diff --git a/.github/workflows/lint-cpp.yml b/.github/workflows/lint-cpp.yml index 1e3154c2..48f5c230 100644 --- a/.github/workflows/lint-cpp.yml +++ b/.github/workflows/lint-cpp.yml @@ -11,6 +11,9 @@ on: - "**/*.cpp" - "**/*.c" - "**/*.mm" + paths-ignore: + - "node_modules" + - "**/node_modules" pull_request: paths: - ".github/workflows/lint-cpp.yml" @@ -19,6 +22,9 @@ on: - "**/*.cpp" - "**/*.c" - "**/*.mm" + paths-ignore: + - "node_modules" + - "**/node_modules" jobs: lint: diff --git a/bun.lockb b/bun.lockb index 6aa8e8e2..a30a08cd 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index ae9db335..f5756e1e 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -7,6 +7,27 @@ PODS: - hermes-engine (0.76.1): - hermes-engine/Pre-built (= 0.76.1) - hermes-engine/Pre-built (0.76.1) + - NitroModules (0.16.1): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga - RCT-Folly (2024.01.01.00): - boost - DoubleConversion @@ -1242,27 +1263,6 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - react-native-quick-sqlite (8.2.5): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - react-native-safe-area-context (4.14.0): - DoubleConversion - glog @@ -1596,6 +1596,28 @@ PODS: - React-logger (= 0.76.1) - React-perflogger (= 0.76.1) - React-utils (= 0.76.1) + - RNQuickSQLite (8.2.5): + - DoubleConversion + - glog + - hermes-engine + - NitroModules + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga - RNScreens (3.35.0): - DoubleConversion - glog @@ -1651,6 +1673,7 @@ DEPENDENCIES: - fmt (from `../../node_modules/react-native/third-party-podspecs/fmt.podspec`) - glog (from `../../node_modules/react-native/third-party-podspecs/glog.podspec`) - hermes-engine (from `../../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) + - NitroModules (from `../../node_modules/react-native-nitro-modules`) - RCT-Folly (from `../../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCT-Folly/Fabric (from `../../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTDeprecation (from `../../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) @@ -1682,7 +1705,6 @@ DEPENDENCIES: - React-logger (from `../../node_modules/react-native/ReactCommon/logger`) - React-Mapbuffer (from `../../node_modules/react-native/ReactCommon`) - React-microtasksnativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`) - - react-native-quick-sqlite (from `../../package`) - react-native-safe-area-context (from `../../node_modules/react-native-safe-area-context`) - React-nativeconfig (from `../../node_modules/react-native/ReactCommon`) - React-NativeModulesApple (from `../../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) @@ -1711,6 +1733,7 @@ DEPENDENCIES: - React-utils (from `../../node_modules/react-native/ReactCommon/react/utils`) - ReactCodegen (from `build/generated/ios`) - ReactCommon/turbomodule/core (from `../../node_modules/react-native/ReactCommon`) + - RNQuickSQLite (from `../../package`) - RNScreens (from `../../node_modules/react-native-screens`) - Yoga (from `../../node_modules/react-native/ReactCommon/yoga`) @@ -1732,6 +1755,8 @@ EXTERNAL SOURCES: hermes-engine: :podspec: "../../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" :tag: hermes-2024-09-09-RNv0.76.0-db6d12e202e15f7a446d8848d6ca8f7abb3cfb32 + NitroModules: + :path: "../../node_modules/react-native-nitro-modules" RCT-Folly: :podspec: "../../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTDeprecation: @@ -1790,8 +1815,6 @@ EXTERNAL SOURCES: :path: "../../node_modules/react-native/ReactCommon" React-microtasksnativemodule: :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" - react-native-quick-sqlite: - :path: "../../package" react-native-safe-area-context: :path: "../../node_modules/react-native-safe-area-context" React-nativeconfig: @@ -1848,6 +1871,8 @@ EXTERNAL SOURCES: :path: build/generated/ios ReactCommon: :path: "../../node_modules/react-native/ReactCommon" + RNQuickSQLite: + :path: "../../package" RNScreens: :path: "../../node_modules/react-native-screens" Yoga: @@ -1860,6 +1885,7 @@ SPEC CHECKSUMS: fmt: 10c6e61f4be25dc963c36bd73fc7b1705fe975be glog: 08b301085f15bcbb6ff8632a8ebaf239aae04e6a hermes-engine: 46f1ffbf0297f4298862068dd4c274d4ac17a1fd + NitroModules: 69af449f389d4c548848a400e1270f672a64e5a3 RCT-Folly: bf5c0376ffe4dd2cf438dcf86db385df9fdce648 RCTDeprecation: fde92935b3caa6cb65cbff9fbb7d3a9867ffb259 RCTRequired: 75c6cee42d21c1530a6f204ba32ff57335d19007 @@ -1889,7 +1915,6 @@ SPEC CHECKSUMS: React-logger: 97c9dafae1f1a638001a9d1d0e93d431f2f9cb7b React-Mapbuffer: 3146a13424f9fec2ea1f1462d49d566e4d69b732 React-microtasksnativemodule: 02d218c79c72d373a92a8552183f4ead0d1c6e05 - react-native-quick-sqlite: 975bea33bc233f8cd468b3a27c50d88521ade800 react-native-safe-area-context: 2500e4fe998caad50ad3bc51ec23ef951308569e React-nativeconfig: 93fe8c85a8c40820c57814e30f3e44b94c995a7b React-NativeModulesApple: b3e076fd0d7b73417fe1e8c8b26e3c57ae9b74aa @@ -1918,6 +1943,7 @@ SPEC CHECKSUMS: React-utils: 5362bd16a9563f9916e7a56c011ddc533507650f ReactCodegen: 4e26d365313307cc7c95e693529e539acfb5c64c ReactCommon: 422e364463f33e336fc4db196aeb50fd801d90d6 + RNQuickSQLite: 8ef02913f22a4ca65f44cf826acd0185aa5d6771 RNScreens: e389d6a6a66a4f0d3662924ecae803073ccce8ec SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Yoga: db69236006b8b1c6d55ab453390c882306cbf219 diff --git a/example/package.json b/example/package.json index 9ad29a23..c55c3957 100644 --- a/example/package.json +++ b/example/package.json @@ -23,6 +23,7 @@ "expo-status-bar": "^1.12.1", "react": "*", "react-native": "*", + "react-native-nitro-modules": "*", "react-native-quick-sqlite": "8.2.5", "react-native-safe-area-context": "^4.14.0", "react-native-screens": "^3.35.0", diff --git a/example/src/App.tsx b/example/src/App.tsx index c0ef752b..9e3436e7 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -13,8 +13,8 @@ const Stack = createNativeStackNavigator() export default function App() { return ( - - + + diff --git a/example/src/navigation.ts b/example/src/navigation.ts index 5dd7fc0b..15faec68 100644 --- a/example/src/navigation.ts +++ b/example/src/navigation.ts @@ -1,5 +1,5 @@ export type ParamList = { - 'QuickSQLite Example': undefined + 'NitroSQLite Example': undefined 'Unit Tests': undefined 'Benchmarks': undefined } diff --git a/example/src/screens/BenchmarkScreen.tsx b/example/src/screens/BenchmarkScreen.tsx index e8c7bf5f..dc39ec3c 100644 --- a/example/src/screens/BenchmarkScreen.tsx +++ b/example/src/screens/BenchmarkScreen.tsx @@ -107,7 +107,7 @@ export const BenchmarkScreen: React.FC = () => { setResults({}) setIsLoading(true) - console.log('--------- BEGINNING QuickSQLite BENCHMARKS ---------') + console.log('--------- BEGINNING NitroSQLite BENCHMARKS ---------') async function start(i = 0): Promise { const benchmark = benchmarks[i]! @@ -121,7 +121,7 @@ export const BenchmarkScreen: React.FC = () => { await start() - console.log('--------- FINISHED QuickSQLite BENCHMARKS! ---------') + console.log('--------- FINISHED NitroSQLite BENCHMARKS! ---------') setIsLoading(false) }, []) diff --git a/example/src/screens/HomeScreen.tsx b/example/src/screens/HomeScreen.tsx index b55cfd4e..9eb7f996 100644 --- a/example/src/screens/HomeScreen.tsx +++ b/example/src/screens/HomeScreen.tsx @@ -5,7 +5,7 @@ import type { ParamList } from '../navigation' import { StatusBar } from 'expo-status-bar' import { ScreenStyles } from '../styles' -type Props = NativeStackScreenProps +type Props = NativeStackScreenProps export const HomeScreen: React.FC = ({ navigation }) => { return ( diff --git a/example/src/tests/db.ts b/example/src/tests/db.ts index c4e994d0..e94b65a4 100644 --- a/example/src/tests/db.ts +++ b/example/src/tests/db.ts @@ -1,7 +1,7 @@ import Chance from 'chance' import type { QuickSQLiteConnection, - SQLBatchTuple, + BatchQueryCommand, } from 'react-native-quick-sqlite' import { open } from 'react-native-quick-sqlite' @@ -24,7 +24,7 @@ export function resetTestDb() { // Copyright 2024 Oscar Franco // Taken from "op-sqlite" example project. -// Used to demonstrate the performance of QuickSQLite. +// Used to demonstrate the performance of NitroSQLite. const ROWS = 300000 export let largeDb: QuickSQLiteConnection | undefined export function resetLargeDb() { @@ -43,11 +43,12 @@ export function resetLargeDb() { largeDb.execute('PRAGMA mmap_size=268435456') - const insertions: SQLBatchTuple[] = [] + const insertions: BatchQueryCommand[] = [] for (let i = 0; i < ROWS; i++) { - insertions.push([ - 'INSERT INTO "Test" (id, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', - [ + insertions.push({ + query: + 'INSERT INTO "Test" (id, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', + params: [ i, chance.name(), chance.name(), @@ -64,7 +65,7 @@ export function resetLargeDb() { chance.floating(), chance.floating(), ], - ]) + }) } largeDb.executeBatch(insertions) diff --git a/example/src/tests/unitTests.spec.ts b/example/src/tests/unitTests.spec.ts index 431e4e9e..79d3fc86 100644 --- a/example/src/tests/unitTests.spec.ts +++ b/example/src/tests/unitTests.spec.ts @@ -1,12 +1,12 @@ import Chance from 'chance' import type { QuickSQLiteConnection, - SQLBatchTuple, + BatchQueryCommand, } from 'react-native-quick-sqlite' import { beforeEach, describe, it } from './MochaRNAdapter' import chai from 'chai' import { testDb as testDbInternal, resetTestDb } from './db' -import type { User } from '../model/User' +import { User } from '../model/User' function isError(e: unknown): e is Error { return e instanceof Error @@ -424,10 +424,8 @@ export function registerUnitTests() { }) } catch (e) { if (isError(e)) { - console.log(e.message) - expect(e.message) - .to.include('SQL execution error') + .to.include('SqlExecutionError') .and.to.include('cannot store TEXT value in REAL column User.id') const res = testDb.execute('SELECT * FROM User') @@ -578,15 +576,17 @@ export function registerUnitTests() { const name2 = chance.name() const age2 = chance.integer() const networth2 = chance.floating() - const commands: SQLBatchTuple[] = [ - [ - 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id1, name1, age1, networth1], - ], - [ - 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id2, name2, age2, networth2], - ], + const commands: BatchQueryCommand[] = [ + { + query: + 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + params: [id1, name1, age1, networth1], + }, + { + query: + 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + params: [id2, name2, age2, networth2], + }, ] testDb.executeBatch(commands) @@ -612,15 +612,17 @@ export function registerUnitTests() { const name2 = chance.name() const age2 = chance.integer() const networth2 = chance.floating() - const commands: SQLBatchTuple[] = [ - [ - 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id1, name1, age1, networth1], - ], - [ - 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id2, name2, age2, networth2], - ], + const commands: BatchQueryCommand[] = [ + { + query: + 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + params: [id1, name1, age1, networth1], + }, + { + query: + 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + params: [id2, name2, age2, networth2], + }, ] await testDb.executeBatchAsync(commands) diff --git a/package.json b/package.json index b93472b4..5d83c968 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,8 @@ "dependencies": { "patch-package": "^8.0.0", "react": "18.3.1", - "react-native": "0.76.1" + "react-native": "0.76.1", + "react-native-nitro-modules": "^0.16.1" }, "devDependencies": { "@babel/core": "^7.25.2", @@ -55,6 +56,7 @@ "eslint": "8.57.0", "eslint-plugin-prettier": "^5.2.1", "jest": "^29.7.0", + "nitro-codegen": "^0.16.1", "prettier": "^3.3.3", "release-it": "^17.10.0", "typescript": "~5.5.4", diff --git a/package/react-native-quick-sqlite.podspec b/package/RNQuickSQLite.podspec similarity index 64% rename from package/react-native-quick-sqlite.podspec rename to package/RNQuickSQLite.podspec index 373f52f5..fab59133 100644 --- a/package/react-native-quick-sqlite.podspec +++ b/package/RNQuickSQLite.podspec @@ -3,8 +3,12 @@ require "json" package = JSON.parse(File.read(File.join(__dir__, "package.json"))) folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32' +# TODO: Should be customizable in package.json. +# Used to create comparable benchmark results +performance_mode = 1 + Pod::Spec.new do |s| - s.name = "react-native-quick-sqlite" + s.name = "RNQuickSQLite" s.version = package["version"] s.summary = package["description"] s.homepage = package["homepage"] @@ -14,15 +18,20 @@ Pod::Spec.new do |s| s.platforms = { :ios => min_ios_version_supported, :visionos => "1.0" } s.source = { :git => "https://github.com/margelo/react-native-quick-sqlite.git", :tag => "#{s.version}" } - s.header_mappings_dir = "cpp" - s.source_files = "ios/**/*.{h,hpp,m,mm}", "cpp/**/*.{h,cpp,c}" + # s.header_mappings_dir = "cpp" + s.source_files = "ios/**/*.{h,hpp,m,mm}", "cpp/**/*.{h,hpp,c,cpp}" s.pod_target_xcconfig = { :GCC_PREPROCESSOR_DEFINITIONS => "HAVE_FULLFSYNC=1", :WARNING_CFLAGS => "-Wno-shorten-64-to-32 -Wno-comma -Wno-unreachable-code -Wno-conditional-uninitialized -Wno-deprecated-declarations", - :USE_HEADERMAP => "No" + :USE_HEADERMAP => "No", + 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++20', + 'CLANG_CXX_LIBRARY' => 'libc++' } + load 'nitrogen/generated/ios/RNQuickSQLite+autolinking.rb' + add_nitrogen_files(s) + # Use install_modules_dependencies helper to install the dependencies if React Native version >=0.71.0. # See https://github.com/facebook/react-native/blob/febf6b7f33fdb4904669f99d795eba4c0f95d7bf/scripts/cocoapods/new_architecture.rb#L79. if respond_to?(:install_modules_dependencies, true) @@ -48,6 +57,18 @@ Pod::Spec.new do |s| end end + optimizedCflags = '$(inherited) -DSQLITE_DQS=0 -DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 -DSQLITE_LIKE_DOESNT_MATCH_BLOBS=1 -DSQLITE_MAX_EXPR_DEPTH=0 -DSQLITE_OMIT_DEPRECATED=1 -DSQLITE_OMIT_PROGRESS_CALLBACK=1 -DSQLITE_OMIT_SHARED_CACHE=1 -DSQLITE_USE_ALLOCA=1' + + if performance_mode == '1' then + log_message.call("Thread unsafe (1) performance mode enabled. Use only transactions! 🚀🚀") + xcconfig[:OTHER_CFLAGS] = optimizedCflags + ' -DSQLITE_THREADSAFE=0 ' + end + + if performance_mode == '2' then + log_message.call("Thread safe (2) performance mode enabled 🚀") + xcconfig[:OTHER_CFLAGS] = optimizedCflags + ' -DSQLITE_THREADSAFE=1 ' + end + if ENV['QUICK_SQLITE_USE_PHONE_VERSION'] == '1' then s.exclude_files = "cpp/sqlite3.c", "cpp/sqlite3.h" s.library = "sqlite3" diff --git a/package/android/CMakeLists.txt b/package/android/CMakeLists.txt index 756979a3..8ec763ae 100644 --- a/package/android/CMakeLists.txt +++ b/package/android/CMakeLists.txt @@ -2,29 +2,36 @@ cmake_minimum_required(VERSION 3.13) project(RNQuickSQLite) set (CMAKE_VERBOSE_MAKEFILE ON) -set (CMAKE_CXX_STANDARD 17) +set (CMAKE_CXX_STANDARD 20) add_definitions( ${SQLITE_FLAGS} ) -include_directories( - ../cpp -) - file(GLOB_RECURSE cpp_files RELATIVE ${CMAKE_SOURCE_DIR} "../cpp/**.c" "../cpp/**.cpp" "cpp-adapter.cpp" ) +# Create library "RNQuickSQLite" and add all C++ files to it add_library(${CMAKE_PROJECT_NAME} SHARED ${cpp_files} ) +include(${CMAKE_SOURCE_DIR}/../nitrogen/generated/android/RNQuickSQLite+autolinking.cmake) + +# Specifies a path to native header files. +include_directories( + ../cpp + ../cpp/specs + ../cpp/sqlite + src/main/cpp +) + set_target_properties( ${CMAKE_PROJECT_NAME} PROPERTIES - CXX_STANDARD 17 + CXX_STANDARD ${CMAKE_CXX_STANDARD} CXX_EXTENSIONS OFF POSITION_INDEPENDENT_CODE ON ) diff --git a/package/android/build.gradle b/package/android/build.gradle index 8bbfd2da..eaa5367a 100644 --- a/package/android/build.gradle +++ b/package/android/build.gradle @@ -82,6 +82,8 @@ if (isNewArchitectureEnabled()) { apply plugin: "com.facebook.react" } +apply from: '../nitrogen/generated/android/RNQuickSQLite+autolinking.gradle' + android { if (supportsNamespace()) { namespace "com.margelo.rnquicksqlite" @@ -183,6 +185,9 @@ dependencies { //noinspection GradleDynamicVersion implementation "com.facebook.react:react-native:+" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + + // Add a dependency on NitroModules + implementation project(":react-native-nitro-modules") } if (isNewArchitectureEnabled()) { diff --git a/package/android/cpp-adapter.cpp b/package/android/cpp-adapter.cpp index c2e90227..6ef673e6 100644 --- a/package/android/cpp-adapter.cpp +++ b/package/android/cpp-adapter.cpp @@ -1,42 +1,21 @@ -#include "bindings.h" -#include "logs.h" -#include #include #include #include #include +#include "HybridQuickSQLite.hpp" +#include "RNQuickSQLiteOnLoad.hpp" -struct QuickSQLiteBridge : jni::JavaClass { - static constexpr auto kJavaDescriptor = - "Lcom/margelo/rnquicksqlite/QuickSQLiteBridge;"; +using namespace margelo::nitro::rnquicksqlite; - static void registerNatives() { - javaClassStatic()->registerNatives( - {// initialization for JSI - makeNativeMethod("installNativeJsi", - QuickSQLiteBridge::installNativeJsi), - makeNativeMethod("clearStateNativeJsi", - QuickSQLiteBridge::clearStateNativeJsi) - }); - } - -private: - static void installNativeJsi( - jni::alias_ref thiz, jlong jsiRuntimePtr, - jni::alias_ref jsCallInvokerHolder, - jni::alias_ref docPath) { - auto jsiRuntime = reinterpret_cast(jsiRuntimePtr); - auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker(); - std::string docPathString = docPath->toStdString(); - - osp::install(*jsiRuntime, jsCallInvoker, docPathString.c_str()); - } - - static void clearStateNativeJsi(jni::alias_ref thiz) { - osp::clearState(); - } -}; +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) { + return margelo::nitro::rnquicksqlite::initialize(vm); +} -JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *) { - return jni::initialize(vm, [] { QuickSQLiteBridge::registerNatives(); }); +extern "C" +JNIEXPORT void JNICALL +Java_com_margelo_rnquicksqlite_DocPathSetter_setDocPathInJNI(JNIEnv *env, jclass clazz, + jstring doc_path) { + const char *nativeString = env->GetStringUTFChars(doc_path, nullptr); + HybridQuickSQLite::docPath = std::string(nativeString); + env->ReleaseStringUTFChars(doc_path, nativeString); } diff --git a/package/android/src/main/java/com/margelo/rnquicksqlite/DocPathSetter.kt b/package/android/src/main/java/com/margelo/rnquicksqlite/DocPathSetter.kt new file mode 100644 index 00000000..c5f2c7b5 --- /dev/null +++ b/package/android/src/main/java/com/margelo/rnquicksqlite/DocPathSetter.kt @@ -0,0 +1,13 @@ +package com.margelo.rnquicksqlite + +import com.facebook.react.bridge.ReactApplicationContext + +object DocPathSetter { + @JvmStatic + fun setDocPath(context: ReactApplicationContext) { + val path = context.filesDir.absolutePath + setDocPathInJNI(path) + } + + private external fun setDocPathInJNI(docPath: String) +} diff --git a/package/android/src/main/java/com/margelo/rnquicksqlite/QuickSQLiteBridge.java b/package/android/src/main/java/com/margelo/rnquicksqlite/QuickSQLiteBridge.java deleted file mode 100644 index 39ac23fb..00000000 --- a/package/android/src/main/java/com/margelo/rnquicksqlite/QuickSQLiteBridge.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.margelo.rnquicksqlite; - -import com.facebook.react.bridge.ReactContext; -import com.facebook.react.turbomodule.core.CallInvokerHolderImpl; - -public class QuickSQLiteBridge { - private native void installNativeJsi(long jsContextNativePointer, CallInvokerHolderImpl jsCallInvokerHolder, - String docPath); - - private native void clearStateNativeJsi(); - - public static final QuickSQLiteBridge instance = new QuickSQLiteBridge(); - - public void install(ReactContext context) { - long jsContextPointer = context.getJavaScriptContextHolder().get(); - CallInvokerHolderImpl jsCallInvokerHolder = (CallInvokerHolderImpl) context.getCatalystInstance() - .getJSCallInvokerHolder(); - final String path = context.getFilesDir().getAbsolutePath(); - - installNativeJsi( - jsContextPointer, - jsCallInvokerHolder, - path); - } - - public void clearState() { - clearStateNativeJsi(); - } -} diff --git a/package/android/src/main/java/com/margelo/rnquicksqlite/RNQuickSQLitePackage.kt b/package/android/src/main/java/com/margelo/rnquicksqlite/RNQuickSQLitePackage.kt new file mode 100644 index 00000000..dc4ead0a --- /dev/null +++ b/package/android/src/main/java/com/margelo/rnquicksqlite/RNQuickSQLitePackage.kt @@ -0,0 +1,40 @@ +package com.margelo.rnquicksqlite + +import com.facebook.react.TurboReactPackage +import com.facebook.react.bridge.NativeModule +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.module.model.ReactModuleInfo +import com.facebook.react.module.model.ReactModuleInfoProvider + +class RNQuickSQLitePackage : TurboReactPackage() { + override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? { + return if (name == RNQuickSQLiteOnLoadModule.NAME) { + RNQuickSQLiteOnLoadModule(reactContext) + } else { + null + } + } + + override fun getReactModuleInfoProvider(): ReactModuleInfoProvider { + return ReactModuleInfoProvider { + val moduleInfos: MutableMap = HashMap() + val isTurboModule: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED + moduleInfos[RNQuickSQLiteOnLoadModule.NAME] = ReactModuleInfo( + RNQuickSQLiteOnLoadModule.NAME, + RNQuickSQLiteOnLoadModule.NAME, + canOverrideExistingModule=false, + needsEagerInit=true, + hasConstants=true, + isCxxModule=false, + isTurboModule=isTurboModule + ) + moduleInfos + } + } + + companion object { + init { + System.loadLibrary("RNQuickSQLite") + } + } +} diff --git a/package/android/src/main/java/com/margelo/rnquicksqlite/SequelModule.java b/package/android/src/main/java/com/margelo/rnquicksqlite/SequelModule.java deleted file mode 100644 index 501574f7..00000000 --- a/package/android/src/main/java/com/margelo/rnquicksqlite/SequelModule.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.margelo.rnquicksqlite; - -import androidx.annotation.NonNull; -import android.util.Log; -import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; - -class SequelModule extends ReactContextBaseJavaModule { - public static final String NAME = "QuickSQLite"; - - public SequelModule(ReactApplicationContext context) { - super(context); - } - - @NonNull - @Override - public String getName() { - return NAME; - } - - @ReactMethod(isBlockingSynchronousMethod = true) - public boolean install() { - try { - System.loadLibrary("RNQuickSQLite"); - QuickSQLiteBridge.instance.install(getReactApplicationContext()); - return true; - } catch (Exception exception) { - Log.e(NAME, "Failed to install JSI Bindings!", exception); - return false; - } - } - - @Override - public void onCatalystInstanceDestroy() { - try { - QuickSQLiteBridge.instance.clearState(); - } catch (Exception exception) { - Log.e(NAME, "Failed to clear state!", exception); - } - } -} diff --git a/package/android/src/main/java/com/margelo/rnquicksqlite/SequelPackage.java b/package/android/src/main/java/com/margelo/rnquicksqlite/SequelPackage.java deleted file mode 100644 index 8c2a2fab..00000000 --- a/package/android/src/main/java/com/margelo/rnquicksqlite/SequelPackage.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.margelo.rnquicksqlite; - -import androidx.annotation.NonNull; - -import com.facebook.react.ReactPackage; -import com.facebook.react.bridge.NativeModule; -import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.uimanager.ViewManager; -import java.util.Collections; -import java.util.List; - -public class SequelPackage implements ReactPackage { - @NonNull - @Override - public List createNativeModules(@NonNull ReactApplicationContext reactContext) { - return Collections.singletonList(new SequelModule(reactContext)); - } - - @NonNull - @Override - public List createViewManagers(@NonNull ReactApplicationContext reactContext) { - return Collections.emptyList(); - } -} diff --git a/package/android/src/newarch/com/margelo/rnquicksqlite/RNQuickSQLiteOnLoadModule.kt b/package/android/src/newarch/com/margelo/rnquicksqlite/RNQuickSQLiteOnLoadModule.kt new file mode 100644 index 00000000..4aade827 --- /dev/null +++ b/package/android/src/newarch/com/margelo/rnquicksqlite/RNQuickSQLiteOnLoadModule.kt @@ -0,0 +1,41 @@ +package com.margelo.rnquicksqlite + +import com.facebook.react.bridge.Callback +import com.facebook.react.bridge.ReactApplicationContext +import com.margelo.rnquicksqlite.NativeQuickSQLiteOnLoadSpec + +class RNQuickSQLiteOnLoadModule(reactContext: ReactApplicationContext) : + NativeQuickSQLiteOnLoadSpec(reactContext) { + private var reactApplicationContextReadyCallback: Callback? = null + + init { + Companion.reactContext = reactContext + DocPathSetter.setDocPath(reactContext) + + if (reactApplicationContextReadyCallback != null) { + reactApplicationContextReadyCallback!!.invoke() + } + } + + override fun getName(): String { + return NAME + } + + override fun onReactApplicationContextReady(callback: Callback) { + if (reactContext != null) { + callback.invoke() + return + } + + reactApplicationContextReadyCallback = callback + } + + companion object { + const val NAME: String = "RNQuickSQLiteOnLoad" + + var reactContext: ReactApplicationContext? = null + private set + var reactApplicationContextReadyCallback: Callback? = null + private set + } +} diff --git a/package/android/src/oldarch/com/margelo/rnquicksqlite/RNQuickSQLiteOnLoadModule.kt b/package/android/src/oldarch/com/margelo/rnquicksqlite/RNQuickSQLiteOnLoadModule.kt new file mode 100644 index 00000000..cf1917b1 --- /dev/null +++ b/package/android/src/oldarch/com/margelo/rnquicksqlite/RNQuickSQLiteOnLoadModule.kt @@ -0,0 +1,43 @@ +package com.margelo.rnquicksqlite + +import com.facebook.react.bridge.Callback +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.bridge.ReactContextBaseJavaModule +import com.facebook.react.bridge.ReactMethod + +class RNQuickSQLiteOnLoadModule(reactContext: ReactApplicationContext) : + ReactContextBaseJavaModule(reactContext) { + + + init { + Companion.reactContext = reactContext + DocPathSetter.setDocPath(reactContext) + + if (reactApplicationContextReadyCallback != null) { + reactApplicationContextReadyCallback!!.invoke() + } + } + + override fun getName(): String { + return NAME + } + + @ReactMethod + fun onReactApplicationContextReady(callback: Callback) { + if (reactContext != null) { + callback.invoke() + return + } + + reactApplicationContextReadyCallback = callback + } + + companion object { + const val NAME: String = "RNNQuickSQLiteOnLoad" + + var reactContext: ReactApplicationContext? = null + private set + var reactApplicationContextReadyCallback: Callback? = null + private set + } +} diff --git a/package/cpp/JSIHelper.cpp b/package/cpp/JSIHelper.cpp deleted file mode 100644 index ac86be40..00000000 --- a/package/cpp/JSIHelper.cpp +++ /dev/null @@ -1,207 +0,0 @@ -// -// JSIHelper.cpp -// react-native-quick-sqlite -// -// Created by Oscar on 13.03.22. -// - -#include "JSIHelper.h" - -using namespace std; -using namespace facebook; - -QuickValue createNullQuickValue() -{ - return QuickValue{ - .dataType = NULL_VALUE}; -} - -QuickValue createBooleanQuickValue(bool value) -{ - return QuickValue{ - .dataType = BOOLEAN, - .booleanValue = int(value)}; -} - -QuickValue createTextQuickValue(string value) -{ - return QuickValue{ - .dataType = TEXT, - .textValue = value}; -} - -QuickValue createIntegerQuickValue(int value) -{ - return QuickValue{ - .dataType = INTEGER, - .doubleOrIntValue = static_cast(value)}; -} - -QuickValue createIntegerQuickValue(double value) -{ - return QuickValue{ - .dataType = INTEGER, - .doubleOrIntValue = value}; -} - -QuickValue createInt64QuickValue(long long value) -{ - return QuickValue{ - .dataType = INT64, - .int64Value = value}; -} - -QuickValue createDoubleQuickValue(double value) -{ - return QuickValue{ - .dataType = DOUBLE, - .doubleOrIntValue = value}; -} - -QuickValue createArrayBufferQuickValue(uint8_t *arrayBufferValue, size_t arrayBufferSize) -{ - return QuickValue{ - .dataType = ARRAY_BUFFER, - .arrayBufferValue = shared_ptr{arrayBufferValue}, - .arrayBufferSize = arrayBufferSize}; -} - -void jsiQueryArgumentsToSequelParam(jsi::Runtime &rt, jsi::Value const ¶ms, vector *target) -{ - if (params.isNull() || params.isUndefined()) - { - return; - } - - jsi::Array values = params.asObject(rt).asArray(rt); - - for (int ii = 0; ii < values.length(rt); ii++) - { - - jsi::Value value = values.getValueAtIndex(rt, ii); - if (value.isNull() || value.isUndefined()) - { - target->push_back(createNullQuickValue()); - } - else if (value.isBool()) - { - target->push_back(createBooleanQuickValue(value.getBool())); - } - else if (value.isNumber()) - { - double doubleVal = value.asNumber(); - int intVal = (int)doubleVal; - long long longVal = (long)doubleVal; - if (intVal == doubleVal) - { - target->push_back(createIntegerQuickValue(intVal)); - } - else if (longVal == doubleVal) - { - target->push_back(createInt64QuickValue(longVal)); - } - else - { - target->push_back(createDoubleQuickValue(doubleVal)); - } - } - else if (value.isString()) - { - string strVal = value.asString(rt).utf8(rt); - target->push_back(createTextQuickValue(strVal)); - } - else if (value.isObject()) - { - auto obj = value.asObject(rt); - if (obj.isArrayBuffer(rt)) - { - auto buf = obj.getArrayBuffer(rt); - target->push_back(createArrayBufferQuickValue(buf.data(rt), buf.size(rt))); - } - } - else - { - target->push_back(createNullQuickValue()); - } - } -} - -jsi::Value createSequelQueryExecutionResult(jsi::Runtime &rt, SQLiteOPResult status, vector> *results, vector *metadata) -{ - if(status.type == SQLiteError) { - throw std::invalid_argument(status.errorMessage); - } - - jsi::Object res = jsi::Object(rt); - - res.setProperty(rt, "rowsAffected", jsi::Value(status.rowsAffected)); - if (status.rowsAffected > 0 && status.insertId != 0) - { - res.setProperty(rt, "insertId", jsi::Value(status.insertId)); - } - - // Converting row results into objects - size_t rowCount = results->size(); - jsi::Object rows = jsi::Object(rt); - if (rowCount > 0) - { - auto array = jsi::Array(rt, rowCount); - for (int i = 0; i < rowCount; i++) - { - jsi::Object rowObject = jsi::Object(rt); - auto row = results->at(i); - for (auto const &entry : row) - { - std::string columnName = entry.first; - QuickValue value = entry.second; - if (value.dataType == TEXT) - { - // using value.textValue (std::string) directly allows jsi::String to use length property of std::string (allowing strings with NULLs in them like SQLite does) - rowObject.setProperty(rt, columnName.c_str(), jsi::String::createFromUtf8(rt, value.textValue)); - } - else if (value.dataType == INTEGER) - { - rowObject.setProperty(rt, columnName.c_str(), jsi::Value(value.doubleOrIntValue)); - } - else if (value.dataType == DOUBLE) - { - rowObject.setProperty(rt, columnName.c_str(), jsi::Value(value.doubleOrIntValue)); - } - else if (value.dataType == ARRAY_BUFFER) - { - jsi::Function array_buffer_ctor = rt.global().getPropertyAsFunction(rt, "ArrayBuffer"); - jsi::Object o = array_buffer_ctor.callAsConstructor(rt, (int)value.arrayBufferSize).getObject(rt); - jsi::ArrayBuffer buf = o.getArrayBuffer(rt); - // It's a shame we have to copy here: see https://github.com/facebook/hermes/pull/419 and https://github.com/facebook/hermes/issues/564. - memcpy(buf.data(rt), value.arrayBufferValue.get(), value.arrayBufferSize); - rowObject.setProperty(rt, columnName.c_str(), o); - } - else - { - rowObject.setProperty(rt, columnName.c_str(), jsi::Value(nullptr)); - } - } - array.setValueAtIndex(rt, i, move(rowObject)); - } - rows.setProperty(rt, "_array", move(array)); - res.setProperty(rt, "rows", move(rows)); - } - - if(metadata != NULL) - { - size_t column_count = metadata->size(); - auto column_array = jsi::Array(rt, column_count); - for (int i = 0; i < column_count; i++) { - auto column = metadata->at(i); - jsi::Object column_object = jsi::Object(rt); - column_object.setProperty(rt, "columnName", jsi::String::createFromUtf8(rt, column.colunmName.c_str())); - column_object.setProperty(rt, "columnDeclaredType", jsi::String::createFromUtf8(rt, column.columnDeclaredType.c_str())); - column_object.setProperty(rt, "columnIndex", jsi::Value(column.columnIndex)); - column_array.setValueAtIndex(rt, i, move(column_object)); - } - res.setProperty(rt, "metadata", move(column_array)); - } - rows.setProperty(rt, "length", jsi::Value((int)rowCount)); - - return move(res); -} diff --git a/package/cpp/JSIHelper.h b/package/cpp/JSIHelper.h deleted file mode 100644 index 9372937f..00000000 --- a/package/cpp/JSIHelper.h +++ /dev/null @@ -1,114 +0,0 @@ -// -// JSIHelper.hpp -// react-native-quick-sqlite -// -// Created by Oscar on 13.03.22. -// - -#ifndef JSIHelper_h -#define JSIHelper_h - -#include -#include -#include -#include -#include - -using namespace std; -using namespace facebook; - -/** - * Enum for QuickValue to store/determine correct type for dynamic JSI values - */ -enum QuickDataType -{ - NULL_VALUE, - TEXT, - INTEGER, - INT64, - DOUBLE, - BOOLEAN, - ARRAY_BUFFER, -}; - -/** - * Wrapper struct to allocate dynamic JSI values to static C++ primitives - */ -struct QuickValue -{ - QuickDataType dataType; - int booleanValue; - double doubleOrIntValue; - long long int64Value; - string textValue; - shared_ptr arrayBufferValue; - size_t arrayBufferSize; -}; - -/** - * Helper struct to carry SQLite results between entities - */ -struct QuickColumnValue -{ - QuickValue value; - string columnName; -}; - -/** - * Various structs to help with the results of the SQLite operations - */ -enum ResultType -{ - SQLiteOk, - SQLiteError -}; - -struct SQLiteOPResult -{ - ResultType type; - string errorMessage; - int rowsAffected; - double insertId; -}; - -struct SequelLiteralUpdateResult -{ - ResultType type; - string message; - int affectedRows; -}; - -struct SequelBatchOperationResult -{ - ResultType type; - string message; - int affectedRows; - int commands; -}; - -/** - * Describe column information of a resultset - */ -struct QuickColumnMetadata -{ - string colunmName; - int columnIndex; - string columnDeclaredType; -}; - -/** - * Fill the target vector with parsed parameters - * */ -void jsiQueryArgumentsToSequelParam(jsi::Runtime &rt, jsi::Value const &args, vector *target); - -QuickValue createNullQuickValue(); -QuickValue createBooleanQuickValue(bool value); -QuickValue createTextQuickValue(string value); -QuickValue createIntegerQuickValue(int value); -QuickValue createIntegerQuickValue(double value); -QuickValue createInt64QuickValue(long long value); -QuickValue createDoubleQuickValue(double value); -QuickValue createArrayBufferQuickValue(uint8_t *arrayBufferValue, size_t arrayBufferSize); -jsi::Value createSequelQueryExecutionResult(jsi::Runtime &rt, SQLiteOPResult status, vector> *results, vector *metadata); - -#endif /* JSIHelper_h */ diff --git a/package/cpp/QuickSQLiteException.hpp b/package/cpp/QuickSQLiteException.hpp new file mode 100644 index 00000000..e81c7f53 --- /dev/null +++ b/package/cpp/QuickSQLiteException.hpp @@ -0,0 +1,63 @@ +#pragma once + +#include +#include +#include + +enum QuickSQLiteExceptionType { + UnknownError, + DatabaseCannotBeOpened, + DatabaseNotOpen, + UnableToAttachToDatabase, + SqlExecutionError, + CouldNotLoadFile, + NoBatchCommandsProvided +}; + +inline std::unordered_map exceptionTypeStrings = { + {UnknownError, "UnknownError"}, + {DatabaseCannotBeOpened, "DatabaseCannotBeOpened"}, + {DatabaseNotOpen, "DatabaseNotOpen"}, + {UnableToAttachToDatabase, "UnableToAttachToDatabase"}, + {SqlExecutionError, "SqlExecutionError"}, + {CouldNotLoadFile, "CouldNotLoadFile"}, + {NoBatchCommandsProvided, "NoBatchCommandsProvided"} +}; + +inline std::string typeToString(QuickSQLiteExceptionType type) { + return exceptionTypeStrings[type]; +} + +class QuickSQLiteException : public std::exception { +public: + explicit QuickSQLiteException(const char* message): QuickSQLiteException(QuickSQLiteExceptionType::UnknownError, message) {} + explicit QuickSQLiteException(const std::string& message): QuickSQLiteException(QuickSQLiteExceptionType::UnknownError, message) {} + QuickSQLiteException(const QuickSQLiteExceptionType& type, const char* message) : QuickSQLiteException(type, std::string(message)) {} + QuickSQLiteException(const QuickSQLiteExceptionType& type, const std::string& message) + : _exceptionString("[react-native-quick-sqlite] " + typeToString(type) + ": " + message) {} + +private: + const std::string _exceptionString; + +public: + [[nodiscard]] const char* what() const noexcept override { + return this->_exceptionString.c_str(); + } + + static QuickSQLiteException DatabaseNotOpen(const std::string& dbName) { + return QuickSQLiteException(QuickSQLiteExceptionType::UnableToAttachToDatabase, dbName + " is not open"); + } + + static QuickSQLiteException SqlExecution(const std::string& errorMessage) { + return QuickSQLiteException(QuickSQLiteExceptionType::SqlExecutionError, errorMessage); + } + + static QuickSQLiteException DatabaseFileNotFound(const std::string& dbFilePath) { + return QuickSQLiteException(QuickSQLiteExceptionType::SqlExecutionError, "Database file not found: " + dbFilePath); + } + + static QuickSQLiteException CouldNotLoadFile(const std::string& fileLocation, std::optional additionalLine = std::nullopt) { + const auto message = "Could not load file: " + fileLocation + (additionalLine ? (". " + *additionalLine) : ""); + return QuickSQLiteException(QuickSQLiteExceptionType::CouldNotLoadFile, message); + } +}; diff --git a/package/cpp/ThreadPool.cpp b/package/cpp/ThreadPool.cpp index 85ad07c9..e9a83c87 100644 --- a/package/cpp/ThreadPool.cpp +++ b/package/cpp/ThreadPool.cpp @@ -5,21 +5,20 @@ // Created by Oscar on 13.03.22. // -#include "ThreadPool.h" +#include "ThreadPool.hpp" -ThreadPool::ThreadPool() : done(false) -{ +namespace margelo::rnquicksqlite { + +ThreadPool::ThreadPool() : done(false) { // This returns the number of threads supported by the system. If the // function can't figure out this information, it returns 0. 0 is not good, // so we create at least 1 auto numberOfThreads = std::thread::hardware_concurrency(); - if (numberOfThreads == 0) - { + if (numberOfThreads == 0) { numberOfThreads = 1; } - for (unsigned i = 0; i < numberOfThreads; ++i) - { + for (unsigned i = 0; i < numberOfThreads; ++i) { // The threads will execute the private member `doWork`. Note that we need // to pass a reference to the function (namespaced with the class name) as // the first argument, and the current object as second argument @@ -29,17 +28,14 @@ ThreadPool::ThreadPool() : done(false) // The destructor joins all the threads so the program can exit gracefully. // This will be executed if there is any exception (e.g. creating the threads) -ThreadPool::~ThreadPool() -{ +ThreadPool::~ThreadPool() { // So threads know it's time to shut down done = true; // Wake up all the threads, so they can finish and be joined workQueueConditionVariable.notify_all(); - for (auto &thread : threads) - { - if (thread.joinable()) - { + for (auto& thread : threads) { + if (thread.joinable()) { thread.join(); } } @@ -47,8 +43,7 @@ ThreadPool::~ThreadPool() // This function will be called by the server every time there is a request // that needs to be processed by the thread pool -void ThreadPool::queueWork(std::function task) -{ +void ThreadPool::queueWork(std::function task) { // Grab the mutex std::lock_guard g(workQueueMutex); @@ -60,25 +55,22 @@ void ThreadPool::queueWork(std::function task) } // Function used by the threads to grab work from the queue -void ThreadPool::doWork() -{ +void ThreadPool::doWork() { // Loop while the queue is not destructing - while (!done) - { + while (!done) { std::function task; // Create a scope, so we don't lock the queue for longer than necessary { std::unique_lock g(workQueueMutex); - workQueueConditionVariable.wait(g, [&] - { + workQueueConditionVariable.wait(g, [&] { // Only wake up if there are elements in the queue or the program is // shutting down - return !workQueue.empty() || done; }); + return !workQueue.empty() || done; + }); // If we are shutting down exit witout trying to process more work - if (done) - { + if (done) { break; } @@ -93,5 +85,7 @@ void ThreadPool::doWork() void ThreadPool::waitFinished() { std::unique_lock g(workQueueMutex); - workQueueConditionVariable.wait(g, [&]{ return workQueue.empty() && (busy == 0); }); -} \ No newline at end of file + workQueueConditionVariable.wait(g, [&] { return workQueue.empty() && (busy == 0); }); +} + +} // namespace margelo::rnquicksqlite diff --git a/package/cpp/ThreadPool.h b/package/cpp/ThreadPool.hpp similarity index 92% rename from package/cpp/ThreadPool.h rename to package/cpp/ThreadPool.hpp index a9534206..77e75ac8 100644 --- a/package/cpp/ThreadPool.h +++ b/package/cpp/ThreadPool.hpp @@ -5,8 +5,7 @@ // Created by Oscar on 13.03.22. // -#ifndef ThreadPool_hpp -#define ThreadPool_hpp +#pragma once #include #include @@ -16,6 +15,8 @@ #include #include +namespace margelo::rnquicksqlite { + class ThreadPool { public: ThreadPool(); @@ -46,4 +47,4 @@ class ThreadPool { void doWork(); }; -#endif /* ThreadPool_hpp */ +} // namespace margelo::rnquicksqlite diff --git a/package/cpp/bindings.cpp b/package/cpp/bindings.cpp deleted file mode 100644 index 34adcd0a..00000000 --- a/package/cpp/bindings.cpp +++ /dev/null @@ -1,450 +0,0 @@ -#include "bindings.h" -#include "sqliteBridge.h" -#include "logs.h" -#include "JSIHelper.h" -#include "ThreadPool.h" -#include "sqlfileloader.h" -#include "sqlbatchexecutor.h" -#include -#include -#include "macros.h" -#include - -using namespace std; -using namespace facebook; - -namespace osp { -string docPathStr; -std::shared_ptr invoker; - -void clearState() { - sqliteCloseAll(); -} - -void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker, const char *docPath) -{ - docPathStr = std::string(docPath); - auto pool = std::make_shared(); - invoker = jsCallInvoker; - - auto open = HOSTFN("open", 2) { - if (count == 0) - { - throw jsi::JSError(rt, "[react-native-quick-sqlite][open] database name is required"); - } - - if (!args[0].isString()) - { - throw jsi::JSError(rt, "[react-native-quick-sqlite][open] database name must be a string"); - } - - string dbName = args[0].asString(rt).utf8(rt); - string tempDocPath = string(docPathStr); - if (count > 1 && !args[1].isUndefined() && !args[1].isNull()) - { - if (!args[1].isString()) - { - throw jsi::JSError(rt, "[react-native-quick-sqlite][open] database location must be a string"); - } - - tempDocPath = tempDocPath + "/" + args[1].asString(rt).utf8(rt); - } - - SQLiteOPResult result = sqliteOpenDb(dbName, tempDocPath); - - if (result.type == SQLiteError) - { - throw jsi::JSError(rt, result.errorMessage.c_str()); - } - - return {}; - }); - - auto attach = HOSTFN("attach", 4) { - if(count < 3) { - throw jsi::JSError(rt, "[react-native-quick-sqlite][attach] Incorrect number of arguments"); - } - if (!args[0].isString() || !args[1].isString() || !args[2].isString()) - { - throw jsi::JSError(rt, "dbName, databaseToAttach and alias must be a strings"); - return {}; - } - - string tempDocPath = string(docPathStr); - if (count > 3 && !args[3].isUndefined() && !args[3].isNull()) - { - if (!args[3].isString()) - { - throw jsi::JSError(rt, "[react-native-quick-sqlite][attach] database location must be a string"); - } - - tempDocPath = tempDocPath + "/" + args[3].asString(rt).utf8(rt); - } - - string dbName = args[0].asString(rt).utf8(rt); - string databaseToAttach = args[1].asString(rt).utf8(rt); - string alias = args[2].asString(rt).utf8(rt); - SQLiteOPResult result = sqliteAttachDb(dbName, tempDocPath, databaseToAttach, alias); - - if (result.type == SQLiteError) - { - throw jsi::JSError(rt, result.errorMessage.c_str()); - } - - return {}; - }); - - auto detach = HOSTFN("detach", 2) { - if(count < 2) { - throw jsi::JSError(rt, "[react-native-quick-sqlite][detach] Incorrect number of arguments"); - } - if (!args[0].isString() || !args[1].isString()) - { - throw jsi::JSError(rt, "dbName, databaseToAttach and alias must be a strings"); - return {}; - } - - string dbName = args[0].asString(rt).utf8(rt); - string alias = args[1].asString(rt).utf8(rt); - SQLiteOPResult result = sqliteDetachDb(dbName, alias); - - if (result.type == SQLiteError) - { - throw jsi::JSError(rt, result.errorMessage.c_str()); - } - - return {}; - }); - - auto close = HOSTFN("close", 1) - { - if (count == 0) - { - throw jsi::JSError(rt, "[react-native-quick-sqlite][close] database name is required"); - } - - if (!args[0].isString()) - { - throw jsi::JSError(rt, "[react-native-quick-sqlite][close] database name must be a string"); - } - - string dbName = args[0].asString(rt).utf8(rt); - - SQLiteOPResult result = sqliteCloseDb(dbName); - - if (result.type == SQLiteError) - { - throw jsi::JSError(rt, result.errorMessage.c_str()); - } - - return {}; - }); - - auto remove = HOSTFN("delete", 2) - { - if (count == 0) - { - throw jsi::JSError(rt, "[react-native-quick-sqlite][open] database name is required"); - } - - if (!args[0].isString()) - { - throw jsi::JSError(rt, "[react-native-quick-sqlite][open] database name must be a string"); - } - - string dbName = args[0].asString(rt).utf8(rt); - - string tempDocPath = string(docPathStr); - if (count > 1 && !args[1].isUndefined() && !args[1].isNull()) - { - if (!args[1].isString()) - { - throw jsi::JSError(rt, "[react-native-quick-sqlite][open] database location must be a string"); - } - - tempDocPath = tempDocPath + "/" + args[1].asString(rt).utf8(rt); - } - - - SQLiteOPResult result = sqliteRemoveDb(dbName, tempDocPath); - - if (result.type == SQLiteError) - { - throw jsi::JSError(rt, result.errorMessage.c_str()); - } - - return {}; - }); - - auto execute = HOSTFN("execute", 3) - { - const string dbName = args[0].asString(rt).utf8(rt); - const string query = args[1].asString(rt).utf8(rt); - vector params; - if(count == 3) { - const jsi::Value &originalParams = args[2]; - jsiQueryArgumentsToSequelParam(rt, originalParams, ¶ms); - } - - vector> results; - vector metadata; - - // Converting results into a JSI Response - try { - auto status = sqliteExecute(dbName, query, ¶ms, &results, &metadata); - - if(status.type == SQLiteError) { -// throw std::runtime_error(status.errorMessage); - throw jsi::JSError(rt, status.errorMessage); -// return {}; - } - - auto jsiResult = createSequelQueryExecutionResult(rt, status, &results, &metadata); - return jsiResult; - } catch(std::exception &e) { - throw jsi::JSError(rt, e.what()); - } - }); - - auto executeAsync = HOSTFN("executeAsync", 3) - { - if (count < 3) - { - throw jsi::JSError(rt, "[react-native-quick-sqlite][executeAsync] Incorrect arguments for executeAsync"); - } - - const string dbName = args[0].asString(rt).utf8(rt); - const string query = args[1].asString(rt).utf8(rt); - const jsi::Value &originalParams = args[2]; - - // Converting query parameters inside the javascript caller thread - vector params; - jsiQueryArgumentsToSequelParam(rt, originalParams, ¶ms); - - auto promiseCtr = rt.global().getPropertyAsFunction(rt, "Promise"); - auto promise = promiseCtr.callAsConstructor(rt, HOSTFN("executor", 2) { - auto resolve = std::make_shared(rt, args[0]); - auto reject = std::make_shared(rt, args[1]); - - auto task = - [&rt, dbName, query, params = make_shared>(params), resolve, reject]() - { - try - { - vector> results; - vector metadata; - auto status = sqliteExecute(dbName, query, params.get(), &results, &metadata); - invoker->invokeAsync([&rt, results = make_shared>>(results), metadata = make_shared>(metadata), status_copy = move(status), resolve, reject] - { - if(status_copy.type == SQLiteOk) { - auto jsiResult = createSequelQueryExecutionResult(rt, status_copy, results.get(), metadata.get()); - resolve->asObject(rt).asFunction(rt).call(rt, move(jsiResult)); - } else { - auto errorCtr = rt.global().getPropertyAsFunction(rt, "Error"); - auto error = errorCtr.callAsConstructor(rt, jsi::String::createFromUtf8(rt, status_copy.errorMessage)); - reject->asObject(rt).asFunction(rt).call(rt, error); - } - }); - - } - catch (std::exception &exc) - { - invoker->invokeAsync([&rt, &exc] { - jsi::JSError(rt, exc.what()); - }); - } - }; - - pool->queueWork(task); - - return {}; - })); - - return promise; - }); - - // Execute a batch of SQL queries in a transaction - // Parameters can be: [[sql: string, arguments: any[] | arguments: any[][] ]] - auto executeBatch = HOSTFN("executeBatch", 2) - { - if (sizeof(args) < 2) - { - throw jsi::JSError(rt, "[react-native-quick-sqlite][executeBatch] - Incorrect parameter count"); - } - - const jsi::Value ¶ms = args[1]; - if (params.isNull() || params.isUndefined()) - { - throw jsi::JSError(rt, "[react-native-quick-sqlite][executeBatch] - An array of SQL commands or parameters is needed"); - } - const string dbName = args[0].asString(rt).utf8(rt); - const jsi::Array &batchParams = params.asObject(rt).asArray(rt); - vector commands; - jsiBatchParametersToQuickArguments(rt, batchParams, &commands); - - auto batchResult = sqliteExecuteBatch(dbName, &commands); - if (batchResult.type == SQLiteOk) - { - auto res = jsi::Object(rt); - res.setProperty(rt, "rowsAffected", jsi::Value(batchResult.affectedRows)); - return move(res); - } - else - { - throw jsi::JSError(rt, batchResult.message); - } - }); - - auto executeBatchAsync = HOSTFN("executeBatchAsync", 2) - { - if (sizeof(args) < 2) - { - throw jsi::JSError(rt, "[react-native-quick-sqlite][executeAsyncBatch] Incorrect parameter count"); - return {}; - } - - const jsi::Value ¶ms = args[1]; - - if (params.isNull() || params.isUndefined()) - { - throw jsi::JSError(rt, "[react-native-quick-sqlite][executeAsyncBatch] - An array of SQL commands or parameters is needed"); - return {}; - } - - const string dbName = args[0].asString(rt).utf8(rt); - const jsi::Array &batchParams = params.asObject(rt).asArray(rt); - - vector commands; - jsiBatchParametersToQuickArguments(rt, batchParams, &commands); - - auto promiseCtr = rt.global().getPropertyAsFunction(rt, "Promise"); - auto promise = promiseCtr.callAsConstructor(rt, HOSTFN("executor", 2) { - auto resolve = std::make_shared(rt, args[0]); - auto reject = std::make_shared(rt, args[1]); - - auto task = - [&rt, dbName, commands = make_shared>(commands), resolve, reject]() - { - try - { - // Inside the new worker thread, we can now call sqlite operations - auto batchResult = sqliteExecuteBatch(dbName, commands.get()); - invoker->invokeAsync([&rt, batchResult = move(batchResult), resolve, reject] - { - if(batchResult.type == SQLiteOk) - { - auto res = jsi::Object(rt); - res.setProperty(rt, "rowsAffected", jsi::Value(batchResult.affectedRows)); - resolve->asObject(rt).asFunction(rt).call(rt, move(res)); - } else - { - throw jsi::JSError(rt, batchResult.message); - } }); - } - catch (std::exception &exc) - { - invoker->invokeAsync([&rt, reject, &exc] - { - throw jsi::JSError(rt, exc.what()); - }); - } - }; - pool->queueWork(task); - - return {}; - })); - - return promise; - }); - - auto loadFile = HOSTFN("loadFile", 2) - { - const string dbName = args[0].asString(rt).utf8(rt); - const string sqlFileName = args[1].asString(rt).utf8(rt); - - const auto importResult = importSQLFile(dbName, sqlFileName); - if (importResult.type == SQLiteOk) - { - auto res = jsi::Object(rt); - res.setProperty(rt, "rowsAffected", jsi::Value(importResult.affectedRows)); - res.setProperty(rt, "commands", jsi::Value(importResult.commands)); - return move(res); - } - else - { - throw jsi::JSError(rt, "[react-native-quick-sqlite][loadFile] Could not open file"); - } - }); - - // Load SQL File from disk in another thread - auto loadFileAsync = HOSTFN("loadFileAsync", 2) - { - if (sizeof(args) < 2) - { - throw jsi::JSError(rt, "[react-native-quick-sqlite][loadFileAsync] Incorrect parameter count"); - return {}; - } - - const string dbName = args[0].asString(rt).utf8(rt); - const string sqlFileName = args[1].asString(rt).utf8(rt); - - auto promiseCtr = rt.global().getPropertyAsFunction(rt, "Promise"); - auto promise = promiseCtr.callAsConstructor(rt, HOSTFN("executor", 2) { - auto resolve = std::make_shared(rt, args[0]); - auto reject = std::make_shared(rt, args[1]); - - auto task = - [&rt, dbName, sqlFileName, resolve, reject]() - { - try - { - const auto importResult = importSQLFile(dbName, sqlFileName); - - invoker->invokeAsync([&rt, result = move(importResult), resolve, reject] - { - if(result.type == SQLiteOk) - { - auto res = jsi::Object(rt); - res.setProperty(rt, "rowsAffected", jsi::Value(result.affectedRows)); - res.setProperty(rt, "commands", jsi::Value(result.commands)); - resolve->asObject(rt).asFunction(rt).call(rt, move(res)); - } else { - throw jsi::JSError(rt, result.message); - } }); - } - catch (std::exception &exc) - { - // LOGW("Catched exception: %s", exc.what()); - invoker->invokeAsync([&rt, err = exc.what(), reject] - { - throw jsi::JSError(rt, err); - }); - } - }; - pool->queueWork(task); - return {}; - })); - - return promise; - }); - - - - jsi::Object module = jsi::Object(rt); - - module.setProperty(rt, "open", move(open)); - module.setProperty(rt, "close", move(close)); - module.setProperty(rt, "attach", move(attach)); - module.setProperty(rt, "detach", move(detach)); - module.setProperty(rt, "delete", move(remove)); - module.setProperty(rt, "execute", move(execute)); - module.setProperty(rt, "executeAsync", move(executeAsync)); - module.setProperty(rt, "executeBatch", move(executeBatch)); - module.setProperty(rt, "executeBatchAsync", move(executeBatchAsync)); - module.setProperty(rt, "loadFile", move(loadFile)); - module.setProperty(rt, "loadFileAsync", move(loadFileAsync)); - - rt.global().setProperty(rt, "__QuickSQLiteProxy", move(module)); -} - -} diff --git a/package/cpp/bindings.h b/package/cpp/bindings.h deleted file mode 100644 index 2cc23043..00000000 --- a/package/cpp/bindings.h +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include -#include - -using namespace facebook; - -namespace osp { -void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker, const char *docPath); -void clearState(); -} - diff --git a/package/cpp/importSqlFile.cpp b/package/cpp/importSqlFile.cpp new file mode 100644 index 00000000..61271679 --- /dev/null +++ b/package/cpp/importSqlFile.cpp @@ -0,0 +1,48 @@ +/** + * SQL File Loader implementation + */ + +#include "importSqlFile.hpp" +#include +#include +#include "QuickSQLiteException.hpp" +#include "operations.hpp" + +namespace margelo::rnquicksqlite { + +SQLiteOperationResult importSqlFile(const std::string& dbName, const std::string& fileLocation) { + std::string line; + std::ifstream sqFile(fileLocation); + if (sqFile.is_open()) { + try { + int rowsAffected = 0; + int commands = 0; + sqliteExecuteLiteral(dbName, "BEGIN EXCLUSIVE TRANSACTION"); + while (std::getline(sqFile, line, '\n')) { + if (!line.empty()) { + try { + SQLiteOperationResult result = sqliteExecuteLiteral(dbName, line); + rowsAffected += result.rowsAffected; + commands++; + } catch (QuickSQLiteException& e) { + sqliteExecuteLiteral(dbName, "ROLLBACK"); + sqFile.close(); + throw QuickSQLiteException::CouldNotLoadFile(fileLocation, "Transaction was rolled back"); + } + } + } + + sqFile.close(); + sqliteExecuteLiteral(dbName, "COMMIT"); + return {.rowsAffected = rowsAffected, .commands = commands}; + } catch (...) { + sqFile.close(); + sqliteExecuteLiteral(dbName, "ROLLBACK"); + throw QuickSQLiteException(QuickSQLiteExceptionType::UnknownError, "Unexpected error. Transaction was rolled back"); + } + } else { + throw QuickSQLiteException::CouldNotLoadFile(fileLocation); + } +} + +} // namespace margelo::rnquicksqlite diff --git a/package/cpp/importSqlFile.hpp b/package/cpp/importSqlFile.hpp new file mode 100644 index 00000000..845836c0 --- /dev/null +++ b/package/cpp/importSqlFile.hpp @@ -0,0 +1,15 @@ +/** + * SQL File Loader + * Utilizes the regular sqlite bridge to load an SQLFile inside a transaction + * + */ + +#pragma once + +#include "types.hpp" + +namespace margelo::rnquicksqlite { + +SQLiteOperationResult importSqlFile(const std::string& dbName, const std::string& fileLocation); + +} diff --git a/package/cpp/logs.h b/package/cpp/logs.h deleted file mode 100644 index 0b8df568..00000000 --- a/package/cpp/logs.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifdef ANDROID -// LOGS ANDROID -#include -#define LOG_TAG "react-native-quick-sqlite" -#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__) -#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) -#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) -#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__) -#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) -#define LOGSIMPLE(...) -#else -// LOGS NO ANDROID -#include -#define LOG_TAG "react-native-quick-sqlite" -#define LOGV(...) \ - printf(" "); \ - printf(__VA_ARGS__); \ - printf("\t - <%s> \n", LOG_TAG); -#define LOGD(...) \ - printf(" "); \ - printf(__VA_ARGS__); \ - printf("\t - <%s> \n", LOG_TAG); -#define LOGI(...) \ - printf(" "); \ - printf(__VA_ARGS__); \ - printf("\t - <%s> \n", LOG_TAG); -#define LOGW(...) \ - printf(" * Warning: "); \ - printf(__VA_ARGS__); \ - printf("\t - <%s> \n", LOG_TAG); -#define LOGE(...) \ - printf(" *** Error: "); \ - printf(__VA_ARGS__); \ - printf("\t - <%s> \n", LOG_TAG); -#define LOGSIMPLE(...) \ - printf(" "); \ - printf(__VA_ARGS__); -#endif // ANDROID diff --git a/package/cpp/logs.hpp b/package/cpp/logs.hpp new file mode 100644 index 00000000..aaa5d6d4 --- /dev/null +++ b/package/cpp/logs.hpp @@ -0,0 +1,38 @@ +#ifdef ANDROID +// LOGS ANDROID +#include +#define LOG_TAG "react-native-quick-sqlite" +#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__) +#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) +#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) +#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__) +#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) +#define LOGSIMPLE(...) +#else +// LOGS NO ANDROID +#include +#define LOG_TAG "react-native-quick-sqlite" +#define LOGV(...) \ + printf(" "); \ + printf(__VA_ARGS__); \ + printf("\t - <%s> \n", LOG_TAG); +#define LOGD(...) \ + printf(" "); \ + printf(__VA_ARGS__); \ + printf("\t - <%s> \n", LOG_TAG); +#define LOGI(...) \ + printf(" "); \ + printf(__VA_ARGS__); \ + printf("\t - <%s> \n", LOG_TAG); +#define LOGW(...) \ + printf(" * Warning: "); \ + printf(__VA_ARGS__); \ + printf("\t - <%s> \n", LOG_TAG); +#define LOGE(...) \ + printf(" *** Error: "); \ + printf(__VA_ARGS__); \ + printf("\t - <%s> \n", LOG_TAG); +#define LOGSIMPLE(...) \ + printf(" "); \ + printf(__VA_ARGS__); +#endif // ANDROID diff --git a/package/cpp/macros.h b/package/cpp/macros.h deleted file mode 100644 index c1457078..00000000 --- a/package/cpp/macros.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef macros_h -#define macros_h - -#define HOSTFN(name, basecount) \ -jsi::Function::createFromHostFunction( \ -rt, \ -jsi::PropNameID::forAscii(rt, name), \ -basecount, \ -[=](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value - -#define JSIFN(capture) \ -capture(jsi::Runtime &runtime, const jsi::Value &thisValue, \ -const jsi::Value *arguments, size_t count) \ -->jsi::Value - -#endif /* macros_h */ diff --git a/package/cpp/macros.hpp b/package/cpp/macros.hpp new file mode 100644 index 00000000..8005554f --- /dev/null +++ b/package/cpp/macros.hpp @@ -0,0 +1,13 @@ +#ifndef macros_h +#define macros_h + +#define HOSTFN(name, basecount) \ +jsi::Function::createFromHostFunction( \ +rt, \ +jsi::PropNameID::forAscii(rt, name), \ +basecount, \ +[=](jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) -> jsi::Value + +#define JSIFN(capture) capture(jsi::Runtime& runtime, const jsi::Value& thisValue, const jsi::Value* arguments, size_t count)->jsi::Value + +#endif /* macros_h */ diff --git a/package/cpp/operations.cpp b/package/cpp/operations.cpp new file mode 100644 index 00000000..a4af4533 --- /dev/null +++ b/package/cpp/operations.cpp @@ -0,0 +1,296 @@ +#include "operations.hpp" +#include "logs.hpp" +#include "utils.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include "QuickSQLiteException.hpp" + +using namespace facebook; +using namespace margelo::nitro; +using namespace margelo::nitro::rnquicksqlite; + +namespace margelo::rnquicksqlite { + +std::map dbMap = std::map(); + +void sqliteOpenDb(const std::string& dbName, const std::string& docPath) { + std::string dbPath = get_db_path(dbName, docPath); + + int sqlOpenFlags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX; + + sqlite3* db; + int exit = 0; + exit = sqlite3_open_v2(dbPath.c_str(), &db, sqlOpenFlags, nullptr); + + if (exit != SQLITE_OK) { + throw QuickSQLiteException(QuickSQLiteExceptionType::DatabaseCannotBeOpened, sqlite3_errmsg(db)); + } else { + dbMap[dbName] = db; + } +} + +void sqliteCloseDb(const std::string& dbName) { + + if (dbMap.count(dbName) == 0) { + throw QuickSQLiteException::DatabaseNotOpen(dbName); + } + + sqlite3* db = dbMap[dbName]; + + sqlite3_close_v2(db); + + dbMap.erase(dbName); +} + +void sqliteCloseAll() { + for (auto const& x : dbMap) { + // In certain cases, this will return SQLITE_OK, mark the database connection as an unusable "zombie", + // and deallocate the connection later. + sqlite3_close_v2(x.second); + } + dbMap.clear(); +} + +void sqliteAttachDb(const std::string& mainDBName, const std::string& docPath, const std::string& databaseToAttach, + const std::string& alias) { + /** + * There is no need to check if mainDBName is opened because sqliteExecuteLiteral will do that. + * */ + std::string dbPath = get_db_path(databaseToAttach, docPath); + std::string statement = "ATTACH DATABASE '" + dbPath + "' AS " + alias; + + try { + sqliteExecuteLiteral(mainDBName, statement); + } catch (QuickSQLiteException& e) { + throw QuickSQLiteException(QuickSQLiteExceptionType::UnableToAttachToDatabase, mainDBName + " was unable to attach another database: " + std::string(e.what())); + } +} + +void sqliteDetachDb(const std::string& mainDBName, const std::string& alias) { + /** + * There is no need to check if mainDBName is opened because sqliteExecuteLiteral will do that. + * */ + std::string statement = "DETACH DATABASE " + alias; + + try { + sqliteExecuteLiteral(mainDBName, statement); + } catch (QuickSQLiteException& e) { + throw QuickSQLiteException(QuickSQLiteExceptionType::UnableToAttachToDatabase, mainDBName + " was unable to detach database: " + std::string(e.what())); + } +} + +void sqliteRemoveDb(const std::string& dbName, const std::string& docPath) { + if (dbMap.count(dbName) == 1) { + sqliteCloseDb(dbName); + } + + std::string dbFilePath = get_db_path(dbName, docPath); + if (!file_exists(dbFilePath)) { + throw QuickSQLiteException::DatabaseFileNotFound(dbFilePath); + } + + remove(dbFilePath.c_str()); +} + +void bindStatement(sqlite3_stmt* statement, const SQLiteQueryParams& values) { + for (int valueIndex = 0; valueIndex < values.size(); valueIndex++) { + int sqliteIndex = valueIndex+1; + SQLiteValue value = values.at(valueIndex); + + // if (std::holds_alternative(value)) + // { + // sqlite3_bind_null(statement, sqliteIndex); + // } + if (std::holds_alternative(value)) { + sqlite3_bind_int(statement, sqliteIndex, std::get(value)); + } else if (std::holds_alternative(value)) { + sqlite3_bind_double(statement, sqliteIndex, std::get(value)); + } else if (std::holds_alternative(value)) { + sqlite3_bind_int64(statement, sqliteIndex, std::get(value)); + } else if (std::holds_alternative(value)) { + const auto stringValue = std::get(value); + sqlite3_bind_text(statement, sqliteIndex, stringValue.c_str(), stringValue.length(), SQLITE_TRANSIENT); + } else if (std::holds_alternative>(value)) { + const auto arrayBufferValue = std::get>(value); + sqlite3_bind_blob(statement, sqliteIndex, arrayBufferValue->data(), arrayBufferValue->size(), SQLITE_STATIC); + } + } +} + +SQLiteExecuteQueryResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional& params) { + if (dbMap.count(dbName) == 0) { + throw QuickSQLiteException::DatabaseNotOpen(dbName); + } + + auto db = dbMap[dbName]; + + sqlite3_stmt* statement; + int statementStatus = sqlite3_prepare_v2(db, query.c_str(), -1, &statement, NULL); + if (statementStatus == SQLITE_OK) // statement is correct, bind the passed parameters + { + if (params) { + bindStatement(statement, *params); + } + } else { + throw QuickSQLiteException::SqlExecution(sqlite3_errmsg(db)); + } + + auto isConsuming = true; + auto isFailed = false; + + int result, i, count, column_type; + std::string column_name; + ColumnType column_declared_type; + SQLiteQueryResultRow row; + + auto results = std::make_unique(); + auto metadata = new SQLiteQueryTableMetadata(); + + while (isConsuming) { + result = sqlite3_step(statement); + + switch (result) { + case SQLITE_ROW: + i = 0; + row = std::unordered_map(); + count = sqlite3_column_count(statement); + + while (i < count) { + column_type = sqlite3_column_type(statement, i); + column_name = sqlite3_column_name(statement, i); + switch (column_type) { + + case SQLITE_INTEGER: { + auto column_value = sqlite3_column_int64(statement, i); + row[column_name] = column_value; + break; + } + case SQLITE_FLOAT: { + auto column_value = sqlite3_column_double(statement, i); + row[column_name] = column_value; + break; + } + case SQLITE_TEXT: { + auto column_value = reinterpret_cast(sqlite3_column_text(statement, i)); + sqlite3_column_bytes(statement, i); + row[column_name] = column_value; + break; + } + case SQLITE_BLOB: { + int blob_size = sqlite3_column_bytes(statement, i); + const void* blob = sqlite3_column_blob(statement, i); + uint8_t* data = new uint8_t[blob_size]; + memcpy(data, blob, blob_size); + row[column_name] = ArrayBuffer::makeBuffer(data, blob_size, [&data]() -> void { delete[] data; }); + break; + } + case SQLITE_NULL: + // Intentionally left blank to switch to default case + default: + // row[column_name] = std::monostate(); + break; + } + i++; + } + results->push_back(std::move(row)); + break; + case SQLITE_DONE: + i = 0; + count = sqlite3_column_count(statement); + while (i < count) { + column_name = sqlite3_column_name(statement, i); + const char* tp = sqlite3_column_decltype(statement, i); + column_declared_type = mapSQLiteTypeToColumnType(tp); + auto columnMeta = SQLiteQueryColumnMetadata(std::move(column_name), std::move(column_declared_type), i); + metadata->insert({column_name, columnMeta}); + i++; + } + isConsuming = false; + break; + default: + isFailed = true; + isConsuming = false; + } + } + + sqlite3_finalize(statement); + + if (isFailed) { + throw QuickSQLiteException::SqlExecution(sqlite3_errmsg(db)); + } + + int rowsAffected = sqlite3_changes(db); + long long latestInsertRowId = sqlite3_last_insert_rowid(db); + auto meta = std::make_unique>( + metadata && metadata->size() > 0 + ? std::make_optional(std::move(*metadata)) + : std::nullopt + ); + + return { + .rowsAffected = rowsAffected, + .insertId = static_cast(latestInsertRowId), + .results = std::move(results), + .metadata = std::move(meta) + }; +} + +SQLiteOperationResult sqliteExecuteLiteral(const std::string& dbName, const std::string& query) { + // Check if db connection is opened + if (dbMap.count(dbName) == 0) { + throw QuickSQLiteException::DatabaseNotOpen(dbName); + } + + sqlite3* db = dbMap[dbName]; + + // SQLite statements need to be compiled before executed + sqlite3_stmt* statement; + + // Compile and move result into statement memory spot + int statementStatus = sqlite3_prepare_v2(db, query.c_str(), -1, &statement, NULL); + + if (statementStatus != SQLITE_OK) // statemnet is correct, bind the passed parameters + { + throw QuickSQLiteException::SqlExecution(sqlite3_errmsg(db)); + } + + bool isConsuming = true; + bool isFailed = false; + + int result, i, count, column_type; + std::string column_name; + + while (isConsuming) { + result = sqlite3_step(statement); + + switch (result) { + case SQLITE_ROW: + isConsuming = true; + break; + + case SQLITE_DONE: + isConsuming = false; + break; + + default: + isFailed = true; + isConsuming = false; + } + } + + sqlite3_finalize(statement); + + if (isFailed) { + throw QuickSQLiteException::SqlExecution(sqlite3_errmsg(db)); + } + + return {.rowsAffected = sqlite3_changes(db)}; +} + +} // namespace margelo::rnquicksqlite diff --git a/package/cpp/operations.hpp b/package/cpp/operations.hpp new file mode 100644 index 00000000..1e073e66 --- /dev/null +++ b/package/cpp/operations.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include "types.hpp" + +namespace margelo::rnquicksqlite { + +void sqliteOpenDb(const std::string& dbName, const std::string& docPath); + +void sqliteCloseDb(const std::string& dbName); + +void sqliteRemoveDb(const std::string& dbName, const std::string& docPath); + +void sqliteAttachDb(const std::string& mainDBName, const std::string& docPath, const std::string& databaseToAttach, + const std::string& alias); + +void sqliteDetachDb(const std::string& mainDBName, const std::string& alias); + +SQLiteExecuteQueryResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional& params); + +SQLiteOperationResult sqliteExecuteLiteral(const std::string& dbName, const std::string& query); + +void sqliteCloseAll(); + +} // namespace margelo::rnquicksqlite diff --git a/package/cpp/specs/HybridNativeQueryResult.cpp b/package/cpp/specs/HybridNativeQueryResult.cpp new file mode 100644 index 00000000..bd447a8e --- /dev/null +++ b/package/cpp/specs/HybridNativeQueryResult.cpp @@ -0,0 +1,20 @@ +#include "HybridNativeQueryResult.hpp" + +namespace margelo::nitro::rnquicksqlite { + +std::optional HybridNativeQueryResult::getInsertId() { + return this->_insertId; +} +double HybridNativeQueryResult::getRowsAffected() { + return this->_rowsAffected; +} + +SQLiteQueryResults HybridNativeQueryResult::getResults() { + return this->_results; +}; + +std::optional HybridNativeQueryResult::getMetadata() { + return this->_metadata; +} + +} // namespace margelo::nitro::rnquicksqlite diff --git a/package/cpp/specs/HybridNativeQueryResult.hpp b/package/cpp/specs/HybridNativeQueryResult.hpp new file mode 100644 index 00000000..c1b9d9aa --- /dev/null +++ b/package/cpp/specs/HybridNativeQueryResult.hpp @@ -0,0 +1,35 @@ +#pragma once + +#include "HybridNativeQueryResultSpec.hpp" +#include "types.hpp" +#include + +using namespace margelo::rnquicksqlite; + +namespace margelo::nitro::rnquicksqlite { + +class HybridNativeQueryResult : public HybridNativeQueryResultSpec { +public: + HybridNativeQueryResult() : HybridObject(TAG) {} + HybridNativeQueryResult(std::optional insertId, int rowsAffected, SQLiteQueryResults& results, std::optional& metadata) + : HybridObject(TAG), + _insertId(insertId), + _rowsAffected(rowsAffected), + _results(std::move(results)), + _metadata(std::move(metadata)) {} + +private: + std::optional _insertId; + int _rowsAffected; + SQLiteQueryResults _results; + std::optional _metadata; + +public: + // Properties + std::optional getInsertId() override; + double getRowsAffected() override; + SQLiteQueryResults getResults() override; + std::optional getMetadata() override; +}; + +} // namespace margelo::nitro::rnquicksqlite diff --git a/package/cpp/specs/HybridQuickSQLite.cpp b/package/cpp/specs/HybridQuickSQLite.cpp new file mode 100644 index 00000000..3af75c4c --- /dev/null +++ b/package/cpp/specs/HybridQuickSQLite.cpp @@ -0,0 +1,132 @@ +#include "HybridQuickSQLite.hpp" +#include "HybridNativeQueryResult.hpp" +#include "ThreadPool.hpp" +#include "QuickSQLiteException.hpp" +#include "logs.hpp" +#include "macros.hpp" +#include "sqliteExecuteBatch.hpp" +#include "importSqlFile.hpp" +#include "operations.hpp" +#include +#include +#include +#include + +namespace margelo::nitro::rnquicksqlite { + +auto pool = std::make_shared(); + +const std::string getDocPath(const std::optional& location) { + std::string tempDocPath = std::string(HybridQuickSQLite::docPath); + if (location) { + tempDocPath = tempDocPath + "/" + *location; + } + + return tempDocPath; +} + +void HybridQuickSQLite::open(const std::string& dbName, const std::optional& location) { + const auto docPath = getDocPath(location); + sqliteOpenDb(dbName, docPath); +} + +void HybridQuickSQLite::close(const std::string& dbName) { + sqliteCloseDb(dbName); +}; + +void HybridQuickSQLite::drop(const std::string& dbName, const std::optional& location) { + const auto docPath = getDocPath(location); + sqliteRemoveDb(dbName, docPath); +}; + +void HybridQuickSQLite::attach(const std::string& mainDbName, const std::string& dbNameToAttach, const std::string& alias, + const std::optional& location) { + std::string tempDocPath = std::string(docPath); + if (location) { + tempDocPath = tempDocPath + "/" + *location; + } + + sqliteAttachDb(mainDbName, tempDocPath, dbNameToAttach, alias); +}; + +void HybridQuickSQLite::detach(const std::string& mainDbName, const std::string& alias) { + sqliteDetachDb(mainDbName, alias); +}; + +using ExecuteQueryResult = std::shared_ptr; + +ExecuteQueryResult HybridQuickSQLite::execute(const std::string& dbName, const std::string& query, + const std::optional& params) { + auto result = sqliteExecute(dbName, query, params); + return std::make_shared(result.insertId, result.rowsAffected, *result.results, *result.metadata); +}; + +std::future HybridQuickSQLite::executeAsync(const std::string& dbName, const std::string& query, + const std::optional& params) { + auto promise = std::make_shared>(); + auto future = promise->get_future(); + + auto task = [this, promise, dbName, query, params]() { + try { + auto result = execute(dbName, query, params); + promise->set_value(result); + } catch (...) { + promise->set_exception(std::current_exception()); + } + }; + + pool->queueWork(std::move(task)); + + return future; +}; + +BatchQueryResult HybridQuickSQLite::executeBatch(const std::string& dbName, const std::vector& batchParams) { + const auto commands = batchParamsToCommands(batchParams); + + auto result = sqliteExecuteBatch(dbName, commands); + return BatchQueryResult(result.rowsAffected); +}; + +std::future HybridQuickSQLite::executeBatchAsync(const std::string& dbName, + const std::vector& batchParams) { + auto promise = std::make_shared>(); + auto future = promise->get_future(); + + auto task = [this, promise, dbName, batchParams]() { + try { + auto result = executeBatch(dbName, batchParams); + promise->set_value(result); + } catch (...) { + promise->set_exception(std::current_exception()); + } + }; + + pool->queueWork(std::move(task)); + + return future; +}; + +FileLoadResult HybridQuickSQLite::loadFile(const std::string& dbName, const std::string& location) { + const auto result = importSqlFile(dbName, location); + return FileLoadResult(result.commands, result.rowsAffected); +}; + +std::future HybridQuickSQLite::loadFileAsync(const std::string& dbName, const std::string& location) { + auto promise = std::make_shared>(); + auto future = promise->get_future(); + + auto task = [this, promise, dbName, location]() { + try { + auto result = loadFile(dbName, location); + promise->set_value(result); + } catch (...) { + promise->set_exception(std::current_exception()); + } + }; + + pool->queueWork(std::move(task)); + + return future; +}; + +} // namespace margelo::nitro::rnquicksqlite diff --git a/package/cpp/specs/HybridQuickSQLite.hpp b/package/cpp/specs/HybridQuickSQLite.hpp new file mode 100644 index 00000000..6ea7ef7a --- /dev/null +++ b/package/cpp/specs/HybridQuickSQLite.hpp @@ -0,0 +1,36 @@ +#pragma once + +#include "HybridQuickSQLiteSpec.hpp" +#include "HybridNativeQueryResultSpec.hpp" +#include "types.hpp" + +using namespace margelo::rnquicksqlite; + +namespace margelo::nitro::rnquicksqlite { + +class HybridQuickSQLite : public HybridQuickSQLiteSpec { +public: + HybridQuickSQLite() : HybridObject(TAG) {} + +public: + static std::string docPath; + +public: + // Methods + void open(const std::string& dbName, const std::optional& location) override; + void close(const std::string& dbName) override; + void drop(const std::string& dbName, const std::optional& location) override; + void attach(const std::string& mainDbName, const std::string& dbNameToAttach, const std::string& alias, + const std::optional& location) override; + void detach(const std::string& mainDbName, const std::string& alias) override; + std::shared_ptr execute(const std::string& dbName, const std::string& query, const std::optional& params) override; + std::future> executeAsync(const std::string& dbName, const std::string& query, const std::optional& params) override; + BatchQueryResult executeBatch(const std::string& dbName, const std::vector& commands) override; + std::future executeBatchAsync(const std::string& dbName, const std::vector& commands) override; + FileLoadResult loadFile(const std::string& dbName, const std::string& location) override; + std::future loadFileAsync(const std::string& dbName, const std::string& location) override; +}; + +inline std::string HybridQuickSQLite::docPath = ""; + +} // namespace margelo::nitro::rnquicksqlite diff --git a/package/cpp/sqlbatchexecutor.cpp b/package/cpp/sqlbatchexecutor.cpp deleted file mode 100644 index f80519ae..00000000 --- a/package/cpp/sqlbatchexecutor.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Batch execution implementation -*/ -#include "sqlbatchexecutor.h" - -void jsiBatchParametersToQuickArguments(jsi::Runtime &rt, jsi::Array const &batchParams, vector *commands) -{ - for (int i = 0; i < batchParams.length(rt); i++) - { - const jsi::Array &command = batchParams.getValueAtIndex(rt, i).asObject(rt).asArray(rt); - if (command.length(rt) == 0) - { - continue; - } - - const string query = command.getValueAtIndex(rt, 0).asString(rt).utf8(rt); - const jsi::Value &commandParams = command.length(rt) > 1 ? command.getValueAtIndex(rt, 1) : jsi::Value::undefined(); - if (!commandParams.isUndefined() && commandParams.asObject(rt).isArray(rt) && commandParams.asObject(rt).asArray(rt).length(rt) > 0 && commandParams.asObject(rt).asArray(rt).getValueAtIndex(rt, 0).isObject()) - { - // This arguments is an array of arrays, like a batch update of a single sql command. - const jsi::Array &batchUpdateParams = commandParams.asObject(rt).asArray(rt); - for (int x = 0; x < batchUpdateParams.length(rt); x++) - { - const jsi::Value &p = batchUpdateParams.getValueAtIndex(rt, x); - vector params; - jsiQueryArgumentsToSequelParam(rt, p, ¶ms); - commands->push_back(QuickQueryArguments{ - query, - make_shared>(params) - }); - } - } - else - { - vector params; - jsiQueryArgumentsToSequelParam(rt, commandParams, ¶ms); - commands->push_back(QuickQueryArguments{ - query, - make_shared>(params) - }); - } - } -} - -SequelBatchOperationResult sqliteExecuteBatch(std::string dbName, vector *commands) -{ - size_t commandCount = commands->size(); - if(commandCount <= 0) - { - return SequelBatchOperationResult { - .type = SQLiteError, - .message = "No SQL commands provided", - }; - } - - try - { - int affectedRows = 0; - sqliteExecuteLiteral(dbName, "BEGIN EXCLUSIVE TRANSACTION"); - for(int i = 0; iat(i); - // We do not provide a datastructure to receive query data because we don't need/want to handle this results in a batch execution - auto result = sqliteExecute(dbName, command.sql, command.params.get(), NULL, NULL); - if(result.type == SQLiteError) - { - sqliteExecuteLiteral(dbName, "ROLLBACK"); - return SequelBatchOperationResult { - .type = SQLiteError, - .message = result.errorMessage, - }; - } else - { - affectedRows += result.rowsAffected; - } - } - sqliteExecuteLiteral(dbName, "COMMIT"); - return SequelBatchOperationResult { - .type = SQLiteOk, - .affectedRows = affectedRows, - .commands = (int) commandCount, - }; - } catch(std::exception &exc) - { - sqliteExecuteLiteral(dbName, "ROLLBACK"); - return SequelBatchOperationResult { - .type = SQLiteError, - .message = exc.what(), - }; - } -} diff --git a/package/cpp/sqlbatchexecutor.h b/package/cpp/sqlbatchexecutor.h deleted file mode 100644 index 43dccd9c..00000000 --- a/package/cpp/sqlbatchexecutor.h +++ /dev/null @@ -1,24 +0,0 @@ -/** - * SQL Batch execution implementation using default sqliteBridge implementation -*/ -#include "JSIHelper.h" -#include "sqliteBridge.h" - -using namespace std; -using namespace facebook; - -struct QuickQueryArguments { - string sql; - shared_ptr> params; -}; - -/** - * Local Helper method to translate JSI objects QuickQueryArguments datastructure - * MUST be called in the JavaScript Thread -*/ -void jsiBatchParametersToQuickArguments(jsi::Runtime &rt, jsi::Array const &batchParams, vector *commands); - -/** - * Execute a batch of commands in a exclusive transaction -*/ -SequelBatchOperationResult sqliteExecuteBatch(std::string dbName, vector *commands); diff --git a/package/cpp/sqlfileloader.cpp b/package/cpp/sqlfileloader.cpp deleted file mode 100644 index d84915ed..00000000 --- a/package/cpp/sqlfileloader.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/** - * SQL File Loader implementation -*/ -#include "sqlfileloader.h" -#include -#include - -using namespace std; - -SequelBatchOperationResult importSQLFile(string dbName, string fileLocation) -{ - string line; - ifstream sqFile(fileLocation); - if (sqFile.is_open()) - { - try - { - int affectedRows = 0; - int commands = 0; - sqliteExecuteLiteral(dbName, "BEGIN EXCLUSIVE TRANSACTION"); - while (std::getline(sqFile, line, '\n')) - { - if (!line.empty()) - { - SequelLiteralUpdateResult result = sqliteExecuteLiteral(dbName, line); - if (result.type == SQLiteError) - { - sqliteExecuteLiteral(dbName, "ROLLBACK"); - sqFile.close(); - return {SQLiteError, result.message, 0, commands}; - } - else - { - affectedRows += result.affectedRows; - commands++; - } - } - } - sqFile.close(); - sqliteExecuteLiteral(dbName, "COMMIT"); - return {SQLiteOk, "", affectedRows, commands}; - } - catch (...) - { - sqFile.close(); - sqliteExecuteLiteral(dbName, "ROLLBACK"); - return {SQLiteError, "[react-native-quick-sqlite][loadSQLFile] Unexpected error, transaction was rolledback", 0, 0}; - } - } - else - { - return {SQLiteError, "[react-native-quick-sqlite][loadSQLFile] Could not open file", 0, 0}; - } -} diff --git a/package/cpp/sqlfileloader.h b/package/cpp/sqlfileloader.h deleted file mode 100644 index c301035a..00000000 --- a/package/cpp/sqlfileloader.h +++ /dev/null @@ -1,10 +0,0 @@ - -/** - * SQL File Loader - * Utilizes the regular sqlite bridge to load an SQLFile inside a transaction - * -*/ - -#include "JSIHelper.h" -#include "sqliteBridge.h" -SequelBatchOperationResult importSQLFile(std::string dbName, std::string fileLocation); \ No newline at end of file diff --git a/package/cpp/sqlite3.c b/package/cpp/sqlite/sqlite3.c similarity index 69% rename from package/cpp/sqlite3.c rename to package/cpp/sqlite/sqlite3.c index 51d5dbd0..12a21f34 100644 --- a/package/cpp/sqlite3.c +++ b/package/cpp/sqlite/sqlite3.c @@ -20,7 +20,7 @@ #define SQLITE_CORE 1 #define SQLITE_AMALGAMATION 1 #ifndef SQLITE_PRIVATE -# define SQLITE_PRIVATE static +#define SQLITE_PRIVATE static #endif /************** Begin file sqliteInt.h ***************************************/ /* @@ -72,7 +72,7 @@ ** only used by test code and Tcl integration code. */ #ifndef SQLITE_TCLAPI -# define SQLITE_TCLAPI +#define SQLITE_TCLAPI #endif /* @@ -149,9 +149,9 @@ */ #if defined(__RTP__) || defined(_WRS_KERNEL) /* This is VxWorks. Set up things specially for that OS -*/ + */ +#include /* amalgamator: dontcache */ #include -#include /* amalgamator: dontcache */ #define OS_VXWORKS 1 #define SQLITE_OS_OTHER 0 #define SQLITE_HOMEGROWN_RECURSIVE_MUTEX 1 @@ -194,11 +194,11 @@ ** 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 +#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 @@ -215,14 +215,14 @@ ** when compiling with clang. */ #if defined(__GNUC__) && !defined(SQLITE_DISABLE_INTRINSIC) -# define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__) +#define GCC_VERSION (__GNUC__ * 1000000 + __GNUC_MINOR__ * 1000 + __GNUC_PATCHLEVEL__) #else -# define GCC_VERSION 0 +#define GCC_VERSION 0 #endif #if defined(_MSC_VER) && !defined(SQLITE_DISABLE_INTRINSIC) -# define MSVC_VERSION _MSC_VER +#define MSVC_VERSION _MSC_VER #else -# define MSVC_VERSION 0 +#define MSVC_VERSION 0 #endif /* @@ -230,29 +230,29 @@ ** 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 +#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 +#define _GNU_SOURCE #endif #if defined(__OpenBSD__) && !defined(_BSD_SOURCE) -# define _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)); +#if GCC_VERSION >= 7000000 +#define deliberate_fall_through __attribute__((fallthrough)); #else -# define deliberate_fall_through +#define deliberate_fall_through #endif /* @@ -270,9 +270,9 @@ ** disabled. */ #if defined(_HAVE_MINGW_H) -# include "mingw.h" +#include "mingw.h" #elif defined(_HAVE__MINGW_H) -# include "_mingw.h" +#include "_mingw.h" #endif /* @@ -280,11 +280,9 @@ ** 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 +#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 @@ -293,9 +291,9 @@ ** file. */ #ifdef SQLITE_CUSTOM_INCLUDE -# define INC_STRINGIFY_(f) #f -# define INC_STRINGIFY(f) INC_STRINGIFY_(f) -# include INC_STRINGIFY(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 @@ -338,7 +336,7 @@ */ #ifndef SQLITE3_H #define SQLITE3_H -#include /* Needed for the definition of va_list */ +#include /* Needed for the definition of va_list */ /* ** Make sure we can call this stuff from C++. @@ -347,7 +345,6 @@ extern "C" { #endif - /* ** Facilitate override of interface linkage and calling conventions. ** Be aware that these macros may not be used within this particular @@ -375,25 +372,25 @@ extern "C" { ** that require non-default calling conventions. */ #ifndef SQLITE_EXTERN -# define SQLITE_EXTERN extern +#define SQLITE_EXTERN extern #endif #ifndef SQLITE_API -# define SQLITE_API +#define SQLITE_API #endif #ifndef SQLITE_CDECL -# define SQLITE_CDECL +#define SQLITE_CDECL #endif #ifndef SQLITE_APICALL -# define SQLITE_APICALL +#define SQLITE_APICALL #endif #ifndef SQLITE_STDCALL -# define SQLITE_STDCALL SQLITE_APICALL +#define SQLITE_STDCALL SQLITE_APICALL #endif #ifndef SQLITE_CALLBACK -# define SQLITE_CALLBACK +#define SQLITE_CALLBACK #endif #ifndef SQLITE_SYSAPI -# define SQLITE_SYSAPI +#define SQLITE_SYSAPI #endif /* @@ -416,10 +413,10 @@ extern "C" { ** Ensure these symbols were not defined by some previous header file. */ #ifdef SQLITE_VERSION -# undef SQLITE_VERSION +#undef SQLITE_VERSION #endif #ifdef SQLITE_VERSION_NUMBER -# undef SQLITE_VERSION_NUMBER +#undef SQLITE_VERSION_NUMBER #endif /* @@ -452,9 +449,9 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.39.4" +#define SQLITE_VERSION "3.39.4" #define SQLITE_VERSION_NUMBER 3039004 -#define SQLITE_SOURCE_ID "2022-09-29 15:55:41 a29f9949895322123f7c38fbe94c649a9d6e6c9cd0c3b41c96d694552f26b309" +#define SQLITE_SOURCE_ID "2022-09-29 15:55:41 a29f9949895322123f7c38fbe94c649a9d6e6c9cd0c3b41c96d694552f26b309" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -489,8 +486,8 @@ extern "C" { ** 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 const char* sqlite3_libversion(void); +SQLITE_API const char* sqlite3_sourceid(void); SQLITE_API int sqlite3_libversion_number(void); /* @@ -516,11 +513,11 @@ SQLITE_API int sqlite3_libversion_number(void); ** [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); +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) +#define sqlite3_compileoption_used(X) 0 +#define sqlite3_compileoption_get(X) ((void*)0) #endif /* @@ -594,18 +591,18 @@ typedef struct sqlite3 sqlite3; ** 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 +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; +typedef __int64 sqlite_int64; +typedef unsigned __int64 sqlite_uint64; #else - typedef long long int sqlite_int64; - typedef unsigned long long int sqlite_uint64; +typedef long long int sqlite_int64; +typedef unsigned long long int sqlite_uint64; #endif typedef sqlite_int64 sqlite3_int64; typedef sqlite_uint64 sqlite3_uint64; @@ -615,7 +612,7 @@ typedef sqlite_uint64 sqlite3_uint64; ** substitute integer for floating-point. */ #ifdef SQLITE_OMIT_FLOATING_POINT -# define double sqlite3_int64 +#define double sqlite3_int64 #endif /* @@ -664,7 +661,7 @@ SQLITE_API int sqlite3_close_v2(sqlite3*); ** This is legacy and deprecated. It is included for historical ** compatibility and is not documented. */ -typedef int (*sqlite3_callback)(void*,int,char**, char**); +typedef int (*sqlite3_callback)(void*, int, char**, char**); /* ** CAPI3REF: One-Step Query Execution Interface @@ -728,12 +725,11 @@ typedef int (*sqlite3_callback)(void*,int,char**, char**); ** 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 */ +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 */ ); /* @@ -747,38 +743,38 @@ SQLITE_API int sqlite3_exec( ** ** See also: [extended result code definitions] */ -#define SQLITE_OK 0 /* Successful result */ +#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 */ +#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 */ /* @@ -798,81 +794,81 @@ SQLITE_API int sqlite3_exec( ** 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 */ +#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 @@ -894,33 +890,32 @@ SQLITE_API int sqlite3_exec( ** [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 */ +#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 */ - +#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* VFS only */ /* ** CAPI3REF: Device Characteristics @@ -955,21 +950,21 @@ SQLITE_API int sqlite3_exec( ** 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 +#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 @@ -978,11 +973,11 @@ SQLITE_API int sqlite3_exec( ** 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 +#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 @@ -1010,9 +1005,9 @@ SQLITE_API int sqlite3_exec( ** 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 +#define SQLITE_SYNC_NORMAL 0x00002 +#define SQLITE_SYNC_FULL 0x00003 +#define SQLITE_SYNC_DATAONLY 0x00010 /* ** CAPI3REF: OS Interface Open File Handle @@ -1027,7 +1022,7 @@ SQLITE_API int sqlite3_exec( */ typedef struct sqlite3_file sqlite3_file; struct sqlite3_file { - const struct sqlite3_io_methods *pMethods; /* Methods for an open file */ + const struct sqlite3_io_methods* pMethods; /* Methods for an open file */ }; /* @@ -1132,11 +1127,11 @@ struct sqlite3_io_methods { 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 (*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 (*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 */ @@ -1145,8 +1140,8 @@ struct sqlite3_io_methods { 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); + 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 */ }; @@ -1490,52 +1485,51 @@ struct sqlite3_io_methods { ** 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 +#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 - +#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 @@ -1731,25 +1725,24 @@ typedef struct sqlite3_api_routines sqlite3_api_routines; 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); + 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 (*xRandomness)(sqlite3_vfs*, int nByte, char* zOut); int (*xSleep)(sqlite3_vfs*, int microseconds); int (*xCurrentTime)(sqlite3_vfs*, double*); - int (*xGetLastError)(sqlite3_vfs*, int, char *); + 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 @@ -1759,9 +1752,9 @@ struct sqlite3_vfs { ** 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); + 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 @@ -1789,9 +1782,9 @@ struct sqlite3_vfs { ** 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 */ +#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 @@ -1815,10 +1808,10 @@ struct sqlite3_vfs { ** 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 +#define SQLITE_SHM_UNLOCK 1 +#define SQLITE_SHM_LOCK 2 +#define SQLITE_SHM_SHARED 4 +#define SQLITE_SHM_EXCLUSIVE 8 /* ** CAPI3REF: Maximum xShmLock index @@ -1828,8 +1821,7 @@ struct sqlite3_vfs { ** The SQLite core will never attempt to acquire or release a ** lock outside of this range */ -#define SQLITE_SHM_NLOCK 8 - +#define SQLITE_SHM_NLOCK 8 /* ** CAPI3REF: Initialize The SQLite Library @@ -2028,14 +2020,14 @@ SQLITE_API int sqlite3_db_config(sqlite3*, int op, ...); */ typedef struct sqlite3_mem_methods sqlite3_mem_methods; struct sqlite3_mem_methods { - void *(*xMalloc)(int); /* Memory allocation function */ + void* (*xMalloc)(int); /* Memory allocation function */ void (*xFree)(void*); /* Free a prior allocation */ - void *(*xRealloc)(void*,int); /* Resize an 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() */ + void* pAppData; /* Argument to xInit() and xShutdown() */ }; /* @@ -2391,35 +2383,35 @@ struct sqlite3_mem_methods { ** 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* */ +#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 */ +#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 @@ -2702,25 +2694,25 @@ struct sqlite3_mem_methods { ** ** */ -#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_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 */ +#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 @@ -2802,7 +2794,7 @@ SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); ** 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); +SQLITE_API void sqlite3_set_last_insert_rowid(sqlite3*, sqlite3_int64); /* ** CAPI3REF: Count The Number Of Rows Modified @@ -2978,8 +2970,8 @@ SQLITE_API void sqlite3_interrupt(sqlite3*); ** 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); +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 @@ -3040,7 +3032,7 @@ SQLITE_API int sqlite3_complete16(const void *sql); ** 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*); +SQLITE_API int sqlite3_busy_handler(sqlite3*, int (*)(void*, int), void*); /* ** CAPI3REF: Set A Busy Timeout @@ -3138,15 +3130,14 @@ SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); ** 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 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); +SQLITE_API void sqlite3_free_table(char** result); /* ** CAPI3REF: Formatted String Printing Functions @@ -3188,10 +3179,10 @@ SQLITE_API void sqlite3_free_table(char **result); ** ** 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); +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 @@ -3268,10 +3259,10 @@ SQLITE_API char *sqlite3_vsnprintf(int,char*,const char*, va_list); ** 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_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*); @@ -3322,7 +3313,7 @@ SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag); ** internally and without recourse to the [sqlite3_vfs] xRandomness ** method. */ -SQLITE_API void sqlite3_randomness(int N, void *P); +SQLITE_API void sqlite3_randomness(int N, void* P); /* ** CAPI3REF: Compile-Time Authorization Callbacks @@ -3413,11 +3404,8 @@ SQLITE_API void sqlite3_randomness(int N, void *P); ** 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 -); +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 @@ -3431,8 +3419,8 @@ SQLITE_API int sqlite3_set_authorizer( ** 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 */ +#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 @@ -3454,40 +3442,40 @@ SQLITE_API int sqlite3_set_authorizer( ** 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 */ +#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 @@ -3521,10 +3509,8 @@ SQLITE_API int sqlite3_set_authorizer( ** 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*); +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 @@ -3578,10 +3564,10 @@ SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*, ** 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 +#define SQLITE_TRACE_STMT 0x01 +#define SQLITE_TRACE_PROFILE 0x02 +#define SQLITE_TRACE_ROW 0x04 +#define SQLITE_TRACE_CLOSE 0x08 /* ** CAPI3REF: SQL Trace Hook @@ -3612,12 +3598,7 @@ SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*, ** 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 -); +SQLITE_API int sqlite3_trace_v2(sqlite3*, unsigned uMask, int (*xCallback)(unsigned, void*, void*, void*), void* pCtx); /* ** CAPI3REF: Query Progress Callbacks @@ -3651,7 +3632,7 @@ SQLITE_API int sqlite3_trace_v2( ** database connections for the meaning of "modify" in this paragraph. ** */ -SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); +SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int (*)(void*), void*); /* ** CAPI3REF: Opening A New Database Connection @@ -3923,19 +3904,16 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** ** 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_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_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 */ +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 */ ); /* @@ -4004,10 +3982,10 @@ SQLITE_API int sqlite3_open_v2( ** ** 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 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); +SQLITE_API const char* sqlite3_uri_key(const char* zFilename, int N); /* ** CAPI3REF: Translate filenames @@ -4036,9 +4014,9 @@ SQLITE_API const char *sqlite3_uri_key(const char *zFilename, int N); ** 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*); +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 @@ -4057,7 +4035,7 @@ SQLITE_API const char *sqlite3_filename_wal(const char*); ** of this routine results in undefined and probably undesirable ** behavior. */ -SQLITE_API sqlite3_file *sqlite3_database_file_object(const char*); +SQLITE_API sqlite3_file* sqlite3_database_file_object(const char*); /* ** CAPI3REF: Create and Destroy VFS Filenames @@ -4104,13 +4082,7 @@ SQLITE_API sqlite3_file *sqlite3_database_file_object(const char*); ** 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 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*); /* @@ -4173,12 +4145,12 @@ SQLITE_API void sqlite3_free_filename(char*); ** 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); +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 @@ -4304,18 +4276,18 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** [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 +#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 @@ -4352,9 +4324,9 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** any virtual tables. ** */ -#define SQLITE_PREPARE_PERSISTENT 0x01 -#define SQLITE_PREPARE_NORMALIZE 0x02 -#define SQLITE_PREPARE_NO_VTAB 0x04 +#define SQLITE_PREPARE_PERSISTENT 0x01 +#define SQLITE_PREPARE_NORMALIZE 0x02 +#define SQLITE_PREPARE_NO_VTAB 0x04 /* ** CAPI3REF: Compiling An SQL Statement @@ -4456,49 +4428,43 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** 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(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_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_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(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_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 */ +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 */ ); /* @@ -4542,10 +4508,10 @@ SQLITE_API int sqlite3_prepare16_v3( ** ^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); +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); +SQLITE_API const char* sqlite3_normalized_sql(sqlite3_stmt* pStmt); #endif /* @@ -4595,7 +4561,7 @@ SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt); ** 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); +SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt* pStmt); /* ** CAPI3REF: Query The EXPLAIN Setting For A Prepared Statement @@ -4607,7 +4573,7 @@ SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); ** ^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); +SQLITE_API int sqlite3_stmt_isexplain(sqlite3_stmt* pStmt); /* ** CAPI3REF: Determine If A Prepared Statement Has Been Reset @@ -4828,19 +4794,17 @@ typedef struct sqlite3_context sqlite3_context; ** 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_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_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_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); @@ -4891,7 +4855,7 @@ SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*); ** [sqlite3_bind_parameter_count()], and ** [sqlite3_bind_parameter_index()]. */ -SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); +SQLITE_API const char* sqlite3_bind_parameter_name(sqlite3_stmt*, int); /* ** CAPI3REF: Index Of A Parameter With A Given Name @@ -4909,7 +4873,7 @@ SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); ** [sqlite3_bind_parameter_count()], and ** [sqlite3_bind_parameter_name()]. */ -SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); +SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt*, const char* zName); /* ** CAPI3REF: Reset All Bindings On A Prepared Statement @@ -4935,7 +4899,7 @@ SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt*); ** ** See also: [sqlite3_data_count()] */ -SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt); +SQLITE_API int sqlite3_column_count(sqlite3_stmt* pStmt); /* ** CAPI3REF: Column Names In A Result Set @@ -4964,8 +4928,8 @@ SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt); ** 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); +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 @@ -5009,12 +4973,12 @@ SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N); ** 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); +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 @@ -5046,8 +5010,8 @@ SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt*,int); ** 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); +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 @@ -5152,7 +5116,7 @@ SQLITE_API int sqlite3_step(sqlite3_stmt*); ** ** See also: [sqlite3_column_count()] */ -SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); +SQLITE_API int sqlite3_data_count(sqlite3_stmt* pStmt); /* ** CAPI3REF: Fundamental Datatypes @@ -5175,16 +5139,16 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** 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 +#define SQLITE_INTEGER 1 +#define SQLITE_FLOAT 2 +#define SQLITE_BLOB 4 +#define SQLITE_NULL 5 #ifdef SQLITE_TEXT -# undef SQLITE_TEXT +#undef SQLITE_TEXT #else -# define SQLITE_TEXT 3 +#define SQLITE_TEXT 3 #endif -#define SQLITE3_TEXT 3 +#define SQLITE3_TEXT 3 /* ** CAPI3REF: Result Values From A Query @@ -5399,13 +5363,13 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** 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 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 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); @@ -5436,7 +5400,7 @@ SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol); ** 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); +SQLITE_API int sqlite3_finalize(sqlite3_stmt* pStmt); /* ** CAPI3REF: Reset A Prepared Statement Object @@ -5463,7 +5427,7 @@ SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt); ** ^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); +SQLITE_API int sqlite3_reset(sqlite3_stmt* pStmt); /* ** CAPI3REF: Create Or Redefine SQL Functions @@ -5588,49 +5552,20 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); ** 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*) -); +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 @@ -5638,12 +5573,12 @@ SQLITE_API int sqlite3_create_window_function( ** 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 */ +#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 @@ -5710,10 +5645,10 @@ SQLITE_API int sqlite3_create_window_function( ** ** */ -#define SQLITE_DETERMINISTIC 0x000000800 -#define SQLITE_DIRECTONLY 0x000080000 -#define SQLITE_SUBTYPE 0x000100000 -#define SQLITE_INNOCUOUS 0x000200000 +#define SQLITE_DETERMINISTIC 0x000000800 +#define SQLITE_DIRECTONLY 0x000080000 +#define SQLITE_SUBTYPE 0x000100000 +#define SQLITE_INNOCUOUS 0x000200000 /* ** CAPI3REF: Deprecated Functions @@ -5731,8 +5666,7 @@ 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); +SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void (*)(void*, sqlite3_int64, int), void*, sqlite3_int64); #endif /* @@ -5863,15 +5797,15 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 ** 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 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 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*); @@ -5906,7 +5840,7 @@ SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value*); ** 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 sqlite3_value* sqlite3_value_dup(const sqlite3_value*); SQLITE_API void sqlite3_value_free(sqlite3_value*); /* @@ -5952,7 +5886,7 @@ SQLITE_API void sqlite3_value_free(sqlite3_value*); ** 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); +SQLITE_API void* sqlite3_aggregate_context(sqlite3_context*, int nBytes); /* ** CAPI3REF: User Data For Functions @@ -5967,7 +5901,7 @@ SQLITE_API void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); ** 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*); +SQLITE_API void* sqlite3_user_data(sqlite3_context*); /* ** CAPI3REF: Database Connection For Functions @@ -5979,7 +5913,7 @@ SQLITE_API void *sqlite3_user_data(sqlite3_context*); ** and [sqlite3_create_function16()] routines that originally ** registered the application defined function. */ -SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); +SQLITE_API sqlite3* sqlite3_context_db_handle(sqlite3_context*); /* ** CAPI3REF: Function Auxiliary Data @@ -6038,10 +5972,9 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); ** 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_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 ** @@ -6057,8 +5990,8 @@ SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(voi ** C++ compilers. */ typedef void (*sqlite3_destructor_type)(void*); -#define SQLITE_STATIC ((sqlite3_destructor_type)0) -#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1) +#define SQLITE_STATIC ((sqlite3_destructor_type)0) +#define SQLITE_TRANSIENT ((sqlite3_destructor_type) - 1) /* ** CAPI3REF: Setting The Result Of An SQL Function @@ -6206,9 +6139,8 @@ typedef void (*sqlite3_destructor_type)(void*); ** 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_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); @@ -6218,18 +6150,16 @@ 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_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_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 @@ -6242,7 +6172,7 @@ SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context*, sqlite3_uint64 n); ** 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); +SQLITE_API void sqlite3_result_subtype(sqlite3_context*, unsigned int); /* ** CAPI3REF: Define New Collating Sequences @@ -6325,28 +6255,12 @@ SQLITE_API void sqlite3_result_subtype(sqlite3_context*,unsigned int); ** ** 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*) -); +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 @@ -6375,24 +6289,15 @@ SQLITE_API int sqlite3_create_collation16( ** [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*) -); +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*)); #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 */ +SQLITE_API void sqlite3_activate_cerod(const char* zPassPhrase /* Activation phrase */ ); #endif @@ -6471,7 +6376,7 @@ SQLITE_API int sqlite3_sleep(int); ** sqlite3_temp_directory = sqlite3_mprintf("%s", zPathBuf); ** */ -SQLITE_API char *sqlite3_temp_directory; +SQLITE_API char* sqlite3_temp_directory; /* ** CAPI3REF: Name Of The Folder Holding Database Files @@ -6508,7 +6413,7 @@ SQLITE_API char *sqlite3_temp_directory; ** 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; +SQLITE_API char* sqlite3_data_directory; /* ** CAPI3REF: Win32 Specific Interface @@ -6529,12 +6434,11 @@ SQLITE_API char *sqlite3_data_directory; ** 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_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); +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 @@ -6542,8 +6446,8 @@ SQLITE_API int sqlite3_win32_set_directory16(unsigned long type, const void *zVa ** 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 +#define SQLITE_WIN32_DATA_DIRECTORY_TYPE 1 +#define SQLITE_WIN32_TEMP_DIRECTORY_TYPE 2 /* ** CAPI3REF: Test For Auto-Commit Mode @@ -6580,7 +6484,7 @@ SQLITE_API int sqlite3_get_autocommit(sqlite3*); ** 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*); +SQLITE_API sqlite3* sqlite3_db_handle(sqlite3_stmt*); /* ** CAPI3REF: Return The Schema Name For A Database Connection @@ -6602,7 +6506,7 @@ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); ** 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); +SQLITE_API const char* sqlite3_db_name(sqlite3* db, int N); /* ** CAPI3REF: Return The Filename For A Database Connection @@ -6634,7 +6538,7 @@ SQLITE_API const char *sqlite3_db_name(sqlite3 *db, int N); **
  • [sqlite3_filename_wal()] ** */ -SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName); +SQLITE_API const char* sqlite3_db_filename(sqlite3* db, const char* zDbName); /* ** CAPI3REF: Determine if a database is read-only @@ -6644,7 +6548,7 @@ SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName); ** 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); +SQLITE_API int sqlite3_db_readonly(sqlite3* db, const char* zDbName); /* ** CAPI3REF: Determine the transaction state of a database @@ -6662,7 +6566,7 @@ SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName); ** ^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); +SQLITE_API int sqlite3_txn_state(sqlite3*, const char* zSchema); /* ** CAPI3REF: Allowed return values from [sqlite3_txn_state()] @@ -6693,8 +6597,8 @@ SQLITE_API int sqlite3_txn_state(sqlite3*,const char *zSchema); ** 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_NONE 0 +#define SQLITE_TXN_READ 1 #define SQLITE_TXN_WRITE 2 /* @@ -6711,7 +6615,7 @@ SQLITE_API int sqlite3_txn_state(sqlite3*,const char *zSchema); ** [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); +SQLITE_API sqlite3_stmt* sqlite3_next_stmt(sqlite3* pDb, sqlite3_stmt* pStmt); /* ** CAPI3REF: Commit And Rollback Notification Callbacks @@ -6760,8 +6664,8 @@ SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt); ** ** 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*); +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 @@ -6821,13 +6725,8 @@ SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); **   } ** */ -SQLITE_API int sqlite3_autovacuum_pages( - sqlite3 *db, - unsigned int(*)(void*,const char*,unsigned int,unsigned int,unsigned int), - void*, - void(*)(void*) -); - +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 @@ -6878,11 +6777,7 @@ SQLITE_API int sqlite3_autovacuum_pages( ** 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* -); +SQLITE_API void* sqlite3_update_hook(sqlite3*, void (*)(void*, int, char const*, char const*, sqlite3_int64), void*); /* ** CAPI3REF: Enable Or Disable Shared Pager Cache @@ -7033,7 +6928,6 @@ SQLITE_API sqlite3_int64 sqlite3_hard_heap_limit64(sqlite3_int64 N); */ SQLITE_API SQLITE_DEPRECATED void sqlite3_soft_heap_limit(int N); - /* ** CAPI3REF: Extract Metadata About A Column Of A Table ** METHOD: sqlite3 @@ -7103,16 +6997,15 @@ SQLITE_API SQLITE_DEPRECATED void sqlite3_soft_heap_limit(int N); ** 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 */ +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 */ ); /* @@ -7159,11 +7052,10 @@ SQLITE_API int sqlite3_table_column_metadata( ** ** 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 */ +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 */ ); /* @@ -7191,7 +7083,7 @@ SQLITE_API int sqlite3_load_extension( ** 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); +SQLITE_API int sqlite3_enable_load_extension(sqlite3* db, int onoff); /* ** CAPI3REF: Automatically Load Statically Linked Extensions @@ -7229,7 +7121,7 @@ SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); ** See also: [sqlite3_reset_auto_extension()] ** and [sqlite3_cancel_auto_extension()] */ -SQLITE_API int sqlite3_auto_extension(void(*xEntryPoint)(void)); +SQLITE_API int sqlite3_auto_extension(void (*xEntryPoint)(void)); /* ** CAPI3REF: Cancel Automatic Extension Loading @@ -7241,7 +7133,7 @@ SQLITE_API int sqlite3_auto_extension(void(*xEntryPoint)(void)); ** 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)); +SQLITE_API int sqlite3_cancel_auto_extension(void (*xEntryPoint)(void)); /* ** CAPI3REF: Reset Automatic Extension Loading @@ -7286,37 +7178,31 @@ typedef struct sqlite3_module sqlite3_module; */ 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 (*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 (*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); + 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); + 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*); @@ -7426,34 +7312,34 @@ struct sqlite3_module { */ struct sqlite3_index_info { /* Inputs */ - int nConstraint; /* Number of entries in aConstraint */ + 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 */ + 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 */ + 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 */ + 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 */ + 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 */ + 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 */ + sqlite3_uint64 colUsed; /* Input: Mask of columns used by statement */ }; /* @@ -7463,7 +7349,7 @@ struct sqlite3_index_info { ** [sqlite3_index_info].idxFlags field to some combination of ** these bits. */ -#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */ +#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */ /* ** CAPI3REF: Virtual Table Constraint Operator Codes @@ -7503,23 +7389,23 @@ struct sqlite3_index_info { ** 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 +#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 @@ -7553,18 +7439,16 @@ struct sqlite3_index_info { ** ** 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(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 */ +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 */ ); /* @@ -7579,9 +7463,8 @@ SQLITE_API int sqlite3_create_module_v2( ** ** 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 */ +SQLITE_API int sqlite3_drop_modules(sqlite3* db, /* Remove modules from this connection */ + const char** azKeep /* Except, do not remove the ones named here */ ); /* @@ -7603,9 +7486,9 @@ SQLITE_API int sqlite3_drop_modules( ** 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() */ + 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 */ }; @@ -7627,7 +7510,7 @@ struct sqlite3_vtab { ** are common to all implementations. */ struct sqlite3_vtab_cursor { - sqlite3_vtab *pVtab; /* Virtual table of this cursor */ + sqlite3_vtab* pVtab; /* Virtual table of this cursor */ /* Virtual table implementations will typically add additional fields */ }; @@ -7639,7 +7522,7 @@ struct sqlite3_vtab_cursor { ** 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); +SQLITE_API int sqlite3_declare_vtab(sqlite3*, const char* zSQL); /* ** CAPI3REF: Overload A Function For A Virtual Table @@ -7658,7 +7541,7 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3*, const char *zSQL); ** 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); +SQLITE_API int sqlite3_overload_function(sqlite3*, const char* zFuncName, int nArg); /* ** The interface to the virtual-table mechanism defined above (back up @@ -7767,15 +7650,8 @@ typedef struct sqlite3_blob sqlite3_blob; ** [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 -); +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 @@ -7800,7 +7676,7 @@ SQLITE_API int sqlite3_blob_open( ** ** ^This function sets the database handle error code and message. */ -SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); +SQLITE_API int sqlite3_blob_reopen(sqlite3_blob*, sqlite3_int64); /* ** CAPI3REF: Close A BLOB Handle @@ -7823,7 +7699,7 @@ SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); ** 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 *); +SQLITE_API int sqlite3_blob_close(sqlite3_blob*); /* ** CAPI3REF: Return The Size Of An Open BLOB @@ -7839,7 +7715,7 @@ SQLITE_API int sqlite3_blob_close(sqlite3_blob *); ** 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 *); +SQLITE_API int sqlite3_blob_bytes(sqlite3_blob*); /* ** CAPI3REF: Read Data From A BLOB Incrementally @@ -7868,7 +7744,7 @@ SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *); ** ** See also: [sqlite3_blob_write()]. */ -SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); +SQLITE_API int sqlite3_blob_read(sqlite3_blob*, void* Z, int N, int iOffset); /* ** CAPI3REF: Write Data Into A BLOB Incrementally @@ -7910,7 +7786,7 @@ SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); ** ** See also: [sqlite3_blob_read()]. */ -SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset); +SQLITE_API int sqlite3_blob_write(sqlite3_blob*, const void* z, int n, int iOffset); /* ** CAPI3REF: Virtual File System Objects @@ -7941,7 +7817,7 @@ SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOff ** ^(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 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*); @@ -8059,7 +7935,7 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); ** ** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()]. */ -SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int); +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*); @@ -8134,13 +8010,13 @@ 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 *); + 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*); }; /* @@ -8187,26 +8063,25 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*); ** 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 */ +#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 - +#define SQLITE_MUTEX_STATIC_MASTER 2 /* ** CAPI3REF: Retrieve the mutex for a database connection @@ -8218,7 +8093,7 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*); ** ^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*); +SQLITE_API sqlite3_mutex* sqlite3_db_mutex(sqlite3*); /* ** CAPI3REF: Low-Level Control Of Database Files @@ -8261,7 +8136,7 @@ SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); ** ** See also: [file control opcodes] */ -SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*); +SQLITE_API int sqlite3_file_control(sqlite3*, const char* zDbName, int op, void*); /* ** CAPI3REF: Testing Interface @@ -8293,39 +8168,39 @@ SQLITE_API int sqlite3_test_control(int op, ...); ** 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 */ +#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 @@ -8375,8 +8250,8 @@ SQLITE_API int sqlite3_test_control(int op, ...); ** 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); +SQLITE_API int sqlite3_keyword_name(int, const char**, int*); +SQLITE_API int sqlite3_keyword_check(const char*, int); /* ** CAPI3REF: Dynamic String Object @@ -8421,7 +8296,7 @@ typedef struct sqlite3_str sqlite3_str; ** the value set for [sqlite3_limit](D,[SQLITE_LIMIT_LENGTH]) instead ** of [SQLITE_MAX_LENGTH]. */ -SQLITE_API sqlite3_str *sqlite3_str_new(sqlite3*); +SQLITE_API sqlite3_str* sqlite3_str_new(sqlite3*); /* ** CAPI3REF: Finalize A Dynamic String @@ -8436,7 +8311,7 @@ SQLITE_API sqlite3_str *sqlite3_str_new(sqlite3*); ** [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*); +SQLITE_API char* sqlite3_str_finish(sqlite3_str*); /* ** CAPI3REF: Add Content To A Dynamic String @@ -8470,10 +8345,10 @@ SQLITE_API char *sqlite3_str_finish(sqlite3_str*); ** 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_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*); @@ -8508,7 +8383,7 @@ SQLITE_API void sqlite3_str_reset(sqlite3_str*); */ SQLITE_API int sqlite3_str_errcode(sqlite3_str*); SQLITE_API int sqlite3_str_length(sqlite3_str*); -SQLITE_API char *sqlite3_str_value(sqlite3_str*); +SQLITE_API char* sqlite3_str_value(sqlite3_str*); /* ** CAPI3REF: SQLite Runtime Status @@ -8536,14 +8411,8 @@ SQLITE_API char *sqlite3_str_value(sqlite3_str*); ** ** 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 -); - +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 @@ -8612,16 +8481,16 @@ SQLITE_API int sqlite3_status64( ** ** 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 +#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 @@ -8646,7 +8515,7 @@ SQLITE_API int sqlite3_status64( ** ** See also: [sqlite3_status()] and [sqlite3_stmt_status()]. */ -SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); +SQLITE_API int sqlite3_db_status(sqlite3*, int op, int* pCur, int* pHiwtr, int resetFlg); /* ** CAPI3REF: Status Parameters for database connections @@ -8759,21 +8628,20 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** ** */ -#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 */ - +#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 @@ -8799,7 +8667,7 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** ** See also: [sqlite3_status()] and [sqlite3_db_status()]. */ -SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); +SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op, int resetFlg); /* ** CAPI3REF: Status Parameters for prepared statements @@ -8866,15 +8734,15 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); ** ** */ -#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 +#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 @@ -8901,8 +8769,8 @@ typedef struct sqlite3_pcache sqlite3_pcache; */ 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 */ + void* pBuf; /* The content of the page */ + void* pExtra; /* Extra information associated with the page */ }; /* @@ -9067,16 +8935,15 @@ struct sqlite3_pcache_page { typedef struct sqlite3_pcache_methods2 sqlite3_pcache_methods2; struct sqlite3_pcache_methods2 { int iVersion; - void *pArg; + void* pArg; int (*xInit)(void*); void (*xShutdown)(void*); - sqlite3_pcache *(*xCreate)(int szPage, int szExtra, int bPurgeable); + 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); + 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 (*xRekey)(sqlite3_pcache*, sqlite3_pcache_page*, unsigned oldKey, unsigned newKey); void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); void (*xDestroy)(sqlite3_pcache*); void (*xShrink)(sqlite3_pcache*); @@ -9089,20 +8956,19 @@ struct sqlite3_pcache_methods2 { */ typedef struct sqlite3_pcache_methods sqlite3_pcache_methods; struct sqlite3_pcache_methods { - void *pArg; + void* pArg; int (*xInit)(void*); void (*xShutdown)(void*); - sqlite3_pcache *(*xCreate)(int szPage, int bPurgeable); + 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* (*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 ** @@ -9301,16 +9167,15 @@ typedef struct sqlite3_backup sqlite3_backup; ** 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 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); +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 @@ -9427,13 +9292,11 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); ** 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 */ +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 ** @@ -9442,8 +9305,8 @@ SQLITE_API int sqlite3_unlock_notify( ** 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); +SQLITE_API int sqlite3_stricmp(const char*, const char*); +SQLITE_API int sqlite3_strnicmp(const char*, const char*, int); /* ** CAPI3REF: String Globbing @@ -9460,7 +9323,7 @@ SQLITE_API int sqlite3_strnicmp(const char *, const char *, int); ** ** See also: [sqlite3_strlike()]. */ -SQLITE_API int sqlite3_strglob(const char *zGlob, const char *zStr); +SQLITE_API int sqlite3_strglob(const char* zGlob, const char* zStr); /* ** CAPI3REF: String LIKE Matching @@ -9483,7 +9346,7 @@ SQLITE_API int sqlite3_strglob(const char *zGlob, const char *zStr); ** ** See also: [sqlite3_strglob()]. */ -SQLITE_API int sqlite3_strlike(const char *zGlob, const char *zStr, unsigned int cEsc); +SQLITE_API int sqlite3_strlike(const char* zGlob, const char* zStr, unsigned int cEsc); /* ** CAPI3REF: Error Logging Interface @@ -9506,7 +9369,7 @@ SQLITE_API int sqlite3_strlike(const char *zGlob, const char *zStr, unsigned int ** a few hundred characters, it will be truncated to the length of the ** buffer. */ -SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); +SQLITE_API void sqlite3_log(int iErrCode, const char* zFormat, ...); /* ** CAPI3REF: Write-Ahead Log Commit Hook @@ -9543,11 +9406,7 @@ SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); ** [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* -); +SQLITE_API void* sqlite3_wal_hook(sqlite3*, int (*)(void*, sqlite3*, const char*, int), void*); /* ** CAPI3REF: Configure an auto-checkpoint @@ -9578,7 +9437,7 @@ SQLITE_API void *sqlite3_wal_hook( ** 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); +SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3* db, int N); /* ** CAPI3REF: Checkpoint a database @@ -9600,7 +9459,7 @@ SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int N); ** 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); +SQLITE_API int sqlite3_wal_checkpoint(sqlite3* db, const char* zDb); /* ** CAPI3REF: Checkpoint a database @@ -9694,12 +9553,11 @@ SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb); ** ^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 */ +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 */ ); /* @@ -9711,10 +9569,10 @@ SQLITE_API int sqlite3_wal_checkpoint_v2( ** 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 */ +#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 @@ -9799,8 +9657,8 @@ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); ** */ #define SQLITE_VTAB_CONSTRAINT_SUPPORT 1 -#define SQLITE_VTAB_INNOCUOUS 2 -#define SQLITE_VTAB_DIRECTONLY 3 +#define SQLITE_VTAB_INNOCUOUS 2 +#define SQLITE_VTAB_DIRECTONLY 3 /* ** CAPI3REF: Determine The Virtual Table Conflict Policy @@ -9812,7 +9670,7 @@ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); ** of the SQL statement that triggered the call to the [xUpdate] method of the ** [virtual table]. */ -SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *); +SQLITE_API int sqlite3_vtab_on_conflict(sqlite3*); /* ** CAPI3REF: Determine If Virtual Table Column Access Is For UPDATE @@ -9873,7 +9731,7 @@ SQLITE_API int sqlite3_vtab_nochange(sqlite3_context*); **
  • Otherwise, "BINARY" is returned. ** */ -SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_info*,int); +SQLITE_API SQLITE_EXPERIMENTAL const char* sqlite3_vtab_collation(sqlite3_index_info*, int); /* ** CAPI3REF: Determine if a virtual table query is DISTINCT @@ -10067,8 +9925,8 @@ SQLITE_API int sqlite3_vtab_in(sqlite3_index_info*, int iCons, int bHandle); ** 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); +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() @@ -10110,7 +9968,7 @@ SQLITE_API int sqlite3_vtab_in_next(sqlite3_value *pVal, sqlite3_value **ppOut); ** 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); +SQLITE_API int sqlite3_vtab_rhs_value(sqlite3_index_info*, int, sqlite3_value** ppVal); /* ** CAPI3REF: Conflict resolution modes @@ -10126,9 +9984,9 @@ SQLITE_API int sqlite3_vtab_rhs_value(sqlite3_index_info*, int, sqlite3_value ** */ #define SQLITE_ROLLBACK 1 /* #define SQLITE_IGNORE 2 // Also used by sqlite3_authorizer() callback */ -#define SQLITE_FAIL 3 +#define SQLITE_FAIL 3 /* #define SQLITE_ABORT 4 // Also an error code */ -#define SQLITE_REPLACE 5 +#define SQLITE_REPLACE 5 /* ** CAPI3REF: Prepared Statement Scan Status Opcodes @@ -10177,11 +10035,11 @@ SQLITE_API int sqlite3_vtab_rhs_value(sqlite3_index_info*, int, sqlite3_value ** ** 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_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 /* @@ -10215,11 +10073,10 @@ SQLITE_API int sqlite3_vtab_rhs_value(sqlite3_index_info*, int, sqlite3_value ** ** ** 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 */ +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 */ ); /* @@ -10359,24 +10216,21 @@ SQLITE_API int sqlite3_db_cacheflush(sqlite3*); ** 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 *); +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 /* @@ -10459,11 +10313,7 @@ typedef struct sqlite3_snapshot { ** 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 -); +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 @@ -10508,11 +10358,7 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_get( ** 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 -); +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_open(sqlite3* db, const char* zSchema, sqlite3_snapshot* pSnapshot); /* ** CAPI3REF: Destroy a snapshot @@ -10552,10 +10398,7 @@ SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_snapshot_free(sqlite3_snapshot*); ** 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 -); +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp(sqlite3_snapshot* p1, sqlite3_snapshot* p2); /* ** CAPI3REF: Recover snapshots from a wal file @@ -10580,7 +10423,7 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp( ** 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); +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3* db, const char* zDb); /* ** CAPI3REF: Serialize a database @@ -10618,11 +10461,10 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const c ** 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 */ +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 */ ); /* @@ -10639,7 +10481,7 @@ SQLITE_API unsigned char *sqlite3_serialize( ** 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 */ +#define SQLITE_SERIALIZE_NOCOPY 0x001 /* Do no memory allocations */ /* ** CAPI3REF: Deserialize a database @@ -10674,13 +10516,12 @@ SQLITE_API unsigned char *sqlite3_serialize( ** 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 */ +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 */ ); /* @@ -10705,15 +10546,15 @@ SQLITE_API int sqlite3_deserialize( ** 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 */ +#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 +#undef double #endif #if 0 @@ -10738,7 +10579,6 @@ SQLITE_API int sqlite3_deserialize( #ifndef _SQLITE3RTREE_H_ #define _SQLITE3RTREE_H_ - #if 0 extern "C" { #endif @@ -10750,9 +10590,9 @@ typedef struct sqlite3_rtree_query_info sqlite3_rtree_query_info; ** SQLITE_RTREE_INT_ONLY compile-time option. */ #ifdef SQLITE_RTREE_INT_ONLY - typedef sqlite3_int64 sqlite3_rtree_dbl; +typedef sqlite3_int64 sqlite3_rtree_dbl; #else - typedef double sqlite3_rtree_dbl; +typedef double sqlite3_rtree_dbl; #endif /* @@ -10761,24 +10601,19 @@ typedef struct sqlite3_rtree_query_info sqlite3_rtree_query_info; ** ** 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 -); - +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 */ + 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 */ }; /* @@ -10787,14 +10622,8 @@ struct sqlite3_rtree_geometry { ** ** 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*) -); - +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 @@ -10806,38 +10635,37 @@ SQLITE_API int sqlite3_rtree_query_callback( ** 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 */ + 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 */ + 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 */ - +#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_ */ +#endif /* ifndef _SQLITE3RTREE_H_ */ /******** End of sqlite3rtree.h *********/ /******** Begin file sqlite3session.h *********/ @@ -10852,7 +10680,6 @@ struct sqlite3_rtree_query_info { extern "C" { #endif - /* ** CAPI3REF: Session Object Handle ** @@ -10900,10 +10727,9 @@ typedef struct sqlite3_changeset_iter sqlite3_changeset_iter; ** 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 */ +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 */ ); /* @@ -10919,7 +10745,7 @@ SQLITE_API int sqlite3session_create( ** are attached is closed. Refer to the documentation for ** [sqlite3session_create()] for details. */ -SQLITE_API void sqlite3session_delete(sqlite3_session *pSession); +SQLITE_API void sqlite3session_delete(sqlite3_session* pSession); /* ** CAPIREF: Conigure a Session Object @@ -10948,10 +10774,10 @@ SQLITE_API void sqlite3session_delete(sqlite3_session *pSession); ** 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); +SQLITE_API int sqlite3session_object_config(sqlite3_session*, int op, void* pArg); /* -*/ + */ #define SQLITE_SESSION_OBJCONFIG_SIZE 1 /* @@ -10972,7 +10798,7 @@ SQLITE_API int sqlite3session_object_config(sqlite3_session*, int op, void *pArg ** 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); +SQLITE_API int sqlite3session_enable(sqlite3_session* pSession, int bEnable); /* ** CAPI3REF: Set Or Clear the Indirect Change Flag @@ -11002,7 +10828,7 @@ SQLITE_API int sqlite3session_enable(sqlite3_session *pSession, int bEnable); ** 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); +SQLITE_API int sqlite3session_indirect(sqlite3_session* pSession, int bIndirect); /* ** CAPI3REF: Attach A Table To A Session Object @@ -11062,9 +10888,8 @@ SQLITE_API int sqlite3session_indirect(sqlite3_session *pSession, int bIndirect) ** 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 */ +SQLITE_API int sqlite3session_attach(sqlite3_session* pSession, /* Session object */ + const char* zTab /* Table name */ ); /* @@ -11077,13 +10902,11 @@ SQLITE_API int sqlite3session_attach( ** 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 */ +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 */ ); /* @@ -11191,10 +11014,9 @@ SQLITE_API void sqlite3session_table_filter( ** 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 */ +SQLITE_API int sqlite3session_changeset(sqlite3_session* pSession, /* Session object */ + int* pnChangeset, /* OUT: Size of buffer at *ppChangeset */ + void** ppChangeset /* OUT: Buffer containing changeset */ ); /* @@ -11211,7 +11033,7 @@ SQLITE_API int sqlite3session_changeset( ** 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); +SQLITE_API sqlite3_int64 sqlite3session_changeset_size(sqlite3_session* pSession); /* ** CAPI3REF: Load The Difference Between Tables Into A Session @@ -11270,13 +11092,7 @@ SQLITE_API sqlite3_int64 sqlite3session_changeset_size(sqlite3_session *pSession ** 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 -); - +SQLITE_API int sqlite3session_diff(sqlite3_session* pSession, const char* zFromDb, const char* zTbl, char** pzErrMsg); /* ** CAPI3REF: Generate A Patchset From A Session Object @@ -11307,10 +11123,9 @@ SQLITE_API int sqlite3session_diff( ** 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 */ +SQLITE_API int sqlite3session_patchset(sqlite3_session* pSession, /* Session object */ + int* pnPatchset, /* OUT: Size of buffer at *ppPatchset */ + void** ppPatchset /* OUT: Buffer containing patchset */ ); /* @@ -11328,7 +11143,7 @@ SQLITE_API int sqlite3session_patchset( ** guaranteed that a call to sqlite3session_changeset() will return a ** changeset containing zero changes. */ -SQLITE_API int sqlite3session_isempty(sqlite3_session *pSession); +SQLITE_API int sqlite3session_isempty(sqlite3_session* pSession); /* ** CAPI3REF: Query for the amount of heap memory used by a session object. @@ -11336,7 +11151,7 @@ SQLITE_API int sqlite3session_isempty(sqlite3_session *pSession); ** 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); +SQLITE_API sqlite3_int64 sqlite3session_memory_used(sqlite3_session* pSession); /* ** CAPI3REF: Create An Iterator To Traverse A Changeset @@ -11379,16 +11194,14 @@ SQLITE_API sqlite3_int64 sqlite3session_memory_used(sqlite3_session *pSession); ** 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(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 */ +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 */ ); /* @@ -11402,8 +11215,7 @@ SQLITE_API int sqlite3changeset_start_v2( ** 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 - +#define SQLITE_CHANGESETSTART_INVERT 0x0002 /* ** CAPI3REF: Advance A Changeset Iterator @@ -11428,7 +11240,7 @@ SQLITE_API int sqlite3changeset_start_v2( ** codes include SQLITE_CORRUPT (if the changeset buffer is corrupt) or ** SQLITE_NOMEM. */ -SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *pIter); +SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter* pIter); /* ** CAPI3REF: Obtain The Current Operation From A Changeset Iterator @@ -11462,12 +11274,11 @@ SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *pIter); ** 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 */ +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 */ ); /* @@ -11496,10 +11307,9 @@ SQLITE_API int sqlite3changeset_op( ** 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 */ +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 */ ); /* @@ -11527,10 +11337,9 @@ SQLITE_API int sqlite3changeset_pk( ** 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) */ +SQLITE_API int sqlite3changeset_old(sqlite3_changeset_iter* pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value** ppValue /* OUT: Old value (or NULL pointer) */ ); /* @@ -11561,10 +11370,9 @@ SQLITE_API int sqlite3changeset_old( ** 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) */ +SQLITE_API int sqlite3changeset_new(sqlite3_changeset_iter* pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value** ppValue /* OUT: New value (or NULL pointer) */ ); /* @@ -11589,10 +11397,9 @@ SQLITE_API int sqlite3changeset_new( ** 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 */ +SQLITE_API int sqlite3changeset_conflict(sqlite3_changeset_iter* pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value** ppValue /* OUT: Value from conflicting row */ ); /* @@ -11606,12 +11413,10 @@ SQLITE_API int sqlite3changeset_conflict( ** ** 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 */ +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 @@ -11642,7 +11447,7 @@ SQLITE_API int sqlite3changeset_fk_conflicts( ** } ** */ -SQLITE_API int sqlite3changeset_finalize(sqlite3_changeset_iter *pIter); +SQLITE_API int sqlite3changeset_finalize(sqlite3_changeset_iter* pIter); /* ** CAPI3REF: Invert A Changeset @@ -11672,9 +11477,8 @@ SQLITE_API int sqlite3changeset_finalize(sqlite3_changeset_iter *pIter); ** 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 */ +SQLITE_API int sqlite3changeset_invert(int nIn, const void* pIn, /* Input changeset */ + int* pnOut, void** ppOut /* OUT: Inverse of input */ ); /* @@ -11703,16 +11507,14 @@ SQLITE_API int sqlite3changeset_invert( ** ** 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 */ +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 ** @@ -11757,7 +11559,7 @@ typedef struct sqlite3_changegroup sqlite3_changegroup; ** sqlite3changegroup_output() functions, also available are the streaming ** versions sqlite3changegroup_add_strm() and sqlite3changegroup_output_strm(). */ -SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp); +SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup** pp); /* ** CAPI3REF: Add A Changeset To A Changegroup @@ -11835,7 +11637,7 @@ SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp); ** ** If no error occurs, SQLITE_OK is returned. */ -SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pData); +SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void* pData); /* ** CAPI3REF: Obtain A Composite Changeset From A Changegroup @@ -11862,10 +11664,8 @@ SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pDa ** 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 */ +SQLITE_API int sqlite3changegroup_output(sqlite3_changegroup*, int* pnData, /* OUT: Size of output buffer in bytes */ + void** ppData /* OUT: Pointer to output buffer */ ); /* @@ -12032,37 +11832,31 @@ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); ** 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(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 */ +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 */ ); /* @@ -12086,8 +11880,8 @@ SQLITE_API int sqlite3changeset_apply_v2( ** 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 +#define SQLITE_CHANGESETAPPLY_NOSAVEPOINT 0x0001 +#define SQLITE_CHANGESETAPPLY_INVERT 0x0002 /* ** CAPI3REF: Constants Passed To The Conflict Handler @@ -12144,10 +11938,10 @@ SQLITE_API int sqlite3changeset_apply_v2( ** ** */ -#define SQLITE_CHANGESET_DATA 1 -#define SQLITE_CHANGESET_NOTFOUND 2 -#define SQLITE_CHANGESET_CONFLICT 3 -#define SQLITE_CHANGESET_CONSTRAINT 4 +#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 /* @@ -12181,9 +11975,9 @@ SQLITE_API int sqlite3changeset_apply_v2( ** and the call to sqlite3changeset_apply() returns SQLITE_ABORT. ** */ -#define SQLITE_CHANGESET_OMIT 0 -#define SQLITE_CHANGESET_REPLACE 1 -#define SQLITE_CHANGESET_ABORT 2 +#define SQLITE_CHANGESET_OMIT 0 +#define SQLITE_CHANGESET_REPLACE 1 +#define SQLITE_CHANGESET_ABORT 2 /* ** CAPI3REF: Rebasing changesets @@ -12294,7 +12088,7 @@ typedef struct sqlite3_rebaser sqlite3_rebaser; ** occurs, return an SQLite error code (e.g. SQLITE_NOMEM) and set (*ppNew) ** to NULL. */ -SQLITE_API int sqlite3rebaser_create(sqlite3_rebaser **ppNew); +SQLITE_API int sqlite3rebaser_create(sqlite3_rebaser** ppNew); /* ** CAPI3REF: Configure a changeset rebaser object. @@ -12305,10 +12099,7 @@ SQLITE_API int sqlite3rebaser_create(sqlite3_rebaser **ppNew); ** 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 -); +SQLITE_API int sqlite3rebaser_configure(sqlite3_rebaser*, int nRebase, const void* pRebase); /* ** CAPI3REF: Rebase a changeset @@ -12324,11 +12115,7 @@ SQLITE_API int sqlite3rebaser_configure( ** 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 -); +SQLITE_API int sqlite3rebaser_rebase(sqlite3_rebaser*, int nIn, const void* pIn, int* pnOut, void** ppOut); /* ** CAPI3REF: Delete a changeset rebaser object. @@ -12338,7 +12125,7 @@ SQLITE_API int sqlite3rebaser_rebase( ** should be one call to this function for each successful invocation ** of sqlite3rebaser_create(). */ -SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p); +SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser* p); /* ** CAPI3REF: Streaming Versions of API functions. @@ -12430,88 +12217,46 @@ SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p); ** 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 +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 @@ -12546,7 +12291,7 @@ SQLITE_API int sqlite3rebaser_rebase_strm( ** This function returns SQLITE_OK if successful, or an SQLite error code ** otherwise. */ -SQLITE_API int sqlite3session_config(int op, void *pArg); +SQLITE_API int sqlite3session_config(int op, void* pArg); /* ** CAPI3REF: Values for sqlite3session_config(). @@ -12560,7 +12305,7 @@ SQLITE_API int sqlite3session_config(int op, void *pArg); } #endif -#endif /* !defined(__SQLITESESSION_H_) && defined(SQLITE_ENABLE_SESSION) */ +#endif /* !defined(__SQLITESESSION_H_) && defined(SQLITE_ENABLE_SESSION) */ /******** End of sqlite3session.h *********/ /******** Begin file fts5.h *********/ @@ -12583,11 +12328,9 @@ SQLITE_API int sqlite3session_config(int op, void *pArg); ** * custom auxiliary functions. */ - #ifndef _FTS5_H #define _FTS5_H - #if 0 extern "C" { #endif @@ -12603,17 +12346,16 @@ 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 */ +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; + const unsigned char* a; + const unsigned char* b; }; /* @@ -12828,41 +12570,38 @@ struct Fts5PhraseIter { ** See xPhraseFirstColumn above. */ struct Fts5ExtensionApi { - int iVersion; /* Currently always set to 3 */ + int iVersion; /* Currently always set to 3 */ - void *(*xUserData)(Fts5Context*); + void* (*xUserData)(Fts5Context*); int (*xColumnCount)(Fts5Context*); - int (*xRowCount)(Fts5Context*, sqlite3_int64 *pnRow); - int (*xColumnTotalSize)(Fts5Context*, int iCol, sqlite3_int64 *pnToken); + 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 (*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); + 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 (*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 (*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); + void (*xPhraseNext)(Fts5Context*, Fts5PhraseIter*, int* piCol, int* piOff); int (*xPhraseFirstColumn)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*); - void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int *piCol); + void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int* piCol); }; /* @@ -13064,32 +12803,28 @@ struct Fts5ExtensionApi { typedef struct Fts5Tokenizer Fts5Tokenizer; typedef struct fts5_tokenizer fts5_tokenizer; struct fts5_tokenizer { - int (*xCreate)(void*, const char **azArg, int nArg, Fts5Tokenizer **ppOut); + 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 */ - ) - ); + 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 +#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 */ +#define FTS5_TOKEN_COLOCATED 0x0001 /* Same position as prev. token */ /* ** END OF CUSTOM TOKENIZERS @@ -13100,33 +12835,16 @@ struct fts5_tokenizer { */ typedef struct fts5_api fts5_api; struct fts5_api { - int iVersion; /* Currently always set to 2 */ + 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*) - ); + 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 - ); + 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*) - ); + int (*xCreateFunction)(fts5_api* pApi, const char* zName, void* pContext, fts5_extension_function xFunction, void (*xDestroy)(void*)); }; /* @@ -13183,7 +12901,7 @@ struct fts5_api { ** to count the size: 2^31-1 or 2147483647. */ #ifndef SQLITE_MAX_LENGTH -# define SQLITE_MAX_LENGTH 1000000000 +#define SQLITE_MAX_LENGTH 1000000000 #endif /* @@ -13204,7 +12922,7 @@ struct fts5_api { ** dozen values in any of the other situations described above. */ #ifndef SQLITE_MAX_COLUMN -# define SQLITE_MAX_COLUMN 2000 +#define SQLITE_MAX_COLUMN 2000 #endif /* @@ -13215,7 +12933,7 @@ struct fts5_api { ** to turn this limit off. */ #ifndef SQLITE_MAX_SQL_LENGTH -# define SQLITE_MAX_SQL_LENGTH 1000000000 +#define SQLITE_MAX_SQL_LENGTH 1000000000 #endif /* @@ -13225,7 +12943,7 @@ struct fts5_api { ** expression. A value of 0 means that there is no limit. */ #ifndef SQLITE_MAX_EXPR_DEPTH -# define SQLITE_MAX_EXPR_DEPTH 1000 +#define SQLITE_MAX_EXPR_DEPTH 1000 #endif /* @@ -13237,7 +12955,7 @@ struct fts5_api { ** any limit on the number of terms in a compount SELECT. */ #ifndef SQLITE_MAX_COMPOUND_SELECT -# define SQLITE_MAX_COMPOUND_SELECT 500 +#define SQLITE_MAX_COMPOUND_SELECT 500 #endif /* @@ -13245,14 +12963,14 @@ struct fts5_api { ** Not currently enforced. */ #ifndef SQLITE_MAX_VDBE_OP -# define SQLITE_MAX_VDBE_OP 250000000 +#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 +#define SQLITE_MAX_FUNCTION_ARG 127 #endif /* @@ -13265,7 +12983,7 @@ struct fts5_api { ** altered using the SQLITE_DEFAULT_CACHE_SIZE compile-time options. */ #ifndef SQLITE_DEFAULT_CACHE_SIZE -# define SQLITE_DEFAULT_CACHE_SIZE -2000 +#define SQLITE_DEFAULT_CACHE_SIZE -2000 #endif /* @@ -13273,7 +12991,7 @@ struct fts5_api { ** checkpointing the database in WAL mode. */ #ifndef SQLITE_DEFAULT_WAL_AUTOCHECKPOINT -# define SQLITE_DEFAULT_WAL_AUTOCHECKPOINT 1000 +#define SQLITE_DEFAULT_WAL_AUTOCHECKPOINT 1000 #endif /* @@ -13283,10 +13001,9 @@ struct fts5_api { ** and we have to allow 2 extra counts for the "main" and "temp" databases. */ #ifndef SQLITE_MAX_ATTACHED -# define SQLITE_MAX_ATTACHED 10 +#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 @@ -13294,7 +13011,7 @@ struct fts5_api { ** as a signed 32-bit integer can hold. */ #ifndef SQLITE_MAX_VARIABLE_NUMBER -# define SQLITE_MAX_VARIABLE_NUMBER 32766 +#define SQLITE_MAX_VARIABLE_NUMBER 32766 #endif /* Maximum page size. The upper bound on this value is 65536. This a limit @@ -13309,20 +13026,19 @@ struct fts5_api { ** the aborted transaction. This could lead to database corruption. */ #ifdef SQLITE_MAX_PAGE_SIZE -# undef 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 +#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 +#if SQLITE_DEFAULT_PAGE_SIZE > SQLITE_MAX_PAGE_SIZE +#undef SQLITE_DEFAULT_PAGE_SIZE +#define SQLITE_DEFAULT_PAGE_SIZE SQLITE_MAX_PAGE_SIZE #endif /* @@ -13333,14 +13049,13 @@ struct fts5_api { ** SQLite will choose on its own. */ #ifndef SQLITE_MAX_DEFAULT_PAGE_SIZE -# define SQLITE_MAX_DEFAULT_PAGE_SIZE 8192 +#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 +#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. ** @@ -13349,7 +13064,7 @@ struct fts5_api { ** max_page_count macro. */ #ifndef SQLITE_MAX_PAGE_COUNT -# define SQLITE_MAX_PAGE_COUNT 1073741823 +#define SQLITE_MAX_PAGE_COUNT 1073741823 #endif /* @@ -13357,7 +13072,7 @@ struct fts5_api { ** operator. */ #ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH -# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000 +#define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000 #endif /* @@ -13368,7 +13083,7 @@ struct fts5_api { ** may be executed. */ #ifndef SQLITE_MAX_TRIGGER_DEPTH -# define SQLITE_MAX_TRIGGER_DEPTH 1000 +#define SQLITE_MAX_TRIGGER_DEPTH 1000 #endif /************** End of sqliteLimit.h *****************************************/ @@ -13376,11 +13091,11 @@ struct fts5_api { /* 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 */ +#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 /* @@ -13388,16 +13103,16 @@ struct fts5_api { ** places. The following macros try to make this explicit. */ #ifndef __has_extension -# define __has_extension(x) 0 /* compatibility with non-clang compilers */ +#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) +#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)) +#define SQLITE_ATOMIC_INTRINSICS 0 +#define AtomicLoad(PTR) (*(PTR)) +#define AtomicStore(PTR, VAL) (*(PTR) = (VAL)) #endif /* @@ -13426,18 +13141,18 @@ struct fts5_api { ** 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)) +#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 /* @@ -13445,11 +13160,11 @@ struct fts5_api { ** inlined. */ #if defined(__GNUC__) -# define SQLITE_NOINLINE __attribute__((noinline)) -#elif defined(_MSC_VER) && _MSC_VER>=1310 -# define SQLITE_NOINLINE __declspec(noinline) +#define SQLITE_NOINLINE __attribute__((noinline)) +#elif defined(_MSC_VER) && _MSC_VER >= 1310 +#define SQLITE_NOINLINE __declspec(noinline) #else -# define SQLITE_NOINLINE +#define SQLITE_NOINLINE #endif /* @@ -13458,17 +13173,17 @@ struct fts5_api { ** 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 +#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 /* @@ -13488,11 +13203,11 @@ struct fts5_api { ** 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 +#if defined(THREADSAFE) +#define SQLITE_THREADSAFE THREADSAFE +#else +#define SQLITE_THREADSAFE 1 /* IMP: R-07272-22309 */ +#endif #endif /* @@ -13500,7 +13215,7 @@ struct fts5_api { ** the -DSQLITE_POWERSAFE_OVERWRITE=0 command-line option. */ #ifndef SQLITE_POWERSAFE_OVERWRITE -# define SQLITE_POWERSAFE_OVERWRITE 1 +#define SQLITE_POWERSAFE_OVERWRITE 1 #endif /* @@ -13509,7 +13224,7 @@ struct fts5_api { ** which case memory allocation statistics are disabled by default. */ #if !defined(SQLITE_DEFAULT_MEMSTATUS) -# define SQLITE_DEFAULT_MEMSTATUS 1 +#define SQLITE_DEFAULT_MEMSTATUS 1 #endif /* @@ -13529,20 +13244,14 @@ struct fts5_api { ** 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\ +#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 +#if defined(SQLITE_SYSTEM_MALLOC) + defined(SQLITE_WIN32_MALLOC) + defined(SQLITE_ZERO_MALLOC) + defined(SQLITE_MEMDEBUG) == 0 +#define SQLITE_SYSTEM_MALLOC 1 #endif /* @@ -13550,7 +13259,7 @@ struct fts5_api { ** sizes of memory allocations below this value where possible. */ #if !defined(SQLITE_MALLOC_SOFT_LIMIT) -# define SQLITE_MALLOC_SOFT_LIMIT 1024 +#define SQLITE_MALLOC_SOFT_LIMIT 1024 #endif /* @@ -13560,7 +13269,7 @@ struct fts5_api { ** it. */ #if !defined(_XOPEN_SOURCE) && !defined(__DARWIN__) && !defined(__APPLE__) -# define _XOPEN_SOURCE 600 +#define _XOPEN_SOURCE 600 #endif /* @@ -13575,17 +13284,17 @@ struct fts5_api { ** feature. */ #if !defined(NDEBUG) && !defined(SQLITE_DEBUG) -# define NDEBUG 1 +#define NDEBUG 1 #endif #if defined(NDEBUG) && defined(SQLITE_DEBUG) -# undef NDEBUG +#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 +#define SQLITE_ENABLE_EXPLAIN_COMMENTS 1 #endif /* @@ -13602,12 +13311,15 @@ struct fts5_api { ** 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__; } +#ifndef SQLITE_AMALGAMATION +extern unsigned int sqlite3CoverageCounter; +#endif +#define testcase(X) \ + if (X) { \ + sqlite3CoverageCounter += (unsigned)__LINE__; \ + } #else -# define testcase(X) +#define testcase(X) #endif /* @@ -13616,9 +13328,9 @@ struct fts5_api { ** within testcase() and assert() macros. */ #if !defined(NDEBUG) || defined(SQLITE_COVERAGE_TEST) -# define TESTONLY(X) X +#define TESTONLY(X) X #else -# define TESTONLY(X) +#define TESTONLY(X) #endif /* @@ -13630,9 +13342,9 @@ struct fts5_api { ** code within VVA_ONLY() will only run during verification processes. */ #ifndef NDEBUG -# define VVA_ONLY(X) X +#define VVA_ONLY(X) X #else -# define VVA_ONLY(X) +#define VVA_ONLY(X) #endif /* @@ -13640,7 +13352,7 @@ struct fts5_api { ** and mutation testing */ #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) -# define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1 +#define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1 #endif /* @@ -13659,14 +13371,14 @@ struct fts5_api { ** not be counted as untested code. */ #if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS) -# define ALWAYS(X) (1) -# define NEVER(X) (0) +#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) +#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) +#define ALWAYS(X) (X) +#define NEVER(X) (X) #endif /* @@ -13677,11 +13389,11 @@ struct fts5_api { ** 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) +#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) +#define OK_IF_ALWAYS_TRUE(X) (X) +#define OK_IF_ALWAYS_FALSE(X) (X) #endif /* @@ -13692,24 +13404,25 @@ struct fts5_api { ** 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) +#define ONLY_IF_REALLOC_STRESS(X) (X) #elif !defined(NDEBUG) -# define ONLY_IF_REALLOC_STRESS(X) ((X)?(assert(0),1):0) +#define ONLY_IF_REALLOC_STRESS(X) ((X) ? (assert(0), 1) : 0) #else -# define ONLY_IF_REALLOC_STRESS(X) (0) +#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 +#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 +#define OSTRACE(X) +#undef SQLITE_HAVE_OS_TRACE #endif /* @@ -13718,25 +13431,24 @@ struct fts5_api { ** 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 +#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 +#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 +#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 +#define SQLITE_OMIT_ALTERTABLE #endif /* @@ -13744,7 +13456,7 @@ struct fts5_api { ** 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) +#define IS_BIG_INT(X) (((X) & ~(i64)0xffffffff) != 0) /* ** The macro unlikely() is a hint that surrounds a boolean @@ -13753,8 +13465,8 @@ struct fts5_api { ** 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) +#define likely(X) (X) +#define unlikely(X) (X) /************** Include hash.h in the middle of sqliteInt.h ******************/ /************** Begin file hash.h ********************************************/ @@ -13801,13 +13513,13 @@ typedef struct HashElem HashElem; ** 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; + 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 @@ -13817,17 +13529,17 @@ struct Hash { ** 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 */ + 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* sqlite3HashInsert(Hash*, const char* pKey, void* pData); +SQLITE_PRIVATE void* sqlite3HashFind(const Hash*, const char* pKey); SQLITE_PRIVATE void sqlite3HashClear(Hash*); /* @@ -13842,16 +13554,16 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); ** // do something with pData ** } */ -#define sqliteHashFirst(H) ((H)->first) -#define sqliteHashNext(E) ((E)->next) -#define sqliteHashData(E) ((E)->data) +#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) +#define sqliteHashCount(H) ((H)->count) #endif /* SQLITE_HASH_H */ @@ -13859,198 +13571,198 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); /************** 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 +#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 -#include -#include /* ** Use a macro to replace memcpy() if compiled with SQLITE_INLINE_MEMCPY. @@ -14060,8 +13772,14 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); ** 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++);} +#define memcpy(D, S, N) \ + { \ + char* xxd = (char*)(D); \ + const char* xxs = (const char*)(S); \ + int xxn = (N); \ + while (xxn-- > 0) \ + *(xxd++) = *(xxs++); \ + } #endif /* @@ -14069,19 +13787,19 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); ** 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 +#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) +#define SQLITE_BIG_DBL (1e99) #endif /* @@ -14103,7 +13821,7 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); */ #define SQLITE_MAX_FILE_FORMAT 4 #ifndef SQLITE_DEFAULT_FILE_FORMAT -# define SQLITE_DEFAULT_FILE_FORMAT 4 +#define SQLITE_DEFAULT_FILE_FORMAT 4 #endif /* @@ -14111,7 +13829,7 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); ** changed at run-time using a pragma. */ #ifndef SQLITE_DEFAULT_RECURSIVE_TRIGGERS -# define SQLITE_DEFAULT_RECURSIVE_TRIGGERS 0 +#define SQLITE_DEFAULT_RECURSIVE_TRIGGERS 0 #endif /* @@ -14119,7 +13837,7 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); ** on the command-line */ #ifndef SQLITE_TEMP_STORE -# define SQLITE_TEMP_STORE 1 +#define SQLITE_TEMP_STORE 1 #endif /* @@ -14127,19 +13845,19 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); ** 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 +#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 +#define SQLITE_MAX_WORKER_THREADS 8 #endif #ifndef SQLITE_DEFAULT_WORKER_THREADS -# define SQLITE_DEFAULT_WORKER_THREADS 0 +#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 +#if SQLITE_DEFAULT_WORKER_THREADS > SQLITE_MAX_WORKER_THREADS +#undef SQLITE_MAX_WORKER_THREADS +#define SQLITE_MAX_WORKER_THREADS SQLITE_DEFAULT_WORKER_THREADS #endif /* @@ -14152,14 +13870,14 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); ** speedtest1 test program with options: --shrink-memory --reprepare */ #ifndef SQLITE_DEFAULT_PCACHE_INITSZ -# define SQLITE_DEFAULT_PCACHE_INITSZ 20 +#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 +#define SQLITE_DEFAULT_SORTERREF_SIZE 0x7fffffff #endif /* @@ -14176,32 +13894,37 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); ** ourselves. */ #ifndef offsetof -#define offsetof(STRUCTURE,FIELD) ((int)((char*)&((STRUCTURE*)0)->FIELD)) +#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)) +#define MIN(A, B) ((A) < (B) ? (A) : (B)) #endif #ifndef MAX -# define MAX(A,B) ((A)>(B)?(A):(B)) +#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;} +#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 +#define SQLITE_EBCDIC 1 #else -# define SQLITE_ASCII 1 +#define SQLITE_ASCII 1 #endif /* @@ -14212,50 +13935,50 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); ** 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 +#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 +#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 +#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 +#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 +#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 +#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 */ +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 @@ -14263,7 +13986,7 @@ typedef INT8_TYPE i8; /* 1-byte signed integer */ ** 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) +#define SQLITE_MAX_U32 ((((u64)1) << 32) - 1) /* ** The datatype used to store estimates of the number of rows in a @@ -14272,9 +13995,9 @@ typedef INT8_TYPE i8; /* 1-byte signed integer */ ** can be used at compile-time if desired. */ #ifdef SQLITE_64BIT_STATS - typedef u64 tRowcnt; /* 64-bit only if requested at compile-time */ +typedef u64 tRowcnt; /* 64-bit only if requested at compile-time */ #else - typedef u32 tRowcnt; /* 32-bit is the default */ +typedef u32 tRowcnt; /* 32-bit is the default */ #endif /* @@ -14306,26 +14029,24 @@ 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 +#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; +typedef uintptr_t uptr; +#elif SQLITE_PTRSIZE == 4 +typedef u32 uptr; #else - typedef u64 uptr; +typedef u64 uptr; #endif /* @@ -14336,8 +14057,7 @@ typedef INT16_TYPE LogEst; ** 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))) - +#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, @@ -14349,35 +14069,32 @@ typedef INT16_TYPE LogEst; ** 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) +#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 /* @@ -14385,9 +14102,9 @@ typedef INT16_TYPE LogEst; ** 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) +#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 @@ -14399,17 +14116,17 @@ typedef INT16_TYPE LogEst; ** 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) +#define ROUND8(x) (((x) + 7) & ~7) +#if SQLITE_PTRSIZE == 8 +#define ROUND8P(x) (x) #else -# define ROUND8P(x) (((x)+7)&~7) +#define ROUND8P(x) (((x) + 7) & ~7) #endif /* ** Round down to the nearest multiple of 8 */ -#define ROUNDDOWN8(x) ((x)&~7) +#define ROUNDDOWN8(x) ((x) & ~7) /* ** Assert that the pointer X is aligned to an 8-byte boundary. This @@ -14421,36 +14138,32 @@ typedef INT16_TYPE LogEst; ** 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) +#define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0) & 3) == 0) #else -# define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&7)==0) +#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 +#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 +#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 +#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 /* @@ -14459,11 +14172,11 @@ typedef INT16_TYPE LogEst; ** not exceed the maximum mmap size. */ #ifndef SQLITE_DEFAULT_MMAP_SIZE -# define SQLITE_DEFAULT_MMAP_SIZE 0 +#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 +#if SQLITE_DEFAULT_MMAP_SIZE > SQLITE_MAX_MMAP_SIZE +#undef SQLITE_DEFAULT_MMAP_SIZE +#define SQLITE_DEFAULT_MMAP_SIZE SQLITE_MAX_MMAP_SIZE #endif /* @@ -14473,32 +14186,29 @@ typedef INT16_TYPE LogEst; #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 +#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 +#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 +#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) +#define WHERETRACE(K, X) #endif - /* ** An instance of the following structure is used to store the busy-handler ** callback for a given sqlite handle. @@ -14510,9 +14220,9 @@ SQLITE_PRIVATE u32 sqlite3WhereTrace; */ 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 */ + int (*xBusyHandler)(void*, int); /* The busy callback */ + void* pBusyArg; /* First arg to busy callback */ + int nBusy; /* Incremented with each busy call */ }; /* @@ -14532,33 +14242,31 @@ struct BusyHandler { ** ** 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" - +#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 +#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) +#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]))) +#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) +#define IsPowerOfTwo(X) (((X) & ((X) - 1)) == 0) /* ** The following value as a destructor means to use sqlite3DbFree(). @@ -14568,7 +14276,7 @@ struct BusyHandler { ** pointer will work here as long as it is distinct from SQLITE_STATIC ** and SQLITE_TRANSIENT. */ -#define SQLITE_DYNAMIC ((sqlite3_destructor_type)sqlite3OomClear) +#define SQLITE_DYNAMIC ((sqlite3_destructor_type)sqlite3OomClear) /* ** When SQLITE_OMIT_WSD is defined, it means that the target platform does @@ -14585,15 +14293,15 @@ struct BusyHandler { ** 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) +#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); +SQLITE_API void* sqlite3_wsd_find(void* K, int L); #else - #define SQLITE_WSD - #define GLOBAL(t,v) v - #define sqlite3GlobalConfig sqlite3Config +#define SQLITE_WSD +#define GLOBAL(t, v) v +#define sqlite3GlobalConfig sqlite3Config #endif /* @@ -14613,7 +14321,7 @@ SQLITE_API void *sqlite3_wsd_find(void *K, int L); ** 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) +#define UNUSED_PARAMETER2(x, y) UNUSED_PARAMETER(x), UNUSED_PARAMETER(y) /* ** Forward references to structures @@ -14675,7 +14383,6 @@ typedef struct WhereInfo WhereInfo; typedef struct Window Window; typedef struct With With; - /* ** The bitmask datatype defined below is used for various optimizations. ** @@ -14684,24 +14391,24 @@ typedef struct With With; ** of the library by 738 bytes on ix86. */ #ifdef SQLITE_BITMASK_TYPE - typedef SQLITE_BITMASK_TYPE Bitmask; +typedef SQLITE_BITMASK_TYPE Bitmask; #else - typedef u64 Bitmask; +typedef u64 Bitmask; #endif /* ** The number of bits in a Bitmask. "BMS" means "BitMask Size". */ -#define BMS ((int)(sizeof(Bitmask)*8)) +#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) +#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 @@ -14743,7 +14450,7 @@ typedef int VList; ** sqlite3PagerJournalSizeLimit() API. See also "PRAGMA journal_size_limit". */ #ifndef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT - #define SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT -1 +#define SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT -1 #endif /* @@ -14770,23 +14477,23 @@ typedef struct PgHdr DbPage; ** 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) +#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 */ +#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 +#define PAGER_LOCKINGMODE_QUERY -1 +#define PAGER_LOCKINGMODE_NORMAL 0 +#define PAGER_LOCKINGMODE_EXCLUSIVE 1 /* ** Numeric constants that encode the journalmode. @@ -14795,19 +14502,19 @@ typedef struct PgHdr DbPage; ** 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 */ +#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 */ +#define PAGER_GET_NOCONTENT 0x01 /* Do not load data from disk */ +#define PAGER_GET_READONLY 0x02 /* Read-only page is acceptable */ /* ** Flags for sqlite3PagerSetFlags() @@ -14817,15 +14524,15 @@ typedef struct PgHdr DbPage; ** 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 */ +#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 @@ -14834,38 +14541,30 @@ typedef struct PgHdr DbPage; */ /* 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 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 void sqlite3PagerSetBusyHandler(Pager*, int (*)(void*), void*); SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager*, u32*, int); 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 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 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 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 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*); @@ -14874,90 +14573,90 @@ 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 sqlite3PagerMovepage(Pager*, DbPage*, Pgno, int); SQLITE_PRIVATE int sqlite3PagerPageRefcount(DbPage*); -SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *); -SQLITE_PRIVATE void *sqlite3PagerGetExtra(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 sqlite3PagerCommitPhaseOne(Pager*, const char* zSuper, int); SQLITE_PRIVATE int sqlite3PagerExclusiveLock(Pager*); -SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager, const char *zSuper); +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); +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 +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*); +SQLITE_PRIVATE int sqlite3PagerWalWriteLock(Pager*, int); +SQLITE_PRIVATE void sqlite3PagerWalDb(Pager*, sqlite3*); #else -# define sqlite3PagerWalWriteLock(y,z) SQLITE_OK -# define sqlite3PagerWalDb(x,y) +#define sqlite3PagerWalWriteLock(y, z) SQLITE_OK +#define sqlite3PagerWalDb(x, y) #endif #ifdef SQLITE_DIRECT_OVERFLOW_READ -SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno); +SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager* pPager, Pgno pgno); #endif #ifdef SQLITE_ENABLE_ZIPVFS -SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager); +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*); +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 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 sqlite3PagerCacheStat(Pager*, int, int, int*); SQLITE_PRIVATE void sqlite3PagerClearCache(Pager*); -SQLITE_PRIVATE int sqlite3SectorSize(sqlite3_file *); +SQLITE_PRIVATE int sqlite3SectorSize(sqlite3_file*); /* Functions used to truncate the database file. */ -SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager*,Pgno); +SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager*, Pgno); SQLITE_PRIVATE void sqlite3PagerRekey(DbPage*, Pgno, u16); /* Functions to support testing and debugging. */ #if !defined(NDEBUG) || defined(SQLITE_TEST) -SQLITE_PRIVATE Pgno sqlite3PagerPagenumber(DbPage*); -SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage*); +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); +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() +#define disable_simulated_io_errors() +#define enable_simulated_io_errors() #endif #endif /* SQLITE_PAGER_H */ @@ -14994,12 +14693,12 @@ SQLITE_PRIVATE void sqlite3PagerRefdump(Pager*); ** it must be turned on for each database using "PRAGMA auto_vacuum = 1". */ #ifndef SQLITE_DEFAULT_AUTOVACUUM - #define SQLITE_DEFAULT_AUTOVACUUM 0 +#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 */ +#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 @@ -15009,14 +14708,12 @@ 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 */ +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 @@ -15025,57 +14722,57 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( ** 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 */ +#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); +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 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 sqlite3BtreeMaxPageCount(Btree*, Pgno); SQLITE_PRIVATE Pgno sqlite3BtreeLastPage(Btree*); -SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree*,int); +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 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 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); +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); +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); +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 *); +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 const char* sqlite3BtreeGetFilename(Btree*); +SQLITE_PRIVATE const char* sqlite3BtreeGetJournalname(Btree*); +SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree*, Btree*); -SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *); +SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree*); /* The flags parameter to sqlite3BtreeCreateTable can be the bitwise OR ** of the flags shown below. @@ -15087,18 +14784,18 @@ SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *); ** 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 */ +#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 void sqlite3BtreeGetMeta(Btree* pBtree, int idx, u32* pValue); SQLITE_PRIVATE int sqlite3BtreeUpdateMeta(Btree*, int idx, u32 value); -SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p); +SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree* p); /* ** The second parameter to sqlite3BtreeGetMeta or sqlite3BtreeUpdateMeta @@ -15117,16 +14814,16 @@ SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p); ** 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 */ +#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() @@ -15155,7 +14852,7 @@ SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p); ** the SQLite parser and code generator but substitute their own storage ** engine. */ -#define BTREE_HINT_RANGE 0 /* Range constraints on queries */ +#define BTREE_HINT_RANGE 0 /* Range constraints on queries */ /* ** Values that may be OR'd together to form the argument to the @@ -15170,8 +14867,8 @@ SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p); ** 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 */ +#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(). @@ -15196,17 +14893,16 @@ SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p); ** 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 */ +#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 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 BtCursor* sqlite3BtreeFakeValidCursor(void); SQLITE_PRIVATE int sqlite3BtreeCursorSize(void); SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor*); SQLITE_PRIVATE void sqlite3BtreeCursorHintFlags(BtCursor*, unsigned); @@ -15215,26 +14911,17 @@ 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 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 */ +#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. @@ -15270,19 +14957,18 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor*, u8 flags); ** 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 */ + 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 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); @@ -15293,29 +14979,29 @@ SQLITE_PRIVATE void sqlite3BtreeCursorUnpin(BtCursor*); 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 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 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 *); +SQLITE_PRIVATE void sqlite3BtreeIncrblobCursor(BtCursor*); #endif -SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *); -SQLITE_PRIVATE int sqlite3BtreeSetVersion(Btree *pBt, int iVersion); +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 sqlite3BtreeIsReadonly(Btree* pBt); SQLITE_PRIVATE int sqlite3HeaderSizeBtree(void); #ifdef SQLITE_DEBUG SQLITE_PRIVATE sqlite3_uint64 sqlite3BtreeSeekCount(Btree*); #else -# define sqlite3BtreeSeekCount(X) 0 +#define sqlite3BtreeSeekCount(X) 0 #endif #ifndef NDEBUG @@ -15331,7 +15017,7 @@ SQLITE_PRIVATE void sqlite3BtreeCursorList(Btree*); #endif #ifndef SQLITE_OMIT_WAL -SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree*, int, int *, int *); +SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree*, int, int*, int*); #endif SQLITE_PRIVATE int sqlite3BtreeTransferRow(BtCursor*, BtCursor*, i64); @@ -15342,41 +15028,40 @@ SQLITE_PRIVATE int sqlite3BtreeTransferRow(BtCursor*, BtCursor*, i64); ** 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*); +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 +#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*); +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*); +/* 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 sqlite3BtreeLeave(X) +#define sqlite3BtreeLeaveCursor(X) +#define sqlite3BtreeLeaveAll(X) -# define sqlite3BtreeHoldsMutex(X) 1 -# define sqlite3BtreeHoldsAllMutexes(X) 1 -# define sqlite3SchemaMutexHeld(X,Y,Z) 1 +#define sqlite3BtreeHoldsMutex(X) 1 +#define sqlite3BtreeHoldsAllMutexes(X) 1 +#define sqlite3SchemaMutexHeld(X, Y, Z) 1 #endif - #endif /* SQLITE_BTREE_H */ /************** End of btree.h ***********************************************/ @@ -15424,57 +15109,56 @@ typedef struct SubProgram SubProgram; ** 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 */ + 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 */ + 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 */ + Expr* pExpr; /* Used when p4type is P4_EXPR */ #endif } p4; #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS - char *zComment; /* Comment to improve readability */ + 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 */ + 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 */ + 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 */ + 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 */ }; /* @@ -15482,59 +15166,59 @@ struct SubProgram { ** 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 */ + 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 */ +#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 */ +#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 +#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_NAME 0 #define COLNAME_DECLTYPE 1 #define COLNAME_DATABASE 2 -#define COLNAME_TABLE 3 -#define COLNAME_COLUMN 4 +#define COLNAME_TABLE 3 +#define COLNAME_COLUMN 4 #ifdef SQLITE_ENABLE_COLUMN_METADATA -# define COLNAME_N 5 /* Number of COLNAME_xxx symbols */ +#define COLNAME_N 5 /* Number of COLNAME_xxx symbols */ +#else +#ifdef SQLITE_OMIT_DECLTYPE +#define COLNAME_N 1 /* Store only the name */ #else -# ifdef SQLITE_OMIT_DECLTYPE -# define COLNAME_N 1 /* Store only the name */ -# else -# define COLNAME_N 2 /* Store the name and decltype */ -# endif +#define COLNAME_N 2 /* Store the name and decltype */ +#endif #endif /* @@ -15542,7 +15226,7 @@ typedef struct VdbeOpList VdbeOpList; ** into an index into the Parse.aLabel[] array that contains the resolved ** address of that label. */ -#define ADDR(X) (~(X)) +#define ADDR(X) (~(X)) /* ** The makefile scans the vdbe.c source file and creates the "opcodes.h" @@ -15552,229 +15236,219 @@ typedef struct VdbeOpList VdbeOpList; /************** 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_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_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_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 +#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,} +#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 @@ -15782,7 +15456,7 @@ typedef struct VdbeOpList VdbeOpList; ** 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 */ +#define SQLITE_MX_JUMP_OPCODE 64 /* Maximum JUMP opcode */ /************** End of opcodes.h *********************************************/ /************** Continuing where we left off in vdbe.h ***********************/ @@ -15790,59 +15464,59 @@ typedef struct VdbeOpList VdbeOpList; /* ** Additional non-public SQLITE_PREPARE_* flags */ -#define SQLITE_PREPARE_SAVESQL 0x80 /* Preserve SQL text */ -#define SQLITE_PREPARE_MASK 0x0f /* Mask of public 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); +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); +SQLITE_PRIVATE void sqlite3VdbeVerifyNoMallocRequired(Vdbe* p, int N); +SQLITE_PRIVATE void sqlite3VdbeVerifyNoResultRow(Vdbe* p); #else -# define sqlite3VdbeVerifyNoMallocRequired(A,B) -# define sqlite3VdbeVerifyNoResultRow(A) +#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); +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) +#define sqlite3VdbeVerifyAbortable(A, B) +#define sqlite3VdbeNoJumpsOutsideSubrtn(A, B, C, D) #endif -SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp,int iLineno); +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*/ +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*); +SQLITE_PRIVATE void sqlite3ExplainBreakpoint(const char*, const char*); #else -# define sqlite3ExplainBreakpoint(A,B) /*no-op*/ +#define sqlite3ExplainBreakpoint(A, B) /*no-op*/ #endif SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe*, int, char*, u16); SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe*, int addr, u8); @@ -15855,58 +15529,58 @@ 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); +SQLITE_PRIVATE void sqlite3VdbeReleaseRegisters(Parse*, int addr, int n, u32 mask, int); #else -# define sqlite3VdbeReleaseRegisters(P,A,N,M,F) +#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 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 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 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); +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 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 sqlite3* sqlite3VdbeDb(Vdbe*); SQLITE_PRIVATE u8 sqlite3VdbePrepareFlags(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe*, const char *z, int n, u8); +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*); +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 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*); +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*); +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*); +typedef int (*RecordCompare)(int, const void*, UnpackedRecord*); SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord*); -SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *, SubProgram *); +SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe*, SubProgram*); SQLITE_PRIVATE int sqlite3VdbeHasSubProgram(Vdbe*); SQLITE_PRIVATE int sqlite3NotPureFunc(sqlite3_context*); @@ -15922,19 +15596,19 @@ SQLITE_PRIVATE int sqlite3VdbeBytecodeVtabInit(sqlite3*); ** 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 +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) +#define VdbeComment(X) +#define VdbeNoopComment(X) +#define VdbeModuleComment(X) #endif /* @@ -15978,35 +15652,34 @@ SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe*, const char*, ...); ** 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 +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) +#define sqlite3VdbeScanStatus(a, b, c, d, e) #endif #if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) @@ -16044,40 +15717,41 @@ typedef struct PCache PCache; ** 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 */ + 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 */ + u32 pageHash; /* Hash of page content */ #endif - u16 flags; /* PGHDR flags defined below */ + 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 */ + 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_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 */ +#define PGHDR_WAL_APPEND 0x040 /* Appended to wal file */ /* Initialize and shutdown the page cache subsystem */ SQLITE_PRIVATE int sqlite3PcacheInitialize(void); @@ -16086,23 +15760,22 @@ SQLITE_PRIVATE void sqlite3PcacheShutdown(void); /* Page cache buffer management: ** These routines implement SQLITE_CONFIG_PAGECACHE. */ -SQLITE_PRIVATE void sqlite3PCacheBufferSetup(void *, int sz, int n); +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 */ +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); +SQLITE_PRIVATE int sqlite3PcacheSetPageSize(PCache*, int); /* Return the size in bytes of a PCache object. Used to preallocate ** storage space. @@ -16112,15 +15785,15 @@ 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 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 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 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. */ @@ -16130,13 +15803,13 @@ SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr*, Pgno); 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*); +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 *); +SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache*); /* Discard the contents of the cache */ SQLITE_PRIVATE void sqlite3PcacheClear(PCache*); @@ -16157,7 +15830,7 @@ SQLITE_PRIVATE int sqlite3PcachePagecount(PCache*); ** interface is only available if SQLITE_CHECK_PAGES is defined when the ** library is built. */ -SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHdr *)); +SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache* pCache, void (*xIter)(PgHdr*)); #endif #if defined(SQLITE_DEBUG) @@ -16171,9 +15844,9 @@ SQLITE_PRIVATE int sqlite3PcachePageSanity(PgHdr*); ** the total number of pages cached by purgeable pager-caches to the sum ** of the suggested cache-sizes. */ -SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache *, int); +SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache*, int); #ifdef SQLITE_TEST -SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *); +SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache*); #endif /* Set or get the suggested spill-size for the specified pager-cache. @@ -16181,7 +15854,7 @@ SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *); ** 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); +SQLITE_PRIVATE int sqlite3PcacheSetSpillsize(PCache*, int); /* Free up as much memory as possible from the page cache */ SQLITE_PRIVATE void sqlite3PcacheShrink(PCache*); @@ -16192,7 +15865,7 @@ SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int); #endif #ifdef SQLITE_TEST -SQLITE_PRIVATE void sqlite3PcacheStats(int*,int*,int*,int*); +SQLITE_PRIVATE void sqlite3PcacheStats(int*, int*, int*, int*); #endif SQLITE_PRIVATE void sqlite3PCacheSetDefault(void); @@ -16205,7 +15878,7 @@ SQLITE_PRIVATE int sqlite3HeaderSizePcache1(void); SQLITE_PRIVATE int sqlite3PCachePercentDirty(PCache*); #ifdef SQLITE_DIRECT_OVERFLOW_READ -SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache); +SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache* pCache); #endif #endif /* _PCACHE_H_ */ @@ -16269,33 +15942,32 @@ SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache); ** 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 +#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 +#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 */ @@ -16307,27 +15979,27 @@ SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache); ** a no-op */ #ifndef SET_FULLSYNC -# define SET_FULLSYNC(x,y) +#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 +#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 +#define SQLITE_MAX_SYMLINK 200 #endif /* ** The default size of a disk sector */ #ifndef SQLITE_DEFAULT_SECTOR_SIZE -# define SQLITE_DEFAULT_SECTOR_SIZE 4096 +#define SQLITE_DEFAULT_SECTOR_SIZE 4096 #endif /* @@ -16352,7 +16024,7 @@ SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache); ** of the file. */ #ifndef SQLITE_TEMP_FILE_PREFIX -# define SQLITE_TEMP_FILE_PREFIX "etilqs_" +#define SQLITE_TEMP_FILE_PREFIX "etilqs_" #endif /* @@ -16372,11 +16044,11 @@ SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache); ** 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 +#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) @@ -16434,13 +16106,13 @@ SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache); ** */ #ifdef SQLITE_OMIT_WSD -# define PENDING_BYTE (0x40000000) +#define PENDING_BYTE (0x40000000) #else -# define PENDING_BYTE sqlite3PendingByte +#define PENDING_BYTE sqlite3PendingByte #endif -#define RESERVED_BYTE (PENDING_BYTE+1) -#define SHARED_FIRST (PENDING_BYTE+2) -#define SHARED_SIZE 510 +#define RESERVED_BYTE (PENDING_BYTE + 1) +#define SHARED_FIRST (PENDING_BYTE + 2) +#define SHARED_SIZE 510 /* ** Wrapper around OS specific sqlite3_os_init() function. @@ -16455,49 +16127,48 @@ 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 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*); +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); +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); +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 *); - +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 *); +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 *); +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 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*); +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 *); +SQLITE_PRIVATE int sqlite3OsOpenMalloc(sqlite3_vfs*, const char*, sqlite3_file**, int, int*); +SQLITE_PRIVATE void sqlite3OsCloseFree(sqlite3_file*); #endif /* _SQLITE_OS_H_ */ @@ -16527,7 +16198,6 @@ SQLITE_PRIVATE void sqlite3OsCloseFree(sqlite3_file *); ** include this one indirectly. */ - /* ** Figure out what version of the code to use. The choices are ** @@ -16545,35 +16215,35 @@ SQLITE_PRIVATE void sqlite3OsCloseFree(sqlite3_file *); ** SQLITE_MUTEX_W32 For multi-threaded applications on Win32. */ #if !SQLITE_THREADSAFE -# define SQLITE_MUTEX_OMIT +#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 +#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_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_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 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 +#define MUTEX_LOGIC(X) X SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*); #endif /* defined(SQLITE_MUTEX_OMIT) */ @@ -16584,8 +16254,8 @@ SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*); ** 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 +#warning Use SQLITE_DEFAULT_SYNCHRONOUS=3 instead of SQLITE_EXTRA_DURABLE +#define SQLITE_DEFAULT_SYNCHRONOUS 3 #endif /* @@ -16605,10 +16275,10 @@ SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*); ** and the one-based values are used internally. */ #ifndef SQLITE_DEFAULT_SYNCHRONOUS -# define SQLITE_DEFAULT_SYNCHRONOUS 2 +#define SQLITE_DEFAULT_SYNCHRONOUS 2 #endif #ifndef SQLITE_DEFAULT_WAL_SYNCHRONOUS -# define SQLITE_DEFAULT_WAL_SYNCHRONOUS SQLITE_DEFAULT_SYNCHRONOUS +#define SQLITE_DEFAULT_WAL_SYNCHRONOUS SQLITE_DEFAULT_SYNCHRONOUS #endif /* @@ -16619,11 +16289,11 @@ SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*); ** 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) */ + 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) */ }; /* @@ -16644,27 +16314,27 @@ struct Db { ** 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 */ + 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) +#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. @@ -16676,15 +16346,15 @@ struct Schema { ** 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 */ +#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) +#define SQLITE_N_LIMIT (SQLITE_LIMIT_WORKER_THREADS + 1) /* ** Lookaside malloc is a set of fixed-size buffers that can be used @@ -16732,36 +16402,39 @@ struct Schema { ** 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 */ + 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 */ + 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 */ + 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 +#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 +#define LOOKASIDE_SMALL 0 #else -# define LOOKASIDE_SMALL 128 +#define LOOKASIDE_SMALL 128 #endif /* @@ -16774,9 +16447,9 @@ struct LookasideSlot { */ #define SQLITE_FUNC_HASH_SZ 23 struct FuncDefHash { - FuncDef *a[SQLITE_FUNC_HASH_SZ]; /* Hash table for functions */ + FuncDef* a[SQLITE_FUNC_HASH_SZ]; /* Hash table for functions */ }; -#define SQLITE_FUNC_HASH(C,L) (((C)+(L))%SQLITE_FUNC_HASH_SZ) +#define SQLITE_FUNC_HASH(C, L) (((C) + (L)) % SQLITE_FUNC_HASH_SZ) #ifdef SQLITE_USER_AUTHENTICATION /* @@ -16785,23 +16458,23 @@ struct FuncDefHash { */ 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 */ + 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 */ +#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 int sqlite3UserAuthCheckLogin(sqlite3*, const char*, u8*); SQLITE_PRIVATE void sqlite3UserAuthInit(sqlite3*); -SQLITE_PRIVATE void sqlite3CryptFunc(sqlite3_context*,int,sqlite3_value**); +SQLITE_PRIVATE void sqlite3CryptFunc(sqlite3_context*, int, sqlite3_value**); #endif /* SQLITE_USER_AUTHENTICATION */ @@ -16809,40 +16482,38 @@ SQLITE_PRIVATE void sqlite3CryptFunc(sqlite3_context*,int,sqlite3_value**); ** 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*); +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*); +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 */ +#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 */ +#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) +#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 */ + 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 */ @@ -16881,82 +16552,81 @@ struct sqlite3 { 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 */ + 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 */ + 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 */ + 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 */ + 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 */ + void (*xProfile)(void*, const char*, u64); /* Profiling function */ + void* pProfileArg; /* Argument to profile function */ #endif - void *pCommitArg; /* Argument to xCommitCallback() */ + void* pCommitArg; /* Argument to xCommitCallback() */ int (*xCommitCallback)(void*); /* Invoked at every commit. */ - void *pRollbackArg; /* Argument to xRollbackCallback() */ + 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 */ + 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 */ + 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; + 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 */ + 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 */ + Lookaside lookaside; /* Lookaside malloc configuration */ #ifndef SQLITE_OMIT_AUTHORIZATION - sqlite3_xauth xAuth; /* Access authorization function */ - void *pAuthArg; /* 1st argument to the access auth function */ + 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 */ + 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() */ + 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. @@ -16968,14 +16638,14 @@ struct sqlite3 { ** 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 */ + 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 */ + sqlite3_userauth auth; /* User authentication information */ #endif }; @@ -16983,14 +16653,14 @@ struct sqlite3 { ** A macro to discover the encoding of a database. */ #define SCHEMA_ENC(db) ((db)->aDb[0].pSchema->enc) -#define ENC(db) ((db)->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) +#define HI(X) ((u64)(X) << 32) /* ** Possible values for the sqlite3.flags. @@ -17000,65 +16670,66 @@ struct sqlite3 { ** 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 */ +#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_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 */ +#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. */ +#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 @@ -17066,39 +16737,39 @@ struct sqlite3 { ** 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_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_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_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 */ +#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) +#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 @@ -17110,12 +16781,12 @@ struct sqlite3 { ** 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 */ +#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 @@ -17128,19 +16799,19 @@ struct sqlite3 { ** 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. */ + 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 */ + 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 */ }; /* @@ -17159,8 +16830,8 @@ struct FuncDef { */ struct FuncDestructor { int nRef; - void (*xDestroy)(void *); - void *pUserData; + void (*xDestroy)(void*); + void* pUserData; }; /* @@ -17179,40 +16850,41 @@ struct FuncDestructor { ** 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_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 */ +#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 */ +#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_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_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 */ +#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 @@ -17280,58 +16952,98 @@ struct FuncDestructor { ** 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} } - +#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 @@ -17340,20 +17052,19 @@ struct FuncDestructor { ** 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) */ + 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 - +#define SAVEPOINT_BEGIN 0 +#define SAVEPOINT_RELEASE 1 +#define SAVEPOINT_ROLLBACK 2 /* ** Each SQLite module (virtual table definition) is defined by an @@ -17361,12 +17072,12 @@ struct Savepoint { ** 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 */ + 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 */ }; /* @@ -17395,9 +17106,9 @@ struct Module { ** 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* 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 */ @@ -17412,14 +17123,14 @@ struct Column { ** 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 */ +#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. ** @@ -17428,19 +17139,19 @@ struct Column { ** 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 */ +#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 @@ -17452,18 +17163,18 @@ struct Column { ** 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 */ + 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_ASC 0 /* Sort in ascending order */ +#define SQLITE_SO_DESC 1 /* Sort in ascending order */ #define SQLITE_SO_UNDEFINED -1 /* No sort order specified */ /* @@ -17480,20 +17191,20 @@ struct CollSeq { ** 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 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) +#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 +#define SQLITE_AFF_MASK 0x47 /* ** Additional bit values that can be ORed with an affinity without @@ -17504,9 +17215,9 @@ struct CollSeq { ** 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 */ +#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 @@ -17551,64 +17262,64 @@ struct CollSeq { ** 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) */ + 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 + */ +#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 */ + 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 */ + 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 */ + 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: */ + 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. + 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 */ + 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. */ + 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 */ + Trigger* pTrigger; /* List of triggers on this object */ + Schema* pSchema; /* Schema that contains this table */ }; /* @@ -17626,35 +17337,36 @@ struct Table { ** 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 +#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 */ +#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 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) +#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 @@ -17662,12 +17374,11 @@ struct Table { ** 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) +#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 +#define IsVirtual(X) 0 +#define ExprIsVtab(X) 0 #endif /* @@ -17677,20 +17388,19 @@ struct Table { ** 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) +#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 +#define IsHiddenColumn(X) (((X)->colFlags & COLFLAG_HIDDEN) != 0) +#define IsOrdinaryHiddenColumn(X) 0 #else -# define IsHiddenColumn(X) 0 -# define IsOrdinaryHiddenColumn(X) 0 +#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) +#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. @@ -17721,20 +17431,20 @@ struct Table { ** 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 */ + 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 */ + 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 */ }; /* @@ -17768,19 +17478,18 @@ struct FKey { ** 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 */ - +#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 @@ -17792,20 +17501,20 @@ struct FKey { ** 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 */ + 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 */ +#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 @@ -17843,22 +17552,21 @@ struct KeyInfo { ** b-tree. */ struct UnpackedRecord { - KeyInfo *pKeyInfo; /* Collation and sort-order information */ - Mem *aMem; /* Values */ + 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() */ + 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 */ + 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. @@ -17894,62 +17602,62 @@ struct UnpackedRecord { ** 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 */ + 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 */ + 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 */ +#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) +#define IsPrimaryKeyIndex(X) ((X)->idxType == SQLITE_IDXTYPE_PRIMARYKEY) /* Return true if index X is a UNIQUE index */ -#define IsUniqueIndex(X) ((X)->onError!=OE_None) +#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 */ +#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 @@ -17957,18 +17665,18 @@ struct Index { ** 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 */ + 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. */ +#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 @@ -17981,8 +17689,8 @@ struct IndexSample { ** static string. */ struct Token { - const char *z; /* Text of the token. Not NULL-terminated! */ - unsigned int n; /* Number of characters in this token */ + const char* z; /* Text of the token. Not NULL-terminated! */ + unsigned int n; /* Number of characters in this token */ }; /* @@ -17999,36 +17707,36 @@ struct Token { ** 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 */ + 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 */ }; /* @@ -18041,7 +17749,7 @@ struct AggInfo { ** to have prepared statements with over 32766 variables, and for them ** the option is available (at compile-time). */ -#if SQLITE_MAX_VARIABLE_NUMBER<32767 +#if SQLITE_MAX_VARIABLE_NUMBER < 32767 typedef i16 ynVar; #else typedef int ynVar; @@ -18111,19 +17819,19 @@ typedef int ynVar; ** 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 */ + 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. */ + u8 vvaFlags; /* Verification flags. */ #endif - u32 flags; /* Various flags. EP_* See below */ + 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 */ + 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 @@ -18131,11 +17839,11 @@ struct Expr { ** access them will result in a segfault or malfunction. *********************************************************************/ - Expr *pLeft; /* Left subnode */ - Expr *pRight; /* Right subnode */ + 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 */ + 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 @@ -18143,32 +17851,32 @@ struct Expr { ** 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[] */ +#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 */ + 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 */ + 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 */ + 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; }; @@ -18179,82 +17887,82 @@ struct Expr { ** 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 */ +#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) +#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) +#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) +#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 */ + */ +#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 +#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) +#define ExprSetVVAProperty(E, P) +#define ExprHasVVAProperty(E, P) 0 +#define ExprClearVVAProperties(E) #endif /* @@ -18262,26 +17970,24 @@ struct 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 */ +#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 */ +#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 +#define IsWindowFunc(p) 0 #else -# define IsWindowFunc(p) ( \ - ExprHasProperty((p), EP_WinFunc) && p->y.pWin->eFrmType!=TK_FILTER \ - ) +#define IsWindowFunc(p) (ExprHasProperty((p), EP_WinFunc) && p->y.pWin->eFrmType != TK_FILTER) #endif /* @@ -18310,37 +18016,37 @@ 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 */ + 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 */ + 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 */ + 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 */ + 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 */ + } 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 */ +#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, @@ -18358,13 +18064,13 @@ struct ExprList { ** 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 */ + 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 */ + 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 */ + 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]; }; @@ -18373,9 +18079,9 @@ struct IdList { ** 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 */ +#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. @@ -18389,45 +18095,45 @@ struct IdList { ** 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 */ + 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 */ + 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 */ + 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 */ + 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 */ + char* zIndexedBy; /* Identifier from "INDEXED BY " 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 */ + Index* pIBIndex; /* Index structure corresponding to u1.zIndexedBy */ + CteUse* pCteUse; /* CTE Usage info info fg.isCte is true */ } u2; }; @@ -18436,8 +18142,8 @@ struct SrcItem { ** 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 */ + Expr* pOn; /* The ON clause of a join */ + IdList* pUsing; /* The USING clause of a join */ }; /* @@ -18460,23 +18166,24 @@ struct OnOrUsing { ** 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 */ + 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 */ +#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() @@ -18485,31 +18192,32 @@ struct SrcList { ** 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_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 */ +#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 */ + */ +#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 @@ -18533,19 +18241,19 @@ struct SrcList { ** subqueries looking for a match. */ struct NameContext { - Parse *pParse; /* The parser */ - SrcList *pSrcList; /* One or more tables used to resolve names */ + 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 */ + 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 */ + 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 */ }; /* @@ -18558,26 +18266,26 @@ struct NameContext { ** 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_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_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_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_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 */ /* @@ -18595,25 +18303,25 @@ struct NameContext { ** 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 */ + 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 */ + 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 */ + 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 */ }; /* @@ -18634,25 +18342,25 @@ struct Upsert { ** 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. */ + 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 */ + Window* pWin; /* List of window functions */ + Window* pWinDefn; /* List of named window definitions */ #endif }; @@ -18666,37 +18374,37 @@ struct Select { ** 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_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_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 */ +#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) +#define IsNestedFrom(S) ((S) != 0 && ((S)->selFlags & SF_NestedFrom) != 0) /* ** The results of a SELECT can be distributed in several ways, as defined @@ -18767,43 +18475,43 @@ struct Select { ** 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 */ +#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 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 */ +#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 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 */ +#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 */ + 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 */ }; /* @@ -18816,10 +18524,10 @@ struct SelectDest { ** 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 */ + 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 */ }; /* @@ -18841,30 +18549,30 @@ struct AutoincInfo { ** 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 */ + 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) +#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 +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 /* @@ -18873,9 +18581,9 @@ struct TriggerPrg { ** 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 */ + ParseCleanup* pNext; /* Next cleanup task */ + void* pPtr; /* Pointer to object to deallocate */ + void (*xCleanup)(sqlite3*, void*); /* Deallocation routine */ }; /* @@ -18895,9 +18603,9 @@ struct ParseCleanup { ** list. */ struct Parse { - sqlite3 *db; /* The main database structure */ - char *zErrMsg; /* An error message */ - Vdbe *pVdbe; /* An engine for executing database bytecode */ + 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 */ @@ -18911,47 +18619,47 @@ struct Parse { 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 */ + 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 */ + 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 */ + 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 */ + 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 */ + 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, @@ -18960,9 +18668,9 @@ struct Parse { ** 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 */ + 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 @@ -18971,72 +18679,72 @@ struct Parse { ** 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 */ + 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 */ + int nVtabLock; /* Number of virtual tables to lock */ #endif - int nHeight; /* Expression tree height of current sub-select */ + int nHeight; /* Expression tree height of current sub-select */ #ifndef SQLITE_OMIT_EXPLAIN - int addrExplain; /* Address of current OP_Explain opcode */ + 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. + 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 */ + 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 */ + Token sArg; /* Complete text of a module argument */ + Table** apVtabLock; /* Pointer to virtual tables needing locking */ #endif - With *pWith; /* Current WITH clause, or NULL */ + With* pWith; /* Current WITH clause, or NULL */ #ifndef SQLITE_OMIT_ALTERTABLE - RenameToken *pRename; /* Tokens subject to renaming by ALTER TABLE */ + 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 + */ +#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 */ +#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 +#define IN_DECLARE_VTAB 0 #else - #define IN_DECLARE_VTAB (pParse->eParseMode==PARSE_MODE_DECLARE_VTAB) +#define IN_DECLARE_VTAB (pParse->eParseMode == PARSE_MODE_DECLARE_VTAB) #endif #if defined(SQLITE_OMIT_ALTERTABLE) - #define IN_RENAME_OBJECT 0 +#define IN_RENAME_OBJECT 0 #else - #define IN_RENAME_OBJECT (pParse->eParseMode>=PARSE_MODE_RENAME) +#define IN_RENAME_OBJECT (pParse->eParseMode >= PARSE_MODE_RENAME) #endif #if defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_OMIT_ALTERTABLE) - #define IN_SPECIAL_PARSE 0 +#define IN_SPECIAL_PARSE 0 #else - #define IN_SPECIAL_PARSE (pParse->eParseMode!=PARSE_MODE_NORMAL) +#define IN_SPECIAL_PARSE (pParse->eParseMode != PARSE_MODE_NORMAL) #endif /* @@ -19044,8 +18752,8 @@ struct Parse { ** 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 */ + const char* zAuthContext; /* Put saved Parse.zAuthContext here */ + Parse* pParse; /* The Parse structure */ }; /* @@ -19060,26 +18768,26 @@ struct AuthContext { ** 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 */ +#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 @@ -19097,18 +18805,18 @@ struct AuthContext { ** 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 */ + 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, + 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 */ + 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 */ }; /* @@ -19118,8 +18826,8 @@ struct Trigger { ** 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 +#define TRIGGER_BEFORE 1 +#define TRIGGER_AFTER 2 /* ** An instance of struct TriggerStep is used to store a single SQL statement @@ -19168,25 +18876,25 @@ 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 */ + 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 */ + 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 */ @@ -19199,42 +18907,41 @@ struct Returning { ** 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 */ + 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) +#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. */ + 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 */ +#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 @@ -19245,11 +18952,11 @@ typedef struct { ** ** Tuning parameters are numbered starting with 1. */ -#define SQLITE_NTUNE 6 /* Should be zero for all trunk check-ins */ +#define SQLITE_NTUNE 6 /* Should be zero for all trunk check-ins */ #ifdef SQLITE_DEBUG -# define Tuning(X) (sqlite3Config.aTune[(X)-1]) +#define Tuning(X) (sqlite3Config.aTune[(X) - 1]) #else -# define Tuning(X) 0 +#define Tuning(X) 0 #endif /* @@ -19258,65 +18965,65 @@ typedef struct { ** 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 */ + 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() */ + 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; + 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 */ + 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 */ + sqlite3_int64 mxMemdbSize; /* Default max memdb size */ #endif #ifndef SQLITE_UNTESTABLE - int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */ + 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 */ + 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 */ @@ -19339,36 +19046,36 @@ struct Sqlite3Config { ** sqlite3_test_control(). This enables assert() statements to prove ** things that are always true for well-formed databases. */ -#define CORRUPT_DB (sqlite3Config.neverCorrupt==0) +#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 */ + 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; + 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; }; @@ -19378,13 +19085,13 @@ struct Walker { ** explicit. */ struct DbFixer { - Parse *pParse; /* The parsing context. Error messages written here */ + Parse* pParse; /* The parsing context. Error messages written here */ Walker w; /* Walker object */ - Schema *pSchema; /* Fix items to this schema */ + 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 */ + 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 */ @@ -19396,9 +19103,9 @@ 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*); +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*); @@ -19407,45 +19114,45 @@ SQLITE_PRIVATE void sqlite3SelectWalkAssert2(Walker*, Select*); #ifndef SQLITE_OMIT_CTE SQLITE_PRIVATE void sqlite3SelectPopWith(Walker*, Select*); #else -# define sqlite3SelectPopWith 0 +#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 */ +#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 */ + 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 */ +#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.... */ + 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.... */ }; /* @@ -19460,23 +19167,22 @@ struct With { ** 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 */ + 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 */ + 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 */ @@ -19504,69 +19210,72 @@ struct TreeView { ** 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 */ + 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 */ + 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 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 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 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*); +SQLITE_PRIVATE Window* sqlite3WindowAssemble(Parse*, Window*, ExprList*, ExprList*, Token*); #else -# define sqlite3WindowDelete(a,b) -# define sqlite3WindowFunctions() -# define sqlite3WindowAttach(a,b,c) +#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++; } \ - } \ -} +#define SQLITE_SKIP_UTF8(zIn) \ + { \ + if ((*(zIn++)) >= 0xc0) { \ + while ((*zIn & 0xc0) == 0x80) { \ + zIn++; \ + } \ + } \ + } /* ** The SQLITE_*_BKPT macros are substitutes for the error codes with @@ -19575,7 +19284,7 @@ SQLITE_PRIVATE Window *sqlite3WindowAssemble(Parse*, Window*, ExprList*, ExprLis ** 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 sqlite3ReportError(int iErr, int lineno, const char* zType); SQLITE_PRIVATE int sqlite3CorruptError(int); SQLITE_PRIVATE int sqlite3MisuseError(int); SQLITE_PRIVATE int sqlite3CantopenError(int); @@ -19583,27 +19292,27 @@ SQLITE_PRIVATE int sqlite3CantopenError(int); #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__) +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 +#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)) +SQLITE_PRIVATE int sqlite3CorruptPgnoError(int, Pgno); +#define SQLITE_CORRUPT_PGNO(P) sqlite3CorruptPgnoError(__LINE__, (P)) #else -# define SQLITE_CORRUPT_PGNO(P) sqlite3CorruptError(__LINE__) +#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 +#undef SQLITE_ENABLE_FTS3 +#undef SQLITE_ENABLE_FTS4 #endif /* @@ -19612,16 +19321,15 @@ SQLITE_PRIVATE int sqlite3CorruptPgnoError(int,Pgno); ** 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 +#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 +#if !defined(SQLITE_ASCII) || (defined(SQLITE_ENABLE_FTS3) && defined(SQLITE_AMALGAMATION)) +#include #endif /* @@ -19630,53 +19338,53 @@ SQLITE_PRIVATE int sqlite3CorruptPgnoError(int,Pgno); ** 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)=='`') +#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 sqlite3StrICmp(const char*, const char*); SQLITE_PRIVATE int sqlite3Strlen30(const char*); -#define sqlite3Strlen30NN(C) (strlen(C)&0x3fffffff) -SQLITE_PRIVATE char *sqlite3ColumnType(Column*,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* 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* sqlite3PageMalloc(int); SQLITE_PRIVATE void sqlite3PageFree(void*); SQLITE_PRIVATE void sqlite3MemSetDefault(void); #ifndef SQLITE_UNTESTABLE @@ -19693,64 +19401,63 @@ SQLITE_PRIVATE int sqlite3HeapNearlyFull(void); ** 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) +#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) +#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); +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); +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); +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); +SQLITE_PRIVATE void sqlite3MemoryBarrier(void); #else -# define sqlite3MemoryBarrier() +#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*); +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); +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) +#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); +#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 +#define IsNaN(X) 0 +#define sqlite3IsNaN(X) 0 #endif /* @@ -19758,166 +19465,162 @@ SQLITE_PRIVATE int sqlite3IsNaN(double); ** 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 */ + 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); +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*, ...); +SQLITE_PRIVATE void sqlite3DebugPrintf(const char*, ...); #endif #if defined(SQLITE_TEST) -SQLITE_PRIVATE void *sqlite3TestTextToPtr(const char*); +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); +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*); +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); +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*); +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*); +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*); +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 sqlite3SetString(char**, sqlite3*, const char*); SQLITE_PRIVATE void sqlite3ErrorMsg(Parse*, const char*, ...); -SQLITE_PRIVATE int sqlite3ErrorToParser(sqlite3*,int); +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 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 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); +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 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 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 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); +SQLITE_PRIVATE void sqlite3Pragma(Parse*, Token*, Token*, Token*, int); #ifndef SQLITE_OMIT_VIRTUALTABLE -SQLITE_PRIVATE Module *sqlite3PragmaVtabRegister(sqlite3*,const char *zName); +SQLITE_PRIVATE Module* sqlite3PragmaVtabRegister(sqlite3*, const char* zName); #endif SQLITE_PRIVATE void sqlite3ResetAllSchemasOfConnection(sqlite3*); -SQLITE_PRIVATE void sqlite3ResetOneSchema(sqlite3*,int); +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 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 */ +#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); +SQLITE_PRIVATE i16 sqlite3TableColumnToStorage(Table*, i16); +SQLITE_PRIVATE i16 sqlite3StorageColumnToTable(Table*, i16); #endif -SQLITE_PRIVATE void sqlite3StartTable(Parse*,Token*,Token*,int,int,int,int); +SQLITE_PRIVATE void sqlite3StartTable(Parse*, Token*, Token*, int, int, int, int); #if SQLITE_ENABLE_HIDDEN_COLUMNS -SQLITE_PRIVATE void sqlite3ColumnPropertiesFromName(Table*, Column*); +SQLITE_PRIVATE void sqlite3ColumnPropertiesFromName(Table*, Column*); #else -# define sqlite3ColumnPropertiesFromName(T,C) /* no-op */ +#define sqlite3ColumnPropertiesFromName(T, C) /* no-op */ #endif -SQLITE_PRIVATE void sqlite3AddColumn(Parse*,Token,Token); +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 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 **); -#define sqlite3CodecQueryParameters(A,B,C) 0 -SQLITE_PRIVATE Btree *sqlite3DbNameToBtree(sqlite3*,const char*); +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**); +#define sqlite3CodecQueryParameters(A, B, C) 0 +SQLITE_PRIVATE Btree* sqlite3DbNameToBtree(sqlite3*, const char*); #ifdef SQLITE_UNTESTABLE -# define sqlite3FaultSim(X) SQLITE_OK +#define sqlite3FaultSim(X) SQLITE_OK #else -SQLITE_PRIVATE int sqlite3FaultSim(int); +SQLITE_PRIVATE int sqlite3FaultSim(int); #endif -SQLITE_PRIVATE Bitvec *sqlite3BitvecCreate(u32); +SQLITE_PRIVATE Bitvec* sqlite3BitvecCreate(u32); SQLITE_PRIVATE int sqlite3BitvecTest(Bitvec*, u32); SQLITE_PRIVATE int sqlite3BitvecTestNotNull(Bitvec*, u32); SQLITE_PRIVATE int sqlite3BitvecSet(Bitvec*, u32); @@ -19925,91 +19628,86 @@ 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*); +SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int, int*); #endif -SQLITE_PRIVATE RowSet *sqlite3RowSetInit(sqlite3*); +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); +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*); +SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse*, Table*); #else -# define sqlite3ViewGetColumnNames(A,B) 0 +#define sqlite3ViewGetColumnNames(A, B) 0 #endif -#if SQLITE_MAX_ATTACHED>30 -SQLITE_PRIVATE int sqlite3DbMaskAllZero(yDbMask); +#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); +SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse* pParse); +SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse* pParse); #else -# define sqlite3AutoincrementBegin(X) -# define sqlite3AutoincrementEnd(X) +#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 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 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 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 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 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*); +SQLITE_PRIVATE Expr* sqlite3LimitWhere(Parse*, SrcList*, Expr*, ExprList*, Expr*, char*); #endif -SQLITE_PRIVATE void sqlite3CodeChangeCount(Vdbe*,int,const char*); +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 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 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 */ +#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); @@ -20025,47 +19723,47 @@ 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 */ +#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 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 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 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*); +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 sqlite3RollbackAll(sqlite3*, int); SQLITE_PRIVATE void sqlite3CodeVerifySchema(Parse*, int); -SQLITE_PRIVATE void sqlite3CodeVerifyNamedSchema(Parse*, const char *zDb); +SQLITE_PRIVATE void sqlite3CodeVerifyNamedSchema(Parse*, const char* zDb); SQLITE_PRIVATE void sqlite3BeginTransaction(Parse*, int); -SQLITE_PRIVATE void sqlite3EndTransaction(Parse*,int); +SQLITE_PRIVATE void sqlite3EndTransaction(Parse*, int); SQLITE_PRIVATE void sqlite3Savepoint(Parse*, int, Token*); -SQLITE_PRIVATE void sqlite3CloseSavepoints(sqlite3 *); +SQLITE_PRIVATE void sqlite3CloseSavepoints(sqlite3*); SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3*); SQLITE_PRIVATE u32 sqlite3IsTrueOrFalse(const char*); SQLITE_PRIVATE int sqlite3ExprIdToTrueFalse(Expr*); @@ -20074,8 +19772,8 @@ 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*); +SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr*, int); +SQLITE_PRIVATE int sqlite3ExprIsTableConstraint(Expr*, const SrcItem*); #ifdef SQLITE_ENABLE_CURSOR_HINTS SQLITE_PRIVATE int sqlite3ExprContainsSubquery(Expr*); #endif @@ -20083,20 +19781,18 @@ 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 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*); +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*); +SQLITE_PRIVATE void sqlite3SetMakeRecordP5(Vdbe*, Table*); #else -# define sqlite3SetMakeRecordP5(A,B) +#define sqlite3SetMakeRecordP5(A, B) #endif -SQLITE_PRIVATE void sqlite3CompleteInsertion(Parse*,Table*,int,int,int,int*,int,int,int); +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*); @@ -20104,92 +19800,85 @@ 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 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*); +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); +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); +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 +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 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 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*); @@ -20197,24 +19886,24 @@ 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 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); +SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void* pData, int nChar); #endif -SQLITE_PRIVATE int sqlite3Utf8CharLen(const char *pData, int nByte); +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 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); +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 @@ -20222,8 +19911,8 @@ SQLITE_PRIVATE int sqlite3VListNameToNum(VList*,const char*,int); ** 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 u8 sqlite3GetVarint(const unsigned char*, u64*); +SQLITE_PRIVATE u8 sqlite3GetVarint32(const unsigned char*, u32*); SQLITE_PRIVATE int sqlite3VarintLen(u64 v); /* @@ -20231,95 +19920,92 @@ SQLITE_PRIVATE int sqlite3VarintLen(u64 v); ** 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 +#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 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 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 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 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 **); +SQLITE_PRIVATE int sqlite3TwoPartName(Parse*, Token*, Token*, Token**); #if defined(SQLITE_NEED_ERR_NAME) -SQLITE_PRIVATE const char *sqlite3ErrName(int); +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 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 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 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) +#define sqlite3FileSuffix3(X, Y) #endif -SQLITE_PRIVATE u8 sqlite3GetBoolean(const char *z,u8); +SQLITE_PRIVATE u8 sqlite3GetBoolean(const char* z, u8); -SQLITE_PRIVATE const void *sqlite3ValueText(sqlite3_value*, 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 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 *); +SQLITE_PRIVATE sqlite3_value* sqlite3ValueNew(sqlite3*); #ifndef SQLITE_OMIT_UTF16 -SQLITE_PRIVATE char *sqlite3Utf16to8(sqlite3 *, const void*, int, u8); +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); +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 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* 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; @@ -20335,96 +20021,86 @@ 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 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 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 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 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 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 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 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 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 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 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* sqlite3OomFault(sqlite3*); SQLITE_PRIVATE void sqlite3OomClear(sqlite3*); -SQLITE_PRIVATE int sqlite3ApiExit(sqlite3 *db, int); -SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *); +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 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 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 *); +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 +#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 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**); @@ -20435,142 +20111,134 @@ SQLITE_PRIVATE char sqlite3IndexColumnAffinity(sqlite3*, Index*, int); ** The interface to the LEMON-generated parser */ #ifndef SQLITE_AMALGAMATION -SQLITE_PRIVATE void *sqlite3ParserAlloc(void*(*)(u64), Parse*); -SQLITE_PRIVATE void sqlite3ParserFree(void*, void(*)(void*)); +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*); +SQLITE_PRIVATE int sqlite3ParserStackPeak(void*); #endif SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3*); #ifndef SQLITE_OMIT_LOAD_EXTENSION -SQLITE_PRIVATE void sqlite3CloseExtensions(sqlite3*); +SQLITE_PRIVATE void sqlite3CloseExtensions(sqlite3*); #else -# define sqlite3CloseExtensions(X) +#define sqlite3CloseExtensions(X) #endif #ifndef SQLITE_OMIT_SHARED_CACHE -SQLITE_PRIVATE void sqlite3TableLock(Parse *, int, Pgno, u8, const char *); +SQLITE_PRIVATE void sqlite3TableLock(Parse*, int, Pgno, u8, const char*); #else - #define sqlite3TableLock(v,w,x,y,z) +#define sqlite3TableLock(v, w, x, y, z) #endif #ifdef SQLITE_TEST -SQLITE_PRIVATE int sqlite3Utf8To8(unsigned char*); +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); +#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*); +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) +#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 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 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 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*); +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 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*); +SQLITE_PRIVATE void* sqlite3ParserAddCleanup(Parse*, void (*)(sqlite3*, void*), void*); #ifdef SQLITE_ENABLE_NORMALIZE -SQLITE_PRIVATE char *sqlite3Normalize(Vdbe*, const char*); +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 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); +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); +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) +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*); +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 +#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 @@ -20579,36 +20247,35 @@ SQLITE_PRIVATE int sqlite3UpsertNextIsIPK(Upsert*); ** 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) +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**); +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) +#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 +#define SQLITE_FAULTINJECTOR_MALLOC 0 +#define SQLITE_FAULTINJECTOR_COUNT 1 /* ** The interface to the code in fault.c used for identifying "benign" @@ -20616,66 +20283,65 @@ SQLITE_PRIVATE int sqlite3FkLocateIndex(Parse*,Table*,FKey*,Index**,int**); ** is not defined. */ #ifndef SQLITE_UNTESTABLE -SQLITE_PRIVATE void sqlite3BeginBenignMalloc(void); -SQLITE_PRIVATE void sqlite3EndBenignMalloc(void); +SQLITE_PRIVATE void sqlite3BeginBenignMalloc(void); +SQLITE_PRIVATE void sqlite3EndBenignMalloc(void); #else - #define sqlite3BeginBenignMalloc() - #define sqlite3EndBenignMalloc() +#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 */ +#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*); +#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 *); +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 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); +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) +#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); +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) +#define sqlite3ConnectionBlocked(x, y) +#define sqlite3ConnectionUnlocked(x) +#define sqlite3ConnectionClosed(x) #endif #ifdef SQLITE_DEBUG -SQLITE_PRIVATE void sqlite3ParserTrace(FILE*, char *); +SQLITE_PRIVATE void sqlite3ParserTrace(FILE*, char*); #endif #if defined(YYCOVERAGE) -SQLITE_PRIVATE int sqlite3ParserCoverage(FILE*); +SQLITE_PRIVATE int sqlite3ParserCoverage(FILE*); #endif /* @@ -20684,12 +20350,15 @@ SQLITE_PRIVATE int sqlite3ParserCoverage(FILE*); ** 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*,...); +#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) +#define IOTRACE(A) +#define sqlite3VdbeIOTraceSql(X) #endif /* @@ -20721,23 +20390,23 @@ SQLITE_API SQLITE_EXTERN void (SQLITE_CDECL *sqlite3IoTrace)(const char*,...); ** 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); +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 +#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 */ +#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*); +#if SQLITE_MAX_WORKER_THREADS > 0 +SQLITE_PRIVATE int sqlite3ThreadCreate(SQLiteThread**, void* (*)(void*), void*); SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread*, void**); #endif @@ -20748,14 +20417,14 @@ SQLITE_PRIVATE int sqlite3DbpageRegister(sqlite3*); 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 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); +SQLITE_PRIVATE const char** sqlite3CompileOptions(int* pnOpt); #endif #endif /* SQLITEINT_H */ @@ -20790,7 +20459,7 @@ SQLITE_PRIVATE const char **sqlite3CompileOptions(int *pnOpt); ** 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." +#error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead." #endif /* @@ -20829,63 +20498,63 @@ SQLITE_PRIVATE const char **sqlite3CompileOptions(int *pnOpt); ** 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(__STRICT_ANSI__) && (defined(__GNUC__) || defined(_MSC_VER)) && (defined(i386) || defined(__i386__) || defined(_M_IX86)) - #if defined(__GNUC__) +#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; - } +__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) +#elif defined(_MSC_VER) - __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){ - __asm { +__declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void) { + __asm { rdtsc ret ; return value at EDX:EAX - } } +} - #endif +#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; - } +__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\ +__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; - } + : "=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); } +/* +** 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 @@ -20896,13 +20565,13 @@ SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } 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 +#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) +#define TIMER_ELAPSED ((sqlite_uint64)0) #endif /* @@ -20918,27 +20587,29 @@ 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(){ +#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--; \ - } \ - } + 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) @@ -20950,7 +20621,7 @@ static void local_ioerr(){ */ #if defined(SQLITE_TEST) SQLITE_API extern int sqlite3_open_file_count; -#define OpenCounter(X) sqlite3_open_file_count+=(X) +#define OpenCounter(X) sqlite3_open_file_count += (X) #else #define OpenCounter(X) #endif /* defined(SQLITE_TEST) */ @@ -21001,7 +20672,7 @@ SQLITE_API extern int sqlite3_open_file_count; /* 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_(opt1, opt2) #opt1 "," #opt2 #define CTIMEOPT_VAL2(opt) CTIMEOPT_VAL2_(opt) /* #include "sqliteInt.h" */ @@ -21013,734 +20684,729 @@ SQLITE_API extern int sqlite3_open_file_count; ** 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[] = { +static const char* const sqlite3azCompileOpt[] = { #ifdef SQLITE_32BIT_ROWID - "32BIT_ROWID", + "32BIT_ROWID", #endif #ifdef SQLITE_4_BYTE_ALIGNED_MALLOC - "4_BYTE_ALIGNED_MALLOC", + "4_BYTE_ALIGNED_MALLOC", #endif #ifdef SQLITE_64BIT_STATS - "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 +#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", + "ALLOW_URI_AUTHORITY", #endif #ifdef SQLITE_ATOMIC_INTRINSICS - "ATOMIC_INTRINSICS=" CTIMEOPT_VAL(SQLITE_ATOMIC_INTRINSICS), + "ATOMIC_INTRINSICS=" CTIMEOPT_VAL(SQLITE_ATOMIC_INTRINSICS), #endif #ifdef SQLITE_BITMASK_TYPE - "BITMASK_TYPE=" CTIMEOPT_VAL(SQLITE_BITMASK_TYPE), + "BITMASK_TYPE=" CTIMEOPT_VAL(SQLITE_BITMASK_TYPE), #endif #ifdef SQLITE_BUG_COMPATIBLE_20160819 - "BUG_COMPATIBLE_20160819", + "BUG_COMPATIBLE_20160819", #endif #ifdef SQLITE_CASE_SENSITIVE_LIKE - "CASE_SENSITIVE_LIKE", + "CASE_SENSITIVE_LIKE", #endif #ifdef SQLITE_CHECK_PAGES - "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__), + "COMPILER=clang-" CTIMEOPT_VAL(__clang_major__) "." CTIMEOPT_VAL(__clang_minor__) "." CTIMEOPT_VAL(__clang_patchlevel__), #elif defined(_MSC_VER) - "COMPILER=msvc-" CTIMEOPT_VAL(_MSC_VER), + "COMPILER=msvc-" CTIMEOPT_VAL(_MSC_VER), #elif defined(__GNUC__) && defined(__VERSION__) - "COMPILER=gcc-" __VERSION__, + "COMPILER=gcc-" __VERSION__, #endif #ifdef SQLITE_COVERAGE_TEST - "COVERAGE_TEST", + "COVERAGE_TEST", #endif #ifdef SQLITE_DEBUG - "DEBUG", + "DEBUG", #endif #ifdef SQLITE_DEFAULT_AUTOMATIC_INDEX - "DEFAULT_AUTOMATIC_INDEX", + "DEFAULT_AUTOMATIC_INDEX", #endif #ifdef SQLITE_DEFAULT_AUTOVACUUM - "DEFAULT_AUTOVACUUM", + "DEFAULT_AUTOVACUUM", #endif #ifdef SQLITE_DEFAULT_CACHE_SIZE - "DEFAULT_CACHE_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_CACHE_SIZE), + "DEFAULT_CACHE_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_CACHE_SIZE), #endif #ifdef SQLITE_DEFAULT_CKPTFULLFSYNC - "DEFAULT_CKPTFULLFSYNC", + "DEFAULT_CKPTFULLFSYNC", #endif #ifdef SQLITE_DEFAULT_FILE_FORMAT - "DEFAULT_FILE_FORMAT=" CTIMEOPT_VAL(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), + "DEFAULT_FILE_PERMISSIONS=" CTIMEOPT_VAL(SQLITE_DEFAULT_FILE_PERMISSIONS), #endif #ifdef SQLITE_DEFAULT_FOREIGN_KEYS - "DEFAULT_FOREIGN_KEYS", + "DEFAULT_FOREIGN_KEYS", #endif #ifdef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT - "DEFAULT_JOURNAL_SIZE_LIMIT=" CTIMEOPT_VAL(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), + "DEFAULT_LOCKING_MODE=" CTIMEOPT_VAL(SQLITE_DEFAULT_LOCKING_MODE), #endif #ifdef SQLITE_DEFAULT_LOOKASIDE - "DEFAULT_LOOKASIDE=" CTIMEOPT_VAL2(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 +#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), + "DEFAULT_MMAP_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_MMAP_SIZE), #endif #ifdef SQLITE_DEFAULT_PAGE_SIZE - "DEFAULT_PAGE_SIZE=" CTIMEOPT_VAL(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), + "DEFAULT_PCACHE_INITSZ=" CTIMEOPT_VAL(SQLITE_DEFAULT_PCACHE_INITSZ), #endif #ifdef SQLITE_DEFAULT_PROXYDIR_PERMISSIONS - "DEFAULT_PROXYDIR_PERMISSIONS=" CTIMEOPT_VAL(SQLITE_DEFAULT_PROXYDIR_PERMISSIONS), + "DEFAULT_PROXYDIR_PERMISSIONS=" CTIMEOPT_VAL(SQLITE_DEFAULT_PROXYDIR_PERMISSIONS), #endif #ifdef SQLITE_DEFAULT_RECURSIVE_TRIGGERS - "DEFAULT_RECURSIVE_TRIGGERS", + "DEFAULT_RECURSIVE_TRIGGERS", #endif #ifdef SQLITE_DEFAULT_ROWEST - "DEFAULT_ROWEST=" CTIMEOPT_VAL(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), + "DEFAULT_SECTOR_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_SECTOR_SIZE), #endif #ifdef SQLITE_DEFAULT_SYNCHRONOUS - "DEFAULT_SYNCHRONOUS=" CTIMEOPT_VAL(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), + "DEFAULT_WAL_AUTOCHECKPOINT=" CTIMEOPT_VAL(SQLITE_DEFAULT_WAL_AUTOCHECKPOINT), #endif #ifdef SQLITE_DEFAULT_WAL_SYNCHRONOUS - "DEFAULT_WAL_SYNCHRONOUS=" CTIMEOPT_VAL(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), + "DEFAULT_WORKER_THREADS=" CTIMEOPT_VAL(SQLITE_DEFAULT_WORKER_THREADS), #endif #ifdef SQLITE_DIRECT_OVERFLOW_READ - "DIRECT_OVERFLOW_READ", + "DIRECT_OVERFLOW_READ", #endif #ifdef SQLITE_DISABLE_DIRSYNC - "DISABLE_DIRSYNC", + "DISABLE_DIRSYNC", #endif #ifdef SQLITE_DISABLE_FTS3_UNICODE - "DISABLE_FTS3_UNICODE", + "DISABLE_FTS3_UNICODE", #endif #ifdef SQLITE_DISABLE_FTS4_DEFERRED - "DISABLE_FTS4_DEFERRED", + "DISABLE_FTS4_DEFERRED", #endif #ifdef SQLITE_DISABLE_INTRINSIC - "DISABLE_INTRINSIC", + "DISABLE_INTRINSIC", #endif #ifdef SQLITE_DISABLE_LFS - "DISABLE_LFS", + "DISABLE_LFS", #endif #ifdef SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS - "DISABLE_PAGECACHE_OVERFLOW_STATS", + "DISABLE_PAGECACHE_OVERFLOW_STATS", #endif #ifdef SQLITE_DISABLE_SKIPAHEAD_DISTINCT - "DISABLE_SKIPAHEAD_DISTINCT", + "DISABLE_SKIPAHEAD_DISTINCT", #endif #ifdef SQLITE_ENABLE_8_3_NAMES - "ENABLE_8_3_NAMES=" CTIMEOPT_VAL(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", + "ENABLE_API_ARMOR", #endif #ifdef SQLITE_ENABLE_ATOMIC_WRITE - "ENABLE_ATOMIC_WRITE", + "ENABLE_ATOMIC_WRITE", #endif #ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE - "ENABLE_BATCH_ATOMIC_WRITE", + "ENABLE_BATCH_ATOMIC_WRITE", #endif #ifdef SQLITE_ENABLE_BYTECODE_VTAB - "ENABLE_BYTECODE_VTAB", + "ENABLE_BYTECODE_VTAB", #endif #ifdef SQLITE_ENABLE_CEROD - "ENABLE_CEROD=" CTIMEOPT_VAL(SQLITE_ENABLE_CEROD), + "ENABLE_CEROD=" CTIMEOPT_VAL(SQLITE_ENABLE_CEROD), #endif #ifdef SQLITE_ENABLE_COLUMN_METADATA - "ENABLE_COLUMN_METADATA", + "ENABLE_COLUMN_METADATA", #endif #ifdef SQLITE_ENABLE_COLUMN_USED_MASK - "ENABLE_COLUMN_USED_MASK", + "ENABLE_COLUMN_USED_MASK", #endif #ifdef SQLITE_ENABLE_COSTMULT - "ENABLE_COSTMULT", + "ENABLE_COSTMULT", #endif #ifdef SQLITE_ENABLE_CURSOR_HINTS - "ENABLE_CURSOR_HINTS", + "ENABLE_CURSOR_HINTS", #endif #ifdef SQLITE_ENABLE_DBPAGE_VTAB - "ENABLE_DBPAGE_VTAB", + "ENABLE_DBPAGE_VTAB", #endif #ifdef SQLITE_ENABLE_DBSTAT_VTAB - "ENABLE_DBSTAT_VTAB", + "ENABLE_DBSTAT_VTAB", #endif #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT - "ENABLE_EXPENSIVE_ASSERT", + "ENABLE_EXPENSIVE_ASSERT", #endif #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS - "ENABLE_EXPLAIN_COMMENTS", + "ENABLE_EXPLAIN_COMMENTS", #endif #ifdef SQLITE_ENABLE_FTS3 - "ENABLE_FTS3", + "ENABLE_FTS3", #endif #ifdef SQLITE_ENABLE_FTS3_PARENTHESIS - "ENABLE_FTS3_PARENTHESIS", + "ENABLE_FTS3_PARENTHESIS", #endif #ifdef SQLITE_ENABLE_FTS3_TOKENIZER - "ENABLE_FTS3_TOKENIZER", + "ENABLE_FTS3_TOKENIZER", #endif #ifdef SQLITE_ENABLE_FTS4 - "ENABLE_FTS4", + "ENABLE_FTS4", #endif #ifdef SQLITE_ENABLE_FTS5 - "ENABLE_FTS5", + "ENABLE_FTS5", #endif #ifdef SQLITE_ENABLE_GEOPOLY - "ENABLE_GEOPOLY", + "ENABLE_GEOPOLY", #endif #ifdef SQLITE_ENABLE_HIDDEN_COLUMNS - "ENABLE_HIDDEN_COLUMNS", + "ENABLE_HIDDEN_COLUMNS", #endif #ifdef SQLITE_ENABLE_ICU - "ENABLE_ICU", + "ENABLE_ICU", #endif #ifdef SQLITE_ENABLE_IOTRACE - "ENABLE_IOTRACE", + "ENABLE_IOTRACE", #endif #ifdef SQLITE_ENABLE_LOAD_EXTENSION - "ENABLE_LOAD_EXTENSION", + "ENABLE_LOAD_EXTENSION", #endif #ifdef SQLITE_ENABLE_LOCKING_STYLE - "ENABLE_LOCKING_STYLE=" CTIMEOPT_VAL(SQLITE_ENABLE_LOCKING_STYLE), + "ENABLE_LOCKING_STYLE=" CTIMEOPT_VAL(SQLITE_ENABLE_LOCKING_STYLE), #endif #ifdef SQLITE_ENABLE_MATH_FUNCTIONS - "ENABLE_MATH_FUNCTIONS", + "ENABLE_MATH_FUNCTIONS", #endif #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT - "ENABLE_MEMORY_MANAGEMENT", + "ENABLE_MEMORY_MANAGEMENT", #endif #ifdef SQLITE_ENABLE_MEMSYS3 - "ENABLE_MEMSYS3", + "ENABLE_MEMSYS3", #endif #ifdef SQLITE_ENABLE_MEMSYS5 - "ENABLE_MEMSYS5", + "ENABLE_MEMSYS5", #endif #ifdef SQLITE_ENABLE_MULTIPLEX - "ENABLE_MULTIPLEX", + "ENABLE_MULTIPLEX", #endif #ifdef SQLITE_ENABLE_NORMALIZE - "ENABLE_NORMALIZE", + "ENABLE_NORMALIZE", #endif #ifdef SQLITE_ENABLE_NULL_TRIM - "ENABLE_NULL_TRIM", + "ENABLE_NULL_TRIM", #endif #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC - "ENABLE_OFFSET_SQL_FUNC", + "ENABLE_OFFSET_SQL_FUNC", #endif #ifdef SQLITE_ENABLE_OVERSIZE_CELL_CHECK - "ENABLE_OVERSIZE_CELL_CHECK", + "ENABLE_OVERSIZE_CELL_CHECK", #endif #ifdef SQLITE_ENABLE_PREUPDATE_HOOK - "ENABLE_PREUPDATE_HOOK", + "ENABLE_PREUPDATE_HOOK", #endif #ifdef SQLITE_ENABLE_QPSG - "ENABLE_QPSG", + "ENABLE_QPSG", #endif #ifdef SQLITE_ENABLE_RBU - "ENABLE_RBU", + "ENABLE_RBU", #endif #ifdef SQLITE_ENABLE_RTREE - "ENABLE_RTREE", + "ENABLE_RTREE", #endif #ifdef SQLITE_ENABLE_SESSION - "ENABLE_SESSION", + "ENABLE_SESSION", #endif #ifdef SQLITE_ENABLE_SNAPSHOT - "ENABLE_SNAPSHOT", + "ENABLE_SNAPSHOT", #endif #ifdef SQLITE_ENABLE_SORTER_REFERENCES - "ENABLE_SORTER_REFERENCES", + "ENABLE_SORTER_REFERENCES", #endif #ifdef SQLITE_ENABLE_SQLLOG - "ENABLE_SQLLOG", + "ENABLE_SQLLOG", #endif #ifdef SQLITE_ENABLE_STAT4 - "ENABLE_STAT4", + "ENABLE_STAT4", #endif #ifdef SQLITE_ENABLE_STMTVTAB - "ENABLE_STMTVTAB", + "ENABLE_STMTVTAB", #endif #ifdef SQLITE_ENABLE_STMT_SCANSTATUS - "ENABLE_STMT_SCANSTATUS", + "ENABLE_STMT_SCANSTATUS", #endif #ifdef SQLITE_ENABLE_TREETRACE - "ENABLE_TREETRACE", + "ENABLE_TREETRACE", #endif #ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION - "ENABLE_UNKNOWN_SQL_FUNCTION", + "ENABLE_UNKNOWN_SQL_FUNCTION", #endif #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY - "ENABLE_UNLOCK_NOTIFY", + "ENABLE_UNLOCK_NOTIFY", #endif #ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT - "ENABLE_UPDATE_DELETE_LIMIT", + "ENABLE_UPDATE_DELETE_LIMIT", #endif #ifdef SQLITE_ENABLE_URI_00_ERROR - "ENABLE_URI_00_ERROR", + "ENABLE_URI_00_ERROR", #endif #ifdef SQLITE_ENABLE_VFSTRACE - "ENABLE_VFSTRACE", + "ENABLE_VFSTRACE", #endif #ifdef SQLITE_ENABLE_WHERETRACE - "ENABLE_WHERETRACE", + "ENABLE_WHERETRACE", #endif #ifdef SQLITE_ENABLE_ZIPVFS - "ENABLE_ZIPVFS", + "ENABLE_ZIPVFS", #endif #ifdef SQLITE_EXPLAIN_ESTIMATED_ROWS - "EXPLAIN_ESTIMATED_ROWS", + "EXPLAIN_ESTIMATED_ROWS", #endif #ifdef SQLITE_EXTRA_IFNULLROW - "EXTRA_IFNULLROW", + "EXTRA_IFNULLROW", #endif #ifdef SQLITE_EXTRA_INIT - "EXTRA_INIT=" CTIMEOPT_VAL(SQLITE_EXTRA_INIT), + "EXTRA_INIT=" CTIMEOPT_VAL(SQLITE_EXTRA_INIT), #endif #ifdef SQLITE_EXTRA_SHUTDOWN - "EXTRA_SHUTDOWN=" CTIMEOPT_VAL(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), + "FTS3_MAX_EXPR_DEPTH=" CTIMEOPT_VAL(SQLITE_FTS3_MAX_EXPR_DEPTH), #endif #ifdef SQLITE_FTS5_ENABLE_TEST_MI - "FTS5_ENABLE_TEST_MI", + "FTS5_ENABLE_TEST_MI", #endif #ifdef SQLITE_FTS5_NO_WITHOUT_ROWID - "FTS5_NO_WITHOUT_ROWID", + "FTS5_NO_WITHOUT_ROWID", #endif #if HAVE_ISNAN || SQLITE_HAVE_ISNAN - "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 +#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", + "IGNORE_AFP_LOCK_ERRORS", #endif #ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS - "IGNORE_FLOCK_LOCK_ERRORS", + "IGNORE_FLOCK_LOCK_ERRORS", #endif #ifdef SQLITE_INLINE_MEMCPY - "INLINE_MEMCPY", + "INLINE_MEMCPY", #endif #ifdef SQLITE_INT64_TYPE - "INT64_TYPE", + "INT64_TYPE", #endif #ifdef SQLITE_INTEGRITY_CHECK_ERROR_MAX - "INTEGRITY_CHECK_ERROR_MAX=" CTIMEOPT_VAL(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", + "LIKE_DOESNT_MATCH_BLOBS", #endif #ifdef SQLITE_LOCK_TRACE - "LOCK_TRACE", + "LOCK_TRACE", #endif #ifdef SQLITE_LOG_CACHE_SPILL - "LOG_CACHE_SPILL", + "LOG_CACHE_SPILL", #endif #ifdef SQLITE_MALLOC_SOFT_LIMIT - "MALLOC_SOFT_LIMIT=" CTIMEOPT_VAL(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), + "MAX_ATTACHED=" CTIMEOPT_VAL(SQLITE_MAX_ATTACHED), #endif #ifdef SQLITE_MAX_COLUMN - "MAX_COLUMN=" CTIMEOPT_VAL(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), + "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), + "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), + "MAX_EXPR_DEPTH=" CTIMEOPT_VAL(SQLITE_MAX_EXPR_DEPTH), #endif #ifdef SQLITE_MAX_FUNCTION_ARG - "MAX_FUNCTION_ARG=" CTIMEOPT_VAL(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), + "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), + "MAX_LIKE_PATTERN_LENGTH=" CTIMEOPT_VAL(SQLITE_MAX_LIKE_PATTERN_LENGTH), #endif #ifdef SQLITE_MAX_MEMORY - "MAX_MEMORY=" CTIMEOPT_VAL(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), + "MAX_MMAP_SIZE=" CTIMEOPT_VAL(SQLITE_MAX_MMAP_SIZE), #endif #ifdef SQLITE_MAX_MMAP_SIZE_ - "MAX_MMAP_SIZE_=" CTIMEOPT_VAL(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), + "MAX_PAGE_COUNT=" CTIMEOPT_VAL(SQLITE_MAX_PAGE_COUNT), #endif #ifdef SQLITE_MAX_PAGE_SIZE - "MAX_PAGE_SIZE=" CTIMEOPT_VAL(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), + "MAX_SCHEMA_RETRY=" CTIMEOPT_VAL(SQLITE_MAX_SCHEMA_RETRY), #endif #ifdef SQLITE_MAX_SQL_LENGTH - "MAX_SQL_LENGTH=" CTIMEOPT_VAL(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), + "MAX_TRIGGER_DEPTH=" CTIMEOPT_VAL(SQLITE_MAX_TRIGGER_DEPTH), #endif #ifdef SQLITE_MAX_VARIABLE_NUMBER - "MAX_VARIABLE_NUMBER=" CTIMEOPT_VAL(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), + "MAX_VDBE_OP=" CTIMEOPT_VAL(SQLITE_MAX_VDBE_OP), #endif #ifdef SQLITE_MAX_WORKER_THREADS - "MAX_WORKER_THREADS=" CTIMEOPT_VAL(SQLITE_MAX_WORKER_THREADS), + "MAX_WORKER_THREADS=" CTIMEOPT_VAL(SQLITE_MAX_WORKER_THREADS), #endif #ifdef SQLITE_MEMDEBUG - "MEMDEBUG", + "MEMDEBUG", #endif #ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT - "MIXED_ENDIAN_64BIT_FLOAT", + "MIXED_ENDIAN_64BIT_FLOAT", #endif #ifdef SQLITE_MMAP_READWRITE - "MMAP_READWRITE", + "MMAP_READWRITE", #endif #ifdef SQLITE_MUTEX_NOOP - "MUTEX_NOOP", + "MUTEX_NOOP", #endif #ifdef SQLITE_MUTEX_OMIT - "MUTEX_OMIT", + "MUTEX_OMIT", #endif #ifdef SQLITE_MUTEX_PTHREADS - "MUTEX_PTHREADS", + "MUTEX_PTHREADS", #endif #ifdef SQLITE_MUTEX_W32 - "MUTEX_W32", + "MUTEX_W32", #endif #ifdef SQLITE_NEED_ERR_NAME - "NEED_ERR_NAME", + "NEED_ERR_NAME", #endif #ifdef SQLITE_NO_SYNC - "NO_SYNC", + "NO_SYNC", #endif #ifdef SQLITE_OMIT_ALTERTABLE - "OMIT_ALTERTABLE", + "OMIT_ALTERTABLE", #endif #ifdef SQLITE_OMIT_ANALYZE - "OMIT_ANALYZE", + "OMIT_ANALYZE", #endif #ifdef SQLITE_OMIT_ATTACH - "OMIT_ATTACH", + "OMIT_ATTACH", #endif #ifdef SQLITE_OMIT_AUTHORIZATION - "OMIT_AUTHORIZATION", + "OMIT_AUTHORIZATION", #endif #ifdef SQLITE_OMIT_AUTOINCREMENT - "OMIT_AUTOINCREMENT", + "OMIT_AUTOINCREMENT", #endif #ifdef SQLITE_OMIT_AUTOINIT - "OMIT_AUTOINIT", + "OMIT_AUTOINIT", #endif #ifdef SQLITE_OMIT_AUTOMATIC_INDEX - "OMIT_AUTOMATIC_INDEX", + "OMIT_AUTOMATIC_INDEX", #endif #ifdef SQLITE_OMIT_AUTORESET - "OMIT_AUTORESET", + "OMIT_AUTORESET", #endif #ifdef SQLITE_OMIT_AUTOVACUUM - "OMIT_AUTOVACUUM", + "OMIT_AUTOVACUUM", #endif #ifdef SQLITE_OMIT_BETWEEN_OPTIMIZATION - "OMIT_BETWEEN_OPTIMIZATION", + "OMIT_BETWEEN_OPTIMIZATION", #endif #ifdef SQLITE_OMIT_BLOB_LITERAL - "OMIT_BLOB_LITERAL", + "OMIT_BLOB_LITERAL", #endif #ifdef SQLITE_OMIT_CAST - "OMIT_CAST", + "OMIT_CAST", #endif #ifdef SQLITE_OMIT_CHECK - "OMIT_CHECK", + "OMIT_CHECK", #endif #ifdef SQLITE_OMIT_COMPLETE - "OMIT_COMPLETE", + "OMIT_COMPLETE", #endif #ifdef SQLITE_OMIT_COMPOUND_SELECT - "OMIT_COMPOUND_SELECT", + "OMIT_COMPOUND_SELECT", #endif #ifdef SQLITE_OMIT_CONFLICT_CLAUSE - "OMIT_CONFLICT_CLAUSE", + "OMIT_CONFLICT_CLAUSE", #endif #ifdef SQLITE_OMIT_CTE - "OMIT_CTE", + "OMIT_CTE", #endif #if defined(SQLITE_OMIT_DATETIME_FUNCS) || defined(SQLITE_OMIT_FLOATING_POINT) - "OMIT_DATETIME_FUNCS", + "OMIT_DATETIME_FUNCS", #endif #ifdef SQLITE_OMIT_DECLTYPE - "OMIT_DECLTYPE", + "OMIT_DECLTYPE", #endif #ifdef SQLITE_OMIT_DEPRECATED - "OMIT_DEPRECATED", + "OMIT_DEPRECATED", #endif #ifdef SQLITE_OMIT_DESERIALIZE - "OMIT_DESERIALIZE", + "OMIT_DESERIALIZE", #endif #ifdef SQLITE_OMIT_DISKIO - "OMIT_DISKIO", + "OMIT_DISKIO", #endif #ifdef SQLITE_OMIT_EXPLAIN - "OMIT_EXPLAIN", + "OMIT_EXPLAIN", #endif #ifdef SQLITE_OMIT_FLAG_PRAGMAS - "OMIT_FLAG_PRAGMAS", + "OMIT_FLAG_PRAGMAS", #endif #ifdef SQLITE_OMIT_FLOATING_POINT - "OMIT_FLOATING_POINT", + "OMIT_FLOATING_POINT", #endif #ifdef SQLITE_OMIT_FOREIGN_KEY - "OMIT_FOREIGN_KEY", + "OMIT_FOREIGN_KEY", #endif #ifdef SQLITE_OMIT_GET_TABLE - "OMIT_GET_TABLE", + "OMIT_GET_TABLE", #endif #ifdef SQLITE_OMIT_HEX_INTEGER - "OMIT_HEX_INTEGER", + "OMIT_HEX_INTEGER", #endif #ifdef SQLITE_OMIT_INCRBLOB - "OMIT_INCRBLOB", + "OMIT_INCRBLOB", #endif #ifdef SQLITE_OMIT_INTEGRITY_CHECK - "OMIT_INTEGRITY_CHECK", + "OMIT_INTEGRITY_CHECK", #endif #ifdef SQLITE_OMIT_INTROSPECTION_PRAGMAS - "OMIT_INTROSPECTION_PRAGMAS", + "OMIT_INTROSPECTION_PRAGMAS", #endif #ifdef SQLITE_OMIT_JSON - "OMIT_JSON", + "OMIT_JSON", #endif #ifdef SQLITE_OMIT_LIKE_OPTIMIZATION - "OMIT_LIKE_OPTIMIZATION", + "OMIT_LIKE_OPTIMIZATION", #endif #ifdef SQLITE_OMIT_LOAD_EXTENSION - "OMIT_LOAD_EXTENSION", + "OMIT_LOAD_EXTENSION", #endif #ifdef SQLITE_OMIT_LOCALTIME - "OMIT_LOCALTIME", + "OMIT_LOCALTIME", #endif #ifdef SQLITE_OMIT_LOOKASIDE - "OMIT_LOOKASIDE", + "OMIT_LOOKASIDE", #endif #ifdef SQLITE_OMIT_MEMORYDB - "OMIT_MEMORYDB", + "OMIT_MEMORYDB", #endif #ifdef SQLITE_OMIT_OR_OPTIMIZATION - "OMIT_OR_OPTIMIZATION", + "OMIT_OR_OPTIMIZATION", #endif #ifdef SQLITE_OMIT_PAGER_PRAGMAS - "OMIT_PAGER_PRAGMAS", + "OMIT_PAGER_PRAGMAS", #endif #ifdef SQLITE_OMIT_PARSER_TRACE - "OMIT_PARSER_TRACE", + "OMIT_PARSER_TRACE", #endif #ifdef SQLITE_OMIT_POPEN - "OMIT_POPEN", + "OMIT_POPEN", #endif #ifdef SQLITE_OMIT_PRAGMA - "OMIT_PRAGMA", + "OMIT_PRAGMA", #endif #ifdef SQLITE_OMIT_PROGRESS_CALLBACK - "OMIT_PROGRESS_CALLBACK", + "OMIT_PROGRESS_CALLBACK", #endif #ifdef SQLITE_OMIT_QUICKBALANCE - "OMIT_QUICKBALANCE", + "OMIT_QUICKBALANCE", #endif #ifdef SQLITE_OMIT_REINDEX - "OMIT_REINDEX", + "OMIT_REINDEX", #endif #ifdef SQLITE_OMIT_SCHEMA_PRAGMAS - "OMIT_SCHEMA_PRAGMAS", + "OMIT_SCHEMA_PRAGMAS", #endif #ifdef SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS - "OMIT_SCHEMA_VERSION_PRAGMAS", + "OMIT_SCHEMA_VERSION_PRAGMAS", #endif #ifdef SQLITE_OMIT_SHARED_CACHE - "OMIT_SHARED_CACHE", + "OMIT_SHARED_CACHE", #endif #ifdef SQLITE_OMIT_SHUTDOWN_DIRECTORIES - "OMIT_SHUTDOWN_DIRECTORIES", + "OMIT_SHUTDOWN_DIRECTORIES", #endif #ifdef SQLITE_OMIT_SUBQUERY - "OMIT_SUBQUERY", + "OMIT_SUBQUERY", #endif #ifdef SQLITE_OMIT_TCL_VARIABLE - "OMIT_TCL_VARIABLE", + "OMIT_TCL_VARIABLE", #endif #ifdef SQLITE_OMIT_TEMPDB - "OMIT_TEMPDB", + "OMIT_TEMPDB", #endif #ifdef SQLITE_OMIT_TEST_CONTROL - "OMIT_TEST_CONTROL", + "OMIT_TEST_CONTROL", #endif #ifdef SQLITE_OMIT_TRACE -# if SQLITE_OMIT_TRACE != 1 - "OMIT_TRACE=" CTIMEOPT_VAL(SQLITE_OMIT_TRACE), -# endif +#if SQLITE_OMIT_TRACE != 1 + "OMIT_TRACE=" CTIMEOPT_VAL(SQLITE_OMIT_TRACE), +#endif #endif #ifdef SQLITE_OMIT_TRIGGER - "OMIT_TRIGGER", + "OMIT_TRIGGER", #endif #ifdef SQLITE_OMIT_TRUNCATE_OPTIMIZATION - "OMIT_TRUNCATE_OPTIMIZATION", + "OMIT_TRUNCATE_OPTIMIZATION", #endif #ifdef SQLITE_OMIT_UTF16 - "OMIT_UTF16", + "OMIT_UTF16", #endif #ifdef SQLITE_OMIT_VACUUM - "OMIT_VACUUM", + "OMIT_VACUUM", #endif #ifdef SQLITE_OMIT_VIEW - "OMIT_VIEW", + "OMIT_VIEW", #endif #ifdef SQLITE_OMIT_VIRTUALTABLE - "OMIT_VIRTUALTABLE", + "OMIT_VIRTUALTABLE", #endif #ifdef SQLITE_OMIT_WAL - "OMIT_WAL", + "OMIT_WAL", #endif #ifdef SQLITE_OMIT_WSD - "OMIT_WSD", + "OMIT_WSD", #endif #ifdef SQLITE_OMIT_XFER_OPT - "OMIT_XFER_OPT", + "OMIT_XFER_OPT", #endif #ifdef SQLITE_PCACHE_SEPARATE_HEADER - "PCACHE_SEPARATE_HEADER", + "PCACHE_SEPARATE_HEADER", #endif #ifdef SQLITE_PERFORMANCE_TRACE - "PERFORMANCE_TRACE", + "PERFORMANCE_TRACE", #endif #ifdef SQLITE_POWERSAFE_OVERWRITE -# if SQLITE_POWERSAFE_OVERWRITE != 1 - "POWERSAFE_OVERWRITE=" CTIMEOPT_VAL(SQLITE_POWERSAFE_OVERWRITE), -# endif +#if SQLITE_POWERSAFE_OVERWRITE != 1 + "POWERSAFE_OVERWRITE=" CTIMEOPT_VAL(SQLITE_POWERSAFE_OVERWRITE), +#endif #endif #ifdef SQLITE_PREFER_PROXY_LOCKING - "PREFER_PROXY_LOCKING", + "PREFER_PROXY_LOCKING", #endif #ifdef SQLITE_PROXY_DEBUG - "PROXY_DEBUG", + "PROXY_DEBUG", #endif #ifdef SQLITE_REVERSE_UNORDERED_SELECTS - "REVERSE_UNORDERED_SELECTS", + "REVERSE_UNORDERED_SELECTS", #endif #ifdef SQLITE_RTREE_INT_ONLY - "RTREE_INT_ONLY", + "RTREE_INT_ONLY", #endif #ifdef SQLITE_SECURE_DELETE - "SECURE_DELETE", + "SECURE_DELETE", #endif #ifdef SQLITE_SMALL_STACK - "SMALL_STACK", + "SMALL_STACK", #endif #ifdef SQLITE_SORTER_PMASZ - "SORTER_PMASZ=" CTIMEOPT_VAL(SQLITE_SORTER_PMASZ), + "SORTER_PMASZ=" CTIMEOPT_VAL(SQLITE_SORTER_PMASZ), #endif #ifdef SQLITE_SOUNDEX - "SOUNDEX", + "SOUNDEX", #endif #ifdef SQLITE_STAT4_SAMPLES - "STAT4_SAMPLES=" CTIMEOPT_VAL(SQLITE_STAT4_SAMPLES), + "STAT4_SAMPLES=" CTIMEOPT_VAL(SQLITE_STAT4_SAMPLES), #endif #ifdef SQLITE_STMTJRNL_SPILL - "STMTJRNL_SPILL=" CTIMEOPT_VAL(SQLITE_STMTJRNL_SPILL), + "STMTJRNL_SPILL=" CTIMEOPT_VAL(SQLITE_STMTJRNL_SPILL), #endif #ifdef SQLITE_SUBSTR_COMPATIBILITY - "SUBSTR_COMPATIBILITY", + "SUBSTR_COMPATIBILITY", #endif -#if (!defined(SQLITE_WIN32_MALLOC) \ - && !defined(SQLITE_ZERO_MALLOC) \ - && !defined(SQLITE_MEMDEBUG) \ - ) || defined(SQLITE_SYSTEM_MALLOC) - "SYSTEM_MALLOC", +#if (!defined(SQLITE_WIN32_MALLOC) && !defined(SQLITE_ZERO_MALLOC) && !defined(SQLITE_MEMDEBUG)) || defined(SQLITE_SYSTEM_MALLOC) + "SYSTEM_MALLOC", #endif #ifdef SQLITE_TCL - "TCL", + "TCL", #endif #ifdef SQLITE_TEMP_STORE - "TEMP_STORE=" CTIMEOPT_VAL(SQLITE_TEMP_STORE), + "TEMP_STORE=" CTIMEOPT_VAL(SQLITE_TEMP_STORE), #endif #ifdef SQLITE_TEST - "TEST", + "TEST", #endif #if defined(SQLITE_THREADSAFE) - "THREADSAFE=" CTIMEOPT_VAL(SQLITE_THREADSAFE), + "THREADSAFE=" CTIMEOPT_VAL(SQLITE_THREADSAFE), #elif defined(THREADSAFE) - "THREADSAFE=" CTIMEOPT_VAL(THREADSAFE), + "THREADSAFE=" CTIMEOPT_VAL(THREADSAFE), #else - "THREADSAFE=1", + "THREADSAFE=1", #endif #ifdef SQLITE_UNLINK_AFTER_CLOSE - "UNLINK_AFTER_CLOSE", + "UNLINK_AFTER_CLOSE", #endif #ifdef SQLITE_UNTESTABLE - "UNTESTABLE", + "UNTESTABLE", #endif #ifdef SQLITE_USER_AUTHENTICATION - "USER_AUTHENTICATION", + "USER_AUTHENTICATION", #endif #ifdef SQLITE_USE_ALLOCA - "USE_ALLOCA", + "USE_ALLOCA", #endif #ifdef SQLITE_USE_FCNTL_TRACE - "USE_FCNTL_TRACE", + "USE_FCNTL_TRACE", #endif #ifdef SQLITE_USE_URI - "USE_URI", + "USE_URI", #endif #ifdef SQLITE_VDBE_COVERAGE - "VDBE_COVERAGE", + "VDBE_COVERAGE", #endif #ifdef SQLITE_WIN32_MALLOC - "WIN32_MALLOC", + "WIN32_MALLOC", #endif #ifdef SQLITE_ZERO_MALLOC - "ZERO_MALLOC", + "ZERO_MALLOC", #endif -} ; +}; -SQLITE_PRIVATE const char **sqlite3CompileOptions(int *pnOpt){ +SQLITE_PRIVATE const char** sqlite3CompileOptions(int* pnOpt) { *pnOpt = sizeof(sqlite3azCompileOpt) / sizeof(sqlite3azCompileOpt[0]); return (const char**)sqlite3azCompileOpt; } @@ -21774,69 +21440,63 @@ SQLITE_PRIVATE const char **sqlite3CompileOptions(int *pnOpt){ */ 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, + 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*/ + 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]; +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 @@ -21867,41 +21527,41 @@ SQLITE_PRIVATE const unsigned char *sqlite3aGTb = &sqlite3UpperToLower[256+12-OP ** 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 ........ */ + 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 @@ -21916,7 +21576,7 @@ SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { ** SQLITE_USE_URI symbol defined. */ #ifndef SQLITE_USE_URI -# define SQLITE_USE_URI 0 +#define SQLITE_USE_URI 0 #endif /* EVIDENCE-OF: R-38720-18127 The default setting is determined by the @@ -21924,21 +21584,21 @@ SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { ** that compile-time option is omitted. */ #if !defined(SQLITE_ALLOW_COVERING_INDEX_SCAN) -# define SQLITE_ALLOW_COVERING_INDEX_SCAN 1 +#define SQLITE_ALLOW_COVERING_INDEX_SCAN 1 #else -# if !SQLITE_ALLOW_COVERING_INDEX_SCAN -# error "Compile-time disabling of covering index scan using the\ +#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 #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 +#define SQLITE_SORTER_PMASZ 250 #endif /* Statement journals spill to disk when their size exceeds the following @@ -21950,7 +21610,7 @@ SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { ** setting.) */ #ifndef SQLITE_STMTJRNL_SPILL -# define SQLITE_STMTJRNL_SPILL (64*1024) +#define SQLITE_STMTJRNL_SPILL (64 * 1024) #endif /* @@ -21967,19 +21627,18 @@ SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { ** 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 +#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 +#define SQLITE_MEMDB_DEFAULT_MAXSIZE 1073741824 #endif /* @@ -21987,62 +21646,63 @@ SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { ** 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 */ + 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 */ + 0, /* xSqllog */ + 0, /* pSqllogArg */ #endif #ifdef SQLITE_VDBE_COVERAGE - 0, /* xVdbeBranch */ - 0, /* pVbeBranchArg */ + 0, /* xVdbeBranch */ + 0, /* pVbeBranchArg */ #endif #ifndef SQLITE_OMIT_DESERIALIZE - SQLITE_MEMDB_DEFAULT_MAXSIZE, /* mxMemdbSize */ + SQLITE_MEMDB_DEFAULT_MAXSIZE, /* mxMemdbSize */ #endif #ifndef SQLITE_UNTESTABLE - 0, /* xTestCallback */ + 0, /* xTestCallback */ #endif - 0, /* bLocaltimeFault */ - 0, /* xAltLocaltime */ - 0x7ffffffe, /* iOnceResetThreshold */ - SQLITE_DEFAULT_SORTERREF_SIZE, /* szSorterRef */ - 0, /* iPrngSeed */ + 0, /* bLocaltimeFault */ + 0, /* xAltLocaltime */ + 0x7ffffffe, /* iOnceResetThreshold */ + SQLITE_DEFAULT_SORTERREF_SIZE, /* szSorterRef */ + 0, /* iPrngSeed */ #ifdef SQLITE_DEBUG - {0,0,0,0,0,0} /* aTune */ + {0, 0, 0, 0, 0, 0} /* aTune */ #endif }; @@ -22131,31 +21791,11 @@ SQLITE_PRIVATE const char sqlite3StrBINARY[] = "BINARY"; ** 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" -}; +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 ******************************************/ @@ -22202,19 +21842,18 @@ SQLITE_PRIVATE const char *sqlite3StdType[] = { ** itself before giving up and returning SQLITE_SCHEMA. */ #ifndef SQLITE_MAX_SCHEMA_RETRY -# define SQLITE_MAX_SCHEMA_RETRY 50 +#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 +#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 +#define VDBE_DISPLAY_P4 0 #endif /* @@ -22236,10 +21875,10 @@ typedef struct VdbeSorter VdbeSorter; typedef struct AuxData AuxData; /* Types of VDBE cursors */ -#define CURTYPE_BTREE 0 -#define CURTYPE_SORTER 1 -#define CURTYPE_VTAB 2 -#define CURTYPE_PSEUDO 3 +#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: @@ -22253,33 +21892,33 @@ typedef struct AuxData AuxData; */ 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 */ + 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 */ + 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 */ + 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. */ + 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 */ @@ -22287,37 +21926,35 @@ struct VdbeCursor { /* 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 */ + 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 */ + 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 */ + 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 */ + 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 */ + 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) - + */ +#define IsNullCursor(P) ((P)->eCurType == CURTYPE_PSEUDO && (P)->nullRow && (P)->seekResult == 0) /* ** A value for VdbeCursor.cacheStatus that means the cache is always invalid. @@ -22347,27 +21984,27 @@ struct VdbeCursor { */ 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 */ + 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 */ + 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 */ @@ -22377,7 +22014,7 @@ struct VdbeFrame { ** Return a pointer to the array of registers allocated for use ** by a VdbeFrame. */ -#define VdbeFrameMem(p) ((Mem *)&((u8 *)p)[ROUND8(sizeof(VdbeFrame))]) +#define VdbeFrameMem(p) ((Mem*)&((u8*)p)[ROUND8(sizeof(VdbeFrame))]) /* ** Internally, the vdbe manipulates nearly all SQL values as Mem @@ -22389,23 +22026,23 @@ struct sqlite3_value { 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 */ + 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 */ + 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 */ + 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 */ + Mem* pScopyFrom; /* This Mem is a shallow copy of pScopyFrom */ + u16 mScopyFlags; /* flags value immediately after the shallow copy */ #endif }; @@ -22413,7 +22050,7 @@ struct sqlite3_value { ** Size of struct Mem not including the Mem.zMalloc member or anything that ** follows. */ -#define MEMCELLSIZE offsetof(Mem,db) +#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. @@ -22460,51 +22097,47 @@ struct sqlite3_value { ** 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 */ +#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 */ + */ +#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 */ +#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) +#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) +#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) +#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. @@ -22515,7 +22148,7 @@ struct sqlite3_value { ** is set. It is "undefined" if all those bits are zero. */ #ifdef SQLITE_DEBUG -#define memIsValid(M) ((M)->flags & MEM_AffMask)!=0 +#define memIsValid(M) ((M)->flags & MEM_AffMask) != 0 #endif /* @@ -22526,11 +22159,11 @@ struct sqlite3_value { ** 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 */ + 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 */ }; /* @@ -22547,34 +22180,34 @@ struct AuxData { ** (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 */ + 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 */ + 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 */ +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 */ + 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 @@ -22586,8 +22219,8 @@ struct ScanStatus { */ typedef struct DblquoteStr DblquoteStr; struct DblquoteStr { - DblquoteStr *pNextStr; /* Next string literal in the list */ - char z[8]; /* Dequoted value for the string */ + DblquoteStr* pNextStr; /* Next string literal in the list */ + char z[8]; /* Dequoted value for the string */ }; /* @@ -22598,103 +22231,103 @@ struct DblquoteStr { ** 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. */ + 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 */ + 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 */ + 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 */ + 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 */ + 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() */ + 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() */ +#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 */ + 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 */ + 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 */ }; /* @@ -22711,8 +22344,8 @@ struct PreUpdate { */ typedef struct ValueList ValueList; struct ValueList { - BtCursor *pCsr; /* An ephemeral table holding all values */ - sqlite3_value *pOut; /* Register to hold each decoded output value */ + 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 @@ -22725,59 +22358,59 @@ SQLITE_PRIVATE const u8 sqlite3SmallTypeSizes[]; /* ** 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 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) +SQLITE_PRIVATE u64 sqlite3FloatSwap(u64 in); +#define swapMixedEndianFloat(X) X = sqlite3FloatSwap(X) #else -# define swapMixedEndianFloat(X) +#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*); +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*); +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*); +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 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 int sqlite3VdbeMemSetStr(Mem*, const char*, i64, u8, void (*)(void*)); SQLITE_PRIVATE void sqlite3VdbeMemSetInt64(Mem*, i64); #ifdef SQLITE_OMIT_FLOATING_POINT -# define sqlite3VdbeMemSetDouble sqlite3VdbeMemSetInt64 +#define sqlite3VdbeMemSetDouble sqlite3VdbeMemSetInt64 #else -SQLITE_PRIVATE void sqlite3VdbeMemSetDouble(Mem*, double); +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 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); +SQLITE_PRIVATE void sqlite3VdbeMemSetZeroBlob(Mem*, int); #else -SQLITE_PRIVATE int sqlite3VdbeMemSetZeroBlob(Mem*,int); +SQLITE_PRIVATE int sqlite3VdbeMemSetZeroBlob(Mem*, int); #endif #ifdef SQLITE_DEBUG SQLITE_PRIVATE int sqlite3VdbeMemIsRowSet(const Mem*); @@ -22785,7 +22418,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemIsRowSet(const Mem*); 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 int sqlite3IntFloatCompare(i64, double); SQLITE_PRIVATE i64 sqlite3VdbeIntValue(const Mem*); SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem*); SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem*); @@ -22793,88 +22426,87 @@ 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 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); +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); +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 *); +SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame*); #ifdef SQLITE_ENABLE_PREUPDATE_HOOK -SQLITE_PRIVATE void sqlite3VdbePreUpdateHook( - Vdbe*,VdbeCursor*,int,const char*,Table*,i64,int,int); +SQLITE_PRIVATE void sqlite3VdbePreUpdateHook(Vdbe*, VdbeCursor*, int, const char*, Table*, i64, int, int); #endif -SQLITE_PRIVATE int sqlite3VdbeTransferError(Vdbe *p); +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 *); +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*); +SQLITE_PRIVATE void sqlite3VdbeIncrWriteCounter(Vdbe*, VdbeCursor*); +SQLITE_PRIVATE void sqlite3VdbeAssertAbortable(Vdbe*); #else -# define sqlite3VdbeIncrWriteCounter(V,C) -# define sqlite3VdbeAssertAbortable(V) +#define sqlite3VdbeIncrWriteCounter(V, C) +#define sqlite3VdbeAssertAbortable(V) #endif #if !defined(SQLITE_OMIT_SHARED_CACHE) -SQLITE_PRIVATE void sqlite3VdbeEnter(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeEnter(Vdbe*); #else -# define sqlite3VdbeEnter(X) +#define sqlite3VdbeEnter(X) #endif -#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE>0 -SQLITE_PRIVATE void sqlite3VdbeLeave(Vdbe*); +#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE > 0 +SQLITE_PRIVATE void sqlite3VdbeLeave(Vdbe*); #else -# define sqlite3VdbeLeave(X) +#define sqlite3VdbeLeave(X) #endif #ifdef SQLITE_DEBUG -SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe*,Mem*); +SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe*, Mem*); SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem*); #endif #ifndef SQLITE_OMIT_FOREIGN_KEY -SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *, int); +SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe*, int); #else -# define sqlite3VdbeCheckFk(p,i) 0 +#define sqlite3VdbeCheckFk(p, i) 0 #endif #ifdef SQLITE_DEBUG -SQLITE_PRIVATE void sqlite3VdbePrintSql(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, StrAccum *pStr); +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); +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) +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 +#define sqlite3VdbeMemExpandBlob(x) SQLITE_OK +#define ExpandBlob(P) SQLITE_OK #endif #endif /* !defined(SQLITE_VDBEINT_H) */ @@ -22885,35 +22517,39 @@ SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *); /* ** Variables in which to record status information. */ -#if SQLITE_PTRSIZE>4 +#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,} }; + 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 */ + 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 @@ -22921,23 +22557,22 @@ static const char statMutex[] = { ** to the "sqlite3Stat" state vector declared above. */ #ifdef SQLITE_OMIT_WSD -# define wsdStatInit sqlite3StatType *x = &GLOBAL(sqlite3StatType,sqlite3Stat) -# define wsdStat x[0] +#define wsdStatInit sqlite3StatType* x = &GLOBAL(sqlite3StatType, sqlite3Stat) +#define wsdStat x[0] #else -# define wsdStatInit -# define wsdStat sqlite3Stat +#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){ +SQLITE_PRIVATE sqlite3_int64 sqlite3StatusValue(int op) { wsdStatInit; - assert( op>=0 && op=0 && op= 0 && op < ArraySize(wsdStat.nowValue)); + assert(op >= 0 && op < ArraySize(statMutex)); + assert(sqlite3_mutex_held(statMutex[op] ? sqlite3Pcache1Mutex() : sqlite3MallocMutex())); return wsdStat.nowValue[op]; } @@ -22952,24 +22587,22 @@ SQLITE_PRIVATE sqlite3_int64 sqlite3StatusValue(int op){ ** The StatusDown() routine lowers the current value by N. The highwater ** mark is unchanged. N must be non-negative for StatusDown(). */ -SQLITE_PRIVATE void sqlite3StatusUp(int op, int N){ +SQLITE_PRIVATE void sqlite3StatusUp(int op, int N) { wsdStatInit; - assert( op>=0 && op=0 && op= 0 && op < ArraySize(wsdStat.nowValue)); + assert(op >= 0 && op < ArraySize(statMutex)); + assert(sqlite3_mutex_held(statMutex[op] ? sqlite3Pcache1Mutex() : sqlite3MallocMutex())); wsdStat.nowValue[op] += N; - if( wsdStat.nowValue[op]>wsdStat.mxValue[op] ){ + if (wsdStat.nowValue[op] > wsdStat.mxValue[op]) { wsdStat.mxValue[op] = wsdStat.nowValue[op]; } } -SQLITE_PRIVATE void sqlite3StatusDown(int op, int N){ +SQLITE_PRIVATE void sqlite3StatusDown(int op, int N) { wsdStatInit; - assert( N>=0 ); - assert( op>=0 && op=0 && op= 0); + assert(op >= 0 && op < ArraySize(statMutex)); + assert(sqlite3_mutex_held(statMutex[op] ? sqlite3Pcache1Mutex() : sqlite3MallocMutex())); + assert(op >= 0 && op < ArraySize(wsdStat.nowValue)); wsdStat.nowValue[op] -= N; } @@ -22977,19 +22610,16 @@ SQLITE_PRIVATE void sqlite3StatusDown(int op, int N){ ** Adjust the highwater mark if necessary. ** The caller must hold the appropriate mutex. */ -SQLITE_PRIVATE void sqlite3StatusHighwater(int op, int X){ +SQLITE_PRIVATE void sqlite3StatusHighwater(int op, int X) { sqlite3StatValueType newValue; wsdStatInit; - assert( X>=0 ); + assert(X >= 0); newValue = (sqlite3StatValueType)X; - assert( op>=0 && op=0 && opwsdStat.mxValue[op] ){ + assert(op >= 0 && op < ArraySize(wsdStat.nowValue)); + assert(op >= 0 && op < ArraySize(statMutex)); + assert(sqlite3_mutex_held(statMutex[op] ? sqlite3Pcache1Mutex() : sqlite3MallocMutex())); + assert(op == SQLITE_STATUS_MALLOC_SIZE || op == SQLITE_STATUS_PAGECACHE_SIZE || op == SQLITE_STATUS_PARSER_STACK); + if (newValue > wsdStat.mxValue[op]) { wsdStat.mxValue[op] = newValue; } } @@ -22997,39 +22627,36 @@ SQLITE_PRIVATE void sqlite3StatusHighwater(int op, int X){ /* ** Query status information. */ -SQLITE_API int sqlite3_status64( - int op, - sqlite3_int64 *pCurrent, - sqlite3_int64 *pHighwater, - int resetFlag -){ - sqlite3_mutex *pMutex; +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) ){ + 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; + 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 ){ + if (resetFlag) { wsdStat.mxValue[op] = wsdStat.nowValue[op]; } sqlite3_mutex_leave(pMutex); - (void)pMutex; /* Prevent warning when SQLITE_THREADSAFE=0 */ + (void)pMutex; /* Prevent warning when SQLITE_THREADSAFE=0 */ return SQLITE_OK; } -SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag){ +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; + if (pCurrent == 0 || pHighwater == 0) + return SQLITE_MISUSE_BKPT; #endif rc = sqlite3_status64(op, &iCur, &iHwtr, resetFlag); - if( rc==0 ){ + if (rc == 0) { *pCurrent = (int)iCur; *pHighwater = (int)iHwtr; } @@ -23039,9 +22666,9 @@ SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetF /* ** Return the number of LookasideSlot elements on the linked list */ -static u32 countLookasideSlots(LookasideSlot *p){ +static u32 countLookasideSlots(LookasideSlot* p) { u32 cnt = 0; - while( p ){ + while (p) { p = p->pNext; cnt++; } @@ -23051,49 +22678,51 @@ static u32 countLookasideSlots(LookasideSlot *p){ /* ** Count the number of slots of lookaside memory that are outstanding */ -SQLITE_PRIVATE int sqlite3LookasideUsed(sqlite3 *db, int *pHighwater){ +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); + 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 */ +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 ){ + if (!sqlite3SafetyCheckOk(db) || pCurrent == 0 || pHighwater == 0) { return SQLITE_MISUSE_BKPT; } #endif sqlite3_mutex_enter(db->mutex); - switch( op ){ + 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; + 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; + if (p) { + while (p->pNext) + p = p->pNext; p->pNext = db->lookaside.pSmallInit; db->lookaside.pSmallInit = db->lookaside.pSmallFree; db->lookaside.pSmallFree = 0; @@ -23106,14 +22735,14 @@ SQLITE_API int sqlite3_db_status( 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 ); + 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 ){ + if (resetFlag) { db->lookaside.anStat[op - SQLITE_DBSTATUS_LOOKASIDE_HIT] = 0; } break; @@ -23129,12 +22758,12 @@ SQLITE_API int sqlite3_db_status( int totalUsed = 0; int i; sqlite3BtreeEnterAll(db); - for(i=0; inDb; i++){ - Btree *pBt = db->aDb[i].pBt; - if( pBt ){ - Pager *pPager = sqlite3BtreePager(pBt); + for (i = 0; i < db->nDb; i++) { + Btree* pBt = db->aDb[i].pBt; + if (pBt) { + Pager* pPager = sqlite3BtreePager(pBt); int nByte = sqlite3PagerMemUsed(pPager); - if( op==SQLITE_DBSTATUS_CACHE_USED_SHARED ){ + if (op == SQLITE_DBSTATUS_CACHE_USED_SHARED) { nByte = nByte / sqlite3BtreeConnectionCount(pBt); } totalUsed += nByte; @@ -23152,32 +22781,28 @@ SQLITE_API int sqlite3_db_status( ** 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 */ + 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 - ); + for (i = 0; i < db->nDb; 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)){ + 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)); + for (p = sqliteHashFirst(&pSchema->tblHash); p; p = sqliteHashNext(p)) { + sqlite3DeleteTable(db, (Table*)sqliteHashData(p)); } } } @@ -23195,16 +22820,16 @@ SQLITE_API int sqlite3_db_status( ** *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 */ + 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){ + for (pVdbe = db->pVdbe; pVdbe; pVdbe = pVdbe->pNext) { sqlite3VdbeDelete(pVdbe); } db->pnBytesFreed = 0; - *pHighwater = 0; /* IMP: R-64479-57858 */ + *pHighwater = 0; /* IMP: R-64479-57858 */ *pCurrent = nByte; break; @@ -23216,19 +22841,18 @@ SQLITE_API int sqlite3_db_status( ** to zero. */ case SQLITE_DBSTATUS_CACHE_SPILL: - op = SQLITE_DBSTATUS_CACHE_WRITE+1; - /* no break */ deliberate_fall_through - case SQLITE_DBSTATUS_CACHE_HIT: + 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:{ + 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 ); + 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); + for (i = 0; i < db->nDb; i++) { + if (db->aDb[i].pBt) { + Pager* pPager = sqlite3BtreePager(db->aDb[i].pBt); sqlite3PagerCacheStat(pPager, op, resetFlag, &nRet); } } @@ -23244,8 +22868,8 @@ SQLITE_API int sqlite3_db_status( ** 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; + *pHighwater = 0; /* IMP: R-11967-56545 */ + *pCurrent = db->nDeferredImmCons > 0 || db->nDeferredCons > 0; break; } @@ -23316,9 +22940,8 @@ SQLITE_API int sqlite3_db_status( ** 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 *); +#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 /* @@ -23326,21 +22949,20 @@ struct tm *__cdecl localtime(const time_t *); */ 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 */ + 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. @@ -23368,39 +22990,39 @@ struct DateTime { ** ** The function returns the number of successful conversions. */ -static int getDigits(const char *zDate, const char *zFormat, ...){ +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 }; + static const u16 aMx[] = {12, 14, 24, 31, 59, 9999}; va_list ap; int cnt = 0; char nextC; va_start(ap, zFormat); - do{ + do { char N = zFormat[0] - '0'; char min = zFormat[1] - '0'; int val = 0; u16 max; - assert( zFormat[2]>='a' && zFormat[2]<='f' ); + assert(zFormat[2] >= 'a' && zFormat[2] <= 'f'); max = aMx[zFormat[2] - 'a']; nextC = zFormat[3]; val = 0; - while( N-- ){ - if( !sqlite3Isdigit(*zDate) ){ + while (N--) { + if (!sqlite3Isdigit(*zDate)) { goto end_getDigits; } - val = val*10 + *zDate - '0'; + val = val * 10 + *zDate - '0'; zDate++; } - if( val<(int)min || val>(int)max || (nextC!=0 && nextC!=*zDate) ){ + if (val < (int)min || val > (int)max || (nextC != 0 && nextC != *zDate)) { goto end_getDigits; } - *va_arg(ap,int*) = val; + *va_arg(ap, int*) = val; zDate++; cnt++; zFormat += 4; - }while( nextC ); + } while (nextC); end_getDigits: va_end(ap); return cnt; @@ -23422,33 +23044,37 @@ static int getDigits(const char *zDate, const char *zFormat, ...){ ** ** A missing specifier is not considered an error. */ -static int parseTimezone(const char *zDate, DateTime *p){ +static int parseTimezone(const char* zDate, DateTime* p) { int sgn = 0; int nHr, nMn; int c; - while( sqlite3Isspace(*zDate) ){ zDate++; } + while (sqlite3Isspace(*zDate)) { + zDate++; + } p->tz = 0; c = *zDate; - if( c=='-' ){ + if (c == '-') { sgn = -1; - }else if( c=='+' ){ + } else if (c == '+') { sgn = +1; - }else if( c=='Z' || c=='z' ){ + } else if (c == 'Z' || c == 'z') { zDate++; goto zulu_time; - }else{ - return c!=0; + } else { + return c != 0; } zDate++; - if( getDigits(zDate, "20b:20e", &nHr, &nMn)!=2 ){ + if (getDigits(zDate, "20b:20e", &nHr, &nMn) != 2) { return 1; } zDate += 5; - p->tz = sgn*(nMn + nHr*60); + p->tz = sgn * (nMn + nHr * 60); zulu_time: - while( sqlite3Isspace(*zDate) ){ zDate++; } + while (sqlite3Isspace(*zDate)) { + zDate++; + } p->tzSet = 1; - return *zDate!=0; + return *zDate != 0; } /* @@ -23458,30 +23084,30 @@ static int parseTimezone(const char *zDate, DateTime *p){ ** ** Return 1 if there is a parsing error and 0 on success. */ -static int parseHhMmSs(const char *zDate, DateTime *p){ +static int parseHhMmSs(const char* zDate, DateTime* p) { int h, m, s; double ms = 0.0; - if( getDigits(zDate, "20c:20e", &h, &m)!=2 ){ + if (getDigits(zDate, "20c:20e", &h, &m) != 2) { return 1; } zDate += 5; - if( *zDate==':' ){ + if (*zDate == ':') { zDate++; - if( getDigits(zDate, "20e", &s)!=1 ){ + if (getDigits(zDate, "20e", &s) != 1) { return 1; } zDate += 2; - if( *zDate=='.' && sqlite3Isdigit(zDate[1]) ){ + if (*zDate == '.' && sqlite3Isdigit(zDate[1])) { double rScale = 1.0; zDate++; - while( sqlite3Isdigit(*zDate) ){ - ms = ms*10.0 + *zDate - '0'; + while (sqlite3Isdigit(*zDate)) { + ms = ms * 10.0 + *zDate - '0'; rScale *= 10.0; zDate++; } ms /= rScale; } - }else{ + } else { s = 0; } p->validJD = 0; @@ -23490,15 +23116,16 @@ static int parseHhMmSs(const char *zDate, DateTime *p){ p->h = h; p->m = m; p->s = s + ms; - if( parseTimezone(zDate, p) ) return 1; - p->validTZ = (p->tz!=0)?1:0; + 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){ +static void datetimeError(DateTime* p) { memset(p, 0, sizeof(*p)); p->isError = 1; } @@ -23509,37 +23136,38 @@ static void datetimeError(DateTime *p){ ** ** Reference: Meeus page 61 */ -static void computeJD(DateTime *p){ +static void computeJD(DateTime* p) { int Y, M, D, A, B, X1, X2; - if( p->validJD ) return; - if( p->validYMD ){ + 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 */ + } else { + Y = 2000; /* If no YMD specified, assume 2000-Jan-01 */ M = 1; D = 1; } - if( Y<-4713 || Y>9999 || p->rawS ){ + if (Y < -4713 || Y > 9999 || p->rawS) { datetimeError(p); return; } - if( M<=2 ){ + 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); + 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; + 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; @@ -23559,25 +23187,27 @@ static void computeJD(DateTime *p){ ** on success and 1 if the input string is not a well-formed ** date. */ -static int parseYyyyMmDd(const char *zDate, DateTime *p){ +static int parseYyyyMmDd(const char* zDate, DateTime* p) { int Y, M, D, neg; - if( zDate[0]=='-' ){ + if (zDate[0] == '-') { zDate++; neg = 1; - }else{ + } else { neg = 0; } - if( getDigits(zDate, "40f-21a-21d", &Y, &M, &D)!=3 ){ + 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 ){ + while (sqlite3Isspace(*zDate) || 'T' == *(u8*)zDate) { + zDate++; + } + if (parseHhMmSs(zDate, p) == 0) { /* We got the time */ - }else if( *zDate==0 ){ + } else if (*zDate == 0) { p->validHMS = 0; - }else{ + } else { return 1; } p->validJD = 0; @@ -23585,7 +23215,7 @@ static int parseYyyyMmDd(const char *zDate, DateTime *p){ p->Y = neg ? -Y : Y; p->M = M; p->D = D; - if( p->validTZ ){ + if (p->validTZ) { computeJD(p); } return 0; @@ -23596,12 +23226,12 @@ static int parseYyyyMmDd(const char *zDate, DateTime *p){ ** ** Return the number of errors. */ -static int setDateTimeToCurrent(sqlite3_context *context, DateTime *p){ +static int setDateTimeToCurrent(sqlite3_context* context, DateTime* p) { p->iJD = sqlite3StmtCurrentTime(context); - if( p->iJD>0 ){ + if (p->iJD > 0) { p->validJD = 1; return 0; - }else{ + } else { return 1; } } @@ -23612,11 +23242,11 @@ static int setDateTimeToCurrent(sqlite3_context *context, DateTime *p){ ** 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){ +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); + if (r >= 0.0 && r < 5373484.5) { + p->iJD = (sqlite3_int64)(r * 86400000.0 + 0.5); p->validJD = 1; } } @@ -23637,19 +23267,15 @@ static void setRawDateNumber(DateTime *p, double r){ ** 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 -){ +static int parseDateOrTime(sqlite3_context* context, const char* zDate, DateTime* p) { double r; - if( parseYyyyMmDd(zDate,p)==0 ){ + if (parseYyyyMmDd(zDate, p) == 0) { return 0; - }else if( parseHhMmSs(zDate, p)==0 ){ + } else if (parseHhMmSs(zDate, p) == 0) { return 0; - }else if( sqlite3StrICmp(zDate,"now")==0 && sqlite3NotPureFunc(context) ){ + } else if (sqlite3StrICmp(zDate, "now") == 0 && sqlite3NotPureFunc(context)) { return setDateTimeToCurrent(context, p); - }else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8)>0 ){ + } else if (sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8) > 0) { setRawDateNumber(p, r); return 0; } @@ -23663,42 +23289,43 @@ static int parseDateOrTime( ** 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) +#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; +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){ +static void computeYMD(DateTime* p) { int Z, A, B, C, D, E, X1; - if( p->validYMD ) return; - if( !p->validJD ){ + if (p->validYMD) + return; + if (!p->validJD) { p->Y = 2000; p->M = 1; p->D = 1; - }else if( !validJulianDay(p->iJD) ){ + } 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); + } 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); + 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->M = E < 14 ? E - 1 : E - 13; + p->Y = p->M > 2 ? C - 4716 : C - 4715; } p->validYMD = 1; } @@ -23706,18 +23333,19 @@ static void computeYMD(DateTime *p){ /* ** Compute the Hour, Minute, and Seconds from the julian day number. */ -static void computeHMS(DateTime *p){ +static void computeHMS(DateTime* p) { int s; - if( p->validHMS ) return; + if (p->validHMS) + return; computeJD(p); s = (int)((p->iJD + 43200000) % 86400000); - p->s = s/1000.0; + 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->h = s / 3600; + s -= p->h * 3600; + p->m = s / 60; + p->s += s - p->m * 60; p->rawS = 0; p->validHMS = 1; } @@ -23725,7 +23353,7 @@ static void computeHMS(DateTime *p){ /* ** Compute both YMD and HMS */ -static void computeYMD_HMS(DateTime *p){ +static void computeYMD_HMS(DateTime* p) { computeYMD(p); computeHMS(p); } @@ -23733,7 +23361,7 @@ static void computeYMD_HMS(DateTime *p){ /* ** Clear the YMD and HMS and the TZ */ -static void clearYMD_HMS_TZ(DateTime *p){ +static void clearYMD_HMS_TZ(DateTime* p) { p->validYMD = 0; p->validHMS = 0; p->validTZ = 0; @@ -23752,9 +23380,8 @@ static void clearYMD_HMS_TZ(DateTime *p){ ** 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 +#if !HAVE_LOCALTIME_R && !HAVE_LOCALTIME_S && defined(_MSC_VER) && defined(_CRT_INSECURE_DEPRECATE) +#undef HAVE_LOCALTIME_S #define HAVE_LOCALTIME_S 1 #endif @@ -23773,43 +23400,42 @@ static void clearYMD_HMS_TZ(DateTime *p){ ** library function localtime_r() is used to assist in the calculation of ** local time. */ -static int osLocaltime(time_t *t, struct tm *pTm){ +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); + 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) - ){ + if (sqlite3GlobalConfig.bLocaltimeFault) { + if (sqlite3GlobalConfig.xAltLocaltime != 0 && 0 == sqlite3GlobalConfig.xAltLocaltime((const void*)t, (void*)pTm)) { pX = pTm; - }else{ + } else { pX = 0; } } #endif - if( pX ) *pTm = *pX; -#if SQLITE_THREADSAFE>0 + if (pX) + *pTm = *pX; +#if SQLITE_THREADSAFE > 0 sqlite3_mutex_leave(mutex); #endif - rc = pX==0; + rc = pX == 0; #else #ifndef SQLITE_UNTESTABLE - if( sqlite3GlobalConfig.bLocaltimeFault ){ - if( sqlite3GlobalConfig.xAltLocaltime!=0 ){ - return sqlite3GlobalConfig.xAltLocaltime((const void*)t,(void*)pTm); - }else{ + 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; + rc = localtime_r(t, pTm) == 0; #else rc = localtime_s(pTm, t); #endif /* HAVE_LOCALTIME_R */ @@ -23818,15 +23444,13 @@ static int osLocaltime(time_t *t, struct tm *pTm){ } #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 */ -){ +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; @@ -23835,9 +23459,9 @@ static int toLocaltime( memset(&sLocal, 0, sizeof(sLocal)); computeJD(p); - if( p->iJD<2108667600*(i64)100000 /* 1970-01-01 */ - || p->iJD>2130141456*(i64)100000 /* 2038-01-18 */ - ){ + 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 @@ -23845,16 +23469,16 @@ static int toLocaltime( */ DateTime x = *p; computeYMD_HMS(&x); - iYearDiff = (2000 + x.Y%4) - x.Y; + 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{ + t = (time_t)(x.iJD / 1000 - 21086676 * (i64)10000); + } else { iYearDiff = 0; - t = (time_t)(p->iJD/1000 - 21086676*(i64)10000); + t = (time_t)(p->iJD / 1000 - 21086676 * (i64)10000); } - if( osLocaltime(&t, &sLocal) ){ + if (osLocaltime(&t, &sLocal)) { sqlite3_result_error(pCtx, "local time unavailable", -1); return SQLITE_ERROR; } @@ -23863,7 +23487,7 @@ static int toLocaltime( 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->s = sLocal.tm_sec + (p->iJD % 1000) * 0.001; p->validYMD = 1; p->validHMS = 1; p->validJD = 0; @@ -23883,17 +23507,13 @@ static int toLocaltime( ** 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 */ + 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 }, + {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}, }; /* @@ -23920,16 +23540,15 @@ static const struct { ** 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 */ -){ +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]] ){ + switch (sqlite3UpperToLower[(u8)z[0]]) { case 'a': { /* ** auto @@ -23937,15 +23556,16 @@ static int parseModifier( ** 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 ){ + 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; + } 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; @@ -23964,9 +23584,10 @@ static int parseModifier( ** 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 ){ + 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; } @@ -23980,7 +23601,7 @@ static int parseModifier( ** 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) ){ + if (sqlite3_stricmp(z, "localtime") == 0 && sqlite3NotPureFunc(pCtx)) { rc = toLocaltime(p, pCtx); } break; @@ -23993,10 +23614,11 @@ static int parseModifier( ** 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 ){ + 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; @@ -24005,27 +23627,28 @@ static int parseModifier( } } #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 */ + 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{ + do { DateTime new; memset(&new, 0, sizeof(new)); iGuess -= iErr; new.iJD = iGuess; new.validJD = 1; rc = toLocaltime(&new, pCtx); - if( rc ) return rc; + if (rc) + return rc; computeJD(&new); iErr = new.iJD - iOrigJD; - }while( iErr && cnt++<3 ); + } while (iErr && cnt++ < 3); memset(p, 0, sizeof(*p)); p->iJD = iGuess; p->validJD = 1; @@ -24044,17 +23667,17 @@ static int parseModifier( ** 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 ){ + 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; + Z = ((p->iJD + 129600000) / 86400000) % 7; + if (Z > n) + Z -= 7; + p->iJD += (n - Z) * 86400000; clearYMD_HMS_TZ(p); rc = 0; } @@ -24067,8 +23690,10 @@ static int parseModifier( ** 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; + if (sqlite3_strnicmp(z, "start of ", 9) != 0) + break; + if (!p->validJD && !p->validYMD && !p->validHMS) + break; z += 9; computeYMD(p); p->validHMS = 1; @@ -24077,14 +23702,14 @@ static int parseModifier( p->rawS = 0; p->validTZ = 0; p->validJD = 0; - if( sqlite3_stricmp(z,"month")==0 ){ + if (sqlite3_stricmp(z, "month") == 0) { p->D = 1; rc = 0; - }else if( sqlite3_stricmp(z,"year")==0 ){ + } else if (sqlite3_stricmp(z, "year") == 0) { p->M = 1; p->D = 1; rc = 0; - }else if( sqlite3_stricmp(z,"day")==0 ){ + } else if (sqlite3_stricmp(z, "day") == 0) { rc = 0; } break; @@ -24103,28 +23728,32 @@ static int parseModifier( 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 ){ + 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]==':' ){ + 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; + const char* z2 = z; DateTime tx; sqlite3_int64 day; - if( !sqlite3Isdigit(*z2) ) z2++; + if (!sqlite3Isdigit(*z2)) + z2++; memset(&tx, 0, sizeof(tx)); - if( parseHhMmSs(z2, &tx) ) break; + 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; + 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; @@ -24135,34 +23764,35 @@ static int parseModifier( /* If control reaches this point, it means the transformation is ** one of the forms like "+NNN days". */ z += n; - while( sqlite3Isspace(*z) ) z++; + while (sqlite3Isspace(*z)) + z++; n = sqlite3Strlen30(z); - if( n>10 || n<3 ) break; - if( sqlite3UpperToLower[(u8)z[n-1]]=='s' ) n--; + 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 && r -aXformType[i].rLimit && + r < aXformType[i].rLimit) { + switch (i) { case 4: { /* Special processing to add months */ int x; - assert( strcmp(aXformType[i].zName,"month")==0 ); + assert(strcmp(aXformType[i].zName, "month") == 0); computeYMD_HMS(p); p->M += (int)r; - x = p->M>0 ? (p->M-1)/12 : (p->M-12)/12; + x = p->M > 0 ? (p->M - 1) / 12 : (p->M - 12) / 12; p->Y += x; - p->M -= x*12; + 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 ); + assert(strcmp(aXformType[i].zName, "year") == 0); computeYMD_HMS(p); p->Y += y; p->validJD = 0; @@ -24171,7 +23801,7 @@ static int parseModifier( } } computeJD(p); - p->iJD += (sqlite3_int64)(r*1000.0*aXformType[i].rXform + rRounder); + p->iJD += (sqlite3_int64)(r * 1000.0 * aXformType[i].rXform + rRounder); rc = 0; break; } @@ -24195,40 +23825,36 @@ static int parseModifier( ** 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 -){ +static int isDate(sqlite3_context* context, int argc, sqlite3_value** argv, DateTime* p) { int i, n; - const unsigned char *z; + const unsigned char* z; int eType; memset(p, 0, sizeof(*p)); - if( argc==0 ){ - if( !sqlite3NotPureFunc(context) ) return 1; + if (argc == 0) { + if (!sqlite3NotPureFunc(context)) + return 1; return setDateTimeToCurrent(context, p); } - if( (eType = sqlite3_value_type(argv[0]))==SQLITE_FLOAT - || eType==SQLITE_INTEGER ){ + if ((eType = sqlite3_value_type(argv[0])) == SQLITE_FLOAT || eType == SQLITE_INTEGER) { setRawDateNumber(p, sqlite3_value_double(argv[0])); - }else{ + } else { z = sqlite3_value_text(argv[0]); - if( !z || parseDateOrTime(context, (char*)z, p) ){ + if (!z || parseDateOrTime(context, (char*)z, p)) { return 1; } } - for(i=1; iisError || !validJulianDay(p->iJD) ) return 1; + if (p->isError || !validJulianDay(p->iJD)) + return 1; return 0; } - /* ** The following routines implement the various date and time functions ** of SQLite. @@ -24239,15 +23865,11 @@ static int isDate( ** ** Return the julian day number of the date specified in the arguments */ -static void juliandayFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ +static void juliandayFunc(sqlite3_context* context, int argc, sqlite3_value** argv) { DateTime x; - if( isDate(context, argc, argv, &x)==0 ){ + if (isDate(context, argc, argv, &x) == 0) { computeJD(&x); - sqlite3_result_double(context, x.iJD/86400000.0); + sqlite3_result_double(context, x.iJD / 86400000.0); } } @@ -24257,15 +23879,11 @@ static void juliandayFunc( ** 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 -){ +static void unixepochFunc(sqlite3_context* context, int argc, sqlite3_value** argv) { DateTime x; - if( isDate(context, argc, argv, &x)==0 ){ + if (isDate(context, argc, argv, &x) == 0) { computeJD(&x); - sqlite3_result_int64(context, x.iJD/1000 - 21086676*(i64)10000); + sqlite3_result_int64(context, x.iJD / 1000 - 21086676 * (i64)10000); } } @@ -24274,43 +23892,40 @@ static void unixepochFunc( ** ** Return YYYY-MM-DD HH:MM:SS */ -static void datetimeFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ +static void datetimeFunc(sqlite3_context* context, int argc, sqlite3_value** argv) { DateTime x; - if( isDate(context, argc, argv, &x)==0 ){ + 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; + 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[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[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[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[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[18] = '0' + (s / 10) % 10; + zBuf[19] = '0' + (s) % 10; zBuf[20] = 0; - if( x.Y<0 ){ + if (x.Y < 0) { zBuf[0] = '-'; sqlite3_result_text(context, zBuf, 20, SQLITE_TRANSIENT); - }else{ + } else { sqlite3_result_text(context, &zBuf[1], 19, SQLITE_TRANSIENT); } } @@ -24321,25 +23936,21 @@ static void datetimeFunc( ** ** Return HH:MM:SS */ -static void timeFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ +static void timeFunc(sqlite3_context* context, int argc, sqlite3_value** argv) { DateTime x; - if( isDate(context, argc, argv, &x)==0 ){ + 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[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[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[6] = '0' + (s / 10) % 10; + zBuf[7] = '0' + (s) % 10; zBuf[8] = 0; sqlite3_result_text(context, zBuf, 8, SQLITE_TRANSIENT); } @@ -24350,33 +23961,30 @@ static void timeFunc( ** ** Return YYYY-MM-DD */ -static void dateFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ +static void dateFunc(sqlite3_context* context, int argc, sqlite3_value** argv) { DateTime x; - if( isDate(context, argc, argv, &x)==0 ){ + 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; + 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[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[9] = '0' + (x.D / 10) % 10; + zBuf[10] = '0' + (x.D) % 10; zBuf[11] = 0; - if( x.Y<0 ){ + if (x.Y < 0) { zBuf[0] = '-'; sqlite3_result_text(context, zBuf, 11, SQLITE_TRANSIENT); - }else{ + } else { sqlite3_result_text(context, &zBuf[1], 10, SQLITE_TRANSIENT); } } @@ -24401,39 +24009,39 @@ static void dateFunc( ** %Y year 0000-9999 ** %% % */ -static void strftimeFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ +static void strftimeFunc(sqlite3_context* context, int argc, sqlite3_value** argv) { DateTime x; - size_t i,j; - sqlite3 *db; - const char *zFmt; + size_t i, j; + sqlite3* db; + const char* zFmt; sqlite3_str sRes; - - if( argc==0 ) return; + if (argc == 0) + return; zFmt = (const char*)sqlite3_value_text(argv[0]); - if( zFmt==0 || isDate(context, argc-1, argv+1, &x) ) return; + 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; + if (s > 59.999) + s = 59.999; sqlite3_str_appendf(&sRes, "%06.3f", s); break; } @@ -24443,50 +24051,49 @@ static void strftimeFunc( } case 'W': /* Fall thru */ case 'j': { - int nDay; /* Number of days since 1st day of year */ + 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); + 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); + sqlite3_str_appendf(&sRes, "%.16g", x.iJD / 86400000.0); break; } case 'm': { - sqlite3_str_appendf(&sRes,"%02d",x.M); + sqlite3_str_appendf(&sRes, "%02d", x.M); break; } case 'M': { - sqlite3_str_appendf(&sRes,"%02d",x.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); + 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); + sqlite3_str_appendf(&sRes, "%02d", (int)x.s); break; } case 'w': { - sqlite3_str_appendchar(&sRes, 1, - (char)(((x.iJD+129600000)/86400000) % 7) + '0'); + sqlite3_str_appendchar(&sRes, 1, (char)(((x.iJD + 129600000) / 86400000) % 7) + '0'); break; } case 'Y': { - sqlite3_str_appendf(&sRes,"%04d",x.Y); + sqlite3_str_appendf(&sRes, "%04d", x.Y); break; } case '%': { @@ -24499,7 +24106,8 @@ static void strftimeFunc( } } } - if( jpMethods ){ +SQLITE_PRIVATE void sqlite3OsClose(sqlite3_file* pId) { + if (pId->pMethods) { pId->pMethods->xClose(pId); pId->pMethods = 0; } } -SQLITE_PRIVATE int sqlite3OsRead(sqlite3_file *id, void *pBuf, int amt, i64 offset){ +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){ +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){ +SQLITE_PRIVATE int sqlite3OsTruncate(sqlite3_file* id, i64 size) { return id->pMethods->xTruncate(id, size); } -SQLITE_PRIVATE int sqlite3OsSync(sqlite3_file *id, int flags){ +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){ +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){ +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){ +SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file* id, int lockType) { return id->pMethods->xUnlock(id, lockType); } -SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut){ +SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file* id, int* pResOut) { DO_OS_MALLOC_TEST(id); return id->pMethods->xCheckReservedLock(id, pResOut); } @@ -24745,14 +24336,12 @@ SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut){ ** 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; +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 - ){ + 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 @@ -24773,56 +24362,55 @@ SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){ #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 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){ +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; +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){ +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){ +SQLITE_PRIVATE void sqlite3OsShmBarrier(sqlite3_file* id) { id->pMethods->xShmBarrier(id); } -SQLITE_PRIVATE int sqlite3OsShmUnmap(sqlite3_file *id, int deleteFlag){ +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 */ -){ +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 +#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){ +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){ +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){ +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){ +SQLITE_PRIVATE int sqlite3OsUnfetch(sqlite3_file* id, i64 iOff, void* p) { return SQLITE_OK; } #endif @@ -24831,13 +24419,7 @@ SQLITE_PRIVATE int sqlite3OsUnfetch(sqlite3_file *id, i64 iOff, void *p){ ** 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 -){ +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 @@ -24845,67 +24427,57 @@ SQLITE_PRIVATE int sqlite3OsOpen( ** 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 ); + assert(rc == SQLITE_OK || pFile->pMethods == 0); return rc; } -SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ +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 -){ + 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 -){ +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 */ +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){ +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){ +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){ +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 ){ +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); + if (ALWAYS(nByte > (signed)sizeof(unsigned))) + nByte = sizeof(unsigned int); memcpy(zBufOut, &sqlite3Config.iPrngSeed, nByte); return SQLITE_OK; - }else{ + } else { return pVfs->xRandomness(pVfs, nByte, zBufOut); } - } -SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *pVfs, int nMicro){ +SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs* pVfs, int nMicro) { return pVfs->xSleep(pVfs, nMicro); } -SQLITE_PRIVATE int sqlite3OsGetLastError(sqlite3_vfs *pVfs){ +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){ +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 @@ -24913,43 +24485,37 @@ SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p ** will fall back to xCurrentTime() if xCurrentTimeInt64() is ** unavailable. */ - if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){ + if (pVfs->iVersion >= 2 && pVfs->xCurrentTimeInt64) { rc = pVfs->xCurrentTimeInt64(pVfs, pTimeOut); - }else{ + } else { double r; rc = pVfs->xCurrentTime(pVfs, &r); - *pTimeOut = (sqlite3_int64)(r*86400000.0); + *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 -){ +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 ){ + sqlite3_file* pFile; + pFile = (sqlite3_file*)sqlite3MallocZero(pVfs->szOsFile); + if (pFile) { rc = sqlite3OsOpen(pVfs, zFile, pFile, flags, pOutFlags); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { sqlite3_free(pFile); *ppFile = 0; - }else{ + } else { *ppFile = pFile; } - }else{ + } else { *ppFile = 0; rc = SQLITE_NOMEM_BKPT; } - assert( *ppFile!=0 || rc!=SQLITE_OK ); + assert(*ppFile != 0 || rc != SQLITE_OK); return rc; } -SQLITE_PRIVATE void sqlite3OsCloseFree(sqlite3_file *pFile){ - assert( pFile ); +SQLITE_PRIVATE void sqlite3OsCloseFree(sqlite3_file* pFile) { + assert(pFile); sqlite3OsClose(pFile); sqlite3_free(pFile); } @@ -24960,9 +24526,10 @@ SQLITE_PRIVATE void sqlite3OsCloseFree(sqlite3_file *pFile){ ** 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; +SQLITE_PRIVATE int sqlite3OsInit(void) { + void* p = sqlite3_malloc(10); + if (p == 0) + return SQLITE_NOMEM_BKPT; sqlite3_free(p); return sqlite3_os_init(); } @@ -24970,29 +24537,32 @@ SQLITE_PRIVATE int sqlite3OsInit(void){ /* ** The list of all registered VFS implementations. */ -static sqlite3_vfs * SQLITE_WSD vfsList = 0; -#define vfsList GLOBAL(sqlite3_vfs *, vfsList) +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; +SQLITE_API sqlite3_vfs* sqlite3_vfs_find(const char* zVfs) { + sqlite3_vfs* pVfs = 0; #if SQLITE_THREADSAFE - sqlite3_mutex *mutex; + sqlite3_mutex* mutex; #endif #ifndef SQLITE_OMIT_AUTOINIT int rc = sqlite3_initialize(); - if( rc ) return 0; + 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; + for (pVfs = vfsList; pVfs; pVfs = pVfs->pNext) { + if (zVfs == 0) + break; + if (strcmp(zVfs, pVfs->zName) == 0) + break; } sqlite3_mutex_leave(mutex); return pVfs; @@ -25001,18 +24571,18 @@ SQLITE_API sqlite3_vfs *sqlite3_vfs_find(const char *zVfs){ /* ** 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 ){ +static void vfsUnlink(sqlite3_vfs* pVfs) { + assert(sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN))); + if (pVfs == 0) { /* No-op */ - }else if( vfsList==pVfs ){ + } else if (vfsList == pVfs) { vfsList = pVfs->pNext; - }else if( vfsList ){ - sqlite3_vfs *p = vfsList; - while( p->pNext && p->pNext!=pVfs ){ + } else if (vfsList) { + sqlite3_vfs* p = vfsList; + while (p->pNext && p->pNext != pVfs) { p = p->pNext; } - if( p->pNext==pVfs ){ + if (p->pNext == pVfs) { p->pNext = pVfs->pNext; } } @@ -25023,23 +24593,25 @@ static void vfsUnlink(sqlite3_vfs *pVfs){ ** 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;) +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; + if (rc) + return rc; #endif #ifdef SQLITE_ENABLE_API_ARMOR - if( pVfs==0 ) return SQLITE_MISUSE_BKPT; + if (pVfs == 0) + return SQLITE_MISUSE_BKPT; #endif - MUTEX_LOGIC( mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); ) + MUTEX_LOGIC(mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN);) sqlite3_mutex_enter(mutex); vfsUnlink(pVfs); - if( makeDflt || vfsList==0 ){ + if (makeDflt || vfsList == 0) { pVfs->pNext = vfsList; vfsList = pVfs; - }else{ + } else { pVfs->pNext = vfsList->pNext; vfsList->pNext = pVfs; } @@ -25051,13 +24623,14 @@ SQLITE_API int sqlite3_vfs_register(sqlite3_vfs *pVfs, int makeDflt){ /* ** Unregister a VFS so that it is no longer accessible. */ -SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs *pVfs){ - MUTEX_LOGIC(sqlite3_mutex *mutex;) +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; + if (rc) + return rc; #endif - MUTEX_LOGIC( mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); ) + MUTEX_LOGIC(mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN);) sqlite3_mutex_enter(mutex); vfsUnlink(pVfs); sqlite3_mutex_leave(mutex); @@ -25103,7 +24676,7 @@ typedef struct BenignMallocHooks BenignMallocHooks; static SQLITE_WSD struct BenignMallocHooks { void (*xBenignBegin)(void); void (*xBenignEnd)(void); -} sqlite3Hooks = { 0, 0 }; +} sqlite3Hooks = {0, 0}; /* The "wsdHooks" macro will resolve to the appropriate BenignMallocHooks ** structure. If writable static data is unsupported on the target, @@ -25112,23 +24685,18 @@ static SQLITE_WSD struct BenignMallocHooks { ** to the "sqlite3Hooks" state vector declared above. */ #ifdef SQLITE_OMIT_WSD -# define wsdHooksInit \ - BenignMallocHooks *x = &GLOBAL(BenignMallocHooks,sqlite3Hooks) -# define wsdHooks x[0] +#define wsdHooksInit BenignMallocHooks* x = &GLOBAL(BenignMallocHooks, sqlite3Hooks) +#define wsdHooks x[0] #else -# define wsdHooksInit -# define wsdHooks sqlite3Hooks +#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) -){ +SQLITE_PRIVATE void sqlite3BenignMallocHooks(void (*xBenignBegin)(void), void (*xBenignEnd)(void)) { wsdHooksInit; wsdHooks.xBenignBegin = xBenignBegin; wsdHooks.xBenignEnd = xBenignEnd; @@ -25139,20 +24707,20 @@ SQLITE_PRIVATE void sqlite3BenignMallocHooks( ** subsequent malloc failures are benign. A call to sqlite3EndBenignMalloc() ** indicates that subsequent malloc failures are non-benign. */ -SQLITE_PRIVATE void sqlite3BeginBenignMalloc(void){ +SQLITE_PRIVATE void sqlite3BeginBenignMalloc(void) { wsdHooksInit; - if( wsdHooks.xBenignBegin ){ + if (wsdHooks.xBenignBegin) { wsdHooks.xBenignBegin(); } } -SQLITE_PRIVATE void sqlite3EndBenignMalloc(void){ +SQLITE_PRIVATE void sqlite3EndBenignMalloc(void) { wsdHooksInit; - if( wsdHooks.xBenignEnd ){ + if (wsdHooks.xBenignEnd) { wsdHooks.xBenignEnd(); } } -#endif /* #ifndef SQLITE_UNTESTABLE */ +#endif /* #ifndef SQLITE_UNTESTABLE */ /************** End of fault.c ***********************************************/ /************** Begin file mem0.c ********************************************/ @@ -25186,13 +24754,27 @@ SQLITE_PRIVATE void sqlite3EndBenignMalloc(void){ /* ** 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; } +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. @@ -25200,17 +24782,9 @@ static void sqlite3MemShutdown(void *NotUsed){ return; } ** 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 - }; +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); } @@ -25275,17 +24849,16 @@ SQLITE_PRIVATE void sqlite3MemSetDefault(void){ ** Use the zone allocator available on apple products unless the ** SQLITE_WITHOUT_ZONEMALLOC symbol is defined. */ -#include #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)) +#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__ */ @@ -25293,17 +24866,17 @@ static malloc_zone_t* _sqliteZone_; ** 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)) +#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 +#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 @@ -25311,8 +24884,8 @@ static malloc_zone_t* _sqliteZone_; ** the malloc.h header file. */ #elif defined(_MSC_VER) && !defined(SQLITE_WITHOUT_MSIZE) -# define SQLITE_USE_MALLOC_H -# define SQLITE_USE_MSIZE +#define SQLITE_USE_MALLOC_H +#define SQLITE_USE_MSIZE #endif /* @@ -25323,16 +24896,16 @@ static malloc_zone_t* _sqliteZone_; ** 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 +#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__ */ @@ -25345,29 +24918,29 @@ static malloc_zone_t* _sqliteZone_; ** cases of nByte<=0 will be intercepted and dealt with by higher level ** routines. */ -static void *sqlite3MemMalloc(int nByte){ +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 ); + 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 ){ + 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 ); + } else { + testcase(sqlite3GlobalConfig.xLog != 0); sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes of memory", nByte); } - return (void *)p; + return (void*)p; #endif } @@ -25379,12 +24952,12 @@ static void *sqlite3MemMalloc(int nByte){ ** cases where pPrior==0 will have been intecepted and dealt with ** by higher-level routines. */ -static void sqlite3MemFree(void *pPrior){ +static void sqlite3MemFree(void* pPrior) { #ifdef SQLITE_MALLOCSIZE SQLITE_FREE(pPrior); #else - sqlite3_int64 *p = (sqlite3_int64*)pPrior; - assert( pPrior!=0 ); + sqlite3_int64* p = (sqlite3_int64*)pPrior; + assert(pPrior != 0); p--; SQLITE_FREE(p); #endif @@ -25394,13 +24967,13 @@ static void sqlite3MemFree(void *pPrior){ ** Report the allocated size of a prior return from xMalloc() ** or xRealloc(). */ -static int sqlite3MemSize(void *pPrior){ +static int sqlite3MemSize(void* pPrior) { #ifdef SQLITE_MALLOCSIZE - assert( pPrior!=0 ); + assert(pPrior != 0); return (int)SQLITE_MALLOCSIZE(pPrior); #else - sqlite3_int64 *p; - assert( pPrior!=0 ); + sqlite3_int64* p; + assert(pPrior != 0); p = (sqlite3_int64*)pPrior; p--; return (int)p[0]; @@ -25417,30 +24990,26 @@ static int sqlite3MemSize(void *pPrior){ ** cases where nByte<=0 will have been intercepted by higher-level ** routines and redirected to xFree. */ -static void *sqlite3MemRealloc(void *pPrior, int nByte){ +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); + 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 */ + 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 = 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); + } else { + testcase(sqlite3GlobalConfig.xLog != 0); + sqlite3_log(SQLITE_NOMEM, "failed memory resize %u to %u bytes", sqlite3MemSize(pPrior), nByte); } return (void*)p; #endif @@ -25449,27 +25018,27 @@ static void *sqlite3MemRealloc(void *pPrior, int nByte){ /* ** Round up a request size to the next valid allocation size. */ -static int sqlite3MemRoundup(int n){ +static int sqlite3MemRoundup(int n) { return ROUND8(n); } /* ** Initialize this module. */ -static int sqlite3MemInit(void *NotUsed){ +static int sqlite3MemInit(void* NotUsed) { #if defined(__APPLE__) && !defined(SQLITE_WITHOUT_ZONEMALLOC) int cpuCount; size_t len; - if( _sqliteZone_ ){ + 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 ){ + if (cpuCount > 1) { /* defer MT decisions to system malloc */ _sqliteZone_ = malloc_default_zone(); - }else{ + } 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); @@ -25483,7 +25052,7 @@ static int sqlite3MemInit(void *NotUsed){ /* ** Deinitialize this module. */ -static void sqlite3MemShutdown(void *NotUsed){ +static void sqlite3MemShutdown(void* NotUsed) { UNUSED_PARAMETER(NotUsed); return; } @@ -25494,17 +25063,9 @@ static void sqlite3MemShutdown(void *NotUsed){ ** 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 - }; +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); } @@ -25545,11 +25106,11 @@ SQLITE_PRIVATE void sqlite3MemSetDefault(void){ ** The backtrace functionality is only available with GLIBC */ #ifdef __GLIBC__ - extern int backtrace(void**,int); - extern void backtrace_symbols_fd(void*const*,int,int); +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) +#define backtrace(A, B) 1 +#define backtrace_symbols_fd(A, B, C) #endif /* #include */ @@ -25567,13 +25128,13 @@ SQLITE_PRIVATE void sqlite3MemSetDefault(void){ ** 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 */ + 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 */ }; /* @@ -25585,7 +25146,7 @@ struct MemBlockHdr { /* ** Number of malloc size increments to track. */ -#define NCSIZE 1000 +#define NCSIZE 1000 /* ** All of the static variables used by this module are collected @@ -25598,25 +25159,25 @@ static struct { /* ** Mutex to control access to the memory allocation subsystem. */ - sqlite3_mutex *mutex; + sqlite3_mutex* mutex; /* ** Head and tail of a linked list of all outstanding allocations */ - struct MemBlockHdr *pFirst; - struct MemBlockHdr *pLast; + struct MemBlockHdr* pFirst; + struct MemBlockHdr* pLast; /* ** The number of levels of backtrace to save in new allocations. */ int nBacktrace; - void (*xBacktrace)(int, int, void **); + 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 */ + int nTitle; /* Bytes of zTitle to save. Includes '\0' and padding */ + char zTitle[100]; /* The title text */ /* ** sqlite3MallocDisallow() increments the following counter. @@ -25630,30 +25191,29 @@ static struct { ** 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 */ + 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 ){ +static void adjustStats(int iSize, int increment) { + int i = ROUND8(iSize) / 8; + if (i > NCSIZE - 1) { i = NCSIZE - 1; } - if( increment>0 ){ + if (increment > 0) { mem.nAlloc[i]++; mem.nCurrent[i]++; - if( mem.nCurrent[i]>mem.mxCurrent[i] ){ + if (mem.nCurrent[i] > mem.mxCurrent[i]) { mem.mxCurrent[i] = mem.nCurrent[i]; } - }else{ + } else { mem.nCurrent[i]--; - assert( mem.nCurrent[i]>=0 ); + assert(mem.nCurrent[i] >= 0); } } @@ -25663,33 +25223,34 @@ static void adjustStats(int iSize, int increment){ ** 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; +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 ); + assert(p->iForeGuard == (int)FOREGUARD); nReserve = ROUND8(p->iSize); pInt = (int*)pAllocation; pU8 = (u8*)pAllocation; - assert( pInt[nReserve/sizeof(int)]==(int)REARGUARD ); + 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 ); + 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 ){ +static int sqlite3MemSize(void* p) { + struct MemBlockHdr* pHdr; + if (!p) { return 0; } pHdr = sqlite3MemsysGetHeader(p); @@ -25699,10 +25260,10 @@ static int sqlite3MemSize(void *p){ /* ** Initialize the memory allocation subsystem. */ -static int sqlite3MemInit(void *NotUsed){ +static int sqlite3MemInit(void* NotUsed) { UNUSED_PARAMETER(NotUsed); - assert( (sizeof(struct MemBlockHdr)&7) == 0 ); - if( !sqlite3GlobalConfig.bMemstat ){ + 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); @@ -25713,7 +25274,7 @@ static int sqlite3MemInit(void *NotUsed){ /* ** Deinitialize the memory allocation subsystem. */ -static void sqlite3MemShutdown(void *NotUsed){ +static void sqlite3MemShutdown(void* NotUsed) { UNUSED_PARAMETER(NotUsed); mem.mutex = 0; } @@ -25721,7 +25282,7 @@ static void sqlite3MemShutdown(void *NotUsed){ /* ** Round up a request size to the next valid allocation size. */ -static int sqlite3MemRoundup(int n){ +static int sqlite3MemRoundup(int n) { return ROUND8(n); } @@ -25730,21 +25291,21 @@ static int sqlite3MemRoundup(int n){ ** 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){ +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; + 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; + while (nByte-- > 0) { + x = (x >> 1) ^ (-(int)(x & 1) & 0xd0000001); + y = y * 1103515245 + 12345; r = x ^ y; *(pBuf++) = r & 0xff; } @@ -25753,29 +25314,28 @@ static void randomFill(char *pBuf, int nByte){ /* ** Allocate nByte bytes of memory. */ -static void *sqlite3MemMalloc(int nByte){ - struct MemBlockHdr *pHdr; - void **pBt; - char *z; - int *pInt; - void *p = 0; +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 ); + assert(mem.disallow == 0); nReserve = ROUND8(nByte); - totalSize = nReserve + sizeof(*pHdr) + sizeof(int) + - mem.nBacktrace*sizeof(void*) + mem.nTitle; + totalSize = nReserve + sizeof(*pHdr) + sizeof(int) + mem.nBacktrace * sizeof(void*) + mem.nTitle; p = malloc(totalSize); - if( p ){ + 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 ){ + if (mem.pLast) { mem.pLast->pNext = pHdr; - }else{ + } else { mem.pFirst = pHdr; } mem.pLast = pHdr; @@ -25783,26 +25343,26 @@ static void *sqlite3MemMalloc(int nByte){ 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*)); + 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]); + if (mem.xBacktrace) { + mem.xBacktrace(nByte, pHdr->nBacktrace - 1, &aAddr[1]); } - }else{ + } else { pHdr->nBacktrace = 0; } - if( mem.nTitle ){ + if (mem.nTitle) { memcpy(z, mem.zTitle, mem.nTitle); } pHdr->iSize = nByte; adjustStats(nByte, +1); pInt = (int*)&pHdr[1]; - pInt[nReserve/sizeof(int)] = REARGUARD; + pInt[nReserve / sizeof(int)] = REARGUARD; randomFill((char*)pInt, nByte); - memset(((char*)pInt)+nByte, 0x65, nReserve-nByte); + memset(((char*)pInt) + nByte, 0x65, nReserve - nByte); p = (void*)pInt; } sqlite3_mutex_leave(mem.mutex); @@ -25812,35 +25372,33 @@ static void *sqlite3MemMalloc(int nByte){ /* ** Free memory. */ -static void sqlite3MemFree(void *pPrior){ - struct MemBlockHdr *pHdr; - void **pBt; - char *z; - assert( sqlite3GlobalConfig.bMemstat || sqlite3GlobalConfig.bCoreMutex==0 - || mem.mutex!=0 ); +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 ); + if (pHdr->pPrev) { + assert(pHdr->pPrev->pNext == pHdr); pHdr->pPrev->pNext = pHdr->pNext; - }else{ - assert( mem.pFirst==pHdr ); + } else { + assert(mem.pFirst == pHdr); mem.pFirst = pHdr->pNext; } - if( pHdr->pNext ){ - assert( pHdr->pNext->pPrev==pHdr ); + if (pHdr->pNext) { + assert(pHdr->pNext->pPrev == pHdr); pHdr->pNext->pPrev = pHdr->pPrev; - }else{ - assert( mem.pLast==pHdr ); + } 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); + randomFill(z, sizeof(void*) * pHdr->nBacktraceSlots + sizeof(*pHdr) + (int)pHdr->iSize + sizeof(int) + pHdr->nTitle); free(z); sqlite3_mutex_leave(mem.mutex); } @@ -25854,16 +25412,16 @@ static void sqlite3MemFree(void *pPrior){ ** 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 */ +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 ){ + if (pNew) { + memcpy(pNew, pPrior, (int)(nByte < pOldHdr->iSize ? nByte : pOldHdr->iSize)); + if (nByte > pOldHdr->iSize) { randomFill(&((char*)pNew)[pOldHdr->iSize], nByte - (int)pOldHdr->iSize); } sqlite3MemFree(pPrior); @@ -25875,28 +25433,20 @@ static void *sqlite3MemRealloc(void *pPrior, int nByte){ ** 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 - }; +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; +SQLITE_PRIVATE void sqlite3MemdebugSetType(void* p, u8 eType) { + if (p && sqlite3GlobalConfig.m.xFree == sqlite3MemFree) { + struct MemBlockHdr* pHdr; pHdr = sqlite3MemsysGetHeader(p); - assert( pHdr->iForeGuard==FOREGUARD ); + assert(pHdr->iForeGuard == FOREGUARD); pHdr->eType = eType; } } @@ -25910,13 +25460,13 @@ SQLITE_PRIVATE void sqlite3MemdebugSetType(void *p, u8 eType){ ** ** assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); */ -SQLITE_PRIVATE int sqlite3MemdebugHasType(const void *p, u8 eType){ +SQLITE_PRIVATE int sqlite3MemdebugHasType(const void* p, u8 eType) { int rc = 1; - if( p && sqlite3GlobalConfig.m.xFree==sqlite3MemFree ){ - struct MemBlockHdr *pHdr; + if (p && sqlite3GlobalConfig.m.xFree == sqlite3MemFree) { + struct MemBlockHdr* pHdr; pHdr = sqlite3MemsysGetHeader(p); - assert( pHdr->iForeGuard==FOREGUARD ); /* Allocation is valid */ - if( (pHdr->eType&eType)==0 ){ + assert(pHdr->iForeGuard == FOREGUARD); /* Allocation is valid */ + if ((pHdr->eType & eType) == 0) { rc = 0; } } @@ -25932,13 +25482,13 @@ SQLITE_PRIVATE int sqlite3MemdebugHasType(const void *p, u8 eType){ ** ** assert( sqlite3MemdebugNoType(p, MEMTYPE_LOOKASIDE) ); */ -SQLITE_PRIVATE int sqlite3MemdebugNoType(const void *p, u8 eType){ +SQLITE_PRIVATE int sqlite3MemdebugNoType(const void* p, u8 eType) { int rc = 1; - if( p && sqlite3GlobalConfig.m.xFree==sqlite3MemFree ){ - struct MemBlockHdr *pHdr; + if (p && sqlite3GlobalConfig.m.xFree == sqlite3MemFree) { + struct MemBlockHdr* pHdr; pHdr = sqlite3MemsysGetHeader(p); - assert( pHdr->iForeGuard==FOREGUARD ); /* Allocation is valid */ - if( (pHdr->eType&eType)!=0 ){ + assert(pHdr->iForeGuard == FOREGUARD); /* Allocation is valid */ + if ((pHdr->eType & eType) != 0) { rc = 0; } } @@ -25950,36 +25500,41 @@ SQLITE_PRIVATE int sqlite3MemdebugNoType(const void *p, u8 eType){ ** 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; +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 **)){ +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){ +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; + 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; +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]); + mem.xBacktrace((int)pHdr->iSize, pHdr->nBacktrace - 1, &pBt[1]); } } @@ -25987,23 +25542,21 @@ SQLITE_PRIVATE void sqlite3MemdebugSync(){ ** 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; +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); + 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 ){ + 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; @@ -26012,16 +25565,13 @@ SQLITE_PRIVATE void sqlite3MemdebugDump(const char *zFilename){ } } 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{ + assert(sqlite3_mutex_held(mem3.mutex)); + assert((mem3.aPool[i - 1].u.hdr.size4x & 1) == 0); + assert(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]); } @@ -26229,11 +25777,11 @@ static void memsys3Unlink(u32 i){ ** 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) ); +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 ){ + if (*pRoot) { mem3.aPool[*pRoot].u.list.prev = i; } *pRoot = i; @@ -26243,17 +25791,17 @@ static void memsys3LinkIntoList(u32 i, u32 *pRoot){ ** 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){ +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{ + 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]); } @@ -26264,23 +25812,23 @@ static void memsys3Link(u32 i){ ** 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 ){ +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){ +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 ){ +static void memsys3OutOfMemory(int nByte) { + if (!mem3.alarmBusy) { mem3.alarmBusy = 1; - assert( sqlite3_mutex_held(mem3.mutex) ); + assert(sqlite3_mutex_held(mem3.mutex)); sqlite3_mutex_leave(mem3.mutex); sqlite3_release_memory(nByte); sqlite3_mutex_enter(mem3.mutex); @@ -26288,22 +25836,21 @@ static void memsys3OutOfMemory(int nByte){ } } - /* ** 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){ +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; + 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]; } @@ -26312,29 +25859,29 @@ static void *memsys3Checkout(u32 i, u32 nBlock){ ** 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 ){ +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); + void* p = memsys3Checkout(mem3.iKeyBlk, mem3.szKeyBlk); mem3.iKeyBlk = 0; mem3.szKeyBlk = 0; mem3.mnKeyBlk = 0; return p; - }else{ + } 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; + 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.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]; @@ -26357,32 +25904,32 @@ static void *memsys3FromKeyBlk(u32 nBlock){ ** chunk before invoking this routine, then must unlink the (possibly ** changed) key chunk once this routine has finished. */ -static void memsys3Merge(u32 *pRoot){ +static void memsys3Merge(u32* pRoot) { u32 iNext, prev, size, i, x; - assert( sqlite3_mutex_held(mem3.mutex) ); - for(i=*pRoot; i>0; i=iNext){ + 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 ){ + 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 ){ + 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; + 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{ + } else { size /= 4; } - if( size>mem3.szKeyBlk ){ + if (size > mem3.szKeyBlk) { mem3.iKeyBlk = i; mem3.szKeyBlk = size; } @@ -26396,35 +25943,35 @@ static void memsys3Merge(u32 *pRoot){ ** This function assumes that the necessary mutexes, if any, are ** already held by the caller. Hence "Unsafe". */ -static void *memsys3MallocUnsafe(int nByte){ +static void* memsys3MallocUnsafe(int nByte) { u32 i; u32 nBlock; u32 toFree; - assert( sqlite3_mutex_held(mem3.mutex) ); - assert( sizeof(Mem3Block)==8 ); - if( nByte<=12 ){ + assert(sqlite3_mutex_held(mem3.mutex)); + assert(sizeof(Mem3Block) == 8); + if (nByte <= 12) { nBlock = 2; - }else{ - nBlock = (nByte + 11)/8; + } else { + nBlock = (nByte + 11) / 8; } - assert( nBlock>=2 ); + 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]); + if (nBlock <= MX_SMALL) { + i = mem3.aiSmall[nBlock - 2]; + if (i > 0) { + memsys3UnlinkFromList(i, &mem3.aiSmall[nBlock - 2]); return memsys3Checkout(i, nBlock); } - }else{ + } 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 ){ + 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); } @@ -26435,11 +25982,10 @@ static void *memsys3MallocUnsafe(int nByte){ ** 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 ){ + 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. @@ -26447,22 +25993,22 @@ static void *memsys3MallocUnsafe(int nByte){ ** of the end of the key chunk. This step happens very ** rarely (we hope!) */ - for(toFree=nBlock*16; toFree<(mem3.nPool*16); toFree *= 2){ + for (toFree = nBlock * 16; toFree < (mem3.nPool * 16); toFree *= 2) { memsys3OutOfMemory(toFree); - if( mem3.iKeyBlk ){ + if (mem3.iKeyBlk) { memsys3Link(mem3.iKeyBlk); mem3.iKeyBlk = 0; mem3.szKeyBlk = 0; } - for(i=0; i=nBlock ){ + if (mem3.szKeyBlk >= nBlock) { return memsys3FromKeyBlk(nBlock); } } @@ -26478,38 +26024,38 @@ static void *memsys3MallocUnsafe(int nByte){ ** 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; +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] ); + 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; + 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; + 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; + 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; + 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; } } } @@ -26519,31 +26065,31 @@ static void memsys3FreeUnsafe(void *pOld){ ** 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 ); +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; + 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 ){ +static int memsys3Roundup(int n) { + if (n <= 12) { return 12; - }else{ - return ((n+11)&~7) - 4; + } 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 */ +static void* memsys3Malloc(int nBytes) { + sqlite3_int64* p; + assert(nBytes > 0); /* malloc.c filters out 0 byte requests */ memsys3Enter(); p = memsys3MallocUnsafe(nBytes); memsys3Leave(); @@ -26553,8 +26099,8 @@ static void *memsys3Malloc(int nBytes){ /* ** Free memory. */ -static void memsys3Free(void *pPrior){ - assert( pPrior ); +static void memsys3Free(void* pPrior) { + assert(pPrior); memsys3Enter(); memsys3FreeUnsafe(pPrior); memsys3Leave(); @@ -26563,26 +26109,26 @@ static void memsys3Free(void *pPrior){ /* ** Change the size of an existing memory allocation */ -static void *memsys3Realloc(void *pPrior, int nBytes){ +static void* memsys3Realloc(void* pPrior, int nBytes) { int nOld; - void *p; - if( pPrior==0 ){ + void* p; + if (pPrior == 0) { return sqlite3_malloc(nBytes); } - if( nBytes<=0 ){ + if (nBytes <= 0) { sqlite3_free(pPrior); return 0; } nOld = memsys3Size(pPrior); - if( nBytes<=nOld && nBytes>=nOld-128 ){ + if (nBytes <= nOld && nBytes >= nOld - 128) { return pPrior; } memsys3Enter(); p = memsys3MallocUnsafe(nBytes); - if( p ){ - if( nOld>1)!=(size&1) ){ + if (((mem3.aPool[i + size / 4 - 1].u.hdr.size4x & 2) >> 1) != (size & 1)) { fprintf(out, "%p tail checkout bit is incorrect\n", &mem3.aPool[i]); - assert( 0 ); + 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**" : ""); + 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); + for (j = mem3.aiSmall[i]; j > 0; 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); + for (j = mem3.aiHash[i]; j > 0; 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); + 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 ){ + if (out == stdout) { fflush(stdout); - }else{ + } else { fclose(out); } #else @@ -26715,17 +26257,9 @@ SQLITE_PRIVATE void sqlite3Memsys3Dump(const char *zFilename){ ** 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 - }; +SQLITE_PRIVATE const sqlite3_mem_methods* sqlite3MemGetMemsys3(void) { + static const sqlite3_mem_methods mempoolMethods = {memsys3Malloc, memsys3Free, memsys3Realloc, memsys3Size, + memsys3Roundup, memsys3Init, memsys3Shutdown, 0}; return &mempoolMethods; } @@ -26801,8 +26335,8 @@ SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys3(void){ */ typedef struct Mem5Link Mem5Link; struct Mem5Link { - int next; /* Index of next free chunk */ - int prev; /* Index of previous free chunk */ + int next; /* Index of next free chunk */ + int prev; /* Index of previous free chunk */ }; /* @@ -26815,8 +26349,8 @@ struct Mem5Link { /* ** Masks used for mem5.aCtrl[] elements. */ -#define CTRL_LOGSIZE 0x1f /* Log2 Size of this block */ -#define CTRL_FREE 0x20 /* True if not checked out */ +#define CTRL_LOGSIZE 0x1f /* Log2 Size of this block */ +#define CTRL_FREE 0x20 /* True if not checked out */ /* ** All of the static variables used by this module are collected @@ -26828,27 +26362,27 @@ static SQLITE_WSD struct Mem5Global { /* ** Memory available for allocation */ - int szAtom; /* Smallest possible allocation in bytes */ - int nBlock; /* Number of szAtom sized blocks in zPool */ - u8 *zPool; /* Memory available to be allocated */ + int szAtom; /* Smallest possible allocation in bytes */ + int nBlock; /* Number of szAtom sized blocks in zPool */ + u8* zPool; /* Memory available to be allocated */ /* ** Mutex to control access to the memory allocation subsystem. */ - sqlite3_mutex *mutex; + sqlite3_mutex* mutex; #if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) /* ** Performance statistics */ - u64 nAlloc; /* Total number of calls to malloc */ - u64 totalAlloc; /* Total of all malloc calls - includes internal frag */ - u64 totalExcess; /* Total internal fragmentation */ - u32 currentOut; /* Current checkout, including internal fragmentation */ - u32 currentCount; /* Current number of distinct checkouts */ - u32 maxOut; /* Maximum instantaneous currentOut */ - u32 maxCount; /* Maximum instantaneous currentCount */ - u32 maxRequest; /* Largest allocation (exclusive of internal frag) */ + u64 nAlloc; /* Total number of calls to malloc */ + u64 totalAlloc; /* Total of all malloc calls - includes internal frag */ + u64 totalExcess; /* Total internal fragmentation */ + u32 currentOut; /* Current checkout, including internal fragmentation */ + u32 currentCount; /* Current number of distinct checkouts */ + u32 maxOut; /* Maximum instantaneous currentOut */ + u32 maxCount; /* Maximum instantaneous currentCount */ + u32 maxRequest; /* Largest allocation (exclusive of internal frag) */ #endif /* @@ -26856,13 +26390,13 @@ static SQLITE_WSD struct Mem5Global { ** size mem5.szAtom. aiFreelist[1] holds blocks of size szAtom*2. ** aiFreelist[2] holds free blocks of size szAtom*4. And so forth. */ - int aiFreelist[LOGMAX+1]; + int aiFreelist[LOGMAX + 1]; /* ** Space for tracking which blocks are checked out and the size ** of each block. One byte per block. */ - u8 *aCtrl; + u8* aCtrl; } mem5; @@ -26875,26 +26409,26 @@ static SQLITE_WSD struct Mem5Global { ** Assuming mem5.zPool is divided up into an array of Mem5Link ** structures, return a pointer to the idx-th such link. */ -#define MEM5LINK(idx) ((Mem5Link *)(&mem5.zPool[(idx)*mem5.szAtom])) +#define MEM5LINK(idx) ((Mem5Link*)(&mem5.zPool[(idx) * mem5.szAtom])) /* ** Unlink the chunk at mem5.aPool[i] from list it is currently ** on. It should be found on mem5.aiFreelist[iLogsize]. */ -static void memsys5Unlink(int i, int iLogsize){ +static void memsys5Unlink(int i, int iLogsize) { int next, prev; - assert( i>=0 && i=0 && iLogsize<=LOGMAX ); - assert( (mem5.aCtrl[i] & CTRL_LOGSIZE)==iLogsize ); + assert(i >= 0 && i < mem5.nBlock); + assert(iLogsize >= 0 && iLogsize <= LOGMAX); + assert((mem5.aCtrl[i] & CTRL_LOGSIZE) == iLogsize); next = MEM5LINK(i)->next; prev = MEM5LINK(i)->prev; - if( prev<0 ){ + if (prev < 0) { mem5.aiFreelist[iLogsize] = next; - }else{ + } else { MEM5LINK(prev)->next = next; } - if( next>=0 ){ + if (next >= 0) { MEM5LINK(next)->prev = prev; } } @@ -26903,17 +26437,17 @@ static void memsys5Unlink(int i, int iLogsize){ ** Link the chunk at mem5.aPool[i] so that is on the iLogsize ** free list. */ -static void memsys5Link(int i, int iLogsize){ +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 ); + assert(sqlite3_mutex_held(mem5.mutex)); + assert(i >= 0 && i < mem5.nBlock); + assert(iLogsize >= 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( x= 0) { + assert(x < mem5.nBlock); MEM5LINK(x)->prev = i; } mem5.aiFreelist[iLogsize] = i; @@ -26922,10 +26456,10 @@ static void memsys5Link(int i, int iLogsize){ /* ** Obtain or release the mutex needed to access global data structures. */ -static void memsys5Enter(void){ +static void memsys5Enter(void) { sqlite3_mutex_enter(mem5.mutex); } -static void memsys5Leave(void){ +static void memsys5Leave(void) { sqlite3_mutex_leave(mem5.mutex); } @@ -26933,12 +26467,12 @@ static void memsys5Leave(void){ ** Return the size of an outstanding allocation, in bytes. ** This only works for chunks that are currently checked out. */ -static int memsys5Size(void *p){ +static int memsys5Size(void* p) { int iSize, i; - assert( p!=0 ); - i = (int)(((u8 *)p-mem5.zPool)/mem5.szAtom); - assert( i>=0 && i= 0 && i < mem5.nBlock); + iSize = mem5.szAtom * (1 << (mem5.aCtrl[i] & CTRL_LOGSIZE)); return iSize; } @@ -26952,49 +26486,51 @@ static int memsys5Size(void *p){ ** routine so there is never any chance that two or more ** threads can be in this routine at the same time. */ -static void *memsys5MallocUnsafe(int nByte){ - int i; /* Index of a mem5.aPool[] slot */ - int iBin; /* Index into mem5.aiFreelist[] */ - int iFullSz; /* Size of allocation rounded up to power of 2 */ - int iLogsize; /* Log2 of iFullSz/POW2_MIN */ +static void* memsys5MallocUnsafe(int nByte) { + int i; /* Index of a mem5.aPool[] slot */ + int iBin; /* Index into mem5.aiFreelist[] */ + int iFullSz; /* Size of allocation rounded up to power of 2 */ + int iLogsize; /* Log2 of iFullSz/POW2_MIN */ /* nByte must be a positive */ - assert( nByte>0 ); + assert(nByte > 0); /* No more than 1GiB per allocation */ - if( nByte > 0x40000000 ) return 0; + 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 ){ + 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 ); + for (iBin = iLogsize; iBin <= LOGMAX && mem5.aiFreelist[iBin] < 0; iBin++) { + } + if (iBin > LOGMAX) { + 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 ){ + while (iBin > iLogsize) { int newSize; iBin--; newSize = 1 << iBin; - mem5.aCtrl[i+newSize] = CTRL_FREE | iBin; - memsys5Link(i+newSize, iBin); + mem5.aCtrl[i + newSize] = CTRL_FREE | iBin; + memsys5Link(i + newSize, iBin); } mem5.aCtrl[i] = iLogsize; @@ -27005,71 +26541,75 @@ static void *memsys5MallocUnsafe(int nByte){ mem5.totalExcess += iFullSz - nByte; mem5.currentCount++; mem5.currentOut += iFullSz; - if( mem5.maxCount=0 && iBlock= 0 && iBlock < mem5.nBlock); + assert(((u8*)pOld - mem5.zPool) % mem5.szAtom == 0); + assert((mem5.aCtrl[iBlock] & CTRL_FREE) == 0); iLogsize = mem5.aCtrl[iBlock] & CTRL_LOGSIZE; - size = 1<0 ); - assert( mem5.currentOut>=(size*mem5.szAtom) ); + assert(mem5.currentCount > 0); + 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 ); + 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 ){ + if ((iBlock >> iLogsize) & 1) { iBuddy = iBlock - size; - assert( iBuddy>=0 ); - }else{ + assert(iBuddy >= 0); + } else { iBuddy = iBlock + size; - if( iBuddy>=mem5.nBlock ) break; + if (iBuddy >= mem5.nBlock) + break; } - if( mem5.aCtrl[iBuddy]!=(CTRL_FREE | iLogsize) ) break; + if (mem5.aCtrl[iBuddy] != (CTRL_FREE | iLogsize)) + break; memsys5Unlink(iBuddy, iLogsize); iLogsize++; - if( iBuddy0 ){ +static void* memsys5Malloc(int nBytes) { + sqlite3_int64* p = 0; + if (nBytes > 0) { memsys5Enter(); p = memsys5MallocUnsafe(nBytes); memsys5Leave(); @@ -27104,8 +26644,8 @@ static void *memsys5Malloc(int nBytes){ ** The outer layer memory allocator prevents this routine from ** being called with pPrior==0. */ -static void memsys5Free(void *pPrior){ - assert( pPrior!=0 ); +static void memsys5Free(void* pPrior) { + assert(pPrior != 0); memsys5Enter(); memsys5FreeUnsafe(pPrior); memsys5Leave(); @@ -27123,21 +26663,21 @@ static void memsys5Free(void *pPrior){ ** (an allocation larger than 0x40000000) was requested and this ** routine should return 0 without freeing pPrior. */ -static void *memsys5Realloc(void *pPrior, int nBytes){ +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 ){ + 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 ){ + if (nBytes <= nOld) { return pPrior; } p = memsys5Malloc(nBytes); - if( p ){ + if (p) { memcpy(p, pPrior, nOld); memsys5Free(pPrior); } @@ -27153,15 +26693,19 @@ static void *memsys5Realloc(void *pPrior, int nBytes){ ** 32-bit signed integer. Hence the largest allocation is 0x40000000 ** or 1073741824 bytes. */ -static int memsys5Roundup(int n){ +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 <= 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; + if (n > 0x40000000) + return 0; + for (iFullSz = mem5.szAtom * 8; iFullSz < n; iFullSz *= 4) + ; + if ((iFullSz / 2) >= n) + return iFullSz / 2; return iFullSz; } @@ -27175,9 +26719,10 @@ static int memsys5Roundup(int n){ ** memsys5Log(8) -> 3 ** memsys5Log(9) -> 4 */ -static int memsys5Log(int iValue){ +static int memsys5Log(int iValue) { int iLog; - for(iLog=0; (iLog<(int)((sizeof(int)*8)-1)) && (1<mem5.szAtom ){ + mem5.szAtom = (1 << nMinLog); + while ((int)sizeof(Mem5Link) > mem5.szAtom) { mem5.szAtom = mem5.szAtom << 1; } - mem5.nBlock = (nByte / (mem5.szAtom+sizeof(u8))); + mem5.nBlock = (nByte / (mem5.szAtom + sizeof(u8))); mem5.zPool = zByte; - mem5.aCtrl = (u8 *)&mem5.zPool[mem5.nBlock*mem5.szAtom]; + mem5.aCtrl = (u8*)&mem5.zPool[mem5.nBlock * mem5.szAtom]; - for(ii=0; ii<=LOGMAX; ii++){ + for (ii = 0; ii <= LOGMAX; ii++) { mem5.aiFreelist[ii] = -1; } iOffset = 0; - for(ii=LOGMAX; ii>=0; ii--){ - int nAlloc = (1<= 0; ii--) { + int nAlloc = (1 << ii); + if ((iOffset + nAlloc) <= mem5.nBlock) { mem5.aCtrl[iOffset] = ii | CTRL_FREE; memsys5Link(iOffset, ii); iOffset += nAlloc; } - assert((iOffset+nAlloc)>mem5.nBlock); + assert((iOffset + nAlloc) > mem5.nBlock); } /* If a mutex is required for normal operation, allocate one */ - if( sqlite3GlobalConfig.bMemstat==0 ){ + if (sqlite3GlobalConfig.bMemstat == 0) { mem5.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM); } @@ -27245,7 +26790,7 @@ static int memsys5Init(void *NotUsed){ /* ** Deinitialize this module. */ -static void memsys5Shutdown(void *NotUsed){ +static void memsys5Shutdown(void* NotUsed) { UNUSED_PARAMETER(NotUsed); mem5.mutex = 0; return; @@ -27256,25 +26801,25 @@ static void memsys5Shutdown(void *NotUsed){ ** 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; +SQLITE_PRIVATE void sqlite3Memsys5Dump(const char* zFilename) { + FILE* out; int i, j, n; int nMinLog; - if( zFilename==0 || zFilename[0]==0 ){ + if (zFilename == 0 || zFilename[0] == 0) { out = stdout; - }else{ + } else { out = fopen(zFilename, "w"); - if( out==0 ){ - fprintf(stderr, "** Unable to output memory debug output log: %s **\n", - zFilename); + 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++){} + 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); @@ -27286,9 +26831,9 @@ SQLITE_PRIVATE void sqlite3Memsys5Dump(const char *zFilename){ fprintf(out, "mem5.maxCount = %u\n", mem5.maxCount); fprintf(out, "mem5.maxRequest = %u\n", mem5.maxRequest); memsys5Leave(); - if( out==stdout ){ + if (out == stdout) { fflush(stdout); - }else{ + } else { fclose(out); } } @@ -27299,17 +26844,9 @@ SQLITE_PRIVATE void sqlite3Memsys5Dump(const char *zFilename){ ** 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 - }; +SQLITE_PRIVATE const sqlite3_mem_methods* sqlite3MemGetMemsys5(void) { + static const sqlite3_mem_methods memsys5Methods = {memsys5Malloc, memsys5Free, memsys5Realloc, memsys5Size, + memsys5Roundup, memsys5Init, memsys5Shutdown, 0}; return &memsys5Methods; } @@ -27343,7 +26880,6 @@ SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys5(void){ static SQLITE_WSD int mutexIsInit = 0; #endif /* SQLITE_DEBUG && !defined(SQLITE_MUTEX_OMIT) */ - #ifndef SQLITE_MUTEX_OMIT #ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS @@ -27373,22 +26909,22 @@ static SQLITE_WSD int mutexIsInit = 0; typedef struct CheckMutex CheckMutex; struct CheckMutex { int iType; - sqlite3_mutex *mutex; + sqlite3_mutex* mutex; }; -#define SQLITE_MUTEX_WARNONCONTENTION (-1) +#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; +static SQLITE_WSD const sqlite3_mutex_methods* pGlobalMutexMethods; #ifdef SQLITE_DEBUG -static int checkMutexHeld(sqlite3_mutex *p){ +static int checkMutexHeld(sqlite3_mutex* p) { return pGlobalMutexMethods->xMutexHeld(((CheckMutex*)p)->mutex); } -static int checkMutexNotheld(sqlite3_mutex *p){ +static int checkMutexNotheld(sqlite3_mutex* p) { return pGlobalMutexMethods->xMutexNotheld(((CheckMutex*)p)->mutex); } #endif @@ -27396,11 +26932,11 @@ static int checkMutexNotheld(sqlite3_mutex *p){ /* ** Initialize and deinitialize the mutex subsystem. */ -static int checkMutexInit(void){ +static int checkMutexInit(void) { pGlobalMutexMethods = sqlite3DefaultMutex(); return SQLITE_OK; } -static int checkMutexEnd(void){ +static int checkMutexEnd(void) { pGlobalMutexMethods = 0; return SQLITE_OK; } @@ -27408,33 +26944,30 @@ static int checkMutexEnd(void){ /* ** 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; +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 ){ + assert(SQLITE_MUTEX_RECURSIVE == 1 && SQLITE_MUTEX_FAST == 0); + if (iType < 2) { p = sqlite3MallocZero(sizeof(CheckMutex)); - if( p==0 ) return 0; + if (p == 0) + return 0; p->iType = iType; - }else{ + } else { #ifdef SQLITE_ENABLE_API_ARMOR - if( iType-2>=ArraySize(staticMutexes) ){ + if (iType - 2 >= ArraySize(staticMutexes)) { (void)SQLITE_MISUSE_BKPT; return 0; } #endif - p = &staticMutexes[iType-2]; + p = &staticMutexes[iType - 2]; } - if( p->mutex==0 ){ + if (p->mutex == 0) { p->mutex = pGlobalMutexMethods->xMutexAlloc(iType); - if( p->mutex==0 ){ - if( iType<2 ){ + if (p->mutex == 0) { + if (iType < 2) { sqlite3_free(p); } p = 0; @@ -27447,21 +26980,21 @@ static sqlite3_mutex *checkMutexAlloc(int iType){ /* ** Free a mutex. */ -static void checkMutexFree(sqlite3_mutex *p){ - assert( SQLITE_MUTEX_RECURSIVE<2 ); - assert( SQLITE_MUTEX_FAST<2 ); - assert( SQLITE_MUTEX_WARNONCONTENTION<2 ); +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 ) + if (((CheckMutex*)p)->iType < 2) #endif { - CheckMutex *pCheck = (CheckMutex*)p; + CheckMutex* pCheck = (CheckMutex*)p; pGlobalMutexMethods->xMutexFree(pCheck->mutex); sqlite3_free(pCheck); } #ifdef SQLITE_ENABLE_API_ARMOR - else{ + else { (void)SQLITE_MISUSE_BKPT; } #endif @@ -27470,15 +27003,13 @@ static void checkMutexFree(sqlite3_mutex *p){ /* ** 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) ){ +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" - ); + sqlite3_log(SQLITE_MISUSE, "illegal multi-threaded access to database connection"); } pGlobalMutexMethods->xMutexEnter(pCheck->mutex); } @@ -27486,31 +27017,24 @@ static void checkMutexEnter(sqlite3_mutex *p){ /* ** Enter the mutex (do not block). */ -static int checkMutexTry(sqlite3_mutex *p){ - CheckMutex *pCheck = (CheckMutex*)p; +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; +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, +sqlite3_mutex_methods const* multiThreadedCheckMutex(void) { + static const sqlite3_mutex_methods sMutex = {checkMutexInit, checkMutexEnd, checkMutexAlloc, checkMutexFree, + checkMutexEnter, checkMutexTry, checkMutexLeave, #ifdef SQLITE_DEBUG - checkMutexHeld, - checkMutexNotheld + checkMutexHeld, checkMutexNotheld #else 0, 0 @@ -27523,36 +27047,36 @@ sqlite3_mutex_methods const *multiThreadedCheckMutex(void){ ** 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 ); +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 */ +#endif /* ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS */ /* ** Initialize the mutex system. */ -SQLITE_PRIVATE int sqlite3MutexInit(void){ +SQLITE_PRIVATE int sqlite3MutexInit(void) { int rc = SQLITE_OK; - if( !sqlite3GlobalConfig.mutex.xMutexAlloc ){ + 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; + sqlite3_mutex_methods const* pFrom; + sqlite3_mutex_methods* pTo = &sqlite3GlobalConfig.mutex; - if( sqlite3GlobalConfig.bCoreMutex ){ + if (sqlite3GlobalConfig.bCoreMutex) { #ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS pFrom = multiThreadedCheckMutex(); #else pFrom = sqlite3DefaultMutex(); #endif - }else{ + } else { pFrom = sqlite3NoopMutex(); } pTo->xMutexInit = pFrom->xMutexInit; @@ -27566,7 +27090,7 @@ SQLITE_PRIVATE int sqlite3MutexInit(void){ sqlite3MemoryBarrier(); pTo->xMutexAlloc = pFrom->xMutexAlloc; } - assert( sqlite3GlobalConfig.mutex.xMutexInit ); + assert(sqlite3GlobalConfig.mutex.xMutexInit); rc = sqlite3GlobalConfig.mutex.xMutexInit(); #ifdef SQLITE_DEBUG @@ -27581,9 +27105,9 @@ SQLITE_PRIVATE int sqlite3MutexInit(void){ ** Shutdown the mutex system. This call frees resources allocated by ** sqlite3MutexInit(). */ -SQLITE_PRIVATE int sqlite3MutexEnd(void){ +SQLITE_PRIVATE int sqlite3MutexEnd(void) { int rc = SQLITE_OK; - if( sqlite3GlobalConfig.mutex.xMutexEnd ){ + if (sqlite3GlobalConfig.mutex.xMutexEnd) { rc = sqlite3GlobalConfig.mutex.xMutexEnd(); } @@ -27597,30 +27121,32 @@ SQLITE_PRIVATE int sqlite3MutexEnd(void){ /* ** Retrieve a pointer to a static mutex or allocate a new dynamic one. */ -SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int id){ +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; + if (id <= SQLITE_MUTEX_RECURSIVE && sqlite3_initialize()) + return 0; + if (id > SQLITE_MUTEX_RECURSIVE && sqlite3MutexInit()) + return 0; #endif - assert( sqlite3GlobalConfig.mutex.xMutexAlloc ); + assert(sqlite3GlobalConfig.mutex.xMutexAlloc); return sqlite3GlobalConfig.mutex.xMutexAlloc(id); } -SQLITE_PRIVATE sqlite3_mutex *sqlite3MutexAlloc(int id){ - if( !sqlite3GlobalConfig.bCoreMutex ){ +SQLITE_PRIVATE sqlite3_mutex* sqlite3MutexAlloc(int id) { + if (!sqlite3GlobalConfig.bCoreMutex) { return 0; } - assert( GLOBAL(int, mutexIsInit) ); - assert( sqlite3GlobalConfig.mutex.xMutexAlloc ); + 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 ); +SQLITE_API void sqlite3_mutex_free(sqlite3_mutex* p) { + if (p) { + assert(sqlite3GlobalConfig.mutex.xMutexFree); sqlite3GlobalConfig.mutex.xMutexFree(p); } } @@ -27629,9 +27155,9 @@ SQLITE_API void sqlite3_mutex_free(sqlite3_mutex *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 ); +SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex* p) { + if (p) { + assert(sqlite3GlobalConfig.mutex.xMutexEnter); sqlite3GlobalConfig.mutex.xMutexEnter(p); } } @@ -27640,10 +27166,10 @@ SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex *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){ +SQLITE_API int sqlite3_mutex_try(sqlite3_mutex* p) { int rc = SQLITE_OK; - if( p ){ - assert( sqlite3GlobalConfig.mutex.xMutexTry ); + if (p) { + assert(sqlite3GlobalConfig.mutex.xMutexTry); return sqlite3GlobalConfig.mutex.xMutexTry(p); } return rc; @@ -27655,9 +27181,9 @@ SQLITE_API int sqlite3_mutex_try(sqlite3_mutex *p){ ** 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 ); +SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex* p) { + if (p) { + assert(sqlite3GlobalConfig.mutex.xMutexLeave); sqlite3GlobalConfig.mutex.xMutexLeave(p); } } @@ -27667,13 +27193,13 @@ SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex *p){ ** 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_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); +SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex* p) { + assert(p == 0 || sqlite3GlobalConfig.mutex.xMutexNotheld); + return p == 0 || sqlite3GlobalConfig.mutex.xMutexNotheld(p); } #endif @@ -27718,32 +27244,45 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex *p){ ** ** 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){ +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){ +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; } +static void noopMutexLeave(sqlite3_mutex* p) { + UNUSED_PARAMETER(p); + return; +} -SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3NoopMutex(void){ +SQLITE_PRIVATE sqlite3_mutex_methods const* sqlite3NoopMutex(void) { static const sqlite3_mutex_methods sMutex = { - noopMutexInit, - noopMutexEnd, - noopMutexAlloc, - noopMutexFree, - noopMutexEnter, - noopMutexTry, - noopMutexLeave, + noopMutexInit, + noopMutexEnd, + noopMutexAlloc, + noopMutexFree, + noopMutexEnter, + noopMutexTry, + noopMutexLeave, - 0, - 0, + 0, + 0, }; return &sMutex; @@ -27761,42 +27300,46 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3NoopMutex(void){ ** The mutex object */ typedef struct sqlite3_debug_mutex { - int id; /* The mutex type */ - int cnt; /* Number of entries without a matching leave */ + 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 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; +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; } +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_mutex* debugMutexAlloc(int id) { static sqlite3_debug_mutex aStatic[SQLITE_MUTEX_STATIC_VFS3 - 1]; - sqlite3_debug_mutex *pNew = 0; - switch( id ){ + sqlite3_debug_mutex* pNew = 0; + switch (id) { case SQLITE_MUTEX_FAST: case SQLITE_MUTEX_RECURSIVE: { pNew = sqlite3Malloc(sizeof(*pNew)); - if( pNew ){ + if (pNew) { pNew->id = id; pNew->cnt = 0; } @@ -27804,12 +27347,12 @@ static sqlite3_mutex *debugMutexAlloc(int id){ } default: { #ifdef SQLITE_ENABLE_API_ARMOR - if( id-2<0 || id-2>=ArraySize(aStatic) ){ + if (id - 2 < 0 || id - 2 >= ArraySize(aStatic)) { (void)SQLITE_MISUSE_BKPT; return 0; } #endif - pNew = &aStatic[id-2]; + pNew = &aStatic[id - 2]; pNew->id = id; break; } @@ -27820,12 +27363,12 @@ static sqlite3_mutex *debugMutexAlloc(int id){ /* ** 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 ){ +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{ + } else { #ifdef SQLITE_ENABLE_API_ARMOR (void)SQLITE_MISUSE_BKPT; #endif @@ -27843,14 +27386,14 @@ static void debugMutexFree(sqlite3_mutex *pX){ ** 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) ); +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) ); +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; } @@ -27861,26 +27404,18 @@ static int debugMutexTry(sqlite3_mutex *pX){ ** 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) ); +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) ); + 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 - }; +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; } @@ -27891,7 +27426,7 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3NoopMutex(void){ ** is used regardless of the run-time threadsafety setting. */ #ifdef SQLITE_MUTEX_NOOP -SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ +SQLITE_PRIVATE sqlite3_mutex_methods const* sqlite3DefaultMutex(void) { return sqlite3NoopMutex(); } #endif /* defined(SQLITE_MUTEX_NOOP) */ @@ -27931,32 +27466,31 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ ** home-grown mutexes. Encapsulate these conditions into a single #define. */ #if defined(SQLITE_DEBUG) || defined(SQLITE_HOMEGROWN_RECURSIVE_MUTEX) -# define SQLITE_MUTEX_NREF 1 +#define SQLITE_MUTEX_NREF 1 #else -# define SQLITE_MUTEX_NREF 0 +#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 */ + pthread_mutex_t mutex; /* Mutex controlling the lock */ #if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR) - int id; /* Mutex type */ + 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 */ + 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} +#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 } +#define SQLITE3_MUTEX_INITIALIZER(id) {PTHREAD_MUTEX_INITIALIZER, id} #else -#define SQLITE3_MUTEX_INITIALIZER(id) { PTHREAD_MUTEX_INITIALIZER } +#define SQLITE3_MUTEX_INITIALIZER(id) {PTHREAD_MUTEX_INITIALIZER} #endif /* @@ -27976,11 +27510,11 @@ struct sqlite3_mutex { ** 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 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; +static int pthreadMutexNotheld(sqlite3_mutex* p) { + return p->nRef == 0 || pthread_equal(p->owner, pthread_self()) == 0; } #endif @@ -27989,10 +27523,10 @@ static int pthreadMutexNotheld(sqlite3_mutex *p){ ** and also for the implementation of xShmBarrier in the VFS in cases ** where SQLite is compiled without mutexes. */ -SQLITE_PRIVATE void sqlite3MemoryBarrier(void){ +SQLITE_PRIVATE void sqlite3MemoryBarrier(void) { #if defined(SQLITE_MEMORY_BARRIER) SQLITE_MEMORY_BARRIER; -#elif defined(__GNUC__) && GCC_VERSION>=4001000 +#elif defined(__GNUC__) && GCC_VERSION >= 4001000 __sync_synchronize(); #endif } @@ -28000,8 +27534,12 @@ SQLITE_PRIVATE void sqlite3MemoryBarrier(void){ /* ** Initialize and deinitialize the mutex subsystem. */ -static int pthreadMutexInit(void){ return SQLITE_OK; } -static int pthreadMutexEnd(void){ return SQLITE_OK; } +static int pthreadMutexInit(void) { + return SQLITE_OK; +} +static int pthreadMutexEnd(void) { + return SQLITE_OK; +} /* ** The sqlite3_mutex_alloc() routine allocates a new @@ -28051,26 +27589,16 @@ static int pthreadMutexEnd(void){ return SQLITE_OK; } ** 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 ){ +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 ){ + 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. */ @@ -28090,8 +27618,8 @@ static sqlite3_mutex *pthreadMutexAlloc(int iType){ break; } case SQLITE_MUTEX_FAST: { - p = sqlite3MallocZero( sizeof(*p) ); - if( p ){ + 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; @@ -28101,38 +27629,37 @@ static sqlite3_mutex *pthreadMutexAlloc(int iType){ } default: { #ifdef SQLITE_ENABLE_API_ARMOR - if( iType-2<0 || iType-2>=ArraySize(staticMutexes) ){ + if (iType - 2 < 0 || iType - 2 >= ArraySize(staticMutexes)) { (void)SQLITE_MISUSE_BKPT; return 0; } #endif - p = &staticMutexes[iType-2]; + p = &staticMutexes[iType - 2]; break; } } #if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR) - assert( p==0 || p->id==iType ); + 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 ); +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 ) + 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{ + else { (void)SQLITE_MISUSE_BKPT; } #endif @@ -28149,8 +27676,8 @@ static void pthreadMutexFree(sqlite3_mutex *p){ ** 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) ); +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 @@ -28165,35 +27692,35 @@ static void pthreadMutexEnter(sqlite3_mutex *p){ */ { pthread_t self = pthread_self(); - if( p->nRef>0 && pthread_equal(p->owner, self) ){ + if (p->nRef > 0 && pthread_equal(p->owner, self)) { p->nRef++; - }else{ + } else { pthread_mutex_lock(&p->mutex); - assert( p->nRef==0 ); + 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 ); + assert(p->nRef > 0 || p->owner == 0); p->owner = pthread_self(); p->nRef++; #endif #endif #ifdef SQLITE_DEBUG - if( p->trace ){ + if (p->trace) { printf("enter mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef); } #endif } -static int pthreadMutexTry(sqlite3_mutex *p){ +static int pthreadMutexTry(sqlite3_mutex* p) { int rc; - assert( p->id==SQLITE_MUTEX_RECURSIVE || pthreadMutexNotheld(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 @@ -28208,34 +27735,34 @@ static int pthreadMutexTry(sqlite3_mutex *p){ */ { pthread_t self = pthread_self(); - if( p->nRef>0 && pthread_equal(p->owner, 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 ); + } else if (pthread_mutex_trylock(&p->mutex) == 0) { + assert(p->nRef == 0); p->owner = self; p->nRef = 1; rc = SQLITE_OK; - }else{ + } else { rc = SQLITE_BUSY; } } #else /* Use the built-in recursive mutexes if they are available. - */ - if( pthread_mutex_trylock(&p->mutex)==0 ){ + */ + if (pthread_mutex_trylock(&p->mutex) == 0) { #if SQLITE_MUTEX_NREF p->owner = pthread_self(); p->nRef++; #endif rc = SQLITE_OK; - }else{ + } else { rc = SQLITE_BUSY; } #endif #ifdef SQLITE_DEBUG - if( rc==SQLITE_OK && p->trace ){ + if (rc == SQLITE_OK && p->trace) { printf("enter mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef); } #endif @@ -28248,16 +27775,17 @@ static int pthreadMutexTry(sqlite3_mutex *p){ ** 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) ); +static void pthreadMutexLeave(sqlite3_mutex* p) { + assert(pthreadMutexHeld(p)); #if SQLITE_MUTEX_NREF p->nRef--; - if( p->nRef==0 ) p->owner = 0; + if (p->nRef == 0) + p->owner = 0; #endif - assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE ); + assert(p->nRef == 0 || p->id == SQLITE_MUTEX_RECURSIVE); #ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX - if( p->nRef==0 ){ + if (p->nRef == 0) { pthread_mutex_unlock(&p->mutex); } #else @@ -28265,24 +27793,17 @@ static void pthreadMutexLeave(sqlite3_mutex *p){ #endif #ifdef SQLITE_DEBUG - if( p->trace ){ + 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, +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 + pthreadMutexHeld, pthreadMutexNotheld #else 0, 0 @@ -28345,8 +27866,8 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ #include "windows.h" #ifdef __CYGWIN__ -# include -# include /* amalgamator: dontcache */ +#include /* amalgamator: dontcache */ +#include #endif /* @@ -28367,7 +27888,7 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ ** by setting SQLITE_OS_WINNT to 0. */ #if SQLITE_OS_WIN && !defined(SQLITE_OS_WINNT) -# define SQLITE_OS_WINNT 1 +#define SQLITE_OS_WINNT 1 #endif /* @@ -28375,9 +27896,9 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ ** API. */ #if defined(_WIN32_WCE) -# define SQLITE_OS_WINCE 1 +#define SQLITE_OS_WINCE 1 #else -# define SQLITE_OS_WINCE 0 +#define SQLITE_OS_WINCE 0 #endif /* @@ -28385,7 +27906,7 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ ** the full Win32 API. */ #if !defined(SQLITE_OS_WINRT) -# define SQLITE_OS_WINRT 0 +#define SQLITE_OS_WINRT 0 #endif /* @@ -28393,20 +27914,19 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ ** volatile. */ #if SQLITE_OS_WINCE -# define SQLITE_WIN32_VOLATILE +#define SQLITE_WIN32_VOLATILE #else -# define SQLITE_WIN32_VOLATILE volatile +#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 +#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 +#define SQLITE_OS_WIN_THREADS 0 #endif #endif /* SQLITE_OS_WIN_H */ @@ -28425,12 +27945,12 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ ** Each recursive mutex is an instance of the following structure. */ struct sqlite3_mutex { - CRITICAL_SECTION mutex; /* Mutex controlling the lock */ - int id; /* Mutex type */ + 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 */ + volatile int nRef; /* Number of enterances */ + volatile DWORD owner; /* Thread holding this mutex */ + volatile LONG trace; /* True to trace changes */ #endif }; @@ -28439,13 +27959,12 @@ struct sqlite3_mutex { ** on Win32. It should be noted that all mutexes require initialization ** on the Win32 platform. */ -#define SQLITE_W32_MUTEX_INITIALIZER { 0 } +#define SQLITE_W32_MUTEX_INITIALIZER {0} #ifdef SQLITE_DEBUG -#define SQLITE3_MUTEX_INITIALIZER(id) { SQLITE_W32_MUTEX_INITIALIZER, id, \ - 0L, (DWORD)0, 0 } +#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 } +#define SQLITE3_MUTEX_INITIALIZER(id) {SQLITE_W32_MUTEX_INITIALIZER, id} #endif #ifdef SQLITE_DEBUG @@ -28453,15 +27972,15 @@ struct sqlite3_mutex { ** 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 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 winMutexNotheld2(sqlite3_mutex* p, DWORD tid) { + return p->nRef == 0 || p->owner != tid; } -static int winMutexNotheld(sqlite3_mutex *p){ +static int winMutexNotheld(sqlite3_mutex* p) { DWORD tid = GetCurrentThreadId(); return winMutexNotheld2(p, tid); } @@ -28472,12 +27991,12 @@ static int winMutexNotheld(sqlite3_mutex *p){ ** 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){ +SQLITE_PRIVATE void sqlite3MemoryBarrier(void) { #if defined(SQLITE_MEMORY_BARRIER) SQLITE_MEMORY_BARRIER; #elif defined(__GNUC__) __sync_synchronize(); -#elif MSVC_VERSION>=1300 +#elif MSVC_VERSION >= 1300 _ReadWriteBarrier(); #elif defined(MemoryBarrier) MemoryBarrier(); @@ -28488,19 +28007,9 @@ SQLITE_PRIVATE void sqlite3MemoryBarrier(void){ ** 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) -}; + 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" */ @@ -28511,14 +28020,14 @@ static int winMutex_isNt = -1; /* <0 means "need to query" */ */ static LONG SQLITE_WIN32_VOLATILE winMutex_lock = 0; -SQLITE_API int sqlite3_win32_is_nt(void); /* os_win.c */ +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){ +static int winMutexInit(void) { /* The first to increment to 1 does actual initialization */ - if( InterlockedCompareExchange(&winMutex_lock, 1, 0)==0 ){ + if (InterlockedCompareExchange(&winMutex_lock, 1, 0) == 0) { int i; - for(i=0; iid = iType; #ifdef SQLITE_DEBUG #ifdef SQLITE_WIN32_MUTEX_TRACE_DYNAMIC @@ -28623,12 +28132,12 @@ static sqlite3_mutex *winMutexAlloc(int iType){ } default: { #ifdef SQLITE_ENABLE_API_ARMOR - if( iType-2<0 || iType-2>=ArraySize(winMutex_staticMutexes) ){ + if (iType - 2 < 0 || iType - 2 >= ArraySize(winMutex_staticMutexes)) { (void)SQLITE_MISUSE_BKPT; return 0; } #endif - p = &winMutex_staticMutexes[iType-2]; + p = &winMutex_staticMutexes[iType - 2]; #ifdef SQLITE_DEBUG #ifdef SQLITE_WIN32_MUTEX_TRACE_STATIC InterlockedCompareExchange(&p->trace, 1, 0); @@ -28637,23 +28146,22 @@ static sqlite3_mutex *winMutexAlloc(int iType){ break; } } - assert( p==0 || p->id==iType ); + 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 ){ +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{ + } else { #ifdef SQLITE_ENABLE_API_ARMOR (void)SQLITE_MISUSE_BKPT; #endif @@ -28671,36 +28179,35 @@ static void winMutexFree(sqlite3_mutex *p){ ** 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){ +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) ); + assert(p); + assert(p->id == SQLITE_MUTEX_RECURSIVE || winMutexNotheld2(p, tid)); #else - assert( p ); + assert(p); #endif - assert( winMutex_isInit==1 ); + assert(winMutex_isInit == 1); EnterCriticalSection(&p->mutex); #ifdef SQLITE_DEBUG - assert( p->nRef>0 || p->owner==0 ); + 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)); + 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){ +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) ); + 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 @@ -28713,13 +28220,13 @@ static int winMutexTry(sqlite3_mutex *p){ ** ticket #2685. */ #if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0400 - assert( winMutex_isInit==1 ); - assert( winMutex_isNt>=-1 && winMutex_isNt<=1 ); - if( winMutex_isNt<0 ){ + 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) ){ + assert(winMutex_isNt == 0 || winMutex_isNt == 1); + if (winMutex_isNt && TryEnterCriticalSection(&p->mutex)) { #ifdef SQLITE_DEBUG p->owner = tid; p->nRef++; @@ -28730,9 +28237,9 @@ static int winMutexTry(sqlite3_mutex *p){ 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))); + 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; @@ -28744,40 +28251,33 @@ static int winMutexTry(sqlite3_mutex *p){ ** 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){ +static void winMutexLeave(sqlite3_mutex* p) { #if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) DWORD tid = GetCurrentThreadId(); #endif - assert( p ); + assert(p); #ifdef SQLITE_DEBUG - assert( p->nRef>0 ); - assert( p->owner==tid ); + 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 ); + if (p->nRef == 0) + p->owner = 0; + assert(p->nRef == 0 || p->id == SQLITE_MUTEX_RECURSIVE); #endif - assert( winMutex_isInit==1 ); + 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)); + 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, +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 + winMutexHeld, winMutexNotheld #else 0, 0 @@ -28812,7 +28312,7 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ ** 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){ +SQLITE_API int sqlite3_release_memory(int n) { #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT return sqlite3PcacheReleaseMemory(n); #else @@ -28828,14 +28328,14 @@ SQLITE_API int sqlite3_release_memory(int n){ ** Default value of the hard heap limit. 0 means "no limit". */ #ifndef SQLITE_MAX_MEMORY -# define SQLITE_MAX_MEMORY 0 +#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_mutex* mutex; /* Mutex to serialize access */ sqlite3_int64 alarmThreshold; /* The soft heap limit */ sqlite3_int64 hardLimit; /* The hard upper bound on memory */ @@ -28844,14 +28344,14 @@ static SQLITE_WSD struct Mem0Global { ** sqlite3_soft_heap_limit() setting. */ int nearlyFull; -} mem0 = { 0, SQLITE_MAX_MEMORY, SQLITE_MAX_MEMORY, 0 }; +} 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){ +SQLITE_PRIVATE sqlite3_mutex* sqlite3MallocMutex(void) { return mem0.mutex; } @@ -28861,11 +28361,7 @@ SQLITE_PRIVATE sqlite3_mutex *sqlite3MallocMutex(void){ ** 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 -){ +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; @@ -28884,33 +28380,36 @@ SQLITE_API int sqlite3_memory_alarm( ** 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){ +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; + if (rc) + return -1; #endif sqlite3_mutex_enter(mem0.mutex); priorLimit = mem0.alarmThreshold; - if( n<0 ){ + if (n < 0) { sqlite3_mutex_leave(mem0.mutex); return priorLimit; } - if( mem0.hardLimit>0 && (n>mem0.hardLimit || n==0) ){ + 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); + 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)); + 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; +SQLITE_API void sqlite3_soft_heap_limit(int n) { + if (n < 0) + n = 0; sqlite3_soft_heap_limit64(n); } @@ -28926,17 +28425,18 @@ SQLITE_API void sqlite3_soft_heap_limit(int n){ ** 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){ +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; + if (rc) + return -1; #endif sqlite3_mutex_enter(mem0.mutex); priorLimit = mem0.hardLimit; - if( n>=0 ){ + if (n >= 0) { mem0.hardLimit = n; - if( n0 ); + assert(sqlite3_mutex_held(mem0.mutex)); + assert(n > 0); /* In Firefox (circa 2017-02-08), xRoundup() is remapped to an internal ** implementation of malloc_good_size(), which must be called in debug @@ -29031,30 +28531,30 @@ static void mallocWithAlarm(int n, void **pp){ nFull = sqlite3GlobalConfig.m.xRoundup(n); sqlite3StatusHighwater(SQLITE_STATUS_MALLOC_SIZE, n); - if( mem0.alarmThreshold>0 ){ + if (mem0.alarmThreshold > 0) { sqlite3_int64 nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); - if( nUsed >= mem0.alarmThreshold - nFull ){ + if (nUsed >= mem0.alarmThreshold - nFull) { AtomicStore(&mem0.nearlyFull, 1); sqlite3MallocAlarm(nFull); - if( mem0.hardLimit ){ + if (mem0.hardLimit) { nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); - if( nUsed >= mem0.hardLimit - nFull ){ + if (nUsed >= mem0.hardLimit - nFull) { *pp = 0; return; } } - }else{ + } else { AtomicStore(&mem0.nearlyFull, 0); } } p = sqlite3GlobalConfig.m.xMalloc(nFull); #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT - if( p==0 && mem0.alarmThreshold>0 ){ + if (p == 0 && mem0.alarmThreshold > 0) { sqlite3MallocAlarm(nFull); p = sqlite3GlobalConfig.m.xMalloc(nFull); } #endif - if( p ){ + if (p) { nFull = sqlite3MallocSize(p); sqlite3StatusUp(SQLITE_STATUS_MEMORY_USED, nFull); sqlite3StatusUp(SQLITE_STATUS_MALLOC_COUNT, 1); @@ -29066,23 +28566,23 @@ static void mallocWithAlarm(int n, void **pp){ ** 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 ){ +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 ){ + } else if (sqlite3GlobalConfig.bMemstat) { sqlite3_mutex_enter(mem0.mutex); mallocWithAlarm((int)n, &p); sqlite3_mutex_leave(mem0.mutex); - }else{ + } else { p = sqlite3GlobalConfig.m.xMalloc((int)n); } - assert( EIGHT_BYTE_ALIGNMENT(p) ); /* IMP: R-11148-40995 */ + assert(EIGHT_BYTE_ALIGNMENT(p)); /* IMP: R-11148-40995 */ return p; } @@ -29091,15 +28591,17 @@ SQLITE_PRIVATE void *sqlite3Malloc(u64 n){ ** First make sure the memory subsystem is initialized, then do the ** allocation. */ -SQLITE_API void *sqlite3_malloc(int n){ +SQLITE_API void* sqlite3_malloc(int n) { #ifndef SQLITE_OMIT_AUTOINIT - if( sqlite3_initialize() ) return 0; + if (sqlite3_initialize()) + return 0; #endif - return n<=0 ? 0 : sqlite3Malloc(n); + return n <= 0 ? 0 : sqlite3Malloc(n); } -SQLITE_API void *sqlite3_malloc64(sqlite3_uint64 n){ +SQLITE_API void* sqlite3_malloc64(sqlite3_uint64 n) { #ifndef SQLITE_OMIT_AUTOINIT - if( sqlite3_initialize() ) return 0; + if (sqlite3_initialize()) + return 0; #endif return sqlite3Malloc(n); } @@ -29108,77 +28610,78 @@ SQLITE_API void *sqlite3_malloc64(sqlite3_uint64 n){ ** TRUE if p is a lookaside memory allocation from db */ #ifndef SQLITE_OMIT_LOOKASIDE -static int isLookaside(sqlite3 *db, const void *p){ +static int isLookaside(sqlite3* db, const void* p) { return SQLITE_WITHIN(p, db->lookaside.pStart, db->lookaside.pEnd); } #else -#define isLookaside(A,B) 0 +#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) ); +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){ +static int lookasideMallocSize(sqlite3* db, const void* p) { #ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE - return plookaside.pMiddle ? db->lookaside.szTrue : LOOKASIDE_SMALL; + return p < db->lookaside.pMiddle ? db->lookaside.szTrue : LOOKASIDE_SMALL; #else return db->lookaside.szTrue; #endif } -SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3 *db, const void *p){ - assert( p!=0 ); +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)) ); + 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) ){ + 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) ); + 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) ); + 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) ); +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 ){ +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{ + } else { sqlite3GlobalConfig.m.xFree(p); } } @@ -29187,8 +28690,8 @@ SQLITE_API void sqlite3_free(void *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); +static SQLITE_NOINLINE void measureAllocationSize(sqlite3* db, void* p) { + *db->pnBytesFreed += sqlite3DbMallocSize(db, p); } /* @@ -29196,30 +28699,30 @@ static SQLITE_NOINLINE void measureAllocationSize(sqlite3 *db, void *p){ ** 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 ){ +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) ){ + if (((uptr)p) < (uptr)(db->lookaside.pEnd)) { #ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE - if( ((uptr)p)>=(uptr)(db->lookaside.pMiddle) ){ - LookasideSlot *pBuf = (LookasideSlot*)p; + if (((uptr)p) >= (uptr)(db->lookaside.pMiddle)) { + LookasideSlot* pBuf = (LookasideSlot*)p; #ifdef SQLITE_DEBUG - memset(p, 0xaa, LOOKASIDE_SMALL); /* Trash freed content */ + 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; + if (((uptr)p) >= (uptr)(db->lookaside.pStart)) { + LookasideSlot* pBuf = (LookasideSlot*)p; #ifdef SQLITE_DEBUG - memset(p, 0xaa, db->lookaside.szTrue); /* Trash freed content */ + memset(p, 0xaa, db->lookaside.szTrue); /* Trash freed content */ #endif pBuf->pNext = db->lookaside.pFree; db->lookaside.pFree = pBuf; @@ -29227,33 +28730,34 @@ SQLITE_PRIVATE void sqlite3DbFreeNN(sqlite3 *db, void *p){ } } } - assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); - assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); - assert( db!=0 || sqlite3MemdebugNoType(p, MEMTYPE_LOOKASIDE) ); + 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); +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){ +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 ){ + 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 ){ + if (nBytes == 0) { sqlite3_free(pOld); /* IMP: R-26507-47431 */ return 0; } - if( nBytes>=0x7fffff00 ){ + if (nBytes >= 0x7fffff00) { /* The 0x7ffff00 limit term is explained in comments on sqlite3Malloc() */ return 0; } @@ -29262,37 +28766,36 @@ SQLITE_PRIVATE void *sqlite3Realloc(void *pOld, u64 nBytes){ ** argument to xRealloc is always a value returned by a prior call to ** xRoundup. */ nNew = sqlite3GlobalConfig.m.xRoundup((int)nBytes); - if( nOld==nNew ){ + if (nOld == nNew) { pNew = pOld; - }else if( sqlite3GlobalConfig.bMemstat ){ + } 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 ){ + if (nDiff > 0 && (nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED)) >= mem0.alarmThreshold - nDiff) { sqlite3MallocAlarm(nDiff); - if( mem0.hardLimit>0 && nUsed >= mem0.hardLimit - 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 ){ + if (pNew == 0 && mem0.alarmThreshold > 0) { sqlite3MallocAlarm((int)nBytes); pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); } #endif - if( pNew ){ + if (pNew) { nNew = sqlite3MallocSize(pNew); - sqlite3StatusUp(SQLITE_STATUS_MEMORY_USED, nNew-nOld); + sqlite3StatusUp(SQLITE_STATUS_MEMORY_USED, nNew - nOld); } sqlite3_mutex_leave(mem0.mutex); - }else{ + } else { pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); } - assert( EIGHT_BYTE_ALIGNMENT(pNew) ); /* IMP: R-11148-40995 */ + assert(EIGHT_BYTE_ALIGNMENT(pNew)); /* IMP: R-11148-40995 */ return pNew; } @@ -29300,27 +28803,29 @@ SQLITE_PRIVATE void *sqlite3Realloc(void *pOld, u64 nBytes){ ** 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){ +SQLITE_API void* sqlite3_realloc(void* pOld, int n) { #ifndef SQLITE_OMIT_AUTOINIT - if( sqlite3_initialize() ) return 0; + if (sqlite3_initialize()) + return 0; #endif - if( n<0 ) n = 0; /* IMP: R-26507-47431 */ + if (n < 0) + n = 0; /* IMP: R-26507-47431 */ return sqlite3Realloc(pOld, n); } -SQLITE_API void *sqlite3_realloc64(void *pOld, sqlite3_uint64 n){ +SQLITE_API void* sqlite3_realloc64(void* pOld, sqlite3_uint64 n) { #ifndef SQLITE_OMIT_AUTOINIT - if( sqlite3_initialize() ) return 0; + 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 ){ +SQLITE_PRIVATE void* sqlite3MallocZero(u64 n) { + void* p = sqlite3Malloc(n); + if (p) { memset(p, 0, (size_t)n); } return p; @@ -29330,25 +28835,25 @@ SQLITE_PRIVATE void *sqlite3MallocZero(u64 n){ ** 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 ); +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); + 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 ); +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); + if (!p) + sqlite3OomFault(db); + sqlite3MemdebugSetType(p, (db->lookaside.bDisable == 0) ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP); return p; } @@ -29374,56 +28879,57 @@ static SQLITE_NOINLINE void *dbMallocRawFinish(sqlite3 *db, u64 n){ ** 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); +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){ +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 ){ + 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 ){ + } 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 ){ + 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 ){ + } 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 ){ + 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 ){ + } else if ((pBuf = db->lookaside.pInit) != 0) { db->lookaside.pInit = pBuf->pNext; db->lookaside.anStat[0]++; return (void*)pBuf; - }else{ + } else { db->lookaside.anStat[2]++; } #else - assert( db!=0 ); - assert( sqlite3_mutex_held(db->mutex) ); - assert( db->pnBytesFreed==0 ); - if( db->mallocFailed ){ + assert(db != 0); + assert(sqlite3_mutex_held(db->mutex)); + assert(db->pnBytesFreed == 0); + if (db->mallocFailed) { return 0; } #endif @@ -29431,49 +28937,51 @@ SQLITE_PRIVATE void *sqlite3DbMallocRawNN(sqlite3 *db, u64 n){ } /* Forward declaration */ -static SQLITE_NOINLINE void *dbReallocFinish(sqlite3 *db, void *p, u64 n); +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 ){ +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 + 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; + 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) ){ +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 ){ + 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)) ); + } 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 ){ + if (!pNew) { sqlite3OomFault(db); } - sqlite3MemdebugSetType(pNew, - (db->lookaside.bDisable==0 ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP)); + sqlite3MemdebugSetType(pNew, (db->lookaside.bDisable == 0 ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP)); } } return pNew; @@ -29483,10 +28991,10 @@ static SQLITE_NOINLINE void *dbReallocFinish(sqlite3 *db, void *p, u64 n){ ** 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; +SQLITE_PRIVATE void* sqlite3DbReallocOrFree(sqlite3* db, void* p, u64 n) { + void* pNew; pNew = sqlite3DbRealloc(db, p, n); - if( !pNew ){ + if (!pNew) { sqlite3DbFree(db, p); } return pNew; @@ -29499,26 +29007,26 @@ SQLITE_PRIVATE void *sqlite3DbReallocOrFree(sqlite3 *db, void *p, u64 n){ ** 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; +SQLITE_PRIVATE char* sqlite3DbStrDup(sqlite3* db, const char* z) { + char* zNew; size_t n; - if( z==0 ){ + if (z == 0) { return 0; } n = strlen(z) + 1; zNew = sqlite3DbMallocRaw(db, n); - if( zNew ){ + 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 ){ +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; } @@ -29530,19 +29038,21 @@ SQLITE_PRIVATE char *sqlite3DbStrNDup(sqlite3 *db, const char *z, u64 n){ ** 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){ +SQLITE_PRIVATE char* sqlite3DbSpanDup(sqlite3* db, const char* zStart, const char* zEnd) { int n; - while( sqlite3Isspace(zStart[0]) ) zStart++; + while (sqlite3Isspace(zStart[0])) + zStart++; n = (int)(zEnd - zStart); - while( ALWAYS(n>0) && sqlite3Isspace(zStart[n-1]) ) n--; + 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); +SQLITE_PRIVATE void sqlite3SetString(char** pz, sqlite3* db, const char* zNew) { + char* z = sqlite3DbStrDup(db, zNew); sqlite3DbFree(db, *pz); *pz = z; } @@ -29560,18 +29070,18 @@ SQLITE_PRIVATE void sqlite3SetString(char **pz, sqlite3 *db, const char *zNew){ ** 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 ){ +SQLITE_PRIVATE void* sqlite3OomFault(sqlite3* db) { + if (db->mallocFailed == 0 && db->bBenignMalloc == 0) { db->mallocFailed = 1; - if( db->nVdbeExec>0 ){ + if (db->nVdbeExec > 0) { AtomicStore(&db->u1.isInterrupted, 1); } DisableLookaside; - if( db->pParse ){ - Parse *pParse; + if (db->pParse) { + Parse* pParse; sqlite3ErrorMsg(db->pParse, "out of memory"); db->pParse->rc = SQLITE_NOMEM_BKPT; - for(pParse=db->pParse->pOuterParse; pParse; pParse = pParse->pOuterParse){ + for (pParse = db->pParse->pOuterParse; pParse; pParse = pParse->pOuterParse) { pParse->nErr++; pParse->rc = SQLITE_NOMEM; } @@ -29587,11 +29097,11 @@ SQLITE_PRIVATE void *sqlite3OomFault(sqlite3 *db){ ** The memory allocator is not restarted if there are running ** VDBEs. */ -SQLITE_PRIVATE void sqlite3OomClear(sqlite3 *db){ - if( db->mallocFailed && db->nVdbeExec==0 ){ +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 ); + assert(db->lookaside.bDisable > 0); EnableLookaside; } } @@ -29599,8 +29109,8 @@ SQLITE_PRIVATE void sqlite3OomClear(sqlite3 *db){ /* ** 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 ){ +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; @@ -29620,14 +29130,14 @@ static SQLITE_NOINLINE int apiHandleError(sqlite3 *db, int rc){ ** 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){ +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 ){ + assert(db != 0); + assert(sqlite3_mutex_held(db->mutex)); + if (db->mallocFailed || rc) { return apiHandleError(db, rc); } return rc & db->errMask; @@ -29652,28 +29162,28 @@ SQLITE_PRIVATE int sqlite3ApiExit(sqlite3* db, int rc){ ** 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 */ +#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 '', +#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 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 */ +#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. @@ -29684,21 +29194,20 @@ 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 */ +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 */ - +#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 @@ -29707,33 +29216,33 @@ typedef struct et_info { /* Information about each format field */ 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 }, + {'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 }, + {'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: @@ -29744,8 +29253,7 @@ static const et_info fmtinfo[] = { /* 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, + 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, }; /* @@ -29766,15 +29274,16 @@ static const double arRound[] = { ** 16 (the number of significant digits in a 64-bit float) '0' is ** always returned. */ -static char et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){ +static char et_getdigit(LONGDOUBLE_TYPE* val, int* cnt) { int digit; LONGDOUBLE_TYPE d; - if( (*cnt)<=0 ) return '0'; + if ((*cnt) <= 0) + return '0'; (*cnt)--; digit = (int)*val; d = digit; digit += '0'; - *val = (*val - d)*10.0; + *val = (*val - d) * 10.0; return (char)digit; } #endif /* SQLITE_OMIT_FLOATING_POINT */ @@ -29782,26 +29291,31 @@ static char et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){ /* ** Set the StrAccum object to an error mode. */ -SQLITE_PRIVATE void sqlite3StrAccumSetError(StrAccum *p, u8 eError){ - assert( eError==SQLITE_NOMEM || eError==SQLITE_TOOBIG ); +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); + 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; +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; +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; +static char* getTextArg(PrintfArguments* p) { + if (p->nArg <= p->nUsed) + return 0; return (char*)sqlite3_value_text(p->apArg[p->nUsed++]); } @@ -29814,15 +29328,16 @@ static char *getTextArg(PrintfArguments *p){ ** 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 ){ +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 ){ + if (z == 0) { sqlite3StrAccumSetError(pAccum, SQLITE_NOMEM); } return z; @@ -29833,27 +29348,26 @@ static char *printfTempBuf(sqlite3_str *pAccum, sqlite3_int64 n){ ** SQLITE_PRINT_BUF_SIZE to be something smaller, if desired. */ #ifndef SQLITE_PRINT_BUF_SIZE -# define SQLITE_PRINT_BUF_SIZE 70 +#define SQLITE_PRINT_BUF_SIZE 70 #endif -#define etBUFSIZE SQLITE_PRINT_BUF_SIZE /* Size of the output buffer */ +#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 +#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 */ -){ +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 */ + 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 */ @@ -29871,110 +29385,135 @@ SQLITE_API void sqlite3_str_vappendf( 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 */ + 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 */ + 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 */ + 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 */ + 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 ); + assert(pAccum->nChar > 0 || (pAccum->printfFlags & SQLITE_PRINTF_MALLOCED) == 0); bufpt = 0; - if( (pAccum->printfFlags & SQLITE_PRINTF_SQLFUNC)!=0 ){ + if ((pAccum->printfFlags & SQLITE_PRINTF_SQLFUNC) != 0) { pArgList = va_arg(ap, PrintfArguments*); bArgList = 1; - }else{ + } else { bArgList = 0; } - for(; (c=(*fmt))!=0; ++fmt){ - if( c!='%' ){ - bufpt = (char *)fmt; + for (; (c = (*fmt)) != 0; ++fmt) { + if (c != '%') { + bufpt = (char*)fmt; #if HAVE_STRCHRNUL fmt = strchrnul(fmt, '%'); #else - do{ fmt++; }while( *fmt && *fmt != '%' ); + do { + fmt++; + } while (*fmt && *fmt != '%'); #endif sqlite3_str_append(pAccum, bufpt, (int)(fmt - bufpt)); - if( *fmt==0 ) break; + if (*fmt == 0) + break; } - if( (c=(*++fmt))==0 ){ + 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; + 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; + 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' ){ + 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': { + 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'; + while ((c = *++fmt) >= '0' && c <= '9') { + wx = wx * 10 + c - '0'; } - testcase( wx>0x7fffffff ); + testcase(wx > 0x7fffffff); width = wx & 0x7fffffff; #ifdef SQLITE_PRINTF_PRECISION_LIMIT - if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ + if (width > SQLITE_PRINTF_PRECISION_LIMIT) { width = SQLITE_PRINTF_PRECISION_LIMIT; } #endif - if( c!='.' && c!='l' ){ + if (c != '.' && c != 'l') { done = 1; - }else{ + } else { fmt--; } break; } case '*': { - if( bArgList ){ + if (bArgList) { width = (int)getIntArg(pArgList); - }else{ - width = va_arg(ap,int); + } else { + width = va_arg(ap, int); } - if( width<0 ){ + if (width < 0) { flag_leftjustify = 1; width = width >= -2147483647 ? -width : 0; } #ifdef SQLITE_PRINTF_PRECISION_LIMIT - if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ + if (width > SQLITE_PRINTF_PRECISION_LIMIT) { width = SQLITE_PRINTF_PRECISION_LIMIT; } #endif - if( (c = fmt[1])!='.' && c!='l' ){ + if ((c = fmt[1]) != '.' && c != 'l') { c = *++fmt; done = 1; } @@ -29982,45 +29521,45 @@ SQLITE_API void sqlite3_str_vappendf( } case '.': { c = *++fmt; - if( c=='*' ){ - if( bArgList ){ + if (c == '*') { + if (bArgList) { precision = (int)getIntArg(pArgList); - }else{ - precision = va_arg(ap,int); + } else { + precision = va_arg(ap, int); } - if( precision<0 ){ + if (precision < 0) { precision = precision >= -2147483647 ? -precision : -1; } c = *++fmt; - }else{ + } else { unsigned px = 0; - while( c>='0' && c<='9' ){ - px = px*10 + c - '0'; + while (c >= '0' && c <= '9') { + px = px * 10 + c - '0'; c = *++fmt; } - testcase( px>0x7fffffff ); + testcase(px > 0x7fffffff); precision = px & 0x7fffffff; } #ifdef SQLITE_PRINTF_PRECISION_LIMIT - if( precision>SQLITE_PRINTF_PRECISION_LIMIT ){ + if (precision > SQLITE_PRINTF_PRECISION_LIMIT) { precision = SQLITE_PRINTF_PRECISION_LIMIT; } #endif - if( c=='l' ){ + if (c == 'l') { --fmt; - }else{ + } else { done = 1; } break; } } - }while( !done && (c=(*++fmt))!=0 ); + } while (!done && (c = (*++fmt)) != 0); /* Fetch the info entry for the field */ infop = &fmtinfo[0]; xtype = etINVALID; - for(idx=0; idxtype; break; @@ -30044,173 +29583,195 @@ SQLITE_API void sqlite3_str_vappendf( ** xtype The class of the conversion. ** infop Pointer to the appropriate info struct. */ - assert( width>=0 ); - assert( precision>=(-1) ); - switch( xtype ){ + 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: + 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 ){ + /* no break */ deliberate_fall_through case etDECIMAL: + if (infop->flags & FLAG_SIGNED) { i64 v; - if( bArgList ){ + 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 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); + } else { + v = va_arg(ap, int); } - if( v<0 ){ - testcase( v==SMALLEST_INT64 ); - testcase( v==(-1) ); + if (v < 0) { + testcase(v == SMALLEST_INT64); + testcase(v == (-1)); longvalue = ~v; longvalue++; prefix = '-'; - }else{ + } else { longvalue = v; prefix = flag_prefix; } - }else{ - if( bArgList ){ + } 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 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); + } else { + longvalue = va_arg(ap, unsigned int); } prefix = 0; } - if( longvalue==0 ) flag_alternateform = 0; - if( flag_zeropad && precision=4 || (longvalue/10)%10==1 ){ + if (x >= 4 || (longvalue / 10) % 10 == 1) { x = 0; } - *(--bufpt) = zOrd[x*2+1]; - *(--bufpt) = zOrd[x*2]; + *(--bufpt) = zOrd[x * 2 + 1]; + *(--bufpt) = zOrd[x * 2]; } { - const char *cset = &aDigits[infop->charset]; + 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 */ + 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; + 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]; + for (idx = 0; nn > 0; idx++) { + bufpt[idx] = bufpt[idx + nn]; ix--; - if( ix==0 ){ + 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; + 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; + for (; (x = (*pre)) != 0; pre++) + *(--bufpt) = x; } - length = (int)(&zOut[nOut-1]-bufpt); + length = (int)(&zOut[nOut - 1] - bufpt); break; case etFLOAT: case etEXP: case etGENERIC: - if( bArgList ){ + if (bArgList) { realvalue = getDoubleArg(pArgList); - }else{ - realvalue = va_arg(ap,double); + } else { + realvalue = va_arg(ap, double); } #ifdef SQLITE_OMIT_FLOATING_POINT length = 0; #else - if( precision<0 ) precision = 6; /* Set default precision */ + if (precision < 0) + precision = 6; /* Set default precision */ #ifdef SQLITE_FP_PRECISION_LIMIT - if( precision>SQLITE_FP_PRECISION_LIMIT ){ + if (precision > SQLITE_FP_PRECISION_LIMIT) { precision = SQLITE_FP_PRECISION_LIMIT; } #endif - if( realvalue<0.0 ){ + if (realvalue < 0.0) { realvalue = -realvalue; prefix = '-'; - }else{ + } else { prefix = flag_prefix; } - if( xtype==etGENERIC && precision>0 ) precision--; - testcase( precision>0xfff ); + 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 ){ + 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; + 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) ){ + if (sqlite3IsNaN((double)realvalue)) { bufpt = "NaN"; length = 3; break; } - if( realvalue>0.0 ){ + 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++; } + 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 ){ + 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); + memcpy(buf + (prefix != 0), "Inf", 4); + length = 3 + (prefix != 0); break; } } @@ -30219,115 +29780,122 @@ SQLITE_API void sqlite3_str_vappendf( ** If the field type is etGENERIC, then convert to either etEXP ** or etFLOAT, as appropriate. */ - if( xtype!=etFLOAT ){ + if (xtype != etFLOAT) { realvalue += rounder; - if( realvalue>=10.0 ){ realvalue *= 0.1; exp++; } + if (realvalue >= 10.0) { + realvalue *= 0.1; + exp++; + } } - if( xtype==etGENERIC ){ + if (xtype == etGENERIC) { flag_rtz = !flag_alternateform; - if( exp<-4 || exp>precision ){ + if (exp < -4 || exp > precision) { xtype = etEXP; - }else{ + } else { precision = precision - exp; xtype = etFLOAT; } - }else{ + } else { flag_rtz = flag_altform2; } - if( xtype==etEXP ){ + if (xtype == etEXP) { e2 = 0; - }else{ + } else { e2 = exp; } { - i64 szBufNeeded; /* Size of a temporary buffer needed */ - szBufNeeded = MAX(e2,0)+(i64)precision+(i64)width+15; - if( szBufNeeded > etBUFSIZE ){ + 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; + if (bufpt == 0) + return; } } zOut = bufpt; - nsd = 16 + flag_altform2*10; - flag_dp = (precision>0 ?1:0) | flag_alternateform | flag_altform2; + nsd = 16 + flag_altform2 * 10; + flag_dp = (precision > 0 ? 1 : 0) | flag_alternateform | flag_altform2; /* The sign in front of the number */ - if( prefix ){ + if (prefix) { *(bufpt++) = prefix; } /* Digits prior to the decimal point */ - if( e2<0 ){ + if (e2 < 0) { *(bufpt++) = '0'; - }else{ - for(; e2>=0; e2--){ - *(bufpt++) = et_getdigit(&realvalue,&nsd); + } else { + for (; e2 >= 0; e2--) { + *(bufpt++) = et_getdigit(&realvalue, &nsd); } } /* The decimal point */ - if( flag_dp ){ + 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 ); + 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); + 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 ){ + if (flag_rtz && flag_dp) { + while (bufpt[-1] == '0') + *(--bufpt) = 0; + assert(bufpt > zOut); + if (bufpt[-1] == '.') { + if (flag_altform2) { *(bufpt++) = '0'; - }else{ + } else { *(--bufpt) = 0; } } } /* Add the "eNNN" suffix */ - if( xtype==etEXP ){ + if (xtype == etEXP) { *(bufpt++) = aDigits[infop->charset]; - if( exp<0 ){ - *(bufpt++) = '-'; exp = -exp; - }else{ + if (exp < 0) { + *(bufpt++) = '-'; + exp = -exp; + } else { *(bufpt++) = '+'; } - if( exp>=100 ){ - *(bufpt++) = (char)((exp/100)+'0'); /* 100's digit */ + 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++) = (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); + 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){ + if (flag_zeropad && !flag_leftjustify && length < width) { int i; int nPad = width - length; - for(i=width; i>=nPad; i--){ - bufpt[i] = bufpt[i-nPad]; + for (i = width; i >= nPad; i--) { + bufpt[i] = bufpt[i - nPad]; } - i = prefix!=0; - while( nPad-- ) bufpt[i++] = '0'; + 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; + if (!bArgList) { + *(va_arg(ap, int*)) = pAccum->nChar; } length = width = 0; break; @@ -30337,48 +29905,48 @@ SQLITE_API void sqlite3_str_vappendf( length = 1; break; case etCHARX: - if( bArgList ){ + if (bArgList) { bufpt = getTextArg(pArgList); length = 1; - if( bufpt ){ + if (bufpt) { buf[0] = c = *(bufpt++); - if( (c&0xc0)==0xc0 ){ - while( length<4 && (bufpt[0]&0xc0)==0x80 ){ + if ((c & 0xc0) == 0xc0) { + while (length < 4 && (bufpt[0] & 0xc0) == 0x80) { buf[length++] = *(bufpt++); } } - }else{ + } else { buf[0] = 0; } - }else{ - unsigned int ch = va_arg(ap,unsigned int); - if( ch<0x00080 ){ + } 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); + } 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); + } 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); + } 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, ' '); + if (precision > 1) { + width -= precision - 1; + if (width > 1 && !flag_leftjustify) { + sqlite3_str_appendchar(pAccum, width - 1, ' '); width = 0; } - while( precision-- > 1 ){ + while (precision-- > 1) { sqlite3_str_append(pAccum, buf, length); } } @@ -30387,25 +29955,20 @@ SQLITE_API void sqlite3_str_vappendf( goto adjust_width_for_utf8; case etSTRING: case etDYNSTRING: - if( bArgList ){ + if (bArgList) { bufpt = getTextArg(pArgList); xtype = etSTRING; - }else{ - bufpt = va_arg(ap,char*); + } else { + bufpt = va_arg(ap, char*); } - if( bufpt==0 ){ + if (bufpt == 0) { bufpt = ""; - }else if( xtype==etDYNSTRING ){ - if( pAccum->nChar==0 - && pAccum->mxAlloc - && width==0 - && precision<0 - && pAccum->accError==0 - ){ + } 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 ); + assert((pAccum->printfFlags & SQLITE_PRINTF_MALLOCED) == 0); pAccum->zText = bufpt; pAccum->nAlloc = sqlite3DbMallocSize(pAccum->db, bufpt); pAccum->nChar = 0x7fffffff & (int)strlen(bufpt); @@ -30415,90 +29978,102 @@ SQLITE_API void sqlite3_str_vappendf( } zExtra = bufpt; } - if( precision>=0 ){ - if( flag_altform2 ){ + 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] ){ + 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 ){ + if (flag_altform2 && width > 0) { /* Adjust width to account for extra bytes in UTF-8 characters */ int ii = length - 1; - while( ii>=0 ) if( (bufpt[ii--] & 0xc0)==0x80 ) width++; + 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 */ + 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; + char q = ((xtype == etSQLESCAPE3) ? '"' : '\''); /* Quote character */ + char* escarg; - if( bArgList ){ + if (bArgList) { escarg = getTextArg(pArgList); - }else{ - escarg = va_arg(ap,char*); + } else { + escarg = va_arg(ap, char*); } - isnull = escarg==0; - if( isnull ) escarg = (xtype==etSQLESCAPE2 ? "NULL" : "(NULL)"); + 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++; } + 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; + needQuote = !isnull && xtype == etSQLESCAPE2; n += i + 3; - if( n>etBUFSIZE ){ + if (n > etBUFSIZE) { bufpt = zExtra = printfTempBuf(pAccum, n); - if( bufpt==0 ) return; - }else{ + if (bufpt == 0) + return; + } else { bufpt = buf; } j = 0; - if( needQuote ) bufpt[j++] = q; + if (needQuote) + bufpt[j++] = q; k = i; - for(i=0; iprintfFlags & SQLITE_PRINTF_INTERNAL)==0 ) return; - if( flag_alternateform ){ + if ((pAccum->printfFlags & 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)) ){ + 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{ + } else { /* %T means a Token pointer */ - Token *pToken = va_arg(ap, Token*); - assert( bArgList==0 ); - if( pToken && pToken->n ){ + 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); } @@ -30507,26 +30082,27 @@ SQLITE_API void sqlite3_str_vappendf( break; } case etSRCITEM: { - SrcItem *pItem; - if( (pAccum->printfFlags & SQLITE_PRINTF_INTERNAL)==0 ) return; + SrcItem* pItem; + if ((pAccum->printfFlags & SQLITE_PRINTF_INTERNAL) == 0) + return; pItem = va_arg(ap, SrcItem*); - assert( bArgList==0 ); - if( pItem->zAlias && !flag_altform2 ){ + assert(bArgList == 0); + if (pItem->zAlias && !flag_altform2) { sqlite3_str_appendall(pAccum, pItem->zAlias); - }else if( pItem->zName ){ - if( pItem->zDatabase ){ + } 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 ){ + } else if (pItem->zAlias) { sqlite3_str_appendall(pAccum, pItem->zAlias); - }else{ - Select *pSel = pItem->pSelect; - assert( pSel!=0 ); - if( pSel->selFlags & SF_NestedFrom ){ + } else { + Select* pSel = pItem->pSelect; + assert(pSel != 0); + if (pSel->selFlags & SF_NestedFrom) { sqlite3_str_appendf(pAccum, "(join-%u)", pSel->selId); - }else{ + } else { sqlite3_str_appendf(pAccum, "(subquery-%u)", pSel->selId); } } @@ -30534,10 +30110,10 @@ SQLITE_API void sqlite3_str_vappendf( break; } default: { - assert( xtype==etINVALID ); + assert(xtype == etINVALID); return; } - }/* End switch over the format type */ + } /* 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 @@ -30547,42 +30123,47 @@ SQLITE_API void sqlite3_str_vappendf( ** then the values have been translated prior to reaching this point. */ width -= length; - if( width>0 ){ - if( !flag_leftjustify ) sqlite3_str_appendchar(pAccum, width, ' '); + 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{ + if (flag_leftjustify) + sqlite3_str_appendchar(pAccum, width, ' '); + } else { sqlite3_str_append(pAccum, bufpt, length); } - if( zExtra ){ + if (zExtra) { sqlite3DbFree(pAccum->db, zExtra); zExtra = 0; } - }/* End for loop over the format string */ + } /* 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; +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; + 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 (SQLITE_WITHIN(z, zText, zEnd)) { + db->errByteOffset = (int)(z - zText); } } @@ -30590,13 +30171,12 @@ SQLITE_PRIVATE void sqlite3RecordErrorByteOffset(sqlite3 *db, const char *z){ ** 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) - ){ +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; + if (pExpr == 0) + return; db->errByteOffset = pExpr->w.iOfst; } @@ -30607,45 +30187,46 @@ SQLITE_PRIVATE void sqlite3RecordErrorOffsetOfExpr(sqlite3 *db, const Expr *pExp ** 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); +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 ){ + if (p->mxAlloc == 0) { sqlite3StrAccumSetError(p, SQLITE_TOOBIG); return p->nAlloc - p->nChar - 1; - }else{ - char *zOld = isMalloced(p) ? p->zText : 0; + } else { + char* zOld = isMalloced(p) ? p->zText : 0; i64 szNew = p->nChar; szNew += (sqlite3_int64)N + 1; - if( szNew+p->nChar<=p->mxAlloc ){ + 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 ){ + if (szNew > p->mxAlloc) { sqlite3_str_reset(p); sqlite3StrAccumSetError(p, SQLITE_TOOBIG); return 0; - }else{ + } else { p->nAlloc = (int)szNew; } - if( p->db ){ + if (p->db) { zNew = sqlite3DbRealloc(p->db, zOld, p->nAlloc); - }else{ + } 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); + 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{ + } else { sqlite3_str_reset(p); sqlite3StrAccumSetError(p, SQLITE_NOMEM); return 0; @@ -30657,12 +30238,13 @@ SQLITE_PRIVATE int sqlite3StrAccumEnlarge(StrAccum *p, int 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 ){ +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; + while ((N--) > 0) + p->zText[p->nChar++] = c; } /* @@ -30673,9 +30255,9 @@ SQLITE_API void sqlite3_str_appendchar(sqlite3_str *p, int N, char c){ ** 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){ +static void SQLITE_NOINLINE enlargeAndAppend(StrAccum* p, const char* z, int N) { N = sqlite3StrAccumEnlarge(p, N); - if( N>0 ){ + if (N > 0) { memcpy(&p->zText[p->nChar], z, N); p->nChar += N; } @@ -30685,50 +30267,49 @@ static void SQLITE_NOINLINE enlargeAndAppend(StrAccum *p, const char *z, int 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 ); +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); + 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){ +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); +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{ + } else { sqlite3StrAccumSetError(p, SQLITE_NOMEM); } p->zText = zText; return zText; } -SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum *p){ - if( p->zText ){ +SQLITE_PRIVATE char* sqlite3StrAccumFinish(StrAccum* p) { + if (p->zText) { p->zText[p->nChar] = 0; - if( p->mxAlloc>0 && !isMalloced(p) ){ + if (p->mxAlloc > 0 && !isMalloced(p)) { return strAccumFinishRealloc(p); } } @@ -30739,13 +30320,13 @@ SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum *p){ ** 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 ){ +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) ){ + } else if (isMalloced(p)) { sqlite3_result_text(pCtx, p->zText, p->nChar, SQLITE_DYNAMIC); - }else{ + } else { sqlite3_result_text(pCtx, "", 0, SQLITE_STATIC); sqlite3_str_reset(p); } @@ -30757,36 +30338,35 @@ SQLITE_PRIVATE void sqlite3ResultStrAccum(sqlite3_context *pCtx, StrAccum *p){ ** 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 -}; +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 ){ + */ +SQLITE_API char* sqlite3_str_finish(sqlite3_str* p) { + char* z; + if (p != 0 && p != &sqlite3OomStr) { z = sqlite3StrAccumFinish(p); sqlite3_free(p); - }else{ + } else { z = 0; } return z; } /* Return any error code associated with p */ -SQLITE_API int sqlite3_str_errcode(sqlite3_str *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){ +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; +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; } @@ -30794,8 +30374,8 @@ SQLITE_API char *sqlite3_str_value(sqlite3_str *p){ /* ** Reset an StrAccum string. Reclaim all malloced memory. */ -SQLITE_API void sqlite3_str_reset(StrAccum *p){ - if( isMalloced(p) ){ +SQLITE_API void sqlite3_str_reset(StrAccum* p) { + if (isMalloced(p)) { sqlite3DbFree(p->db, p->zText); p->printfFlags &= ~SQLITE_PRINTF_MALLOCED; } @@ -30818,7 +30398,7 @@ SQLITE_API void sqlite3_str_reset(StrAccum *p){ ** 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){ +SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum* p, sqlite3* db, char* zBase, int n, int mx) { p->zText = zBase; p->db = db; p->nAlloc = n; @@ -30829,12 +30409,11 @@ SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum *p, sqlite3 *db, char *zBase, i } /* 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{ +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; @@ -30844,17 +30423,16 @@ SQLITE_API sqlite3_str *sqlite3_str_new(sqlite3 *db){ ** 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; +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]); + 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 ){ + if (acc.accError == SQLITE_NOMEM) { sqlite3OomFault(db); } return z; @@ -30864,9 +30442,9 @@ SQLITE_PRIVATE char *sqlite3VMPrintf(sqlite3 *db, const char *zFormat, va_list a ** Print into memory obtained from sqliteMalloc(). Use the internal ** %-conversion extensions. */ -SQLITE_PRIVATE char *sqlite3MPrintf(sqlite3 *db, const char *zFormat, ...){ +SQLITE_PRIVATE char* sqlite3MPrintf(sqlite3* db, const char* zFormat, ...) { va_list ap; - char *z; + char* z; va_start(ap, zFormat); z = sqlite3VMPrintf(db, zFormat, ap); va_end(ap); @@ -30877,19 +30455,20 @@ SQLITE_PRIVATE char *sqlite3MPrintf(sqlite3 *db, const char *zFormat, ...){ ** 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; +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 ){ + if (zFormat == 0) { (void)SQLITE_MISUSE_BKPT; return 0; } #endif #ifndef SQLITE_OMIT_AUTOINIT - if( sqlite3_initialize() ) return 0; + if (sqlite3_initialize()) + return 0; #endif sqlite3StrAccumInit(&acc, 0, zBase, sizeof(zBase), SQLITE_MAX_LENGTH); sqlite3_str_vappendf(&acc, zFormat, ap); @@ -30901,11 +30480,12 @@ SQLITE_API char *sqlite3_vmprintf(const char *zFormat, va_list ap){ ** Print into memory obtained from sqlite3_malloc()(). Omit the internal ** %-conversion extensions. */ -SQLITE_API char *sqlite3_mprintf(const char *zFormat, ...){ +SQLITE_API char* sqlite3_mprintf(const char* zFormat, ...) { va_list ap; - char *z; + char* z; #ifndef SQLITE_OMIT_AUTOINIT - if( sqlite3_initialize() ) return 0; + if (sqlite3_initialize()) + return 0; #endif va_start(ap, zFormat); z = sqlite3_vmprintf(zFormat, ap); @@ -30926,13 +30506,15 @@ SQLITE_API char *sqlite3_mprintf(const char *zFormat, ...){ ** ** sqlite3_vsnprintf() is the varargs version. */ -SQLITE_API char *sqlite3_vsnprintf(int n, char *zBuf, const char *zFormat, va_list ap){ +SQLITE_API char* sqlite3_vsnprintf(int n, char* zBuf, const char* zFormat, va_list ap) { StrAccum acc; - if( n<=0 ) return zBuf; + if (n <= 0) + return zBuf; #ifdef SQLITE_ENABLE_API_ARMOR - if( zBuf==0 || zFormat==0 ) { + if (zBuf == 0 || zFormat == 0) { (void)SQLITE_MISUSE_BKPT; - if( zBuf ) zBuf[0] = 0; + if (zBuf) + zBuf[0] = 0; return zBuf; } #endif @@ -30941,10 +30523,10 @@ SQLITE_API char *sqlite3_vsnprintf(int n, char *zBuf, const char *zFormat, va_li zBuf[acc.nChar] = 0; return zBuf; } -SQLITE_API char *sqlite3_snprintf(int n, char *zBuf, const char *zFormat, ...){ - char *z; +SQLITE_API char* sqlite3_snprintf(int n, char* zBuf, const char* zFormat, ...) { + char* z; va_list ap; - va_start(ap,zFormat); + va_start(ap, zFormat); z = sqlite3_vsnprintf(n, zBuf, zFormat, ap); va_end(ap); return z; @@ -30964,22 +30546,21 @@ SQLITE_API char *sqlite3_snprintf(int n, char *zBuf, const char *zFormat, ...){ ** 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 */ +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)); + 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 ){ +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); @@ -30992,35 +30573,34 @@ SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...){ ** 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, ...){ +SQLITE_PRIVATE void sqlite3DebugPrintf(const char* zFormat, ...) { va_list ap; StrAccum acc; - char zBuf[SQLITE_PRINT_BUF_SIZE*10]; + char zBuf[SQLITE_PRINT_BUF_SIZE * 10]; sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); - va_start(ap,zFormat); + 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); + extern void SQLITE_OS_TRACE_PROC(const char* zBuf, int nBuf); SQLITE_OS_TRACE_PROC(zBuf, sizeof(zBuf)); } #else - fprintf(stdout,"%s", zBuf); + 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, ...){ +SQLITE_API void sqlite3_str_appendf(StrAccum* p, const char* zFormat, ...) { va_list ap; - va_start(ap,zFormat); + va_start(ap, zFormat); sqlite3_str_vappendf(p, zFormat, ap); va_end(ap); } @@ -31053,27 +30633,30 @@ SQLITE_API void sqlite3_str_appendf(StrAccum *p, const char *zFormat, ...){ ** 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; +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{ + } else { p->iLevel++; } - assert( moreToFollow==0 || moreToFollow==1 ); - if( p->iLevel<(int)sizeof(p->bLine) ) p->bLine[p->iLevel] = moreToFollow; + 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; +static void sqlite3TreeViewPop(TreeView** pp) { + TreeView* p = *pp; + if (p == 0) + return; p->iLevel--; - if( p->iLevel<0 ){ + if (p->iLevel < 0) { sqlite3_free(p); *pp = 0; } @@ -31083,34 +30666,34 @@ static void sqlite3TreeViewPop(TreeView **pp){ ** 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, ...){ +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++){ + if (p) { + for (i = 0; i < p->iLevel && 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 ){ + if (zFormat != 0) { va_start(ap, zFormat); sqlite3_str_vappendf(&acc, zFormat, ap); va_end(ap); - assert( acc.nChar>0 || acc.accError ); + assert(acc.nChar > 0 || acc.accError); sqlite3_str_append(&acc, "\n", 1); } sqlite3StrAccumFinish(&acc); - fprintf(stdout,"%s", zBuf); + 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){ +static void sqlite3TreeViewItem(TreeView* p, const char* zLabel, u8 moreFollows) { sqlite3TreeViewPush(&p, moreFollows); sqlite3TreeViewLine(p, "%s", zLabel); } @@ -31118,43 +30701,54 @@ static void sqlite3TreeViewItem(TreeView *p, const char *zLabel,u8 moreFollows){ /* ** Show a list of Column objects in tree format. */ -SQLITE_PRIVATE void sqlite3TreeViewColumnList( - TreeView *pView, - const Column *aCol, - int nCol, - u8 moreToFollow -){ +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{ + if (pWith == 0) + return; + if (pWith->nCte == 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 ){ + if (pWith->nCte > 0) { sqlite3TreeViewPush(&pView, moreToFollow); - for(i=0; inCte; i++){ + for (i = 0; i < pWith->nCte; i++) { StrAccum x; char zLine[1000]; - const struct Cte *pCte = &pWith->a[i]; + 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 ){ + if (pCte->pCols && pCte->pCols->nExpr > 0) { char cSep = '('; int j; - for(j=0; jpCols->nExpr; j++){ + for (j = 0; j < pCte->pCols->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->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); + if (pCte->pUse) { + sqlite3_str_appendf(&x, " (pUse=0x%p, nUse=%d)", pCte->pUse, pCte->pUse->nUse); } sqlite3StrAccumFinish(&x); - sqlite3TreeViewItem(pView, zLine, inCte-1); + sqlite3TreeViewItem(pView, zLine, i < pWith->nCte - 1); sqlite3TreeViewSelect(pView, pCte->pSelect, 0); sqlite3TreeViewPop(&pView); } @@ -31211,60 +30805,63 @@ SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 m /* ** Generate a human-readable description of a SrcList object. */ -SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc){ +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]; + if (pSrc == 0) + return; + for (i = 0; i < pSrc->nSrc; 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->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) ){ + 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 ){ + } else if (pItem->fg.jointype & JT_LEFT) { sqlite3_str_appendf(&x, " LEFT-JOIN"); - }else if( pItem->fg.jointype & JT_RIGHT ){ + } else if (pItem->fg.jointype & JT_RIGHT) { sqlite3_str_appendf(&x, " RIGHT-JOIN"); - }else if( pItem->fg.jointype & JT_CROSS ){ + } else if (pItem->fg.jointype & JT_CROSS) { sqlite3_str_appendf(&x, " CROSS-JOIN"); } - if( pItem->fg.jointype & JT_LTORJ ){ + if (pItem->fg.jointype & JT_LTORJ) { sqlite3_str_appendf(&x, " LTORJ"); } - if( pItem->fg.fromDDL ){ + if (pItem->fg.fromDDL) { sqlite3_str_appendf(&x, " DDL"); } - if( pItem->fg.isCte ){ + 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) ){ + if (pItem->fg.isOn || (pItem->fg.isUsing == 0 && pItem->u3.pOn != 0)) { sqlite3_str_appendf(&x, " ON"); } sqlite3StrAccumFinish(&x); - sqlite3TreeViewItem(pView, zLine, inSrc-1); + sqlite3TreeViewItem(pView, zLine, i < pSrc->nSrc - 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; + 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); + assert((int)pItem->fg.isNestedFrom == IsNestedFrom(pItem->pSelect)); + sqlite3TreeViewSelect(pView, pItem->pSelect, (--n) > 0); } - if( pItem->fg.isTabFunc ){ + if (pItem->fg.isTabFunc) { sqlite3TreeViewExprList(pView, pItem->u1.pFuncArg, 0, "func-args:"); } sqlite3TreeViewPop(&pView); @@ -31274,115 +30871,125 @@ SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc) /* ** Generate a human-readable description of a Select object. */ -SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 moreToFollow){ +SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView* pView, const Select* p, u8 moreToFollow) { int n = 0; int cnt = 0; - if( p==0 ){ + if (p == 0) { sqlite3TreeViewLine(pView, "nil-SELECT"); return; } sqlite3TreeViewPush(&pView, moreToFollow); - if( p->pWith ){ + if (p->pWith) { sqlite3TreeViewWith(pView, p->pWith, 1); cnt = 1; sqlite3TreeViewPush(&pView, 1); } - do{ - if( p->selFlags & SF_WhereBegin ){ + 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 - ); + } 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 ){ + if (cnt++) + sqlite3TreeViewPop(&pView); + if (p->pPrior) { n = 1000; - }else{ + } 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++; + 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++; + if (p->pWin) + n++; + if (p->pWinDefn) + n++; #endif } - if( p->pEList ){ - sqlite3TreeViewExprList(pView, p->pEList, n>0, "result-set"); + 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); + 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); + 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); + 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); + 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->pGroupBy) { + sqlite3TreeViewExprList(pView, p->pGroupBy, (n--) > 0, "GROUPBY"); } - if( p->pHaving ){ - sqlite3TreeViewItem(pView, "HAVING", (n--)>0); + 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); + 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->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); + 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; + 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 ); + } while (p != 0); sqlite3TreeViewPop(&pView); } @@ -31390,13 +30997,12 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m /* ** 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 ){ +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); @@ -31427,57 +31033,71 @@ SQLITE_PRIVATE void sqlite3TreeViewBound( /* ** Generate a human-readable explanation for a Window object */ -SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u8 more){ +SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView* pView, const Window* pWin, u8 more) { int nElement = 0; - if( pWin==0 ) return; - if( pWin->pFilter ){ + if (pWin == 0) + return; + if (pWin->pFilter) { sqlite3TreeViewItem(pView, "FILTER", 1); sqlite3TreeViewExpr(pView, pWin->pFilter, 0); sqlite3TreeViewPop(&pView); } sqlite3TreeViewPush(&pView, more); - if( pWin->zName ){ + if (pWin->zName) { sqlite3TreeViewLine(pView, "OVER %s (%p)", pWin->zName, pWin); - }else{ + } 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); + 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->pPartition) { + sqlite3TreeViewExprList(pView, pWin->pPartition, nElement > 0, "PARTITION-BY"); } - if( pWin->pOrderBy ){ - sqlite3TreeViewExprList(pView, pWin->pOrderBy, (--nElement)>0, "ORDER-BY"); + if (pWin->pOrderBy) { + sqlite3TreeViewExprList(pView, pWin->pOrderBy, (--nElement) > 0, "ORDER-BY"); } - if( pWin->eFrmType ){ + 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); + 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 ){ + 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; + 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); + sqlite3_snprintf(sizeof(zBuf), zBuf, "invalid(%d)", pWin->eExclude); zExclude = zBuf; break; } @@ -31493,11 +31113,11 @@ SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u /* ** 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; +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); + sqlite3TreeViewLine(pView, "WINFUNC %s(%d)", pWin->pWFunc->zName, pWin->pWFunc->nArg); sqlite3TreeViewWindow(pView, pWin, 0); sqlite3TreeViewPop(&pView); } @@ -31506,170 +31126,217 @@ SQLITE_PRIVATE void sqlite3TreeViewWinFunc(TreeView *pView, const Window *pWin, /* ** 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 */ +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 ){ + if (pExpr == 0) { sqlite3TreeViewLine(pView, "nil"); sqlite3TreeViewPop(&pView); return; } - if( pExpr->flags || pExpr->affExpr || pExpr->vvaFlags ){ + 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, " 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) ){ + if (ExprHasProperty(pExpr, EP_InnerON)) { sqlite3_str_appendf(&x, " inner.iJoin=%d", pExpr->w.iJoin); } - if( ExprHasProperty(pExpr, EP_FromDDL) ){ + if (ExprHasProperty(pExpr, EP_FromDDL)) { sqlite3_str_appendf(&x, " DDL"); } - if( ExprHasVVAProperty(pExpr, EP_Immutable) ){ + if (ExprHasVVAProperty(pExpr, EP_Immutable)) { sqlite3_str_appendf(&x, " IMMUTABLE"); } sqlite3StrAccumFinish(&x); - }else{ + } else { zFlgs[0] = 0; } - switch( pExpr->op ){ + switch (pExpr->op) { case TK_AGG_COLUMN: { - sqlite3TreeViewLine(pView, "AGG{%d:%d}%s", - pExpr->iTable, pExpr->iColumn, zFlgs); + sqlite3TreeViewLine(pView, "AGG{%d:%d}%s", pExpr->iTable, pExpr->iColumn, zFlgs); break; } case TK_COLUMN: { - if( pExpr->iTable<0 ){ + 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{ + 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); + 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) ){ + if (ExprHasProperty(pExpr, EP_FixedCol)) { sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); } break; } case TK_INTEGER: { - if( pExpr->flags & EP_IntValue ){ + if (pExpr->flags & EP_IntValue) { sqlite3TreeViewLine(pView, "%d", pExpr->u.iValue); - }else{ + } 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); + 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); + assert(!ExprHasProperty(pExpr, EP_IntValue)); + sqlite3TreeViewLine(pView, "%Q", pExpr->u.zToken); break; } case TK_NULL: { - sqlite3TreeViewLine(pView,"NULL"); + sqlite3TreeViewLine(pView, "NULL"); break; } case TK_TRUEFALSE: { - sqlite3TreeViewLine(pView,"%s%s", - sqlite3ExprTruthValue(pExpr) ? "TRUE" : "FALSE", zFlgs); + 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); + 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); + 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); + sqlite3TreeViewLine(pView, "REGISTER(%d)", pExpr->iTable); break; } case TK_ID: { - assert( !ExprHasProperty(pExpr, EP_IntValue) ); - sqlite3TreeViewLine(pView,"ID \"%w\"", pExpr->u.zToken); + 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); + 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_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); + 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) ); + assert(!ExprHasProperty(pExpr, EP_IntValue)); sqlite3TreeViewLine(pView, "SPAN %Q", pExpr->u.zToken); sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); break; @@ -31681,23 +31348,21 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m ** 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); + 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) ){ + ExprList* pFarg; /* List of function arguments */ + Window* pWin; + if (ExprHasProperty(pExpr, EP_TokenOnly)) { pFarg = 0; pWin = 0; - }else{ - assert( ExprUseXList(pExpr) ); + } else { + assert(ExprUseXList(pExpr)); pFarg = pExpr->x.pList; #ifndef SQLITE_OMIT_WINDOWFUNC pWin = ExprHasProperty(pExpr, EP_WinFunc) ? pExpr->y.pWin : 0; @@ -31705,31 +31370,32 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m 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; + 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); + 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{ + 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); + if (pFarg) { + sqlite3TreeViewExprList(pView, pFarg, pWin != 0, 0); } #ifndef SQLITE_OMIT_WINDOWFUNC - if( pWin ){ + if (pWin) { sqlite3TreeViewWindow(pView, pWin, 0); } #endif @@ -31737,33 +31403,33 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m } #ifndef SQLITE_OMIT_SUBQUERY case TK_EXISTS: { - assert( ExprUseXSelect(pExpr) ); + 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) ); + 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* 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); + 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) ){ + if (ExprUseXSelect(pExpr)) { sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); - }else{ + } else { sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0); } break; @@ -31784,8 +31450,8 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m case TK_BETWEEN: { const Expr *pX, *pY, *pZ; pX = pExpr->pLeft; - assert( ExprUseXList(pExpr) ); - assert( pExpr->x.pList->nExpr==2 ); + 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"); @@ -31802,49 +31468,54 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m ** 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); + 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) ); + 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) ); + 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); + 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) ); + 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) ); + 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; } @@ -31862,11 +31533,10 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m break; } case TK_ROW: { - if( pExpr->iColumn<=0 ){ + if (pExpr->iColumn <= 0) { sqlite3TreeViewLine(pView, "First FROM table rowid"); - }else{ - sqlite3TreeViewLine(pView, "First FROM table column %d", - pExpr->iColumn-1); + } else { + sqlite3TreeViewLine(pView, "First FROM table column %d", pExpr->iColumn - 1); } break; } @@ -31875,75 +31545,69 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m break; } } - if( zBinOp ){ + if (zBinOp) { sqlite3TreeViewLine(pView, "%s%s", zBinOp, zFlgs); sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); sqlite3TreeViewExpr(pView, pExpr->pRight, 0); - }else if( zUniOp ){ + } else if (zUniOp) { sqlite3TreeViewLine(pView, "%s%s", zUniOp, zFlgs); - sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + 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 ){ +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{ + } else { int i; sqlite3TreeViewLine(pView, "%s", zLabel); - for(i=0; inExpr; i++){ + for (i = 0; i < pList->nExpr; i++) { int j = pList->a[i].u.x.iOrderByCol; - char *zName = pList->a[i].zEName; - int moreToFollow = inExpr - 1; - if( j || zName ){ + char* zName = pList->a[i].zEName; + int moreToFollow = i < pList->nExpr - 1; + if (j || zName) { sqlite3TreeViewPush(&pView, moreToFollow); moreToFollow = 0; sqlite3TreeViewLine(pView, 0); - if( zName ){ - switch( pList->a[i].fg.eEName ){ + 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) "); + 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 ){ + if (j) { fprintf(stdout, "iOrderByCol=%d", j); } fprintf(stdout, "\n"); fflush(stdout); } sqlite3TreeViewExpr(pView, pList->a[i].pExpr, moreToFollow); - if( j || zName ){ + if (j || zName) { sqlite3TreeViewPop(&pView); } } } } -SQLITE_PRIVATE void sqlite3TreeViewExprList( - TreeView *pView, - const ExprList *pList, - u8 moreToFollow, - const char *zLabel -){ +SQLITE_PRIVATE void sqlite3TreeViewExprList(TreeView* pView, const ExprList* pList, u8 moreToFollow, const char* zLabel) { sqlite3TreeViewPush(&pView, moreToFollow); sqlite3TreeViewBareExprList(pView, pList, zLabel); sqlite3TreeViewPop(&pView); @@ -31952,34 +31616,32 @@ SQLITE_PRIVATE void sqlite3TreeViewExprList( /* ** 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 ){ +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{ + } 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)"; + for (i = 0; i < pList->nId; i++) { + char* zName = pList->a[i].zName; + int moreToFollow = i < pList->nId - 1; + if (zName == 0) + zName = "(null)"; sqlite3TreeViewPush(&pView, moreToFollow); sqlite3TreeViewLine(pView, 0); - if( pList->eU4==EU4_NONE ){ + if (pList->eU4 == EU4_NONE) { fprintf(stdout, "%s\n", zName); - }else if( pList->eU4==EU4_IDX ){ + } 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 ){ + } else { + assert(pList->eU4 == EU4_EXPR); + if (pList->a[i].u4.pExpr == 0) { fprintf(stdout, "%s (pExpr=NULL)\n", zName); - }else{ + } else { fprintf(stdout, "%s\n", zName); - sqlite3TreeViewPush(&pView, inId-1); + sqlite3TreeViewPush(&pView, i < pList->nId - 1); sqlite3TreeViewExpr(pView, pList->a[i].u4.pExpr, 0); sqlite3TreeViewPop(&pView); } @@ -31988,12 +31650,7 @@ SQLITE_PRIVATE void sqlite3TreeViewBareIdList( } } } -SQLITE_PRIVATE void sqlite3TreeViewIdList( - TreeView *pView, - const IdList *pList, - u8 moreToFollow, - const char *zLabel -){ +SQLITE_PRIVATE void sqlite3TreeViewIdList(TreeView* pView, const IdList* pList, u8 moreToFollow, const char* zLabel) { sqlite3TreeViewPush(&pView, moreToFollow); sqlite3TreeViewBareIdList(pView, pList, zLabel); sqlite3TreeViewPop(&pView); @@ -32002,23 +31659,19 @@ SQLITE_PRIVATE void sqlite3TreeViewIdList( /* ** 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; +SQLITE_PRIVATE void sqlite3TreeViewUpsert(TreeView* pView, const Upsert* pUpsert, u8 moreToFollow) { + if (pUpsert == 0) + return; sqlite3TreeViewPush(&pView, moreToFollow); - while( pUpsert ){ + 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); + 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); } @@ -32033,52 +31686,52 @@ SQLITE_PRIVATE void sqlite3TreeViewUpsert( ** 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 -){ +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; + 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); + 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); + if (pTabList) { + sqlite3TreeViewPush(&pView, (--n) > 0); sqlite3TreeViewLine(pView, "FROM"); sqlite3TreeViewSrcList(pView, pTabList); sqlite3TreeViewPop(&pView); } - if( pWhere ){ - sqlite3TreeViewPush(&pView, (--n)>0); + 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 (pOrderBy) { + sqlite3TreeViewExprList(pView, pOrderBy, (--n) > 0, "ORDER-BY"); } - if( pLimit ){ - sqlite3TreeViewPush(&pView, (--n)>0); + if (pLimit) { + sqlite3TreeViewPush(&pView, (--n) > 0); sqlite3TreeViewLine(pView, "LIMIT"); sqlite3TreeViewExpr(pView, pLimit, 0); sqlite3TreeViewPop(&pView); } - if( pTrigger ){ - sqlite3TreeViewTrigger(pView, pTrigger, (--n)>0, 1); + if (pTrigger) { + sqlite3TreeViewTrigger(pView, pTrigger, (--n) > 0, 1); } sqlite3TreeViewPop(&pView); } @@ -32089,66 +31742,75 @@ SQLITE_PRIVATE void sqlite3TreeViewDelete( ** 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; +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; + 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); + 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); + if (pTabList) { + sqlite3TreeViewPush(&pView, (--n) > 0); sqlite3TreeViewLine(pView, "INTO"); sqlite3TreeViewSrcList(pView, pTabList); sqlite3TreeViewPop(&pView); } - if( pColumnList ){ - sqlite3TreeViewIdList(pView, pColumnList, (--n)>0, "COLUMNS"); + if (pColumnList) { + sqlite3TreeViewIdList(pView, pColumnList, (--n) > 0, "COLUMNS"); } - if( pSelect ){ - sqlite3TreeViewPush(&pView, (--n)>0); + 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 (pExprList) { + sqlite3TreeViewExprList(pView, pExprList, (--n) > 0, "VALUES"); } - if( pUpsert ){ - sqlite3TreeViewPush(&pView, (--n)>0); + if (pUpsert) { + sqlite3TreeViewPush(&pView, (--n) > 0); sqlite3TreeViewLine(pView, "UPSERT"); sqlite3TreeViewUpsert(pView, pUpsert, 0); sqlite3TreeViewPop(&pView); } - if( pTrigger ){ - sqlite3TreeViewTrigger(pView, pTrigger, (--n)>0, 1); + if (pTrigger) { + sqlite3TreeViewTrigger(pView, pTrigger, (--n) > 0, 1); } sqlite3TreeViewPop(&pView); } @@ -32159,74 +31821,84 @@ SQLITE_PRIVATE void sqlite3TreeViewInsert( ** 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 -){ +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; + 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); + 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); + if (pTabList) { + sqlite3TreeViewPush(&pView, (--n) > 0); sqlite3TreeViewLine(pView, "FROM"); sqlite3TreeViewSrcList(pView, pTabList); sqlite3TreeViewPop(&pView); } - if( pChanges ){ - sqlite3TreeViewExprList(pView, pChanges, (--n)>0, "SET"); + if (pChanges) { + sqlite3TreeViewExprList(pView, pChanges, (--n) > 0, "SET"); } - if( pWhere ){ - sqlite3TreeViewPush(&pView, (--n)>0); + 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 (pOrderBy) { + sqlite3TreeViewExprList(pView, pOrderBy, (--n) > 0, "ORDER-BY"); } - if( pLimit ){ - sqlite3TreeViewPush(&pView, (--n)>0); + if (pLimit) { + sqlite3TreeViewPush(&pView, (--n) > 0); sqlite3TreeViewLine(pView, "LIMIT"); sqlite3TreeViewExpr(pView, pLimit, 0); sqlite3TreeViewPop(&pView); } - if( pUpsert ){ - sqlite3TreeViewPush(&pView, (--n)>0); + if (pUpsert) { + sqlite3TreeViewPush(&pView, (--n) > 0); sqlite3TreeViewLine(pView, "UPSERT"); sqlite3TreeViewUpsert(pView, pUpsert, 0); sqlite3TreeViewPop(&pView); } - if( pTrigger ){ - sqlite3TreeViewTrigger(pView, pTrigger, (--n)>0, 1); + if (pTrigger) { + sqlite3TreeViewTrigger(pView, pTrigger, (--n) > 0, 1); } sqlite3TreeViewPop(&pView); } @@ -32236,41 +31908,31 @@ SQLITE_PRIVATE void sqlite3TreeViewUpdate( /* ** Show a human-readable graph of a TriggerStep */ -SQLITE_PRIVATE void sqlite3TreeViewTriggerStep( - TreeView *pView, - const TriggerStep *pStep, - u8 moreToFollow, - u8 showFullList -){ +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 ){ + 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 ); + } 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 -){ +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 ){ + if (pTrigger == 0) + return; + sqlite3TreeViewPush(&pView, moreToFollow || (showFullList && pTrigger->pNext != 0)); + do { + if (cnt++ && pTrigger->pNext == 0) { sqlite3TreeViewPop(&pView); sqlite3TreeViewPush(&pView, 0); } @@ -32278,12 +31940,11 @@ SQLITE_PRIVATE void sqlite3TreeViewTrigger( sqlite3TreeViewPush(&pView, 0); sqlite3TreeViewTriggerStep(pView, pTrigger->step_list, 0, 1); sqlite3TreeViewPop(&pView); - }while( showFullList && (pTrigger = pTrigger->pNext)!=0 ); + } 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 @@ -32294,26 +31955,48 @@ SQLITE_PRIVATE void sqlite3TreeViewTrigger( ** 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); } +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 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 sqlite3ShowTriggerStepList(const TriggerStep *p){ - sqlite3TreeViewTriggerStep(0,p,0,1); +SQLITE_PRIVATE void sqlite3ShowTriggerList(const Trigger* p) { + sqlite3TreeViewTrigger(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); } +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 */ @@ -32339,22 +32022,21 @@ SQLITE_PRIVATE void sqlite3ShowWinFunc(const Window *p){ sqlite3TreeViewWinFunc( */ /* #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 */ + 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){ +SQLITE_API void sqlite3_randomness(int N, void* pBuf) { unsigned char t; - unsigned char *zBuf = pBuf; + 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, @@ -32363,18 +32045,19 @@ SQLITE_API void sqlite3_randomness(int N, void *pBuf){ ** to the "sqlite3Prng" state vector declared above. */ #ifdef SQLITE_OMIT_WSD - struct sqlite3PrngType *p = &GLOBAL(struct sqlite3PrngType, sqlite3Prng); -# define wsdPrng p[0] + struct sqlite3PrngType* p = &GLOBAL(struct sqlite3PrngType, sqlite3Prng); +#define wsdPrng p[0] #else -# define wsdPrng sqlite3Prng +#define wsdPrng sqlite3Prng #endif #if SQLITE_THREADSAFE - sqlite3_mutex *mutex; + sqlite3_mutex* mutex; #endif #ifndef SQLITE_OMIT_AUTOINIT - if( sqlite3_initialize() ) return; + if (sqlite3_initialize()) + return; #endif #if SQLITE_THREADSAFE @@ -32382,7 +32065,7 @@ SQLITE_API void sqlite3_randomness(int N, void *pBuf){ #endif sqlite3_mutex_enter(mutex); - if( N<=0 || pBuf==0 ){ + if (N <= 0 || pBuf == 0) { wsdPrng.isInit = 0; sqlite3_mutex_leave(mutex); return; @@ -32397,21 +32080,21 @@ SQLITE_API void sqlite3_randomness(int N, void *pBuf){ ** 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); + 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) ){ + if (NEVER(pVfs == 0)) { memset(k, 0, sizeof(k)); - }else{ + } else { sqlite3OsRandomness(pVfs, 256, k); } - for(i=0; i<256; i++){ + for (i = 0; i < 256; i++) { wsdPrng.s[i] = (u8)i; } - for(i=0; i<256; 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]; @@ -32420,8 +32103,8 @@ SQLITE_API void sqlite3_randomness(int N, void *pBuf){ wsdPrng.isInit = 1; } - assert( N>0 ); - do{ + assert(N > 0); + do { wsdPrng.i++; t = wsdPrng.s[wsdPrng.i]; wsdPrng.j += t; @@ -32429,7 +32112,7 @@ SQLITE_API void sqlite3_randomness(int N, void *pBuf){ wsdPrng.s[wsdPrng.j] = t; t += wsdPrng.s[wsdPrng.i]; *(zBuf++) = wsdPrng.s[t]; - }while( --N ); + } while (--N); sqlite3_mutex_leave(mutex); } @@ -32444,19 +32127,11 @@ SQLITE_API void sqlite3_randomness(int N, void *pBuf){ ** 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 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) - ); +SQLITE_PRIVATE void sqlite3PrngRestoreState(void) { + memcpy(&GLOBAL(struct sqlite3PrngType, sqlite3Prng), &GLOBAL(struct sqlite3PrngType, sqlite3SavedPrng), sizeof(sqlite3Prng)); } #endif /* SQLITE_UNTESTABLE */ @@ -32494,40 +32169,40 @@ SQLITE_PRIVATE void sqlite3PrngRestoreState(void){ /* # include "os_win.h" */ #endif -#if SQLITE_MAX_WORKER_THREADS>0 +#if SQLITE_MAX_WORKER_THREADS > 0 /********************************* Unix Pthreads ****************************/ -#if SQLITE_OS_UNIX && defined(SQLITE_MUTEX_PTHREADS) && SQLITE_THREADSAFE>0 +#if SQLITE_OS_UNIX && defined(SQLITE_MUTEX_PTHREADS) && SQLITE_THREADSAFE > 0 -#define SQLITE_THREADS_IMPLEMENTED 1 /* Prevent the single-thread code below */ +#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 */ + 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; +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 ); + assert(ppThread != 0); + assert(xTask != 0); /* This routine is never used in single-threaded mode */ - assert( sqlite3GlobalConfig.bCoreMutex!=0 ); + assert(sqlite3GlobalConfig.bCoreMutex != 0); *ppThread = 0; p = sqlite3Malloc(sizeof(*p)); - if( p==0 ) return SQLITE_NOMEM_BKPT; + if (p == 0) + return SQLITE_NOMEM_BKPT; memset(p, 0, sizeof(*p)); p->xTask = xTask; p->pIn = pIn; @@ -32535,12 +32210,12 @@ SQLITE_PRIVATE int sqlite3ThreadCreate( ** 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) ){ + if (sqlite3FaultSim(200)) { rc = 1; - }else{ + } else { rc = pthread_create(&p->tid, 0, xTask, pIn); } - if( rc ){ + if (rc) { p->done = 1; p->pOut = xTask(pIn); } @@ -32549,15 +32224,16 @@ SQLITE_PRIVATE int sqlite3ThreadCreate( } /* Get the results of the thread */ -SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ +SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread* p, void** ppOut) { int rc; - assert( ppOut!=0 ); - if( NEVER(p==0) ) return SQLITE_NOMEM_BKPT; - if( p->done ){ + assert(ppOut != 0); + if (NEVER(p == 0)) + return SQLITE_NOMEM_BKPT; + if (p->done) { *ppOut = p->pOut; rc = SQLITE_OK; - }else{ + } else { rc = pthread_join(p->tid, ppOut) ? SQLITE_ERROR : SQLITE_OK; } sqlite3_free(p); @@ -32567,29 +32243,27 @@ SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ #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 */ +#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 */ + 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; +static unsigned __stdcall sqlite3ThreadProc(void* pArg /* IN: Pointer to the SQLiteThread structure */ +) { + SQLiteThread* p = (SQLiteThread*)pArg; - assert( p!=0 ); + assert(p != 0); #if 0 /* ** This assert appears to trigger spuriously on certain @@ -32599,7 +32273,7 @@ static unsigned __stdcall sqlite3ThreadProc( */ assert( p->id==GetCurrentThreadId() ); #endif - assert( p->xTask!=0 ); + assert(p->xTask != 0); p->pResult = p->xTask(p->pIn); _endthreadex(0); @@ -32607,34 +32281,34 @@ static unsigned __stdcall sqlite3ThreadProc( } /* 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; +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 ); + assert(ppThread != 0); + assert(xTask != 0); *ppThread = 0; p = sqlite3Malloc(sizeof(*p)); - if( p==0 ) return SQLITE_NOMEM_BKPT; + 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) ){ + if (sqlite3GlobalConfig.bCoreMutex == 0 || sqlite3FaultSim(200)) { memset(p, 0, sizeof(*p)); - }else{ + } else { p->xTask = xTask; p->pIn = pIn; p->tid = (void*)_beginthreadex(0, 0, sqlite3ThreadProc, p, 0, &p->id); - if( p->tid==0 ){ + if (p->tid == 0) { memset(p, 0, sizeof(*p)); } } - if( p->xTask==0 ){ + if (p->xTask == 0) { p->id = GetCurrentThreadId(); p->pResult = xTask(pIn); } @@ -32645,32 +32319,33 @@ SQLITE_PRIVATE int sqlite3ThreadCreate( SQLITE_PRIVATE DWORD sqlite3Win32Wait(HANDLE hObject); /* os_win.c */ /* Get the results of the thread */ -SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ +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(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() ); + assert(p->tid == 0); + } else { + assert(p->id != 0 && p->id != GetCurrentThreadId()); rc = sqlite3Win32Wait((HANDLE)p->tid); - assert( rc!=WAIT_IO_COMPLETION ); + assert(rc != WAIT_IO_COMPLETION); bRc = CloseHandle((HANDLE)p->tid); - assert( bRc ); + assert(bRc); } - if( rc==WAIT_OBJECT_0 ) *ppOut = p->pResult; + if (rc == WAIT_OBJECT_0) + *ppOut = p->pResult; sqlite3_free(p); - return (rc==WAIT_OBJECT_0) ? SQLITE_OK : SQLITE_ERROR; + return (rc == WAIT_OBJECT_0) ? SQLITE_OK : SQLITE_ERROR; } #endif /* SQLITE_OS_WIN_THREADS */ /******************************** End Win32 Threads *************************/ - /********************************* Single-Threaded **************************/ #ifndef SQLITE_THREADS_IMPLEMENTED /* @@ -32681,28 +32356,28 @@ SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ /* 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 */ + 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; +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 ); + 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 ){ + if (p == 0) + return SQLITE_NOMEM_BKPT; + if ((SQLITE_PTR_TO_INT(p) / 17) & 1) { p->xTask = xTask; p->pIn = pIn; - }else{ + } else { p->xTask = 0; p->pResult = xTask(pIn); } @@ -32711,21 +32386,23 @@ SQLITE_PRIVATE int sqlite3ThreadCreate( } /* Get the results of the thread */ -SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ +SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread* p, void** ppOut) { - assert( ppOut!=0 ); - if( NEVER(p==0) ) return SQLITE_NOMEM_BKPT; - if( p->xTask ){ + assert(ppOut != 0); + if (NEVER(p == 0)) + return SQLITE_NOMEM_BKPT; + if (p->xTask) { *ppOut = p->xTask(p->pIn); - }else{ + } else { *ppOut = p->pResult; } sqlite3_free(p); #if defined(SQLITE_TEST) { - void *pTstAlloc = sqlite3Malloc(10); - if (!pTstAlloc) return SQLITE_NOMEM_BKPT; + void* pTstAlloc = sqlite3Malloc(10); + if (!pTstAlloc) + return SQLITE_NOMEM_BKPT; sqlite3_free(pTstAlloc); } #endif @@ -32778,7 +32455,7 @@ SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ /* #include */ /* #include "vdbeInt.h" */ -#if !defined(SQLITE_AMALGAMATION) && SQLITE_BYTEORDER==0 +#if !defined(SQLITE_AMALGAMATION) && SQLITE_BYTEORDER == 0 /* ** The following constant value is used by the SQLITE_BIGENDIAN and ** SQLITE_LITTLEENDIAN macros. @@ -32791,60 +32468,55 @@ SQLITE_PRIVATE const int sqlite3one = 1; ** 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, + 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); \ - } \ -} +#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. @@ -32873,41 +32545,37 @@ static const unsigned char sqlite3Utf8Trans1[] = { ** 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 */ -){ +#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 >= 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; } - 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(). @@ -32920,19 +32588,19 @@ SQLITE_PRIVATE u32 sqlite3Utf8Read( ** 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 */ +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 ); + 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) { @@ -32948,19 +32616,19 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desired ** 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 ){ + if (pMem->enc != SQLITE_UTF8 && desiredEnc != SQLITE_UTF8) { u8 temp; int rc; rc = sqlite3VdbeMemMakeWriteable(pMem); - if( rc!=SQLITE_OK ){ - assert( rc==SQLITE_NOMEM ); + if (rc != SQLITE_OK) { + assert(rc == SQLITE_NOMEM); return SQLITE_NOMEM_BKPT; } zIn = (u8*)pMem->z; - zTerm = &zIn[pMem->n&~1]; - while( zInn & ~1]; + while (zIn < zTerm) { temp = *zIn; - *zIn = *(zIn+1); + *zIn = *(zIn + 1); zIn++; *zIn++ = temp; } @@ -32969,7 +32637,7 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desired } /* Set len to the maximum number of bytes required in the output buffer. */ - if( desiredEnc==SQLITE_UTF8 ){ + 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 @@ -32977,7 +32645,7 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desired */ pMem->n &= ~1; len = 2 * (sqlite3_int64)pMem->n + 1; - }else{ + } 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 @@ -32995,83 +32663,83 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desired zIn = (u8*)pMem->z; zTerm = &zIn[pMem->n]; zOut = sqlite3DbMallocRaw(pMem->db, len); - if( !zOut ){ + if (!zOut) { return SQLITE_NOMEM_BKPT; } z = zOut; - if( pMem->enc==SQLITE_UTF8 ){ - if( desiredEnc==SQLITE_UTF16LE ){ + 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 ){ + } else { + assert(desiredEnc == SQLITE_UTF8); + if (pMem->enc == SQLITE_UTF16LE) { /* UTF-16 Little-endian -> UTF-8 */ - while( zIn=0xd800 && c<0xe000 ){ + c += (*(zIn++)) << 8; + if (c >= 0xd800 && c < 0xe000) { #ifdef SQLITE_REPLACE_INVALID_UTF - if( c>=0xdc00 || zIn>=zTerm ){ + if (c >= 0xdc00 || zIn >= zTerm) { c = 0xfffd; - }else{ + } else { int c2 = *(zIn++); - c2 += (*(zIn++))<<8; - if( c2<0xdc00 || c2>=0xe000 ){ + c2 += (*(zIn++)) << 8; + if (c2 < 0xdc00 || c2 >= 0xe000) { zIn -= 2; c = 0xfffd; - }else{ - c = ((c&0x3ff)<<10) + (c2&0x3ff) + 0x10000; + } else { + c = ((c & 0x3ff) << 10) + (c2 & 0x3ff) + 0x10000; } } #else - if( zIn UTF-8 */ - while( zIn=0xd800 && c<0xe000 ){ + if (c >= 0xd800 && c < 0xe000) { #ifdef SQLITE_REPLACE_INVALID_UTF - if( c>=0xdc00 || zIn>=zTerm ){ + if (c >= 0xdc00 || zIn >= zTerm) { c = 0xfffd; - }else{ - int c2 = (*(zIn++))<<8; + } else { + int c2 = (*(zIn++)) << 8; c2 += *(zIn++); - if( c2<0xdc00 || c2>=0xe000 ){ + if (c2 < 0xdc00 || c2 >= 0xe000) { zIn -= 2; c = 0xfffd; - }else{ - c = ((c&0x3ff)<<10) + (c2&0x3ff) + 0x10000; + } 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 ); + assert((pMem->n + (desiredEnc == SQLITE_UTF8 ? 1 : 2)) <= len); - c = MEM_Str|MEM_Term|(pMem->flags&(MEM_AffMask|MEM_Subtype)); + c = MEM_Str | MEM_Term | (pMem->flags & (MEM_AffMask | MEM_Subtype)); sqlite3VdbeMemRelease(pMem); pMem->flags = c; pMem->enc = desiredEnc; @@ -33093,13 +32761,13 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desired 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)); - } +{ + 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; } @@ -33115,29 +32783,29 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desired ** The allocation (static, dynamic etc.) and encoding of the Mem may be ** changed by this function. */ -SQLITE_PRIVATE int sqlite3VdbeMemHandleBom(Mem *pMem){ +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 ){ + 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 ){ + if (b1 == 0xFF && b2 == 0xFE) { bom = SQLITE_UTF16LE; } } - if( bom ){ + if (bom) { rc = sqlite3VdbeMemMakeWriteable(pMem); - if( rc==SQLITE_OK ){ + 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->z[pMem->n + 1] = '\0'; pMem->flags |= MEM_Term; pMem->enc = bom; } @@ -33153,17 +32821,17 @@ SQLITE_PRIVATE int sqlite3VdbeMemHandleBom(Mem *pMem){ ** 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){ +SQLITE_PRIVATE int sqlite3Utf8CharLen(const char* zIn, int nByte) { int r = 0; - const u8 *z = (const u8*)zIn; - const u8 *zTerm; - if( nByte>=0 ){ + const u8* z = (const u8*)zIn; + const u8* zTerm; + if (nByte >= 0) { zTerm = &z[nByte]; - }else{ + } else { zTerm = (const u8*)(-1); } - assert( z<=zTerm ); - while( *z!=0 && zmallocFailed ){ + if (db->mallocFailed) { 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 ); + assert((m.flags & MEM_Term) != 0 || db->mallocFailed); + assert((m.flags & MEM_Str) != 0 || db->mallocFailed); + assert(m.z || db->mallocFailed); return m.z; } @@ -33228,20 +32896,21 @@ SQLITE_PRIVATE char *sqlite3Utf16to8(sqlite3 *db, const void *z, int nByte, u8 e ** 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){ +SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void* zIn, int nChar) { int c; - unsigned char const *z = zIn; + 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; + if (c >= 0xd8 && c < 0xdc && z[0] >= 0xdc && z[0] < 0xe0) + z += 2; n++; } - return (int)(z-(unsigned char const *)zIn) - - (SQLITE_UTF16NATIVE==SQLITE_UTF16LE); + return (int)(z - (unsigned char const*)zIn) - (SQLITE_UTF16NATIVE == SQLITE_UTF16LE); } #if defined(SQLITE_TEST) @@ -33250,26 +32919,28 @@ SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *zIn, int nChar){ ** It checks that the primitives for serializing and deserializing ** characters in each encoding are inverses of each other. */ -SQLITE_PRIVATE void sqlite3UtfSelfTest(void){ +SQLITE_PRIVATE void sqlite3UtfSelfTest(void) { unsigned int i, t; unsigned char zBuf[20]; - unsigned char *z; + unsigned char* z; int n; unsigned int c; - for(i=0; i<0x00110000; i++){ + for (i = 0; i < 0x00110000; i++) { z = zBuf; WRITE_UTF8(z, i); - n = (int)(z-zBuf); - assert( n>0 && n<=4 ); + 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 ); + if (i >= 0xD800 && i <= 0xDFFF) + t = 0xFFFD; + if ((i & 0xFFFFFFFE) == 0xFFFE) + t = 0xFFFD; + assert(c == t); + assert((z - zBuf) == n); } } #endif /* SQLITE_TEST */ @@ -33320,7 +32991,7 @@ SQLITE_PRIVATE void sqlite3UtfSelfTest(void){ ** breaking, the codes should not be changed or reused. */ #ifndef SQLITE_UNTESTABLE -SQLITE_PRIVATE int sqlite3FaultSim(int iTest){ +SQLITE_PRIVATE int sqlite3FaultSim(int iTest) { int (*xCallback)(int) = sqlite3GlobalConfig.xTestCallback; return xCallback ? xCallback(iTest) : SQLITE_OK; } @@ -33333,16 +33004,16 @@ SQLITE_PRIVATE int sqlite3FaultSim(int iTest){ ** 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 */ +SQLITE_PRIVATE int sqlite3IsNaN(double x) { + int rc; /* The value return */ #if !SQLITE_HAVE_ISNAN && !HAVE_ISNAN u64 y; - memcpy(&y,&x,sizeof(y)); + memcpy(&y, &x, sizeof(y)); rc = IsNaN(y); #else rc = isnan(x); #endif /* HAVE_ISNAN */ - testcase( rc ); + testcase(rc); return rc; } #endif /* SQLITE_OMIT_FLOATING_POINT */ @@ -33355,8 +33026,9 @@ SQLITE_PRIVATE int sqlite3IsNaN(double x){ ** 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; +SQLITE_PRIVATE int sqlite3Strlen30(const char* z) { + if (z == 0) + return 0; return 0x3fffffff & (int)strlen(z); } @@ -33367,13 +33039,13 @@ SQLITE_PRIVATE int sqlite3Strlen30(const char *z){ ** 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 ){ +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{ + } else if (pCol->eCType) { + assert(pCol->eCType <= SQLITE_N_STDTYPE); + return (char*)sqlite3StdType[pCol->eCType - 1]; + } else { return zDflt; } } @@ -33383,8 +33055,9 @@ SQLITE_PRIVATE char *sqlite3ColumnType(Column *pCol, char *zDflt){ ** 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); +static SQLITE_NOINLINE void sqlite3ErrorFinish(sqlite3* db, int err_code) { + if (db->pErr) + sqlite3ValueSetNull(db->pErr); sqlite3SystemError(db, err_code); } @@ -33393,12 +33066,12 @@ static SQLITE_NOINLINE void sqlite3ErrorFinish(sqlite3 *db, int err_code){ ** 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 ); +SQLITE_PRIVATE void sqlite3Error(sqlite3* db, int err_code) { + assert(db != 0); db->errCode = err_code; - if( err_code || db->pErr ){ + if (err_code || db->pErr) { sqlite3ErrorFinish(db, err_code); - }else{ + } else { db->errByteOffset = -1; } } @@ -33407,21 +33080,23 @@ SQLITE_PRIVATE void sqlite3Error(sqlite3 *db, int err_code){ ** The equivalent of sqlite3Error(db, SQLITE_OK). Clear the error state ** and error message. */ -SQLITE_PRIVATE void sqlite3ErrorClear(sqlite3 *db){ - assert( db!=0 ); +SQLITE_PRIVATE void sqlite3ErrorClear(sqlite3* db) { + assert(db != 0); db->errCode = SQLITE_OK; db->errByteOffset = -1; - if( db->pErr ) sqlite3ValueSetNull(db->pErr); + 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; +SQLITE_PRIVATE void sqlite3SystemError(sqlite3* db, int rc) { + if (rc == SQLITE_IOERR_NOMEM) + return; rc &= 0xff; - if( rc==SQLITE_CANTOPEN || rc==SQLITE_IOERR ){ + if (rc == SQLITE_CANTOPEN || rc == SQLITE_IOERR) { db->iSysErrno = sqlite3OsGetLastError(db->pVfs); } } @@ -33438,14 +33113,14 @@ SQLITE_PRIVATE void sqlite3SystemError(sqlite3 *db, int rc){ ** 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 ); +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 ){ + if (zFormat == 0) { sqlite3Error(db, err_code); - }else if( db->pErr || (db->pErr = sqlite3ValueNew(db))!=0 ){ - char *z; + } else if (db->pErr || (db->pErr = sqlite3ValueNew(db)) != 0) { + char* z; va_list ap; va_start(ap, zFormat); z = sqlite3VMPrintf(db, zFormat, ap); @@ -33464,24 +33139,25 @@ SQLITE_PRIVATE void sqlite3ErrorWithMsg(sqlite3 *db, int err_code, const char *z ** Functions sqlite3Error() or sqlite3ErrorWithMsg() should be used ** during statement execution (sqlite3_step() etc.). */ -SQLITE_PRIVATE void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){ - char *zMsg; +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->pParse->pToplevel==pParse ); + sqlite3* db = pParse->db; + assert(db != 0); + assert(db->pParse == pParse || db->pParse->pToplevel == 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 ){ + if (db->errByteOffset < -1) + db->errByteOffset = -1; + if (db->suppressErr) { sqlite3DbFree(db, zMsg); - if( db->mallocFailed ){ + if (db->mallocFailed) { pParse->nErr++; pParse->rc = SQLITE_NOMEM; } - }else{ + } else { pParse->nErr++; sqlite3DbFree(db, pParse->zErrMsg); pParse->zErrMsg = zMsg; @@ -33495,9 +33171,10 @@ SQLITE_PRIVATE void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){ ** 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; +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; @@ -33520,32 +33197,35 @@ SQLITE_PRIVATE int sqlite3ErrorToParser(sqlite3 *db, int errCode){ ** brackets from around identifiers. For example: "[a-b-c]" becomes ** "a-b-c". */ -SQLITE_PRIVATE void sqlite3Dequote(char *z){ +SQLITE_PRIVATE void sqlite3Dequote(char* z) { char quote; int i, j; - if( z==0 ) return; + 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 ){ + 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{ + } else { break; } - }else{ + } 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; +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); } @@ -33560,12 +33240,15 @@ SQLITE_PRIVATE void sqlite3DequoteExpr(Expr *p){ ** system should still return the correct answer even if this routine ** is always a no-op. */ -SQLITE_PRIVATE void sqlite3DequoteToken(Token *p){ +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; + if (p->n < 2) + return; + if (!sqlite3Isquote(p->z[0])) + return; + for (i = 1; i < p->n - 1; i++) { + if (sqlite3Isquote(p->z[i])) + return; } p->n -= 2; p->z++; @@ -33574,7 +33257,7 @@ SQLITE_PRIVATE void sqlite3DequoteToken(Token *p){ /* ** Generate a Token object from a string */ -SQLITE_PRIVATE void sqlite3TokenInit(Token *p, char *z){ +SQLITE_PRIVATE void sqlite3TokenInit(Token* p, char* z) { p->z = z; p->n = sqlite3Strlen30(z); } @@ -33592,53 +33275,59 @@ SQLITE_PRIVATE void sqlite3TokenInit(Token *p, char *z){ ** 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 ){ +SQLITE_API int sqlite3_stricmp(const char* zLeft, const char* zRight) { + if (zLeft == 0) { return zRight ? -1 : 0; - }else if( zRight==0 ){ + } else if (zRight == 0) { return 1; } return sqlite3StrICmp(zLeft, zRight); } -SQLITE_PRIVATE int sqlite3StrICmp(const char *zLeft, const char *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(;;){ + a = (unsigned char*)zLeft; + b = (unsigned char*)zRight; + for (;;) { c = *a; x = *b; - if( c==x ){ - if( c==0 ) break; - }else{ + if (c == x) { + if (c == 0) + break; + } else { c = (int)UpperToLower[c] - (int)UpperToLower[x]; - if( c ) break; + if (c) + break; } a++; b++; } return c; } -SQLITE_API int sqlite3_strnicmp(const char *zLeft, const char *zRight, int N){ +SQLITE_API int sqlite3_strnicmp(const char* zLeft, const char* zRight, int N) { register unsigned char *a, *b; - if( zLeft==0 ){ + if (zLeft == 0) { return zRight ? -1 : 0; - }else if( zRight==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]; + 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){ +SQLITE_PRIVATE u8 sqlite3StrIHash(const char* z) { u8 h = 0; - if( z==0 ) return 0; - while( z[0] ){ + if (z == 0) + return 0; + while (z[0]) { h += UpperToLower[(unsigned char)z[0]]; z++; } @@ -33651,33 +33340,26 @@ SQLITE_PRIVATE u8 sqlite3StrIHash(const char *z){ ** ** This routine only works for values of E between 1 and 341. */ -static LONGDOUBLE_TYPE sqlite3Pow10(int E){ +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 - }; + 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]; + 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; + while (1) { + if (E & 1) + r *= x; E >>= 1; - if( E==0 ) break; + if (E == 0) + break; x *= x; } return r; @@ -33716,124 +33398,137 @@ static LONGDOUBLE_TYPE sqlite3Pow10(int E){ #if defined(_MSC_VER) #pragma warning(disable : 4756) #endif -SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 enc){ +SQLITE_PRIVATE int sqlite3AtoF(const char* z, double* pResult, int length, u8 enc) { #ifndef SQLITE_OMIT_FLOATING_POINT int incr; - const char *zEnd; + 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 */ + 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 */ + 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; + 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 ){ + if (enc == SQLITE_UTF8) { incr = 1; zEnd = z + length; - }else{ + } 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; + while (z < zEnd && sqlite3Isspace(*z)) + z += incr; + if (z >= zEnd) + return 0; /* get sign of significand */ - if( *z=='-' ){ + if (*z == '-') { sign = -1; - z+=incr; - }else if( *z=='+' ){ - z+=incr; + z += incr; + } else if (*z == '+') { + z += incr; } /* copy max significant digits to significand */ - while( z=((LARGEST_INT64-9)/10) ){ + while (z < zEnd && sqlite3Isdigit(*z)) { + s = s * 10 + (*z - '0'); + z += incr; + nDigit++; + if (s >= ((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 (z >= zEnd) + goto do_atof_calc; /* if decimal point is present */ - if( *z=='.' ){ - z+=incr; + 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 (z >= zEnd) + goto do_atof_calc; /* if exponent is present */ - if( *z=='e' || *z=='E' ){ - z+=incr; + 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*/ + if (z >= zEnd) + goto do_atof_calc; /*PREVENTS-HARMLESS-OVERREAD*/ /* get sign of exponent */ - if( *z=='-' ){ + if (*z == '-') { esign = -1; - z+=incr; - }else if( *z=='+' ){ - z+=incr; + 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*/ + while (e > 0) { /*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*/ + } else { + if (s % 10 != 0) + break; /*OPTIMIZATION-IF-FALSE*/ s /= 10; } e--; } /* adjust the sign of significand */ - s = sign<0 ? -s : s; + s = sign < 0 ? -s : s; - if( e==0 ){ /*OPTIMIZATION-IF-TRUE*/ + if (e == 0) { /*OPTIMIZATION-IF-TRUE*/ result = (double)s; - }else{ + } 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 ){ + 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{ + } else { result = s * scale; result *= 1.0e+308; } - }else{ assert( e>=342 ); - if( esign<0 ){ - result = 0.0*s; - }else{ + } else { + assert(e >= 342); + if (esign < 0) { + result = 0.0 * s; + } else { #ifdef INFINITY - result = INFINITY*s; + result = INFINITY * s; #else - result = 1e308*1e308*s; /* Infinity */ + result = 1e308 * 1e308 * s; /* Infinity */ #endif } } - }else{ + } else { LONGDOUBLE_TYPE scale = sqlite3Pow10(e); - if( esign<0 ){ + if (esign < 0) { result = s / scale; - }else{ + } else { result = s * scale; } } @@ -33895,11 +33593,11 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 en *pResult = result; /* return true if number and no extra non-whitespace chracters after */ - if( z==zEnd && nDigit>0 && eValid && eType>0 ){ + if (z == zEnd && nDigit > 0 && eValid && eType > 0) { return eType; - }else if( eType>=2 && (eType==3 || eValid) && nDigit>0 ){ + } else if (eType >= 2 && (eType == 3 || eValid) && nDigit > 0) { return -1; - }else{ + } else { return 0; } #else @@ -33915,23 +33613,24 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 en ** ** The caller must ensure that zOut[] is at least 21 bytes in size. */ -SQLITE_PRIVATE void sqlite3Int64ToText(i64 v, char *zOut){ +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{ + 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); + 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); } /* @@ -33948,19 +33647,19 @@ SQLITE_PRIVATE void sqlite3Int64ToText(i64 v, char *zOut){ ** ** will return -8. */ -static int compare2pow63(const char *zNum, int incr){ +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; + /* 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) ); + if (c == 0) { + c = zNum[18 * incr] - '8'; + testcase(c == (-1)); + testcase(c == 0); + testcase(c == (+1)); } return c; } @@ -33981,91 +33680,95 @@ static int compare2pow63(const char *zNum, int incr){ ** 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){ +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 ){ + 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{ + } 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 ){ + while (zNum < zEnd && zNum[0] == '0') { + zNum += incr; + } /* Skip leading zeros. */ + for (i = 0; &zNum[i] < zEnd && (c = zNum[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 ){ + } else if (neg) { *pNum = -(i64)u; - }else{ + } else { *pNum = (i64)u; } rc = 0; - if( i==0 && zStart==zNum ){ /* No digits */ + if (i == 0 && zStart == zNum) { /* No digits */ rc = -1; - }else if( nonNum ){ /* UTF16 with high-order bytes non-zero */ + } 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 ){ + c = i > 19 * incr ? 1 : compare2pow63(zNum, incr); + if (c < 0) { /* zNum is less than 9223372036854775808 so it fits */ - assert( u<=LARGEST_INT64 ); + assert(u <= LARGEST_INT64); return rc; - }else{ + } else { *pNum = neg ? SMALLEST_INT64 : LARGEST_INT64; - if( c>0 ){ + if (c > 0) { /* zNum is greater than 9223372036854775808 so it overflows */ return 2; - }else{ + } else { /* zNum is exactly 9223372036854775808. Fits if negative. The ** special case 2 overflow if positive */ - assert( u-1==LARGEST_INT64 ); + assert(u - 1 == LARGEST_INT64); return neg ? rc : 3; } } @@ -34084,20 +33787,19 @@ SQLITE_PRIVATE int sqlite3Atoi64(const char *zNum, i64 *pNum, int length, u8 enc ** 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){ +SQLITE_PRIVATE int sqlite3DecOrHexToI64(const char* z, i64* pOut) { #ifndef SQLITE_OMIT_HEX_INTEGER - if( z[0]=='0' - && (z[1]=='x' || z[1]=='X') - ){ + 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]); + 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 + return (z[k] == 0 && k - i <= 16) ? 0 : 2; + } else #endif /* SQLITE_OMIT_HEX_INTEGER */ { return sqlite3Atoi64(z, pOut, sqlite3Strlen30(z), SQLITE_UTF8); @@ -34114,39 +33816,39 @@ SQLITE_PRIVATE int sqlite3DecOrHexToI64(const char *z, i64 *pOut){ ** This is different from sqlite3Atoi64() which requires the ** input number to be zero-terminated. */ -SQLITE_PRIVATE int sqlite3GetInt32(const char *zNum, int *pValue){ +SQLITE_PRIVATE int sqlite3GetInt32(const char* zNum, int* pValue) { sqlite_int64 v = 0; int i, c; int neg = 0; - if( zNum[0]=='-' ){ + if (zNum[0] == '-') { neg = 1; zNum++; - }else if( zNum[0]=='+' ){ + } else if (zNum[0] == '+') { zNum++; } #ifndef SQLITE_OMIT_HEX_INTEGER - else if( zNum[0]=='0' - && (zNum[1]=='x' || zNum[1]=='X') - && sqlite3Isxdigit(zNum[2]) - ){ + 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]); + 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 ){ + if ((u & 0x80000000) == 0 && sqlite3Isxdigit(zNum[i]) == 0) { memcpy(pValue, &u, 4); return 1; - }else{ + } 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; + 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: @@ -34154,15 +33856,15 @@ SQLITE_PRIVATE int sqlite3GetInt32(const char *zNum, int *pValue){ ** 1234567890 ** 2^31 -> 2147483648 */ - testcase( i==10 ); - if( i>10 ){ + testcase(i == 10); + if (i > 10) { return 0; } - testcase( v-neg==2147483647 ); - if( v-neg>2147483647 ){ + testcase(v - neg == 2147483647); + if (v - neg > 2147483647) { return 0; } - if( neg ){ + if (neg) { v = -v; } *pValue = (int)v; @@ -34173,7 +33875,7 @@ SQLITE_PRIVATE int sqlite3GetInt32(const char *zNum, int *pValue){ ** 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){ +SQLITE_PRIVATE int sqlite3Atoi(const char* z) { int x = 0; sqlite3GetInt32(z, &x); return x; @@ -34185,14 +33887,20 @@ SQLITE_PRIVATE int sqlite3Atoi(const char *z){ ** ** Only decimal notation is accepted. */ -SQLITE_PRIVATE int sqlite3GetUInt32(const char *z, u32 *pI){ +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; } + 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; } - if( i==0 || z[i]!=0 ){ *pI = 0; return 0; } *pI = (u32)v; return 1; } @@ -34226,41 +33934,41 @@ SQLITE_PRIVATE int sqlite3GetUInt32(const char *z, u32 *pI){ ** 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){ +static int SQLITE_NOINLINE putVarint64(unsigned char* p, u64 v) { int i, j, n; u8 buf[10]; - if( v & (((u64)0xff000000)<<32) ){ + if (v & (((u64)0xff000000) << 32)) { p[8] = (u8)v; v >>= 8; - for(i=7; i>=0; i--){ + for (i = 7; i >= 0; i--) { p[i] = (u8)((v & 0x7f) | 0x80); v >>= 7; } return 9; } n = 0; - do{ + do { buf[n++] = (u8)((v & 0x7f) | 0x80); v >>= 7; - }while( v!=0 ); + } while (v != 0); buf[0] &= 0x7f; - assert( n<=9 ); - for(i=0, j=n-1; j>=0; j--, i++){ + 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; +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; + if (v <= 0x3fff) { + p[0] = ((v >> 7) & 0x7f) | 0x80; + p[1] = v & 0x7f; return 2; } - return putVarint64(p,v); + return putVarint64(p, v); } /* @@ -34272,40 +33980,38 @@ SQLITE_PRIVATE int sqlite3PutVarint(unsigned char *p, u64 v){ ** ** SLOT_4_2_0 A mask for (0x7f<<28) | SLOT_2_0 */ -#define SLOT_2_0 0x001fc07f -#define SLOT_4_2_0 0xf01fc07f - +#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; +SQLITE_PRIVATE u8 sqlite3GetVarint(const unsigned char* p, u64* v) { + u32 a, b, s; - if( ((signed char*)p)[0]>=0 ){ + if (((signed char*)p)[0] >= 0) { *v = *p; return 1; } - if( ((signed char*)p)[1]>=0 ){ - *v = ((u32)(p[0]&0x7f)<<7) | p[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)) ); + assert(SLOT_2_0 == ((0x7f << 14) | (0x7f))); + assert(SLOT_4_2_0 == ((0xfU << 28) | (0x7f << 14) | (0x7f))); - a = ((u32)p[0])<<14; + a = ((u32)p[0]) << 14; b = p[1]; p += 2; a |= *p; /* a: p0<<14 | p2 (unmasked) */ - if (!(a&0x80)) - { + if (!(a & 0x80)) { a &= SLOT_2_0; b &= 0x7f; - b = b<<7; + b = b << 7; a |= b; *v = a; return 3; @@ -34314,15 +34020,14 @@ SQLITE_PRIVATE u8 sqlite3GetVarint(const unsigned char *p, u64 *v){ /* CSE1 from below */ a &= SLOT_2_0; p++; - b = b<<14; + b = b << 14; b |= *p; /* b: p1<<14 | p3 (unmasked) */ - if (!(b&0x80)) - { + if (!(b & 0x80)) { b &= SLOT_2_0; /* moved CSE1 up */ /* a &= (0x7f<<14)|(0x7f); */ - a = a<<7; + a = a << 7; a |= b; *v = a; return 4; @@ -34338,94 +34043,90 @@ SQLITE_PRIVATE u8 sqlite3GetVarint(const unsigned char *p, u64 *v){ /* s: p0<<14 | p2 (masked) */ p++; - a = a<<14; + a = a << 14; a |= *p; /* a: p0<<28 | p2<<14 | p4 (unmasked) */ - if (!(a&0x80)) - { + 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; + b = b << 7; a |= b; - s = s>>18; - *v = ((u64)s)<<32 | a; + 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 = s << 7; s |= b; /* s: p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ p++; - b = b<<14; + b = b << 14; b |= *p; /* b: p1<<28 | p3<<14 | p5 (unmasked) */ - if (!(b&0x80)) - { + 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 = a << 7; a |= b; - s = s>>18; - *v = ((u64)s)<<32 | a; + s = s >> 18; + *v = ((u64)s) << 32 | a; return 6; } p++; - a = a<<14; + a = a << 14; a |= *p; /* a: p2<<28 | p4<<14 | p6 (unmasked) */ - if (!(a&0x80)) - { + if (!(a & 0x80)) { a &= SLOT_4_2_0; b &= SLOT_2_0; - b = b<<7; + b = b << 7; a |= b; - s = s>>11; - *v = ((u64)s)<<32 | a; + s = s >> 11; + *v = ((u64)s) << 32 | a; return 7; } /* CSE2 from below */ a &= SLOT_2_0; p++; - b = b<<14; + b = b << 14; b |= *p; /* b: p3<<28 | p5<<14 | p7 (unmasked) */ - if (!(b&0x80)) - { + if (!(b & 0x80)) { b &= SLOT_4_2_0; /* moved CSE2 up */ /* a &= (0x7f<<14)|(0x7f); */ - a = a<<7; + a = a << 7; a |= b; - s = s>>4; - *v = ((u64)s)<<32 | a; + s = s >> 4; + *v = ((u64)s) << 32 | a; return 8; } p++; - a = a<<15; + 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; + b = b << 8; a |= b; - s = s<<4; + s = s << 4; b = p[-4]; b &= 0x7f; - b = b>>3; + b = b >> 3; s |= b; - *v = ((u64)s)<<32 | a; + *v = ((u64)s) << 32 | a; return 9; } @@ -34441,16 +34142,15 @@ SQLITE_PRIVATE u8 sqlite3GetVarint(const unsigned char *p, u64 *v){ ** 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; +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)) - { + if (!(a & 0x80)) { /* Values between 0 and 127 */ *v = a; return 1; @@ -34461,26 +34161,24 @@ SQLITE_PRIVATE u8 sqlite3GetVarint32(const unsigned char *p, u32 *v){ p++; b = *p; /* b: p1 (unmasked) */ - if (!(b&0x80)) - { + if (!(b & 0x80)) { /* Values between 128 and 16383 */ a &= 0x7f; - a = a<<7; + a = a << 7; *v = a | b; return 2; } /* The 3-byte case */ p++; - a = a<<14; + a = a << 14; a |= *p; /* a: p0<<14 | p2 (unmasked) */ - if (!(a&0x80)) - { + if (!(a & 0x80)) { /* Values between 16384 and 2097151 */ - a &= (0x7f<<14)|(0x7f); + a &= (0x7f << 14) | (0x7f); b &= 0x7f; - b = b<<7; + b = b << 7; *v = a | b; return 3; } @@ -34499,11 +34197,11 @@ SQLITE_PRIVATE u8 sqlite3GetVarint32(const unsigned char *p, u32 *v){ u64 v64; u8 n; - n = sqlite3GetVarint(p-2, &v64); - assert( n>3 && n<=9 ); - if( (v64 & SQLITE_MAX_U32)!=v64 ){ + n = sqlite3GetVarint(p - 2, &v64); + assert(n > 3 && n <= 9); + if ((v64 & SQLITE_MAX_U32) != v64) { *v = 0xffffffff; - }else{ + } else { *v = (u32)v64; } return n; @@ -34515,29 +34213,27 @@ SQLITE_PRIVATE u8 sqlite3GetVarint32(const unsigned char *p, u32 *v){ ** slightly faster, but it is also larger and much harder to test. */ p++; - b = b<<14; + b = b << 14; b |= *p; /* b: p1<<14 | p3 (unmasked) */ - if (!(b&0x80)) - { + if (!(b & 0x80)) { /* Values between 2097152 and 268435455 */ - b &= (0x7f<<14)|(0x7f); - a &= (0x7f<<14)|(0x7f); - a = a<<7; + b &= (0x7f << 14) | (0x7f); + a &= (0x7f << 14) | (0x7f); + a = a << 7; *v = a | b; return 4; } p++; - a = a<<14; + a = a << 14; a |= *p; /* a: p0<<28 | p2<<14 | p4 (unmasked) */ - if (!(a&0x80)) - { + if (!(a & 0x80)) { /* Values between 268435456 and 34359738367 */ a &= SLOT_4_2_0; b &= SLOT_4_2_0; - b = b<<7; + b = b << 7; *v = a | b; return 5; } @@ -34552,7 +34248,7 @@ SQLITE_PRIVATE u8 sqlite3GetVarint32(const unsigned char *p, u32 *v){ p -= 4; n = sqlite3GetVarint(p, &v64); - assert( n>5 && n<=9 ); + assert(n > 5 && n <= 9); *v = (u32)v64; return n; } @@ -34563,65 +34259,64 @@ SQLITE_PRIVATE u8 sqlite3GetVarint32(const unsigned char *p, u32 *v){ ** Return the number of bytes that will be needed to store the given ** 64-bit integer. */ -SQLITE_PRIVATE int sqlite3VarintLen(u64 v){ +SQLITE_PRIVATE int sqlite3VarintLen(u64 v) { int i; - for(i=1; (v >>= 7)!=0; i++){ assert( i<10 ); } + 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 +SQLITE_PRIVATE u32 sqlite3Get4byte(const u8* p) { +#if SQLITE_BYTEORDER == 4321 u32 x; - memcpy(&x,p,4); + memcpy(&x, p, 4); return x; -#elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 +#elif SQLITE_BYTEORDER == 1234 && GCC_VERSION >= 4003000 u32 x; - memcpy(&x,p,4); + memcpy(&x, p, 4); return __builtin_bswap32(x); -#elif SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 +#elif SQLITE_BYTEORDER == 1234 && MSVC_VERSION >= 1300 u32 x; - memcpy(&x,p,4); + 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]; + 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 +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 + memcpy(p, &x, 4); +#elif SQLITE_BYTEORDER == 1234 && MSVC_VERSION >= 1300 u32 x = _byteswap_ulong(v); - memcpy(p,&x,4); + memcpy(p, &x, 4); #else - p[0] = (u8)(v>>24); - p[1] = (u8)(v>>16); - p[2] = (u8)(v>>8); + 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') ); +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)); + h += 9 * (1 & (h >> 6)); #endif #ifdef SQLITE_EBCDIC - h += 9*(1&~(h>>4)); + h += 9 * (1 & ~(h >> 4)); #endif return (u8)(h & 0xf); } @@ -34633,17 +34328,17 @@ SQLITE_PRIVATE u8 sqlite3HexToInt(int h){ ** 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; +SQLITE_PRIVATE void* sqlite3HexToBlob(sqlite3* db, const char* z, int n) { + char* zBlob; int i; - zBlob = (char *)sqlite3DbMallocRawNN(db, n/2 + 1); + 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 ); + if (eOpenState != SQLITE_STATE_OPEN) { + if (sqlite3SafetyCheckSickOrOk(db)) { + testcase(sqlite3GlobalConfig.xLog != 0); logBadConnection("unopened"); } return 0; - }else{ + } else { return 1; } } -SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3 *db){ +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 ); + if (eOpenState != SQLITE_STATE_SICK && eOpenState != SQLITE_STATE_OPEN && eOpenState != SQLITE_STATE_BUSY) { + testcase(sqlite3GlobalConfig.xLog != 0); logBadConnection("invalid"); return 0; - }else{ + } else { return 1; } } @@ -34712,59 +34402,71 @@ SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3 *db){ ** 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) +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; + 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) +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; + 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{ + } else { return sqlite3AddInt64(pA, -iB); } #endif } -SQLITE_PRIVATE int sqlite3MulInt64(i64 *pA, i64 iB){ -#if GCC_VERSION>=5004000 && !defined(__INTEL_COMPILER) +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; + if (iB > 0) { + if (iA > LARGEST_INT64 / iB) + return 1; + if (iA < SMALLEST_INT64 / iB) + return 1; + } else if (iB < 0) { + if (iA > 0) { + if (iB < SMALLEST_INT64 / iA) + return 1; + } else if (iA < 0) { + if (iB == SMALLEST_INT64) + return 1; + if (iA == SMALLEST_INT64) + return 1; + if (-iA > LARGEST_INT64 / -iB) + return 1; + } + } + *pA = iA * iB; return 0; #endif } @@ -34773,9 +34475,11 @@ SQLITE_PRIVATE int sqlite3MulInt64(i64 *pA, i64 iB){ ** 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; +SQLITE_PRIVATE int sqlite3AbsInt32(int x) { + if (x >= 0) + return x; + if (x == (int)0x80000000) + return 0x7fffffff; return -x; } @@ -34797,15 +34501,17 @@ SQLITE_PRIVATE int sqlite3AbsInt32(int x){ ** 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) ) +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); + 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 @@ -34816,26 +34522,30 @@ SQLITE_PRIVATE void sqlite3FileSuffix3(const char *zBaseFilename, char *z){ ** value. ** */ -SQLITE_PRIVATE LogEst sqlite3LogEstAdd(LogEst a, LogEst b){ +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 */ + 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]; + 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]; } } @@ -34843,51 +34553,66 @@ SQLITE_PRIVATE LogEst sqlite3LogEstAdd(LogEst a, LogEst b){ ** 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 }; +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 + 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; + y += i * 10; x >>= i; #else - while( x>255 ){ y += 40; x >>= 4; } /*OPTIMIZATION-IF-TRUE*/ - while( x>15 ){ y += 10; x >>= 1; } + while (x > 255) { + y += 40; + x >>= 4; + } /*OPTIMIZATION-IF-TRUE*/ + while (x > 15) { + y += 10; + x >>= 1; + } #endif } - return a[x&7] + y - 10; + 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){ +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); + 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; + e = (a >> 52) - 1022; + return e * 10; } /* ** Convert a LogEst into an integer. */ -SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst x){ +SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst x) { u64 n; - n = x%10; + 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); + 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); } /* @@ -34926,34 +34651,35 @@ SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst x){ ** 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 */ +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] ){ + 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; + 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] ); + 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; @@ -34964,15 +34690,17 @@ SQLITE_PRIVATE VList *sqlite3VListAdd( ** 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){ +SQLITE_PRIVATE const char* sqlite3VListNumToName(VList* pIn, int iVal) { int i, mx; - if( pIn==0 ) return 0; + 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( ifirst = 0; pNew->count = 0; pNew->htsize = 0; @@ -35029,17 +34759,17 @@ SQLITE_PRIVATE void sqlite3HashInit(Hash *pNew){ ** 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 */ +SQLITE_PRIVATE void sqlite3HashClear(Hash* pH) { + HashElem* elem; /* For looping over all elements of the table */ - assert( pH!=0 ); + 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; + while (elem) { + HashElem* next_elem = elem->next; sqlite3_free(elem); elem = next_elem; } @@ -35049,10 +34779,10 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash *pH){ /* ** The hashing function. */ -static unsigned int strHash(const char *z){ +static unsigned int strHash(const char* z) { unsigned int h = 0; unsigned char c; - while( (c = (unsigned char)*z++)!=0 ){ /*OPTIMIZATION-IF-TRUE*/ + 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. */ @@ -35062,53 +34792,56 @@ static unsigned int strHash(const char *z){ 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 ){ +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{ + } else { pHead = 0; } - if( pHead ){ + if (pHead) { pNew->next = pHead; pNew->prev = pHead->prev; - if( pHead->prev ){ pHead->prev->next = pNew; } - else { pH->first = pNew; } + if (pHead->prev) { + pHead->prev->next = pNew; + } else { + pH->first = pNew; + } pHead->prev = pNew; - }else{ + } else { pNew->next = pH->first; - if( pH->first ){ pH->first->prev = pNew; } + 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 */ +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 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; + if (new_size == pH->htsize) + return 0; #endif /* The inability to allocates space for a larger hash table is @@ -35120,15 +34853,16 @@ static int rehash(Hash *pH, unsigned int new_size){ ** may be larger than the requested amount). */ sqlite3BeginBenignMalloc(); - new_ht = (struct _ht *)sqlite3Malloc( new_size*sizeof(struct _ht) ); + new_ht = (struct _ht*)sqlite3Malloc(new_size * sizeof(struct _ht)); sqlite3EndBenignMalloc(); - if( new_ht==0 ) return 0; + 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){ + 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); @@ -35141,31 +34875,31 @@ static int rehash(Hash *pH, unsigned int new_size){ ** 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 }; +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; + 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{ + } else { h = 0; elem = pH->first; count = pH->count; } - if( pHash ) *pHash = h; - while( count-- ){ - assert( elem!=0 ); - if( sqlite3StrICmp(elem->pKey,pKey)==0 ){ + if (pHash) + *pHash = h; + while (count--) { + assert(elem != 0); + if (sqlite3StrICmp(elem->pKey, pKey) == 0) { return elem; } elem = elem->next; @@ -35176,33 +34910,32 @@ static HashElem *findElementWithHash( /* 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 ){ +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{ + } else { pH->first = elem->next; } - if( elem->next ){ + if (elem->next) { elem->next->prev = elem->prev; } - if( pH->ht ){ + if (pH->ht) { pEntry = &pH->ht[h]; - if( pEntry->chain==elem ){ + if (pEntry->chain == elem) { pEntry->chain = elem->next; } - assert( pEntry->count>0 ); + assert(pEntry->count > 0); pEntry->count--; } - sqlite3_free( elem ); + sqlite3_free(elem); pH->count--; - if( pH->count==0 ){ - assert( pH->first==0 ); - assert( pH->count==0 ); + if (pH->count == 0) { + assert(pH->first == 0); + assert(pH->count == 0); sqlite3HashClear(pH); } } @@ -35211,9 +34944,9 @@ static void removeElementGivenHash( ** 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 ); +SQLITE_PRIVATE void* sqlite3HashFind(const Hash* pH, const char* pKey) { + assert(pH != 0); + assert(pKey != 0); return findElementWithHash(pH, pKey, 0)->data; } @@ -35231,33 +34964,35 @@ SQLITE_PRIVATE void *sqlite3HashFind(const Hash *pH, const char *pKey){ ** 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{ +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; + 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 ); + if (pH->count >= 10 && pH->count > 2 * pH->htsize) { + if (rehash(pH, pH->count * 2)) { + assert(pH->htsize > 0); h = strHash(pKey) % pH->htsize; } } @@ -35269,203 +35004,201 @@ SQLITE_PRIVATE void *sqlite3HashInsert(Hash *pH, const char *pKey, void *data){ /************** 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_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(""), +#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]; } @@ -35519,7 +35252,7 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ ** plus implementations of sqlite3_os_init() and sqlite3_os_end(). */ /* #include "sqliteInt.h" */ -#if SQLITE_OS_UNIX /* This file is used on unix only */ +#if SQLITE_OS_UNIX /* This file is used on unix only */ /* ** There are various methods for file locking used for concurrency @@ -35539,45 +35272,45 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ ** 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 +#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 +#define HAVE_PREAD 1 +#define HAVE_PWRITE 1 #endif #if defined(HAVE_PREAD64) && defined(HAVE_PWRITE64) -# undef USE_PREAD -# define USE_PREAD64 1 +#undef USE_PREAD +#define USE_PREAD64 1 #elif defined(HAVE_PREAD) && defined(HAVE_PWRITE) -# undef USE_PREAD64 -# define USE_PREAD 1 +#undef USE_PREAD64 +#define USE_PREAD 1 #endif /* ** standard include files. */ -#include -#include #include #include +#include +#include #include /* #include */ -#include #include -#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 -# include +#include +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE > 0 +#include #endif #if SQLITE_ENABLE_LOCKING_STYLE /* # include */ -# include -# include +#include +#include #endif /* SQLITE_ENABLE_LOCKING_STYLE */ /* @@ -35593,39 +35326,37 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ ** -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 +#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 +#include +#include #endif /* OS_VXWORKS */ #if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE -# include +#include #endif #ifdef HAVE_UTIME -# include +#include #endif /* ** Allowed values of unixFile.fsFlags */ -#define SQLITE_FSFLAGS_IS_MSDOS 0x1 +#define SQLITE_FSFLAGS_IS_MSDOS 0x1 /* ** If we are to be thread-safe, include the pthreads header. @@ -35638,14 +35369,14 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ ** Default permissions when creating a new file */ #ifndef SQLITE_DEFAULT_FILE_PERMISSIONS -# define SQLITE_DEFAULT_FILE_PERMISSIONS 0644 +#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 +#define SQLITE_DEFAULT_PROXYDIR_PERMISSIONS 0755 #endif /* @@ -35660,19 +35391,19 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* Always cast the getpid() return type for compatibility with ** kernel modules in VxWorks. */ -#define osGetpid(X) (pid_t)getpid() +#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)) +#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 */ +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 @@ -35681,9 +35412,9 @@ typedef struct UnixUnusedFd UnixUnusedFd; /* An unused file descriptor */ ** 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 */ + int fd; /* File descriptor to close */ + int flags; /* Flags this file descriptor was opened with */ + UnixUnusedFd* pNext; /* Next unused file descriptor on same file */ }; /* @@ -35692,38 +35423,38 @@ struct UnixUnusedFd { */ 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 */ + 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() */ + int openFlags; /* The flags specified at open() */ #endif #if SQLITE_ENABLE_LOCKING_STYLE || defined(__APPLE__) - unsigned fsFlags; /* cached details from statfs() */ + unsigned fsFlags; /* cached details from statfs() */ #endif #ifdef SQLITE_ENABLE_SETLK_TIMEOUT - unsigned iBusyTimeout; /* Wait this many millisec on locks */ + unsigned iBusyTimeout; /* Wait this many millisec on locks */ #endif #if OS_VXWORKS - struct vxworksFileId *pId; /* Unique file ID */ + struct vxworksFileId* pId; /* Unique file ID */ #endif #ifdef SQLITE_DEBUG /* The next group of variables are used to track whether or not the @@ -35733,9 +35464,9 @@ struct unixFile { ** 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 */ + 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 @@ -35756,18 +35487,18 @@ 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 */ +#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 */ +#define UNIXFILE_DIRSYNC 0x08 /* Directory sync needed */ #else -# define UNIXFILE_DIRSYNC 0x00 +#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 */ +#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 @@ -35778,17 +35509,17 @@ static pid_t randomnessPid = 0; ** Define various macros that are missing from some systems. */ #ifndef O_LARGEFILE -# define O_LARGEFILE 0 +#define O_LARGEFILE 0 #endif #ifdef SQLITE_DISABLE_LFS -# undef O_LARGEFILE -# define O_LARGEFILE 0 +#undef O_LARGEFILE +#define O_LARGEFILE 0 #endif #ifndef O_NOFOLLOW -# define O_NOFOLLOW 0 +#define O_NOFOLLOW 0 #endif #ifndef O_BINARY -# define O_BINARY 0 +#define O_BINARY 0 #endif /* @@ -35805,11 +35536,11 @@ static pid_t randomnessPid = 0; ** 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 +#if defined(__linux__) && defined(_GNU_SOURCE) +#define HAVE_MREMAP 1 +#else +#define HAVE_MREMAP 0 +#endif #endif /* @@ -35817,23 +35548,22 @@ static pid_t randomnessPid = 0; ** is the 32-bit version, even if _FILE_OFFSET_BITS=64 is defined. */ #ifdef __ANDROID__ -# define lseek lseek64 +#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_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,...). @@ -35842,7 +35572,7 @@ static pid_t randomnessPid = 0; ** 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){ +static int posixOpen(const char* zFile, int flags, int mode) { return open(zFile, flags, mode); } @@ -35857,24 +35587,24 @@ static int unixGetpagesize(void); ** to all overrideable system calls. */ static struct unix_syscall { - const char *zName; /* Name of the system call */ + 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) + {"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) + {"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) + {"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) + {"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) + {"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 @@ -35883,156 +35613,153 @@ static struct unix_syscall { ** DJGPP. But it is DOS - what did you expect? */ #ifdef __DJGPP__ - { "fstat", 0, 0 }, -#define osFstat(a,b,c) 0 + {"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) + {"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) + {"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) + {"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) + {"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 }, + {"pread", (sqlite3_syscall_ptr)pread, 0}, #else - { "pread", (sqlite3_syscall_ptr)0, 0 }, + {"pread", (sqlite3_syscall_ptr)0, 0}, #endif -#define osPread ((ssize_t(*)(int,void*,size_t,off_t))aSyscall[9].pCurrent) +#define osPread ((ssize_t(*)(int, void*, size_t, off_t))aSyscall[9].pCurrent) #if defined(USE_PREAD64) - { "pread64", (sqlite3_syscall_ptr)pread64, 0 }, + {"pread64", (sqlite3_syscall_ptr)pread64, 0}, #else - { "pread64", (sqlite3_syscall_ptr)0, 0 }, + {"pread64", (sqlite3_syscall_ptr)0, 0}, #endif -#define osPread64 ((ssize_t(*)(int,void*,size_t,off64_t))aSyscall[10].pCurrent) +#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) + {"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 }, + {"pwrite", (sqlite3_syscall_ptr)pwrite, 0}, #else - { "pwrite", (sqlite3_syscall_ptr)0, 0 }, + {"pwrite", (sqlite3_syscall_ptr)0, 0}, #endif -#define osPwrite ((ssize_t(*)(int,const void*,size_t,off_t))\ - aSyscall[12].pCurrent) +#define osPwrite ((ssize_t(*)(int, const void*, size_t, off_t))aSyscall[12].pCurrent) #if defined(USE_PREAD64) - { "pwrite64", (sqlite3_syscall_ptr)pwrite64, 0 }, + {"pwrite64", (sqlite3_syscall_ptr)pwrite64, 0}, #else - { "pwrite64", (sqlite3_syscall_ptr)0, 0 }, + {"pwrite64", (sqlite3_syscall_ptr)0, 0}, #endif -#define osPwrite64 ((ssize_t(*)(int,const void*,size_t,off64_t))\ - aSyscall[13].pCurrent) +#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) + {"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 }, + {"fallocate", (sqlite3_syscall_ptr)posix_fallocate, 0}, #else - { "fallocate", (sqlite3_syscall_ptr)0, 0 }, + {"fallocate", (sqlite3_syscall_ptr)0, 0}, #endif -#define osFallocate ((int(*)(int,off_t,off_t))aSyscall[15].pCurrent) +#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) + {"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) + {"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) + {"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) + {"rmdir", (sqlite3_syscall_ptr)rmdir, 0}, +#define osRmdir ((int (*)(const char*))aSyscall[19].pCurrent) #if defined(HAVE_FCHOWN) - { "fchown", (sqlite3_syscall_ptr)fchown, 0 }, + {"fchown", (sqlite3_syscall_ptr)fchown, 0}, #else - { "fchown", (sqlite3_syscall_ptr)0, 0 }, + {"fchown", (sqlite3_syscall_ptr)0, 0}, #endif -#define osFchown ((int(*)(int,uid_t,gid_t))aSyscall[20].pCurrent) +#define osFchown ((int (*)(int, uid_t, gid_t))aSyscall[20].pCurrent) #if defined(HAVE_FCHOWN) - { "geteuid", (sqlite3_syscall_ptr)geteuid, 0 }, + {"geteuid", (sqlite3_syscall_ptr)geteuid, 0}, #else - { "geteuid", (sqlite3_syscall_ptr)0, 0 }, + {"geteuid", (sqlite3_syscall_ptr)0, 0}, #endif -#define osGeteuid ((uid_t(*)(void))aSyscall[21].pCurrent) +#define osGeteuid ((uid_t(*)(void))aSyscall[21].pCurrent) -#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 - { "mmap", (sqlite3_syscall_ptr)mmap, 0 }, +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE > 0 + {"mmap", (sqlite3_syscall_ptr)mmap, 0}, #else - { "mmap", (sqlite3_syscall_ptr)0, 0 }, + {"mmap", (sqlite3_syscall_ptr)0, 0}, #endif -#define osMmap ((void*(*)(void*,size_t,int,int,int,off_t))aSyscall[22].pCurrent) +#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 }, +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE > 0 + {"munmap", (sqlite3_syscall_ptr)munmap, 0}, #else - { "munmap", (sqlite3_syscall_ptr)0, 0 }, + {"munmap", (sqlite3_syscall_ptr)0, 0}, #endif -#define osMunmap ((int(*)(void*,size_t))aSyscall[23].pCurrent) +#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 }, +#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 }, + {"mremap", (sqlite3_syscall_ptr)0, 0}, #endif -#define osMremap ((void*(*)(void*,size_t,size_t,int,...))aSyscall[24].pCurrent) +#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 }, +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE > 0 + {"getpagesize", (sqlite3_syscall_ptr)unixGetpagesize, 0}, #else - { "getpagesize", (sqlite3_syscall_ptr)0, 0 }, + {"getpagesize", (sqlite3_syscall_ptr)0, 0}, #endif -#define osGetpagesize ((int(*)(void))aSyscall[25].pCurrent) +#define osGetpagesize ((int (*)(void))aSyscall[25].pCurrent) #if defined(HAVE_READLINK) - { "readlink", (sqlite3_syscall_ptr)readlink, 0 }, + {"readlink", (sqlite3_syscall_ptr)readlink, 0}, #else - { "readlink", (sqlite3_syscall_ptr)0, 0 }, + {"readlink", (sqlite3_syscall_ptr)0, 0}, #endif -#define osReadlink ((ssize_t(*)(const char*,char*,size_t))aSyscall[26].pCurrent) +#define osReadlink ((ssize_t(*)(const char*, char*, size_t))aSyscall[26].pCurrent) #if defined(HAVE_LSTAT) - { "lstat", (sqlite3_syscall_ptr)lstat, 0 }, + {"lstat", (sqlite3_syscall_ptr)lstat, 0}, #else - { "lstat", (sqlite3_syscall_ptr)0, 0 }, + {"lstat", (sqlite3_syscall_ptr)0, 0}, #endif -#define osLstat ((int(*)(const char*,struct stat*))aSyscall[27].pCurrent) +#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 +#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 }, + {"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){ +static int robustFchown(int fd, uid_t uid, gid_t gid) { #if defined(HAVE_FCHOWN) - return osGeteuid() ? 0 : osFchown(fd,uid,gid); + return osGeteuid() ? 0 : osFchown(fd, uid, gid); #else return 0; #endif @@ -36044,36 +35771,36 @@ static int robustFchown(int fd, uid_t uid, gid_t gid){ ** 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 */ -){ +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 (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; + if (fd >= SQLITE_MINIMUM_FILE_DESCRIPTOR) + break; osClose(fd); - sqlite3_log(SQLITE_WARNING, - "attempt to open \"%s\" as file descriptor %d", z, 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 (osOpen("/dev/null", O_RDONLY, m) < 0) + break; } - if( fd>=0 ){ - if( m!=0 ){ + if (fd >= 0) { + if (m != 0) { struct stat statbuf; - if( osFstat(fd, &statbuf)==0 - && statbuf.st_size==0 - && (statbuf.st_mode&0777)!=m - ){ + 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) +#if defined(FD_CLOEXEC) && (!defined(O_CLOEXEC) || O_CLOEXEC == 0) osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC); #endif } @@ -36209,13 +35935,13 @@ static int robust_open(const char *z, int f, mode_t m){ ** 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 */ +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) ); +static void unixLeaveMutex(void) { + assert(sqlite3_mutex_held(unixBigLock)); sqlite3_mutex_leave(unixBigLock); } #ifdef SQLITE_DEBUG @@ -36224,20 +35950,24 @@ static int unixMutexHeld(void) { } #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"; +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"; } @@ -36252,49 +35982,46 @@ static const char *azFileLock(int eFileLock){ ** command-line option on the compiler. This code is normally ** turned off. */ -static int lockTrace(int fd, int op, struct flock *p){ +static int lockTrace(int fd, int op, struct flock* p) { char *zOpName, *zType; int s; int savedErrno; - if( op==F_GETLK ){ + if (op == F_GETLK) { zOpName = "GETLK"; - }else if( op==F_SETLK ){ + } else if (op == F_SETLK) { zOpName = "SETLK"; - }else{ + } else { s = osFcntl(fd, op, p); sqlite3DebugPrintf("fcntl unknown %d %d %d\n", fd, op, s); return s; } - if( p->l_type==F_RDLCK ){ + if (p->l_type == F_RDLCK) { zType = "RDLCK"; - }else if( p->l_type==F_WRLCK ){ + } else if (p->l_type == F_WRLCK) { zType = "WRLCK"; - }else if( p->l_type==F_UNLCK ){ + } else if (p->l_type == F_UNLCK) { zType = "UNLCK"; - }else{ - assert( 0 ); + } else { + assert(0); } - assert( p->l_whence==SEEK_SET ); + 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) ){ + 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 ){ + if (l2.l_type == F_RDLCK) { zType = "RDLCK"; - }else if( l2.l_type==F_WRLCK ){ + } else if (l2.l_type == F_WRLCK) { zType = "WRLCK"; - }else if( l2.l_type==F_UNLCK ){ + } else if (l2.l_type == F_UNLCK) { zType = "UNLCK"; - }else{ - assert( 0 ); + } 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); + 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; @@ -36310,18 +36037,20 @@ static int lockTrace(int fd, int op, struct flock *p){ ** 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){ +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 ){ + if (sz > (sqlite3_int64)0x7FFFFFFF) { rc = SQLITE_OK; - }else + } else #endif - do{ rc = osFtruncate(h,sz); }while( rc<0 && errno==EINTR ); + do { + rc = osFtruncate(h, sz); + } while (rc < 0 && errno == EINTR); return rc; } @@ -36336,30 +36065,27 @@ static int robust_ftruncate(int h, sqlite3_int64 sz){ ** 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) ); + 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 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; + case EPERM: + return SQLITE_PERM; - default: - return sqliteIOErr; + default: + return sqliteIOErr; } } - /****************************************************************************** ****************** Begin Unique File ID Utility Used By VxWorks *************** ** @@ -36378,10 +36104,10 @@ static int sqliteErrorFromPosixError(int posixError, int sqliteIOErr) { ** 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 */ + 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 @@ -36389,7 +36115,7 @@ struct vxworksFileId { ** All unique filenames are held on a linked list headed by this ** variable: */ -static struct vxworksFileId *vxworksFileList = 0; +static struct vxworksFileId* vxworksFileList = 0; /* ** Simplify a filename into its canonical form @@ -36404,19 +36130,26 @@ static struct vxworksFileId *vxworksFileList = 0; ** 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){ +static int vxworksSimplifyName(char* z, int n) { int i, j; - while( n>1 && z[n-1]=='/' ){ n--; } - for(i=j=0; i 1 && z[n - 1] == '/') { + n--; + } + for (i = j = 0; i < n; i++) { + if (z[i] == '/') { + if (z[i + 1] == '/') + continue; + if (z[i + 1] == '.' && i + 2 < n && z[i + 2] == '/') { i += 1; continue; } - if( z[i+1]=='.' && i+30 && z[j-1]!='/' ){ j--; } - if( j>0 ){ j--; } + if (z[i + 1] == '.' && i + 3 < n && z[i + 2] == '.' && z[i + 3] == '/') { + while (j > 0 && z[j - 1] != '/') { + j--; + } + if (j > 0) { + j--; + } i += 2; continue; } @@ -36438,17 +36171,18 @@ static int vxworksSimplifyName(char *z, int n){ ** ** 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 */ +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]=='/' ); + assert(zAbsoluteName[0] == '/'); n = (int)strlen(zAbsoluteName); - pNew = sqlite3_malloc64( sizeof(*pNew) + (n+1) ); - if( pNew==0 ) return 0; + pNew = sqlite3_malloc64(sizeof(*pNew) + (n + 1)); + if (pNew == 0) + return 0; pNew->zCanonicalName = (char*)&pNew[1]; - memcpy(pNew->zCanonicalName, zAbsoluteName, n+1); + memcpy(pNew->zCanonicalName, zAbsoluteName, n + 1); n = vxworksSimplifyName(pNew->zCanonicalName, n); /* Search for an existing entry that matching the canonical name. @@ -36456,14 +36190,12 @@ static struct vxworksFileId *vxworksFindFileId(const char *zAbsoluteName){ ** 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; + 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; } } @@ -36480,14 +36212,15 @@ static struct vxworksFileId *vxworksFindFileId(const char *zAbsoluteName){ ** Decrement the reference count on a vxworksFileId object. Free ** the object when the reference count reaches zero. */ -static void vxworksReleaseFileId(struct vxworksFileId *pId){ +static void vxworksReleaseFileId(struct vxworksFileId* pId) { unixEnterMutex(); - assert( pId->nRef>0 ); + 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 ); + 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); } @@ -36497,7 +36230,6 @@ static void vxworksReleaseFileId(struct vxworksFileId *pId){ /*************** End of Unique File ID Utility Used By VxWorks **************** ******************************************************************************/ - /****************************************************************************** *************************** Posix Advisory Locking **************************** ** @@ -36593,9 +36325,9 @@ static void vxworksReleaseFileId(struct vxworksFileId *pId){ ** to locate a particular unixInodeInfo object. */ struct unixFileId { - dev_t dev; /* Device number */ + dev_t dev; /* Device number */ #if OS_VXWORKS - struct vxworksFileId *pId; /* Unique file ID for 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 @@ -36604,7 +36336,7 @@ struct unixFileId { ** 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 */ + u64 ino; /* Inode number */ #endif }; @@ -36634,23 +36366,23 @@ struct unixFileId { ** 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 */ + 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 */ + 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 */ + sem_t* pSem; /* Named POSIX semaphore */ + char aSemName[MAX_PATHNAME + 2]; /* Name of that semaphore */ #endif }; @@ -36659,7 +36391,7 @@ struct unixInodeInfo { ** ** Must hold unixBigLock in order to read or write this variable. */ -static unixInodeInfo *inodeList = 0; /* All unixInodeInfo objects */ +static unixInodeInfo* inodeList = 0; /* All unixInodeInfo objects */ #ifdef SQLITE_DEBUG /* @@ -36667,12 +36399,12 @@ static unixInodeInfo *inodeList = 0; /* All unixInodeInfo objects */ ** This routine is used only within assert() to help verify correct mutex ** usage. */ -int unixFileMutexHeld(unixFile *pFile){ - assert( pFile->pInode ); +int unixFileMutexHeld(unixFile* pFile) { + assert(pFile->pInode); return sqlite3_mutex_held(pFile->pInode->pLockMutex); } -int unixFileMutexNotheld(unixFile *pFile){ - assert( pFile->pInode ); +int unixFileMutexNotheld(unixFile* pFile) { + assert(pFile->pInode); return sqlite3_mutex_notheld(pFile->pInode->pLockMutex); } #endif @@ -36693,15 +36425,14 @@ int unixFileMutexNotheld(unixFile *pFile){ ** 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 */ +#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 @@ -36726,8 +36457,8 @@ static int unixLogErrorAtLine( */ #if defined(STRERROR_R_CHAR_P) || defined(__USE_GNU) zErr = -# endif - strerror_r(iErrno, aErr, sizeof(aErr)-1); +#endif + strerror_r(iErrno, aErr, sizeof(aErr) - 1); #elif SQLITE_THREADSAFE /* This is a threadsafe build, but strerror_r() is not available. */ @@ -36737,11 +36468,9 @@ static int unixLogErrorAtLine( zErr = strerror(iErrno); #endif - if( zPath==0 ) zPath = ""; - sqlite3_log(errcode, - "os_unix.c:%d: (%d) %s(%s) - %s", - iLine, iErrno, zFunc, zPath, zErr - ); + if (zPath == 0) + zPath = ""; + sqlite3_log(errcode, "os_unix.c:%d: (%d) %s(%s) - %s", iLine, iErrno, zFunc, zPath, zErr); return errcode; } @@ -36759,10 +36488,9 @@ static int unixLogErrorAtLine( ** 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); +static void robust_close(unixFile* pFile, int h, int lineno) { + if (osClose(h)) { + unixLogErrorAtLine(SQLITE_IOERR_CLOSE, "close", pFile ? pFile->zPath : 0, lineno); } } @@ -36770,19 +36498,19 @@ static void robust_close(unixFile *pFile, int h, int 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){ +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){ +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); @@ -36796,26 +36524,26 @@ static void closePendingFds(unixFile *pFile){ ** 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) ){ +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 ); + 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 ); + if (pInode->pPrev) { + assert(pInode->pPrev->pNext == pInode); pInode->pPrev->pNext = pInode->pNext; - }else{ - assert( inodeList==pInode ); + } else { + assert(inodeList == pInode); inodeList = pInode->pNext; } - if( pInode->pNext ){ - assert( pInode->pNext->pPrev==pInode ); + if (pInode->pNext) { + assert(pInode->pNext->pPrev == pInode); pInode->pNext->pPrev = pInode->pPrev; } sqlite3_mutex_free(pInode->pLockMutex); @@ -36833,27 +36561,27 @@ static void releaseInodeInfo(unixFile *pFile){ ** ** 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 */ +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() ); + 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 ){ + if (rc != 0) { storeLastErrno(pFile, errno); #if defined(EOVERFLOW) && defined(SQLITE_DISABLE_LFS) - if( pFile->lastErrno==EOVERFLOW ) return SQLITE_NOLFS; + if (pFile->lastErrno == EOVERFLOW) + return SQLITE_NOLFS; #endif return SQLITE_IOERR; } @@ -36869,14 +36597,16 @@ static int findInodeInfo( ** 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 ){ + 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 ){ + if (rc != 0) { storeLastErrno(pFile, errno); return SQLITE_IOERR; } @@ -36890,32 +36620,33 @@ static int findInodeInfo( #else fileId.ino = (u64)statbuf.st_ino; #endif - assert( unixMutexHeld() ); + assert(unixMutexHeld()); pInode = inodeList; - while( pInode && memcmp(&fileId, &pInode->fileId, sizeof(fileId)) ){ + while (pInode && memcmp(&fileId, &pInode->fileId, sizeof(fileId))) { pInode = pInode->pNext; } - if( pInode==0 ){ - pInode = sqlite3_malloc64( sizeof(*pInode) ); - if( pInode==0 ){ + 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 ){ + if (sqlite3GlobalConfig.bCoreMutex) { pInode->pLockMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); - if( pInode->pLockMutex==0 ){ + if (pInode->pLockMutex == 0) { sqlite3_free(pInode); return SQLITE_NOMEM_BKPT; } } pInode->nRef = 1; - assert( unixMutexHeld() ); + assert(unixMutexHeld()); pInode->pNext = inodeList; pInode->pPrev = 0; - if( inodeList ) inodeList->pPrev = pInode; + if (inodeList) + inodeList->pPrev = pInode; inodeList = pInode; - }else{ + } else { pInode->nRef++; } *ppInode = pInode; @@ -36925,18 +36656,15 @@ static int findInodeInfo( /* ** Return TRUE if pFile has been renamed or unlinked since it was first opened. */ -static int fileHasMoved(unixFile *pFile){ +static int fileHasMoved(unixFile* pFile) { #if OS_VXWORKS - return pFile->pInode!=0 && pFile->pId!=pFile->pInode->fileId.pId; + 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); + 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: ** @@ -36946,68 +36674,68 @@ static int fileHasMoved(unixFile *pFile){ ** ** Issue sqlite3_log(SQLITE_WARNING,...) messages if anything is not right. */ -static void verifyDbFile(unixFile *pFile){ +static void verifyDbFile(unixFile* pFile) { struct stat buf; int rc; /* These verifications occurs for the main database only */ - if( pFile->ctrlFlags & UNIXFILE_NOLOCK ) return; + if (pFile->ctrlFlags & UNIXFILE_NOLOCK) + return; rc = osFstat(pFile->h, &buf); - if( rc!=0 ){ + if (rc != 0) { sqlite3_log(SQLITE_WARNING, "cannot fstat db file %s", pFile->zPath); return; } - if( buf.st_nlink==0 ){ + if (buf.st_nlink == 0) { sqlite3_log(SQLITE_WARNING, "file unlinked while open: %s", pFile->zPath); return; } - if( buf.st_nlink>1 ){ + if (buf.st_nlink > 1) { sqlite3_log(SQLITE_WARNING, "multiple links to file: %s", pFile->zPath); return; } - if( fileHasMoved(pFile) ){ + 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){ +static int unixCheckReservedLock(sqlite3_file* id, int* pResOut) { int rc = SQLITE_OK; int reserved = 0; - unixFile *pFile = (unixFile*)id; + unixFile* pFile = (unixFile*)id; - SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + SimulateIOError(return SQLITE_IOERR_CHECKRESERVEDLOCK;); - assert( pFile ); - assert( pFile->eFileLock<=SHARED_LOCK ); + 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 ){ + if (pFile->pInode->eFileLock > SHARED_LOCK) { reserved = 1; } /* Otherwise see if some other process holds it. - */ + */ #ifndef __DJGPP__ - if( !reserved && !pFile->pInode->bProcessLock ){ + 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) ){ + if (osFcntl(pFile->h, F_GETLK, &lock)) { rc = SQLITE_IOERR_CHECKRESERVEDLOCK; storeLastErrno(pFile, errno); - } else if( lock.l_type!=F_UNLCK ){ + } else if (lock.l_type != F_UNLCK) { reserved = 1; } } @@ -37021,7 +36749,7 @@ static int unixCheckReservedLock(sqlite3_file *id, int *pResOut){ } /* Forward declaration*/ -static int unixSleep(sqlite3_vfs*,int); +static int unixSleep(sqlite3_vfs*, int); /* ** Set a posix-advisory-lock. @@ -37037,30 +36765,28 @@ static int unixSleep(sqlite3_vfs*,int); ** attempt to set the lock. */ #ifndef SQLITE_ENABLE_SETLK_TIMEOUT -# define osSetPosixAdvisoryLock(h,x,t) osFcntl(h,F_SETLK,x) +#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 */ -){ +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 ){ + 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); + 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. @@ -37080,27 +36806,28 @@ static int osSetPosixAdvisoryLock( ** 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){ +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 ){ + 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 ); + 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; + if (rc < 0) + return rc; pInode->bProcessLock = 1; pInode->nLock++; - }else{ + } else { rc = 0; } - }else{ + } else { rc = osSetPosixAdvisoryLock(pFile->h, pLock, pFile); } return rc; @@ -37130,7 +36857,7 @@ static int unixFileLock(unixFile *pFile, struct flock *pLock){ ** This routine will only increase a lock. Use the sqlite3OsUnlock() ** routine to lower a locking level. */ -static int unixLock(sqlite3_file *id, int eFileLock){ +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 @@ -37171,24 +36898,21 @@ static int unixLock(sqlite3_file *id, int eFileLock){ ** database. */ int rc = SQLITE_OK; - unixFile *pFile = (unixFile*)id; - unixInodeInfo *pInode; + 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))); + 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))); + if (pFile->eFileLock >= eFileLock) { + OSTRACE(("LOCK %d %s ok (already held) (unix)\n", pFile->h, azFileLock(eFileLock))); return SQLITE_OK; } @@ -37197,21 +36921,19 @@ static int unixLock(sqlite3_file *id, int eFileLock){ ** (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 ); + 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)) - ){ + if ((pFile->eFileLock != pInode->eFileLock && (pInode->eFileLock >= PENDING_LOCK || eFileLock > SHARED_LOCK))) { rc = SQLITE_BUSY; goto end_lock; } @@ -37220,52 +36942,47 @@ static int unixLock(sqlite3_file *id, int eFileLock){ ** 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 ); + 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->eFileLockeFileLock < PENDING_LOCK)) { + lock.l_type = (eFileLock == SHARED_LOCK ? F_RDLCK : F_WRLCK); lock.l_start = PENDING_BYTE; - if( unixFileLock(pFile, &lock) ){ + if (unixFileLock(pFile, &lock)) { tErrno = errno; rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); - if( rc!=SQLITE_BUSY ){ + if (rc != SQLITE_BUSY) { storeLastErrno(pFile, tErrno); } goto 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 ){ - assert( pInode->nShared==0 ); - assert( pInode->eFileLock==0 ); - assert( rc==SQLITE_OK ); + if (eFileLock == SHARED_LOCK) { + assert(pInode->nShared == 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) ){ + if (unixFileLock(pFile, &lock)) { tErrno = errno; rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); } @@ -37274,82 +36991,76 @@ static int unixLock(sqlite3_file *id, int eFileLock){ lock.l_start = PENDING_BYTE; lock.l_len = 1L; lock.l_type = F_UNLCK; - if( unixFileLock(pFile, &lock) && rc==SQLITE_OK ){ + 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 ){ + if (rc) { + if (rc != SQLITE_BUSY) { storeLastErrno(pFile, tErrno); } goto end_lock; - }else{ + } else { pFile->eFileLock = SHARED_LOCK; pInode->nLock++; pInode->nShared = 1; } - }else if( eFileLock==EXCLUSIVE_LOCK && 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{ + } 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 ); + assert(0 != pFile->eFileLock); lock.l_type = F_WRLCK; - assert( eFileLock==RESERVED_LOCK || eFileLock==EXCLUSIVE_LOCK ); - if( eFileLock==RESERVED_LOCK ){ + assert(eFileLock == RESERVED_LOCK || eFileLock == EXCLUSIVE_LOCK); + if (eFileLock == RESERVED_LOCK) { lock.l_start = RESERVED_BYTE; lock.l_len = 1L; - }else{ + } else { lock.l_start = SHARED_FIRST; lock.l_len = SHARED_SIZE; } - if( unixFileLock(pFile, &lock) ){ + if (unixFileLock(pFile, &lock)) { tErrno = errno; rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); - if( rc!=SQLITE_BUSY ){ + 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 - ){ + 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 ){ + if (rc == SQLITE_OK) { pFile->eFileLock = eFileLock; pInode->eFileLock = eFileLock; - }else if( eFileLock==EXCLUSIVE_LOCK ){ + } 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")); + OSTRACE(("LOCK %d %s %s (unix)\n", pFile->h, azFileLock(eFileLock), rc == SQLITE_OK ? "ok" : "failed")); return rc; } @@ -37357,10 +37068,10 @@ static int unixLock(sqlite3_file *id, int eFileLock){ ** 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) ); +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; @@ -37380,26 +37091,25 @@ static void setPendingFd(unixFile *pFile){ ** 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; +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(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 ){ + 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 ); + 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 @@ -37422,21 +37132,21 @@ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ ** 3: [RRRRW] ** 4: [RRRR.] */ - if( eFileLock==SHARED_LOCK ){ + if (eFileLock == SHARED_LOCK) { #if !defined(__APPLE__) || !SQLITE_ENABLE_LOCKING_STYLE (void)handleNFSUnlock; - assert( handleNFSUnlock==0 ); + assert(handleNFSUnlock == 0); #endif #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE - if( handleNFSUnlock ){ - int tErrno; /* Error code from system call errors */ + 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) ){ + if (unixFileLock(pFile, &lock) == (-1)) { tErrno = errno; rc = SQLITE_IOERR_UNLOCK; storeLastErrno(pFile, tErrno); @@ -37446,32 +37156,32 @@ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ lock.l_whence = SEEK_SET; lock.l_start = SHARED_FIRST; lock.l_len = divSize; - if( unixFileLock(pFile, &lock)==(-1) ){ + if (unixFileLock(pFile, &lock) == (-1)) { tErrno = errno; rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_RDLOCK); - if( IS_LOCK_ERROR(rc) ){ + 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) ){ + 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 + } 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) ){ + 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 @@ -37487,28 +37197,29 @@ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ 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 ){ + lock.l_len = 2L; + assert(PENDING_BYTE + 1 == RESERVED_BYTE); + if (unixFileLock(pFile, &lock) == 0) { pInode->eFileLock = SHARED_LOCK; - }else{ + } else { rc = SQLITE_IOERR_UNLOCK; storeLastErrno(pFile, errno); goto end_unlock; } } - if( eFileLock==NO_LOCK ){ + 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 ){ + 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 ){ + if (unixFileLock(pFile, &lock) == 0) { pInode->eFileLock = NO_LOCK; - }else{ + } else { rc = SQLITE_IOERR_UNLOCK; storeLastErrno(pFile, errno); pInode->eFileLock = NO_LOCK; @@ -37521,13 +37232,14 @@ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ ** was deferred because of outstanding locks. */ pInode->nLock--; - assert( pInode->nLock>=0 ); - if( pInode->nLock==0 ) closePendingFds(pFile); + assert(pInode->nLock >= 0); + if (pInode->nLock == 0) + closePendingFds(pFile); } end_unlock: sqlite3_mutex_leave(pInode->pLockMutex); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pFile->eFileLock = eFileLock; } return rc; @@ -37540,16 +37252,16 @@ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ ** 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 ); +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); +#if SQLITE_MAX_MMAP_SIZE > 0 +static int unixMapfile(unixFile* pFd, i64 nByte); +static void unixUnmapfile(unixFile* pFd); #endif /* @@ -37562,18 +37274,18 @@ static void unixUnmapfile(unixFile *pFd); ** 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 +static int closeUnixFile(sqlite3_file* id) { + unixFile* pFile = (unixFile*)id; +#if SQLITE_MAX_MMAP_SIZE > 0 unixUnmapfile(pFile); #endif - if( pFile->h>=0 ){ + if (pFile->h >= 0) { robust_close(pFile, pFile->h, __LINE__); pFile->h = -1; } #if OS_VXWORKS - if( pFile->pId ){ - if( pFile->ctrlFlags & UNIXFILE_DELETE ){ + if (pFile->pId) { + if (pFile->ctrlFlags & UNIXFILE_DELETE) { osUnlink(pFile->pId->zCanonicalName); } vxworksReleaseFileId(pFile->pId); @@ -37581,7 +37293,7 @@ static int closeUnixFile(sqlite3_file *id){ } #endif #ifdef SQLITE_UNLINK_AFTER_CLOSE - if( pFile->ctrlFlags & UNIXFILE_DELETE ){ + if (pFile->ctrlFlags & UNIXFILE_DELETE) { osUnlink(pFile->zPath); sqlite3_free(*(char**)&pFile->zPath); pFile->zPath = 0; @@ -37597,23 +37309,23 @@ static int closeUnixFile(sqlite3_file *id){ /* ** Close a file. */ -static int unixClose(sqlite3_file *id){ +static int unixClose(sqlite3_file* id) { int rc = SQLITE_OK; - unixFile *pFile = (unixFile *)id; - unixInodeInfo *pInode = pFile->pInode; + unixFile* pFile = (unixFile*)id; + unixInodeInfo* pInode = pFile->pInode; - assert( pInode!=0 ); + assert(pInode != 0); verifyDbFile(pFile); unixUnlock(id, NO_LOCK); - assert( unixFileMutexNotheld(pFile) ); + 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 ); + assert(pFile->pInode->nLock > 0 || pFile->pInode->bProcessLock == 0); sqlite3_mutex_enter(pInode->pLockMutex); - if( pInode->nLock ){ + 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 @@ -37623,7 +37335,7 @@ static int unixClose(sqlite3_file *id){ } sqlite3_mutex_leave(pInode->pLockMutex); releaseInodeInfo(pFile); - assert( pFile->pShm==0 ); + assert(pFile->pShm == 0); rc = closeUnixFile(id); unixLeaveMutex(); return rc; @@ -37649,16 +37361,16 @@ static int unixClose(sqlite3_file *id){ ** time and one or more of those connections are writing. */ -static int nolockCheckReservedLock(sqlite3_file *NotUsed, int *pResOut){ +static int nolockCheckReservedLock(sqlite3_file* NotUsed, int* pResOut) { UNUSED_PARAMETER(NotUsed); *pResOut = 0; return SQLITE_OK; } -static int nolockLock(sqlite3_file *NotUsed, int NotUsed2){ +static int nolockLock(sqlite3_file* NotUsed, int NotUsed2) { UNUSED_PARAMETER2(NotUsed, NotUsed2); return SQLITE_OK; } -static int nolockUnlock(sqlite3_file *NotUsed, int NotUsed2){ +static int nolockUnlock(sqlite3_file* NotUsed, int NotUsed2) { UNUSED_PARAMETER2(NotUsed, NotUsed2); return SQLITE_OK; } @@ -37666,7 +37378,7 @@ static int nolockUnlock(sqlite3_file *NotUsed, int NotUsed2){ /* ** Close the file. */ -static int nolockClose(sqlite3_file *id) { +static int nolockClose(sqlite3_file* id) { return closeUnixFile(id); } @@ -37711,15 +37423,15 @@ static int nolockClose(sqlite3_file *id) { ** 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) { +static int dotlockCheckReservedLock(sqlite3_file* id, int* pResOut) { int rc = SQLITE_OK; int reserved = 0; - unixFile *pFile = (unixFile*)id; + unixFile* pFile = (unixFile*)id; - SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + SimulateIOError(return SQLITE_IOERR_CHECKRESERVEDLOCK;); - assert( pFile ); - reserved = osAccess((const char*)pFile->lockingContext, 0)==0; + 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; @@ -37752,16 +37464,15 @@ static int dotlockCheckReservedLock(sqlite3_file *id, int *pResOut) { ** 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; +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 ){ + if (pFile->eFileLock > NO_LOCK) { pFile->eFileLock = eFileLock; /* Always update the timestamp on the old file */ #ifdef HAVE_UTIME @@ -37774,14 +37485,14 @@ static int dotlockLock(sqlite3_file *id, int eFileLock) { /* grab an exclusive lock */ rc = osMkdir(zLockFile, 0777); - if( rc<0 ){ + if (rc < 0) { /* failed to open/create the lock directory */ int tErrno = errno; - if( EEXIST == tErrno ){ + if (EEXIST == tErrno) { rc = SQLITE_BUSY; } else { rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); - if( rc!=SQLITE_BUSY ){ + if (rc != SQLITE_BUSY) { storeLastErrno(pFile, tErrno); } } @@ -37802,37 +37513,36 @@ static int dotlockLock(sqlite3_file *id, int eFileLock) { ** ** 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; +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 ); + 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 ){ + 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 ){ + if (eFileLock == SHARED_LOCK) { pFile->eFileLock = SHARED_LOCK; return SQLITE_OK; } /* To fully unlock the database, delete the lock file */ - assert( eFileLock==NO_LOCK ); + assert(eFileLock == NO_LOCK); rc = osRmdir(zLockFile); - if( rc<0 ){ + if (rc < 0) { int tErrno = errno; - if( tErrno==ENOENT ){ + if (tErrno == ENOENT) { rc = SQLITE_OK; - }else{ + } else { rc = SQLITE_IOERR_UNLOCK; storeLastErrno(pFile, tErrno); } @@ -37845,9 +37555,9 @@ static int dotlockUnlock(sqlite3_file *id, int eFileLock) { /* ** 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 ); +static int dotlockClose(sqlite3_file* id) { + unixFile* pFile = (unixFile*)id; + assert(id != 0); dotlockUnlock(id, NO_LOCK); sqlite3_free(pFile->lockingContext); return closeUnixFile(id); @@ -37875,44 +37585,45 @@ static int dotlockClose(sqlite3_file *id) { ** Retry flock() calls that fail with EINTR */ #ifdef EINTR -static int robust_flock(int fd, int op){ +static int robust_flock(int fd, int op) { int rc; - do{ rc = flock(fd,op); }while( rc<0 && errno==EINTR ); + do { + rc = flock(fd, op); + } while (rc < 0 && errno == EINTR); return rc; } #else -# define robust_flock(a,b) flock(a,b) +#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){ +static int flockCheckReservedLock(sqlite3_file* id, int* pResOut) { int rc = SQLITE_OK; int reserved = 0; - unixFile *pFile = (unixFile*)id; + unixFile* pFile = (unixFile*)id; - SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + SimulateIOError(return SQLITE_IOERR_CHECKRESERVEDLOCK;); - assert( pFile ); + assert(pFile); /* Check if a thread in this process holds such a lock */ - if( pFile->eFileLock>SHARED_LOCK ){ + if (pFile->eFileLock > SHARED_LOCK) { reserved = 1; } /* Otherwise see if some other process holds it. */ - if( !reserved ){ + if (!reserved) { /* attempt to get the lock */ int lrc = robust_flock(pFile->h, LOCK_EX | LOCK_NB); - if( !lrc ){ + if (!lrc) { /* got the lock, unlock it */ lrc = robust_flock(pFile->h, LOCK_UN); - if ( lrc ) { + if (lrc) { int tErrno = errno; /* unlock failed with an error */ lrc = SQLITE_IOERR_UNLOCK; @@ -37924,7 +37635,7 @@ static int flockCheckReservedLock(sqlite3_file *id, int *pResOut){ reserved = 1; /* someone else might have it reserved */ lrc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); - if( IS_LOCK_ERROR(lrc) ){ + if (IS_LOCK_ERROR(lrc)) { storeLastErrno(pFile, tErrno); rc = lrc; } @@ -37933,9 +37644,9 @@ static int flockCheckReservedLock(sqlite3_file *id, int *pResOut){ OSTRACE(("TEST WR-LOCK %d %d %d (flock)\n", pFile->h, rc, reserved)); #ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS - if( (rc & 0xff) == SQLITE_IOERR ){ + if ((rc & 0xff) == SQLITE_IOERR) { rc = SQLITE_OK; - reserved=1; + reserved = 1; } #endif /* SQLITE_IGNORE_FLOCK_LOCK_ERRORS */ *pResOut = reserved; @@ -37971,11 +37682,11 @@ static int flockCheckReservedLock(sqlite3_file *id, int *pResOut){ ** This routine will only increase a lock. Use the sqlite3OsUnlock() ** routine to lower a locking level. */ -static int flockLock(sqlite3_file *id, int eFileLock) { +static int flockLock(sqlite3_file* id, int eFileLock) { int rc = SQLITE_OK; - unixFile *pFile = (unixFile*)id; + unixFile* pFile = (unixFile*)id; - assert( pFile ); + assert(pFile); /* if we already have a lock, it is exclusive. ** Just adjust level and punt on outta here. */ @@ -37990,24 +37701,22 @@ static int flockLock(sqlite3_file *id, int eFileLock) { int tErrno = errno; /* didn't get, must be busy */ rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); - if( IS_LOCK_ERROR(rc) ){ + 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")); + 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 ){ + 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. @@ -38015,32 +37724,31 @@ static int flockLock(sqlite3_file *id, int eFileLock) { ** 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; +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 ); + 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 ){ + if (pFile->eFileLock == eFileLock) { return SQLITE_OK; } /* shared can just be set because we always have an exclusive */ - if (eFileLock==SHARED_LOCK) { + if (eFileLock == SHARED_LOCK) { pFile->eFileLock = eFileLock; return SQLITE_OK; } /* no, really, unlock. */ - if( robust_flock(pFile->h, LOCK_UN) ){ + 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{ + } else { pFile->eFileLock = NO_LOCK; return SQLITE_OK; } @@ -38049,8 +37757,8 @@ static int flockUnlock(sqlite3_file *id, int eFileLock) { /* ** Close a file. */ -static int flockClose(sqlite3_file *id) { - assert( id!=0 ); +static int flockClose(sqlite3_file* id) { + assert(id != 0); flockUnlock(id, NO_LOCK); return closeUnixFile(id); } @@ -38078,34 +37786,34 @@ static int flockClose(sqlite3_file *id) { ** 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) { +static int semXCheckReservedLock(sqlite3_file* id, int* pResOut) { int rc = SQLITE_OK; int reserved = 0; - unixFile *pFile = (unixFile*)id; + unixFile* pFile = (unixFile*)id; - SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + SimulateIOError(return SQLITE_IOERR_CHECKRESERVEDLOCK;); - assert( pFile ); + assert(pFile); /* Check if a thread in this process holds such a lock */ - if( pFile->eFileLock>SHARED_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 (!reserved) { + sem_t* pSem = pFile->pInode->pSem; - if( sem_trywait(pSem)==-1 ){ + if (sem_trywait(pSem) == -1) { int tErrno = errno; - if( EAGAIN != tErrno ){ + 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{ + } else { /* we could have it if we want it */ sem_post(pSem); } @@ -38145,9 +37853,9 @@ static int semXCheckReservedLock(sqlite3_file *id, int *pResOut) { ** 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; +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. @@ -38159,7 +37867,7 @@ static int semXLock(sqlite3_file *id, int eFileLock) { } /* lock semaphore now but bail out when already locked. */ - if( sem_trywait(pSem)==-1 ){ + if (sem_trywait(pSem) == -1) { rc = SQLITE_BUSY; goto sem_end_lock; } @@ -38167,7 +37875,7 @@ static int semXLock(sqlite3_file *id, int eFileLock) { /* got it, set the type and return ok */ pFile->eFileLock = eFileLock; - sem_end_lock: +sem_end_lock: return rc; } @@ -38178,32 +37886,31 @@ static int semXLock(sqlite3_file *id, int eFileLock) { ** 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; +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 ); + 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 ){ + if (pFile->eFileLock == eFileLock) { return SQLITE_OK; } /* shared can just be set because we always have an exclusive */ - if (eFileLock==SHARED_LOCK) { + if (eFileLock == SHARED_LOCK) { pFile->eFileLock = eFileLock; return SQLITE_OK; } /* no, really unlock. */ - if ( sem_post(pSem)==-1 ) { + if (sem_post(pSem) == -1) { int rc, tErrno = errno; rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_UNLOCK); - if( IS_LOCK_ERROR(rc) ){ + if (IS_LOCK_ERROR(rc)) { storeLastErrno(pFile, tErrno); } return rc; @@ -38215,12 +37922,12 @@ static int semXUnlock(sqlite3_file *id, int eFileLock) { /* ** Close a file. */ -static int semXClose(sqlite3_file *id) { - if( id ){ - unixFile *pFile = (unixFile*)id; +static int semXClose(sqlite3_file* id) { + if (id) { + unixFile* pFile = (unixFile*)id; semXUnlock(id, NO_LOCK); - assert( pFile ); - assert( unixFileMutexNotheld(pFile) ); + assert(pFile); + assert(unixFileMutexNotheld(pFile)); unixEnterMutex(); releaseInodeInfo(pFile); unixLeaveMutex(); @@ -38236,7 +37943,6 @@ static int semXClose(sqlite3_file *id) { *************** End of the named semaphore lock implementation **************** ******************************************************************************/ - /****************************************************************************** *************************** Begin AFP Locking ********************************* ** @@ -38254,11 +37960,10 @@ static int semXClose(sqlite3_file *id) { typedef struct afpLockingContext afpLockingContext; struct afpLockingContext { int reserved; - const char *dbPath; /* Name of the open file */ + const char* dbPath; /* Name of the open file */ }; -struct ByteRangeLockPB2 -{ +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 */ @@ -38267,7 +37972,7 @@ struct ByteRangeLockPB2 int fd; /* file desc to assoc this lock with */ }; -#define afpfsByteRangeLock2FSCTL _IOWR('z', 23, struct ByteRangeLockPB2) +#define afpfsByteRangeLock2FSCTL _IOWR('z', 23, struct ByteRangeLockPB2) /* ** This is a utility for setting or clearing a bit-range lock on an @@ -38275,13 +37980,12 @@ struct ByteRangeLockPB2 ** ** 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 */ -){ +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; @@ -38291,22 +37995,19 @@ static int afpSetLock( 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)); + 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 ) { + if (err == -1) { int rc; int tErrno = errno; - OSTRACE(("AFPSETLOCK failed to fsctl() '%s' %d %s\n", - path, tErrno, strerror(tErrno))); + 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); + rc = sqliteErrorFromPosixError(tErrno, setLockFlag ? SQLITE_IOERR_LOCK : SQLITE_IOERR_UNLOCK); #endif /* SQLITE_IGNORE_AFP_LOCK_ERRORS */ - if( IS_LOCK_ERROR(rc) ){ + if (IS_LOCK_ERROR(rc)) { storeLastErrno(pFile, tErrno); } return rc; @@ -38321,32 +38022,32 @@ static int afpSetLock( ** 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){ +static int afpCheckReservedLock(sqlite3_file* id, int* pResOut) { int rc = SQLITE_OK; int reserved = 0; - unixFile *pFile = (unixFile*)id; - afpLockingContext *context; + unixFile* pFile = (unixFile*)id; + afpLockingContext* context; - SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + SimulateIOError(return SQLITE_IOERR_CHECKRESERVEDLOCK;); - assert( pFile ); - context = (afpLockingContext *) pFile->lockingContext; - if( context->reserved ){ + 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 ){ + if (pFile->pInode->eFileLock > SHARED_LOCK) { reserved = 1; } /* Otherwise see if some other process holds it. */ - if( !reserved ){ + if (!reserved) { /* lock the RESERVED byte */ - int lrc = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1,1); - if( SQLITE_OK==lrc ){ + 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); @@ -38354,8 +38055,8 @@ static int afpCheckReservedLock(sqlite3_file *id, int *pResOut){ /* if we failed to get the lock then someone else must have it */ reserved = 1; } - if( IS_LOCK_ERROR(lrc) ){ - rc=lrc; + if (IS_LOCK_ERROR(lrc)) { + rc = lrc; } } @@ -38390,24 +38091,22 @@ static int afpCheckReservedLock(sqlite3_file *id, int *pResOut){ ** This routine will only increase a lock. Use the sqlite3OsUnlock() ** routine to lower a locking level. */ -static int afpLock(sqlite3_file *id, int eFileLock){ +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; + 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))); + 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))); + if (pFile->eFileLock >= eFileLock) { + OSTRACE(("LOCK %d %s ok (already held) (afp)\n", pFile->h, azFileLock(eFileLock))); return SQLITE_OK; } @@ -38416,21 +38115,19 @@ static int afpLock(sqlite3_file *id, int eFileLock){ ** (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 ); + 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)) - ){ + if ((pFile->eFileLock != pInode->eFileLock && (pInode->eFileLock >= PENDING_LOCK || eFileLock > SHARED_LOCK))) { rc = SQLITE_BUSY; goto afp_end_lock; } @@ -38439,11 +38136,10 @@ static int afpLock(sqlite3_file *id, int eFileLock){ ** 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 ); + 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++; @@ -38454,9 +38150,7 @@ static int afpLock(sqlite3_file *id, int eFileLock){ ** acquiring an EXCLUSIVE lock. For the SHARED lock, the PENDING will ** be released. */ - if( eFileLock==SHARED_LOCK - || (eFileLock==EXCLUSIVE_LOCK && pFile->eFileLockeFileLock < PENDING_LOCK)) { int failed; failed = afpSetLock(context->dbPath, pFile, PENDING_BYTE, 1, 1); if (failed) { @@ -38468,55 +38162,54 @@ static int afpLock(sqlite3_file *id, int eFileLock){ /* If control gets to this point, then actually go ahead and make ** operating system calls for the specified lock. */ - if( eFileLock==SHARED_LOCK ){ + if (eFileLock == SHARED_LOCK) { int lrc1, lrc2, lrc1Errno = 0; long lk, mask; - assert( pInode->nShared==0 ); - assert( pInode->eFileLock==0 ); + assert(pInode->nShared == 0); + assert(pInode->eFileLock == 0); - mask = (sizeof(long)==8) ? LARGEST_INT64 : 0x7fffffff; + 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) ){ + 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) ) { + if (IS_LOCK_ERROR(lrc1)) { storeLastErrno(pFile, lrc1Errno); rc = lrc1; goto afp_end_lock; - } else if( IS_LOCK_ERROR(lrc2) ){ + } else if (IS_LOCK_ERROR(lrc2)) { rc = lrc2; goto afp_end_lock; - } else if( lrc1 != SQLITE_OK ) { + } 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 ){ + } 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{ + } 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 ); + 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 ){ + /* Acquire a RESERVED lock */ + failed = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1, 1); + if (!failed) { context->reserved = 1; } } @@ -38526,42 +38219,37 @@ static int afpLock(sqlite3_file *id, int eFileLock){ /* 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)) ){ + 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)) ){ + 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; + rc = ((failed & 0xff) == SQLITE_IOERR) ? failed2 : SQLITE_IOERR_LOCK; goto afp_end_lock; } - }else{ + } else { rc = failed; } } - if( failed ){ + if (failed) { rc = failed; } } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pFile->eFileLock = eFileLock; pInode->eFileLock = eFileLock; - }else if( eFileLock==EXCLUSIVE_LOCK ){ + } 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")); + OSTRACE(("LOCK %d %s %s (afp)\n", pFile->h, azFileLock(eFileLock), rc == SQLITE_OK ? "ok" : "failed")); return rc; } @@ -38572,33 +38260,31 @@ static int afpLock(sqlite3_file *id, int eFileLock){ ** 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) { +static int afpUnlock(sqlite3_file* id, int eFileLock) { int rc = SQLITE_OK; - unixFile *pFile = (unixFile*)id; - unixInodeInfo *pInode; - afpLockingContext *context = (afpLockingContext *) pFile->lockingContext; + 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(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 ){ + 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 ); + assert(pInode->nShared != 0); + if (pFile->eFileLock > SHARED_LOCK) { + assert(pInode->eFileLock == pFile->eFileLock); SimulateIOErrorBenign(1); - SimulateIOError( h=(-1) ) - SimulateIOErrorBenign(0); + SimulateIOError(h = (-1)) SimulateIOErrorBenign(0); #ifdef SQLITE_DEBUG /* When reducing a lock such that other processes can start @@ -38609,64 +38295,62 @@ static int afpUnlock(sqlite3_file *id, int eFileLock) { ** 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 ); + assert(pFile->inNormalWrite == 0 || pFile->dbUpdate == 0 || pFile->transCntrChng == 1); pFile->inNormalWrite = 0; #endif - if( pFile->eFileLock==EXCLUSIVE_LOCK ){ + 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) ){ + if (rc == SQLITE_OK && (eFileLock == SHARED_LOCK || pInode->nShared > 1)) { /* only re-establish the shared lock if necessary */ - int sharedLockByte = SHARED_FIRST+pInode->sharedByte; + 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 ){ + 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 ){ + if (rc == SQLITE_OK && pFile->eFileLock >= RESERVED_LOCK && context->reserved) { rc = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1, 0); - if( !rc ){ + if (!rc) { context->reserved = 0; } } - if( rc==SQLITE_OK && (eFileLock==SHARED_LOCK || pInode->nShared>1)){ + if (rc == SQLITE_OK && (eFileLock == SHARED_LOCK || pInode->nShared > 1)) { pInode->eFileLock = SHARED_LOCK; } } - if( rc==SQLITE_OK && eFileLock==NO_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; + unsigned long long sharedLockByte = SHARED_FIRST + pInode->sharedByte; pInode->nShared--; - if( pInode->nShared==0 ){ + if (pInode->nShared == 0) { SimulateIOErrorBenign(1); - SimulateIOError( h=(-1) ) - SimulateIOErrorBenign(0); - if( !skipShared ){ + SimulateIOError(h = (-1)) SimulateIOErrorBenign(0); + if (!skipShared) { rc = afpSetLock(context->dbPath, pFile, sharedLockByte, 1, 0); } - if( !rc ){ + if (!rc) { pInode->eFileLock = NO_LOCK; pFile->eFileLock = NO_LOCK; } } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pInode->nLock--; - assert( pInode->nLock>=0 ); - if( pInode->nLock==0 ) closePendingFds(pFile); + assert(pInode->nLock >= 0); + if (pInode->nLock == 0) + closePendingFds(pFile); } } sqlite3_mutex_leave(pInode->pLockMutex); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pFile->eFileLock = eFileLock; } return rc; @@ -38675,17 +38359,17 @@ static int afpUnlock(sqlite3_file *id, int eFileLock) { /* ** Close a file & cleanup AFP specific locking context */ -static int afpClose(sqlite3_file *id) { +static int afpClose(sqlite3_file* id) { int rc = SQLITE_OK; - unixFile *pFile = (unixFile*)id; - assert( id!=0 ); + unixFile* pFile = (unixFile*)id; + assert(id != 0); afpUnlock(id, NO_LOCK); - assert( unixFileMutexNotheld(pFile) ); + assert(unixFileMutexNotheld(pFile)); unixEnterMutex(); - if( pFile->pInode ){ - unixInodeInfo *pInode = pFile->pInode; + if (pFile->pInode) { + unixInodeInfo* pInode = pFile->pInode; sqlite3_mutex_enter(pInode->pLockMutex); - if( pInode->nLock ){ + 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 @@ -38723,7 +38407,7 @@ static int afpClose(sqlite3_file *id) { ** 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){ +static int nfsUnlock(sqlite3_file* id, int eFileLock) { return posixUnlock(id, eFileLock, 1); } @@ -38759,48 +38443,51 @@ static int nfsUnlock(sqlite3_file *id, int eFileLock){ ** 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){ +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{ + assert(cnt == (cnt & 0x1ffff)); + assert(id->h > 2); + do { #if defined(USE_PREAD) got = osPread(id->h, pBuf, cnt, offset); - SimulateIOError( got = -1 ); + SimulateIOError(got = -1); #elif defined(USE_PREAD64) got = osPread64(id->h, pBuf, cnt, offset); - SimulateIOError( got = -1 ); + SimulateIOError(got = -1); #else newOffset = lseek(id->h, offset, SEEK_SET); - SimulateIOError( newOffset = -1 ); - if( newOffset<0 ){ + 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; } + if (got == cnt) + break; + if (got < 0) { + if (errno == EINTR) { + got = 1; + continue; + } prior = 0; - storeLastErrno((unixFile*)id, errno); + storeLastErrno((unixFile*)id, errno); break; - }else if( got>0 ){ + } else if (got > 0) { cnt -= got; offset += got; prior += got; pBuf = (void*)(got + (char*)pBuf); } - }while( got>0 ); + } while (got > 0); TIMER_END; - OSTRACE(("READ %-3d %5d %7lld %llu\n", - id->h, got+prior, offset-prior, TIMER_ELAPSED)); - return got+prior; + OSTRACE(("READ %-3d %5d %7lld %llu\n", id->h, got + prior, offset - prior, TIMER_ELAPSED)); + return got + prior; } /* @@ -38808,17 +38495,12 @@ static int seekAndRead(unixFile *id, sqlite3_int64 offset, void *pBuf, int cnt){ ** 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; +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 ); + 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. */ @@ -38829,17 +38511,17 @@ static int unixRead( ); #endif -#if SQLITE_MAX_MMAP_SIZE>0 +#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); + if (offset < pFile->mmapSize) { + if (offset + amt <= pFile->mmapSize) { + memcpy(pBuf, &((u8*)(pFile->pMapRegion))[offset], amt); return SQLITE_OK; - }else{ + } else { int nCopy = pFile->mmapSize - offset; - memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], nCopy); - pBuf = &((u8 *)pBuf)[nCopy]; + memcpy(pBuf, &((u8*)(pFile->pMapRegion))[offset], nCopy); + pBuf = &((u8*)pBuf)[nCopy]; amt -= nCopy; offset += nCopy; } @@ -38847,9 +38529,9 @@ static int unixRead( #endif got = seekAndRead(pFile, offset, pBuf, amt); - if( got==amt ){ + if (got == amt) { return SQLITE_OK; - }else if( got<0 ){ + } 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 @@ -38857,7 +38539,7 @@ static int unixRead( ** prior to returning to the application by the sqlite3ApiExit() ** routine. */ - switch( pFile->lastErrno ){ + switch (pFile->lastErrno) { case ERANGE: case EIO: #ifdef ENXIO @@ -38869,10 +38551,10 @@ static int unixRead( return SQLITE_IOERR_CORRUPTFS; } return SQLITE_IOERR_READ; - }else{ - storeLastErrno(pFile, 0); /* not a system error */ + } else { + storeLastErrno(pFile, 0); /* not a system error */ /* Unread parts of the buffer must be zero-filled */ - memset(&((char*)pBuf)[got], 0, amt-got); + memset(&((char*)pBuf)[got], 0, amt - got); return SQLITE_IOERR_SHORT_READ; } } @@ -38884,45 +38566,48 @@ static int unixRead( ** 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 */ +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 ); + 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 ); + 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); + do { + rc = (int)osPwrite64(fd, pBuf, nBuf, iOff); + } while (rc < 0 && errno == EINTR); #else - do{ + do { i64 iSeek = lseek(fd, iOff, SEEK_SET); - SimulateIOError( iSeek = -1 ); - if( iSeek<0 ){ + SimulateIOError(iSeek = -1); + if (iSeek < 0) { rc = -1; break; } rc = osWrite(fd, pBuf, nBuf); - }while( rc<0 && errno==EINTR ); + } 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; + 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. @@ -38930,25 +38615,19 @@ static int seekAndWriteFd( ** 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){ +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; +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 ); + 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. */ @@ -38966,51 +38645,51 @@ static int unixWrite( ** 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 ){ + 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 */ + 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 +#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); + if (offset < pFile->mmapSize) { + if (offset + amt <= pFile->mmapSize) { + memcpy(&((u8*)(pFile->pMapRegion))[offset], pBuf, amt); return SQLITE_OK; - }else{ + } else { int nCopy = pFile->mmapSize - offset; - memcpy(&((u8 *)(pFile->pMapRegion))[offset], pBuf, nCopy); - pBuf = &((u8 *)pBuf)[nCopy]; + memcpy(&((u8*)(pFile->pMapRegion))[offset], pBuf, nCopy); + pBuf = &((u8*)pBuf)[nCopy]; amt -= nCopy; offset += nCopy; } } #endif - while( (wrote = seekAndWrite(pFile, offset, pBuf, amt))0 ){ + while ((wrote = seekAndWrite(pFile, offset, pBuf, amt)) < amt && wrote > 0) { amt -= wrote; offset += wrote; pBuf = &((char*)pBuf)[wrote]; } - SimulateIOError(( wrote=(-1), amt=1 )); - SimulateDiskfullError(( wrote=0, amt=1 )); + SimulateIOError((wrote = (-1), amt = 1)); + SimulateDiskfullError((wrote = 0, amt = 1)); - if( amt>wrote ){ - if( wrote<0 && pFile->lastErrno!=ENOSPC ){ + if (amt > wrote) { + if (wrote < 0 && pFile->lastErrno != ENOSPC) { /* lastErrno set by seekAndWrite */ return SQLITE_IOERR_WRITE; - }else{ + } else { storeLastErrno(pFile, 0); /* not a system error */ return SQLITE_FULL; } @@ -39035,7 +38714,7 @@ SQLITE_API int sqlite3_fullsync_count = 0; ** then simply compile with -Dfdatasync=fdatasync or -DHAVE_FDATASYNC */ #if !defined(fdatasync) && !HAVE_FDATASYNC -# define fdatasync fsync +#define fdatasync fsync #endif /* @@ -39044,12 +38723,11 @@ SQLITE_API int sqlite3_fullsync_count = 0; ** only available on Mac OS X. But that could change. */ #ifdef F_FULLFSYNC -# define HAVE_FULLFSYNC 1 +#define HAVE_FULLFSYNC 1 #else -# define HAVE_FULLFSYNC 0 +#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 @@ -39074,7 +38752,7 @@ SQLITE_API int sqlite3_fullsync_count = 0; ** 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){ +static int full_fsync(int fd, int fullSync, int dataOnly) { int rc; /* The following "ifdef/elif/else/" block has the same structure as @@ -39097,7 +38775,8 @@ static int full_fsync(int fd, int fullSync, int dataOnly){ ** gets called with the correct arguments. */ #ifdef SQLITE_TEST - if( fullSync ) sqlite3_fullsync_count++; + if (fullSync) + sqlite3_fullsync_count++; sqlite3_sync_count++; #endif @@ -39112,9 +38791,9 @@ static int full_fsync(int fd, int fullSync, int dataOnly){ rc = osFstat(fd, &buf); } #elif HAVE_FULLFSYNC - if( fullSync ){ + if (fullSync) { rc = osFcntl(fd, F_FULLFSYNC, 0); - }else{ + } else { rc = 1; } /* If the FULLFSYNC failed, fall back to attempting an fsync(). @@ -39125,7 +38804,8 @@ static int full_fsync(int fd, int fullSync, int dataOnly){ ** It'd be better to detect fullfsync support once and avoid ** the fcntl call every time sync is called. */ - if( rc ) rc = fsync(fd); + if (rc) + rc = fsync(fd); #elif defined(__APPLE__) /* fdatasync() on HFS+ doesn't yet flush the file size if it changed correctly @@ -39135,13 +38815,13 @@ static int full_fsync(int fd, int fullSync, int dataOnly){ #else rc = fdatasync(fd); #if OS_VXWORKS - if( rc==-1 && errno==ENOTSUP ){ + if (rc == -1 && errno == ENOTSUP) { rc = fsync(fd); } #endif /* OS_VXWORKS */ #endif /* ifdef SQLITE_NO_SYNC elif HAVE_FULLFSYNC */ - if( OS_VXWORKS && rc!= -1 ){ + if (OS_VXWORKS && rc != -1) { rc = 0; } return rc; @@ -39170,25 +38850,28 @@ static int full_fsync(int fd, int fullSync, int dataOnly){ ** 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){ +static int openDirectory(const char* zFilename, int* pFd) { int ii; int fd = -1; - char zDirname[MAX_PATHNAME+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 ){ + for (ii = (int)strlen(zDirname); ii > 0 && zDirname[ii] != '/'; ii--) + ; + if (ii > 0) { zDirname[ii] = '\0'; - }else{ - if( zDirname[0]!='/' ) zDirname[0] = '.'; + } else { + if (zDirname[0] != '/') + zDirname[0] = '.'; zDirname[1] = 0; } - fd = robust_open(zDirname, O_RDONLY|O_BINARY, 0); - if( fd>=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; + if (fd >= 0) + return SQLITE_OK; return unixLogError(SQLITE_CANTOPEN_BKPT, "openDirectory", zDirname); } @@ -39207,28 +38890,26 @@ static int openDirectory(const char *zFilename, int *pFd){ ** 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){ +static int unixSync(sqlite3_file* id, int flags) { int rc; - unixFile *pFile = (unixFile*)id; + unixFile* pFile = (unixFile*)id; - int isDataOnly = (flags&SQLITE_SYNC_DATAONLY); - int isFullsync = (flags&0x0F)==SQLITE_SYNC_FULL; + 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 - ); + 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 ); + SimulateDiskfullError(return SQLITE_FULL); - assert( pFile ); + assert(pFile); OSTRACE(("SYNC %-3d\n", pFile->h)); rc = full_fsync(pFile->h, isFullsync, isDataOnly); - SimulateIOError( rc=1 ); - if( rc ){ + SimulateIOError(rc = 1); + if (rc) { storeLastErrno(pFile, errno); return unixLogError(SQLITE_IOERR_FSYNC, "full_fsync", pFile->zPath); } @@ -39237,16 +38918,15 @@ static int unixSync(sqlite3_file *id, int flags){ ** 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 ){ + if (pFile->ctrlFlags & UNIXFILE_DIRSYNC) { int dirfd; - OSTRACE(("DIRSYNC %s (have_fullfsync=%d fullsync=%d)\n", pFile->zPath, - HAVE_FULLFSYNC, isFullsync)); + OSTRACE(("DIRSYNC %s (have_fullfsync=%d fullsync=%d)\n", pFile->zPath, HAVE_FULLFSYNC, isFullsync)); rc = osOpenDirectory(pFile->zPath, &dirfd); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { full_fsync(dirfd, 0, 0); robust_close(pFile, dirfd, __LINE__); - }else{ - assert( rc==SQLITE_CANTOPEN ); + } else { + assert(rc == SQLITE_CANTOPEN); rc = SQLITE_OK; } pFile->ctrlFlags &= ~UNIXFILE_DIRSYNC; @@ -39257,26 +38937,26 @@ static int unixSync(sqlite3_file *id, int flags){ /* ** Truncate an open file to a specified size */ -static int unixTruncate(sqlite3_file *id, i64 nByte){ - unixFile *pFile = (unixFile *)id; +static int unixTruncate(sqlite3_file* id, i64 nByte) { + unixFile* pFile = (unixFile*)id; int rc; - assert( pFile ); - SimulateIOError( return SQLITE_IOERR_TRUNCATE ); + 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; + if (pFile->szChunk > 0) { + nByte = ((nByte + pFile->szChunk - 1) / pFile->szChunk) * pFile->szChunk; } rc = robust_ftruncate(pFile->h, nByte); - if( rc ){ + if (rc) { storeLastErrno(pFile, errno); return unixLogError(SQLITE_IOERR_TRUNCATE, "ftruncate", pFile->zPath); - }else{ + } 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 @@ -39285,17 +38965,17 @@ static int unixTruncate(sqlite3_file *id, i64 nByte){ ** when restoring a database using the backup API from a zero-length ** source. */ - if( pFile->inNormalWrite && nByte==0 ){ + if (pFile->inNormalWrite && nByte == 0) { pFile->transCntrChng = 1; } #endif -#if SQLITE_MAX_MMAP_SIZE>0 +#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 ){ + if (nByte < pFile->mmapSize) { pFile->mmapSize = nByte; } #endif @@ -39307,13 +38987,13 @@ static int unixTruncate(sqlite3_file *id, i64 nByte){ /* ** Determine the current size of a file in bytes */ -static int unixFileSize(sqlite3_file *id, i64 *pSize){ +static int unixFileSize(sqlite3_file* id, i64* pSize) { int rc; struct stat buf; - assert( id ); + assert(id); rc = osFstat(((unixFile*)id)->h, &buf); - SimulateIOError( rc=1 ); - if( rc!=0 ){ + SimulateIOError(rc = 1); + if (rc != 0) { storeLastErrno((unixFile*)id, errno); return SQLITE_IOERR_FSTAT; } @@ -39325,8 +39005,8 @@ static int unixFileSize(sqlite3_file *id, i64 *pSize){ ** layers, we need to report this file size as zero even though it is ** really 1. Ticket #3260. */ - if( *pSize==1 ) *pSize = 0; - + if (*pSize == 1) + *pSize = 0; return SQLITE_OK; } @@ -39336,7 +39016,7 @@ static int unixFileSize(sqlite3_file *id, i64 *pSize){ ** Handler for proxy-locking file-control verbs. Defined below in the ** proxying locking division. */ -static int proxyFileControl(sqlite3_file*,int,void*); +static int proxyFileControl(sqlite3_file*, int, void*); #endif /* @@ -39345,27 +39025,28 @@ static int proxyFileControl(sqlite3_file*,int,void*); ** (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() */ +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) ){ + if (osFstat(pFile->h, &buf)) { return SQLITE_IOERR_FSTAT; } - nSize = ((nByte+pFile->szChunk-1) / pFile->szChunk) * pFile->szChunk; - if( nSize>(i64)buf.st_size ){ + 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; + 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 @@ -39374,27 +39055,29 @@ static int fcntlSizeHint(unixFile *pFile, i64 nByte){ ** 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; + 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 + nBlk - 1; iWrite += nBlk) { + if (iWrite >= nSize) + iWrite = nSize - 1; nWrite = seekAndWrite(pFile, iWrite, "", 1); - if( nWrite!=1 ) return SQLITE_IOERR_WRITE; + if (nWrite != 1) + return SQLITE_IOERR_WRITE; } #endif } } -#if SQLITE_MAX_MMAP_SIZE>0 - if( pFile->mmapSizeMax>0 && nByte>pFile->mmapSize ){ +#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) ){ + if (pFile->szChunk <= 0) { + if (robust_ftruncate(pFile->h, nByte)) { storeLastErrno(pFile, errno); return unixLogError(SQLITE_IOERR_TRUNCATE, "ftruncate", pFile->zPath); } @@ -39414,28 +39097,28 @@ static int fcntlSizeHint(unixFile *pFile, i64 nByte){ ** ** 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 ){ +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{ + } else { pFile->ctrlFlags |= mask; } } /* Forward declaration */ -static int unixGetTempname(int nBuf, char *zBuf); +static int unixGetTempname(int nBuf, char* zBuf); #ifndef SQLITE_OMIT_WAL - static int unixFcntlExternalReader(unixFile*, int*); +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 ){ +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); @@ -39460,13 +39143,13 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){ return SQLITE_OK; } case SQLITE_FCNTL_CHUNK_SIZE: { - pFile->szChunk = *(int *)pArg; + pFile->szChunk = *(int*)pArg; return SQLITE_OK; } case SQLITE_FCNTL_SIZE_HINT: { int rc; SimulateIOErrorBenign(1); - rc = fcntlSizeHint(pFile, *(i64 *)pArg); + rc = fcntlSizeHint(pFile, *(i64*)pArg); SimulateIOErrorBenign(0); return rc; } @@ -39483,8 +39166,8 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){ return SQLITE_OK; } case SQLITE_FCNTL_TEMPFILENAME: { - char *zTFile = sqlite3_malloc64( pFile->pVfs->mxPathname ); - if( zTFile ){ + char* zTFile = sqlite3_malloc64(pFile->pVfs->mxPathname); + if (zTFile) { unixGetTempname(pFile->pVfs->mxPathname, zTFile); *(char**)pArg = zTFile; } @@ -39502,25 +39185,25 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){ return SQLITE_OK; } #endif -#if SQLITE_MAX_MMAP_SIZE>0 +#if SQLITE_MAX_MMAP_SIZE > 0 case SQLITE_FCNTL_MMAP_SIZE: { i64 newLimit = *(i64*)pArg; int rc = SQLITE_OK; - if( newLimit>sqlite3GlobalConfig.mxMmap ){ + 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 ){ + if (newLimit > 0 && sizeof(size_t) < 8) { newLimit = (newLimit & 0x7FFFFFFF); } *(i64*)pArg = pFile->mmapSizeMax; - if( newLimit>=0 && newLimit!=pFile->mmapSizeMax && pFile->nFetchOut==0 ){ + if (newLimit >= 0 && newLimit != pFile->mmapSizeMax && pFile->nFetchOut == 0) { pFile->mmapSizeMax = newLimit; - if( pFile->mmapSize>0 ){ + if (pFile->mmapSize > 0) { unixUnmapfile(pFile); rc = unixMapfile(pFile, -1); } @@ -39542,7 +39225,7 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){ #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) case SQLITE_FCNTL_SET_LOCKPROXYFILE: case SQLITE_FCNTL_GET_LOCKPROXYFILE: { - return proxyFileControl(id,op,pArg); + return proxyFileControl(id, op, pArg); } #endif /* SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) */ @@ -39568,22 +39251,22 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){ ** other systems. */ #ifndef __QNXNTO__ -static void setDeviceCharacteristics(unixFile *pFd){ - assert( pFd->deviceCharacteristics==0 || pFd->sectorSize!=0 ); - if( pFd->sectorSize==0 ){ +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) ){ + 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 ){ + if (pFd->ctrlFlags & UNIXFILE_PSOW) { pFd->deviceCharacteristics |= SQLITE_IOCAP_POWERSAFE_OVERWRITE; } @@ -39593,72 +39276,68 @@ static void setDeviceCharacteristics(unixFile *pFd){ #else #include #include -static void setDeviceCharacteristics(unixFile *pFile){ - if( pFile->sectorSize == 0 ){ +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 ) { + if (fstatvfs(pFile->h, &fsInfo) == -1) { return; } - if( !strcmp(fsInfo.f_basetype, "tmp") ) { + 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->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") ){ + /* 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->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") ){ + /* 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; + /* 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 ){ + if (pFile->sectorSize % 512 != 0) { pFile->deviceCharacteristics = 0; pFile->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE; } @@ -39675,8 +39354,8 @@ static void setDeviceCharacteristics(unixFile *pFile){ ** 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; +static int unixSectorSize(sqlite3_file* id) { + unixFile* pFd = (unixFile*)id; setDeviceCharacteristics(pFd); return pFd->sectorSize; } @@ -39694,13 +39373,13 @@ static int unixSectorSize(sqlite3_file *id){ ** 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; +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 +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE > 0 /* ** Return the system page size. @@ -39708,7 +39387,7 @@ static int unixDeviceCharacteristics(sqlite3_file *id){ ** 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){ +static int unixGetpagesize(void) { #if OS_VXWORKS return 1024; #elif defined(_BSD_SOURCE) @@ -39752,22 +39431,22 @@ static int unixGetpagesize(void){ ** 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 */ + 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 */ + u8 exclMask; /* Mask of exclusive locks held */ + u8 sharedMask; /* Mask of shared locks held */ + u8 nextShmId; /* Next available unixShm.id value */ #endif }; @@ -39785,19 +39464,19 @@ struct unixShmNode { ** 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 */ + 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 */ +#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 @@ -39807,11 +39486,11 @@ struct unixShm { ** SQLite error code. The final value of *piOut is undefined in this ** case. */ -static int unixFcntlExternalReader(unixFile *pFile, int *piOut){ +static int unixFcntlExternalReader(unixFile* pFile, int* piOut) { int rc = SQLITE_OK; *piOut = 0; - if( pFile->pShm){ - unixShmNode *pShmNode = pFile->pShm->pShmNode; + if (pFile->pShm) { + unixShmNode* pShmNode = pFile->pShm->pShmNode; struct flock f; memset(&f, 0, sizeof(f)); @@ -39821,10 +39500,10 @@ static int unixFcntlExternalReader(unixFile *pFile, int *piOut){ f.l_len = SQLITE_SHM_NLOCK - 3; sqlite3_mutex_enter(pShmNode->pShmMutex); - if( osFcntl(pShmNode->hShm, F_GETLK, &f)<0 ){ + if (osFcntl(pShmNode->hShm, F_GETLK, &f) < 0) { rc = SQLITE_IOERR_LOCK; - }else{ - *piOut = (f.l_type!=F_UNLCK); + } else { + *piOut = (f.l_type != F_UNLCK); } sqlite3_mutex_leave(pShmNode->pShmMutex); } @@ -39832,35 +39511,33 @@ static int unixFcntlExternalReader(unixFile *pFile, int *piOut){ 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 */ +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() ); + 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 ); + assert(n == 1 || lockType != F_RDLCK); /* Locks are within range */ - assert( n>=1 && n<=SQLITE_SHM_NLOCK ); + assert(n >= 1 && n <= SQLITE_SHM_NLOCK); - if( pShmNode->hShm>=0 ){ + if (pShmNode->hShm >= 0) { int res; /* Initialize the locking parameters */ f.l_type = lockType; @@ -39868,7 +39545,7 @@ static int unixShmSystemLock( f.l_start = ofst; f.l_len = n; res = osSetPosixAdvisoryLock(pShmNode->hShm, &f, pFile); - if( res==-1 ){ + if (res == -1) { #ifdef SQLITE_ENABLE_SETLK_TIMEOUT rc = (pFile->iBusyTimeout ? SQLITE_BUSY_TIMEOUT : SQLITE_BUSY); #else @@ -39879,36 +39556,36 @@ static int unixShmSystemLock( /* 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)); + { + u16 mask; + OSTRACE(("SHM-LOCK ")); + mask = ofst > 31 ? 0xffff : (1 << (ofst + n)) - (1 << ofst); + if (rc == SQLITE_OK) { + if (lockType == F_UNLCK) { + OSTRACE(("unlock %d ok", ofst)); + pShmNode->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)); + OSTRACE((" - afterwards %03x,%03x\n", pShmNode->sharedMask, pShmNode->exclMask)); } #endif @@ -39924,12 +39601,13 @@ static int unixShmSystemLock( ** 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) ){ +static void unixShmPurge(unixFile* pFd) { + unixShmNode* p = pFd->pInode->pShmNode; + assert(unixMutexHeld()); + if (p && ALWAYS(p->nRef == 0)) { int nShmPerMap = unixShmRegionPerMap(); int i; - assert( p->pInode==pFd->pInode ); + assert(p->pInode == pFd->pInode); sqlite3_mutex_free(p->pShmMutex); - for(i=0; inRegion; i+=nShmPerMap){ - if( p->hShm>=0 ){ + for (i = 0; i < p->nRegion; i += nShmPerMap) { + if (p->hShm >= 0) { osMunmap(p->apRegion[i], p->szRegion); - }else{ + } else { sqlite3_free(p->apRegion[i]); } } sqlite3_free(p->apRegion); - if( p->hShm>=0 ){ + if (p->hShm >= 0) { robust_close(pFd, p->hShm, __LINE__); p->hShm = -1; } @@ -39972,7 +39650,7 @@ static void unixShmPurge(unixFile *pFd){ ** 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){ +static int unixLockSharedMemory(unixFile* pDbFd, unixShmNode* pShmNode) { struct flock lock; int rc = SQLITE_OK; @@ -39998,29 +39676,29 @@ static int unixLockSharedMemory(unixFile *pDbFd, unixShmNode *pShmNode){ lock.l_start = UNIX_SHM_DMS; lock.l_len = 1; lock.l_type = F_WRLCK; - if( osFcntl(pShmNode->hShm, F_GETLK, &lock)!=0 ) { + if (osFcntl(pShmNode->hShm, F_GETLK, &lock) != 0) { rc = SQLITE_IOERR_LOCK; - }else if( lock.l_type==F_UNLCK ){ - if( pShmNode->isReadonly ){ + } else if (lock.l_type == F_UNLCK) { + if (pShmNode->isReadonly) { pShmNode->isUnlocked = 1; rc = SQLITE_READONLY_CANTINIT; - }else{ + } 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); + if (rc == SQLITE_OK && robust_ftruncate(pShmNode->hShm, 3)) { + rc = unixLogError(SQLITE_IOERR_SHMOPEN, "ftruncate", pShmNode->zFilename); } } - }else if( lock.l_type==F_WRLCK ){ + } 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 ); + 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; @@ -40061,38 +39739,39 @@ static int unixLockSharedMemory(unixFile *pDbFd, unixShmNode *pShmNode){ ** 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 */ +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; + p = sqlite3_malloc64(sizeof(*p)); + if (p == 0) + return SQLITE_NOMEM_BKPT; memset(p, 0, sizeof(*p)); - assert( pDbFd->pShm==0 ); + 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) ); + assert(unixFileMutexNotheld(pDbFd)); unixEnterMutex(); pInode = pDbFd->pInode; pShmNode = pInode->pShmNode; - if( pShmNode==0 ){ - struct stat sStat; /* fstat() info for database file */ + if (pShmNode == 0) { + struct stat sStat; /* fstat() info for database file */ #ifndef SQLITE_SHM_DIRECTORY - const char *zBasePath = pDbFd->zPath; + 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) ){ + if (osFstat(pDbFd->h, &sStat)) { rc = SQLITE_IOERR_FSTAT; goto shm_open_err; } @@ -40102,17 +39781,15 @@ static int unixOpenSharedMemory(unixFile *pDbFd){ #else nShmFilename = 6 + (int)strlen(zBasePath); #endif - pShmNode = sqlite3_malloc64( sizeof(*pShmNode) + nShmFilename ); - if( pShmNode==0 ){ + pShmNode = sqlite3_malloc64(sizeof(*pShmNode) + nShmFilename); + if (pShmNode == 0) { rc = SQLITE_NOMEM_BKPT; goto shm_open_err; } - memset(pShmNode, 0, sizeof(*pShmNode)+nShmFilename); + 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); + 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); @@ -40120,23 +39797,21 @@ static int unixOpenSharedMemory(unixFile *pDbFd){ pShmNode->hShm = -1; pDbFd->pInode->pShmNode = pShmNode; pShmNode->pInode = pDbFd->pInode; - if( sqlite3GlobalConfig.bCoreMutex ){ + if (sqlite3GlobalConfig.bCoreMutex) { pShmNode->pShmMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); - if( pShmNode->pShmMutex==0 ){ + 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 (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 ){ + 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; } @@ -40150,7 +39825,8 @@ static int unixOpenSharedMemory(unixFile *pDbFd){ 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; + if (rc != SQLITE_OK && rc != SQLITE_READONLY_CANTINIT) + goto shm_open_err; } } @@ -40178,7 +39854,7 @@ static int unixOpenSharedMemory(unixFile *pDbFd){ /* Jump here on any error */ shm_open_err: - unixShmPurge(pDbFd); /* This call frees pShmNode if required */ + unixShmPurge(pDbFd); /* This call frees pShmNode if required */ sqlite3_free(p); unixLeaveMutex(); return rc; @@ -40203,64 +39879,65 @@ static int unixOpenSharedMemory(unixFile *pDbFd){ ** 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; +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 ){ + if (pDbFd->pShm == 0) { rc = unixOpenSharedMemory(pDbFd); - if( rc!=SQLITE_OK ) return rc; + if (rc != SQLITE_OK) + return rc; } p = pDbFd->pShm; pShmNode = p->pShmNode; sqlite3_mutex_enter(pShmNode->pShmMutex); - if( pShmNode->isUnlocked ){ + if (pShmNode->isUnlocked) { rc = unixLockSharedMemory(pDbFd, pShmNode); - if( rc!=SQLITE_OK ) goto shmpage_out; + 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 ); + 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; + nReqRegion = ((iRegion + nShmPerMap) / nShmPerMap) * nShmPerMap; - if( pShmNode->nRegionnRegion < nReqRegion) { + char** apNew; /* New apRegion[] array */ + int nByte = nReqRegion * szRegion; /* Minimum required file size */ struct stat sStat; /* Used by fstat() */ pShmNode->szRegion = szRegion; - if( pShmNode->hShm>=0 ){ + 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) ){ + 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; + if (seekAndWriteFd(pShmNode->hShm, iPg * pgsz + pgsz - 1, "", 1, &x) != 1) { + const char* zFile = pShmNode->zFilename; rc = unixLogError(SQLITE_IOERR_SHMSIZE, "write", zFile); goto shmpage_out; } @@ -40290,50 +39967,47 @@ static int unixShmMap( } /* Map the requested memory region into this processes address space. */ - apNew = (char **)sqlite3_realloc( - pShmNode->apRegion, nReqRegion*sizeof(char *) - ); - if( !apNew ){ + apNew = (char**)sqlite3_realloc(pShmNode->apRegion, nReqRegion * sizeof(char*)); + if (!apNew) { rc = SQLITE_IOERR_NOMEM_BKPT; goto shmpage_out; } pShmNode->apRegion = apNew; - while( pShmNode->nRegionnRegion < nReqRegion) { + int nMap = szRegion * nShmPerMap; int i; - void *pMem; - if( pShmNode->hShm>=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 ){ + void* pMem; + if (pShmNode->hShm >= 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{ + } else { pMem = sqlite3_malloc64(nMap); - if( pMem==0 ){ + 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]; + for (i = 0; i < nShmPerMap; i++) { + pShmNode->apRegion[pShmNode->nRegion + i] = &((char*)pMem)[szRegion * i]; } pShmNode->nRegion += nShmPerMap; } } shmpage_out: - if( pShmNode->nRegion>iRegion ){ + if (pShmNode->nRegion > iRegion) { *pp = pShmNode->apRegion[iRegion]; - }else{ + } else { *pp = 0; } - if( pShmNode->isReadonly && rc==SQLITE_OK ) rc = SQLITE_READONLY; + if (pShmNode->isReadonly && rc == SQLITE_OK) + rc = SQLITE_READONLY; sqlite3_mutex_leave(pShmNode->pShmMutex); return rc; } @@ -40346,27 +40020,27 @@ static int unixShmMap( ** assert( assertLockingArrayOk(pShmNode) ); */ #ifdef SQLITE_DEBUG -static int assertLockingArrayOk(unixShmNode *pShmNode){ - unixShm *pX; +static int assertLockingArrayOk(unixShmNode* pShmNode) { + unixShm* pX; int aLock[SQLITE_SHM_NLOCK]; - assert( sqlite3_mutex_held(pShmNode->pShmMutex) ); + assert(sqlite3_mutex_held(pShmNode->pShmMutex)); memset(aLock, 0, sizeof(aLock)); - for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ + for (pX = pShmNode->pFirst; pX; pX = pX->pNext) { int i; - for(i=0; iexclMask & (1<exclMask & (1 << i)) { + assert(aLock[i] == 0); aLock[i] = -1; - }else if( pX->sharedMask & (1<=0 ); + } else if (pX->sharedMask & (1 << i)) { + assert(aLock[i] >= 0); aLock[i]++; } } } - assert( 0==memcmp(pShmNode->aLock, aLock, sizeof(aLock)) ); - return (memcmp(pShmNode->aLock, aLock, sizeof(aLock))==0); + assert(0 == memcmp(pShmNode->aLock, aLock, sizeof(aLock))); + return (memcmp(pShmNode->aLock, aLock, sizeof(aLock)) == 0); } #endif @@ -40378,36 +40052,35 @@ static int assertLockingArrayOk(unixShmNode *pShmNode){ ** 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; +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; + if (p == 0) + return SQLITE_IOERR_SHMLOCK; pShmNode = p->pShmNode; - if( NEVER(pShmNode==0) ) return SQLITE_IOERR_SHMLOCK; + 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 ); + 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: @@ -40423,68 +40096,66 @@ static int unixShmLock( ** It is not permitted to block on the RECOVER lock. */ #ifdef SQLITE_ENABLE_SETLK_TIMEOUT - assert( (flags & SQLITE_SHM_UNLOCK) || pDbFd->iBusyTimeout==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<iBusyTimeout == 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 << ofst)))); #endif - mask = (1<<(ofst+n)) - (1<1 || mask==(1< 1 || mask == (1 << ofst)); sqlite3_mutex_enter(pShmNode->pShmMutex); - assert( assertLockingArrayOk(pShmNode) ); - if( flags & SQLITE_SHM_UNLOCK ){ - if( (p->exclMask|p->sharedMask) & mask ){ + 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< ((p->sharedMask & (1 << ii)) ? 1 : 0)) { bUnlock = 0; } } - if( bUnlock ){ - rc = unixShmSystemLock(pDbFd, F_UNLCK, ofst+UNIX_SHM_BASE, n); - if( rc==SQLITE_OK ){ - memset(&aLock[ofst], 0, sizeof(int)*n); + if (bUnlock) { + rc = unixShmSystemLock(pDbFd, F_UNLCK, ofst + UNIX_SHM_BASE, n); + if (rc == SQLITE_OK) { + memset(&aLock[ofst], 0, sizeof(int) * n); } - }else if( ALWAYS(p->sharedMask & (1<1 ); + } else if (ALWAYS(p->sharedMask & (1 << ofst))) { + assert(n == 1 && aLock[ofst] > 1); aLock[ofst]--; } /* Undo the local locks */ - if( rc==SQLITE_OK ){ + 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 ){ + } else if (flags & SQLITE_SHM_SHARED) { + assert(n == 1); + assert((p->exclMask & (1 << ofst)) == 0); + if ((p->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); + } else if (aLock[ofst] == 0) { + rc = unixShmSystemLock(pDbFd, F_RDLCK, ofst + UNIX_SHM_BASE, n); } /* Get the local shared locks */ - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { p->sharedMask |= mask; aLock[ofst]++; } } - }else{ + } 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); + if (ALWAYS((p->exclMask & (1 << ii)) == 0) && aLock[ii]) { rc = SQLITE_BUSY; break; } @@ -40492,21 +40163,20 @@ static int unixShmLock( /* Get the exclusive locks at the system level. Then if successful ** also update the in-memory values. */ - if( rc==SQLITE_OK ){ - rc = unixShmSystemLock(pDbFd, F_WRLCK, ofst+UNIX_SHM_BASE, n); - if( rc==SQLITE_OK ){ - assert( (p->sharedMask & mask)==0 ); + if (rc == SQLITE_OK) { + rc = unixShmSystemLock(pDbFd, F_WRLCK, ofst + UNIX_SHM_BASE, n); + if (rc == SQLITE_OK) { + assert((p->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)); + OSTRACE(("SHM-LOCK shmid-%d, pid-%d got %03x,%03x\n", p->id, osGetpid(0), p->sharedMask, p->exclMask)); return rc; } @@ -40516,15 +40186,12 @@ static int unixShmLock( ** 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 */ -){ +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 */ + sqlite3MemoryBarrier(); /* compiler-defined memory barrier */ + assert(fd->pMethods->xLock == nolockLock || unixFileMutexNotheld((unixFile*)fd)); + unixEnterMutex(); /* Also mutex, for redundancy */ unixLeaveMutex(); } @@ -40535,27 +40202,28 @@ static void unixShmBarrier( ** 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 */ +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; + if (p == 0) + return SQLITE_OK; pShmNode = p->pShmNode; - assert( pShmNode==pDbFd->pInode->pShmNode ); - assert( pShmNode->pInode==pDbFd->pInode ); + 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){} + for (pp = &pShmNode->pFirst; (*pp) != p; pp = &(*pp)->pNext) { + } *pp = p->pNext; /* Free the connection p */ @@ -40565,12 +40233,12 @@ static int unixShmUnmap( /* If pShmNode->nRef has reached 0, then close the underlying ** shared-memory file, too */ - assert( unixFileMutexNotheld(pDbFd) ); + assert(unixFileMutexNotheld(pDbFd)); unixEnterMutex(); - assert( pShmNode->nRef>0 ); + assert(pShmNode->nRef > 0); pShmNode->nRef--; - if( pShmNode->nRef==0 ){ - if( deleteFlag && pShmNode->hShm>=0 ){ + if (pShmNode->nRef == 0) { + if (deleteFlag && pShmNode->hShm >= 0) { osUnlink(pShmNode->zFilename); } unixShmPurge(pDbFd); @@ -40580,21 +40248,20 @@ static int unixShmUnmap( return SQLITE_OK; } - #else -# define unixShmMap 0 -# define unixShmLock 0 -# define unixShmBarrier 0 -# define unixShmUnmap 0 +#define unixShmMap 0 +#define unixShmLock 0 +#define unixShmBarrier 0 +#define unixShmUnmap 0 #endif /* #ifndef SQLITE_OMIT_WAL */ -#if SQLITE_MAX_MMAP_SIZE>0 +#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 ){ +static void unixUnmapfile(unixFile* pFd) { + assert(pFd->nFetchOut == 0); + if (pFd->pMapRegion) { osMunmap(pFd->pMapRegion, pFd->mmapSizeActual); pFd->pMapRegion = 0; pFd->mmapSize = 0; @@ -40617,69 +40284,69 @@ static void unixUnmapfile(unixFile *pFd){ ** 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 ); +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; + if ((pFd->ctrlFlags & UNIXFILE_RDONLY) == 0) + flags |= PROT_WRITE; #endif - if( pOrig ){ + if (pOrig) { #if HAVE_MREMAP i64 nReuse = pFd->mmapSize; #else const int szSyspage = osGetpagesize(); - i64 nReuse = (pFd->mmapSize & ~(szSyspage-1)); + i64 nReuse = (pFd->mmapSize & ~(szSyspage - 1)); #endif - u8 *pReq = &pOrig[nReuse]; + u8* pReq = &pOrig[nReuse]; /* Unmap any pages of the existing mapping that cannot be reused. */ - if( nReuse!=nOrig ){ - osMunmap(pReq, nOrig-nReuse); + 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 ){ + pNew = osMmap(pReq, nNew - nReuse, flags, MAP_SHARED, h, nReuse); + if (pNew != MAP_FAILED) { + if (pNew != pReq) { osMunmap(pNew, nNew - nReuse); pNew = 0; - }else{ + } else { pNew = pOrig; } } #endif /* The attempt to extend the existing mapping failed. Free it. */ - if( pNew==MAP_FAILED || pNew==0 ){ + if (pNew == MAP_FAILED || pNew == 0) { osMunmap(pOrig, nReuse); } } /* If pNew is still NULL, try to create an entirely new mapping. */ - if( pNew==0 ){ + if (pNew == 0) { pNew = osMmap(0, nNew, flags, MAP_SHARED, h, 0); } - if( pNew==MAP_FAILED ){ + if (pNew == MAP_FAILED) { pNew = 0; nNew = 0; unixLogError(SQLITE_OK, zErr, pFd->zPath); @@ -40689,7 +40356,7 @@ static void unixRemapfile( ** in this case. */ pFd->mmapSizeMax = 0; } - pFd->pMapRegion = (void *)pNew; + pFd->pMapRegion = (void*)pNew; pFd->mmapSize = pFd->mmapSizeActual = nNew; } @@ -40709,24 +40376,25 @@ static void unixRemapfile( ** 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; +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) ){ + 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 ){ + if (nMap > pFd->mmapSizeMax) { nMap = pFd->mmapSizeMax; } - assert( nMap>0 || (pFd->mmapSize==0 && pFd->pMapRegion==0) ); - if( nMap!=pFd->mmapSize ){ + assert(nMap > 0 || (pFd->mmapSize == 0 && pFd->pMapRegion == 0)); + if (nMap != pFd->mmapSize) { unixRemapfile(pFd, nMap); } @@ -40746,20 +40414,21 @@ static int unixMapfile(unixFile *pFd, i64 nMap){ ** 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 */ +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 ){ +#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 (rc != SQLITE_OK) + return rc; } - if( pFd->mmapSize >= iOff+nAmt ){ - *pp = &((u8 *)pFd->pMapRegion)[iOff]; + if (pFd->mmapSize >= iOff + nAmt) { + *pp = &((u8*)pFd->pMapRegion)[iOff]; pFd->nFetchOut++; } } @@ -40777,26 +40446,26 @@ static int unixFetch(sqlite3_file *fd, i64 iOff, int nAmt, void **pp){ ** 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 */ +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) ); + assert((p == 0) == (pFd->nFetchOut == 0)); /* If p!=0, it must match the iOff value. */ - assert( p==0 || p==&((u8 *)pFd->pMapRegion)[iOff] ); + assert(p == 0 || p == &((u8*)pFd->pMapRegion)[iOff]); - if( p ){ + if (p) { pFd->nFetchOut--; - }else{ + } else { unixUnmapfile(pFd); } - assert( pFd->nFetchOut>=0 ); + assert(pFd->nFetchOut >= 0); #else UNUSED_PARAMETER(fd); UNUSED_PARAMETER(p); @@ -40845,107 +40514,101 @@ static int unixUnfetch(sqlite3_file *fd, i64 iOff, void *p){ ** * 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; +#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(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(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 */ +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 */ +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 */ +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 */ +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 @@ -40963,29 +40626,27 @@ 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 */ +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 */ +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 @@ -40997,36 +40658,29 @@ IOMETHODS( ** ** 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 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 } - }; + 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) { /* 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 ){ + 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 ){ + for (i = 0; aMap[i].zFilesystem; i++) { + if (strcmp(fsInfo.f_fstypename, aMap[i].zFilesystem) == 0) { return aMap[i].pMethods; } } @@ -41040,18 +40694,17 @@ static const sqlite3_io_methods *autolockIoFinderImpl( 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 ){ + if (osFcntl(pNew->h, F_GETLK, &lockInfo) != -1) { + if (strcmp(fsInfo.f_fstypename, "nfs") == 0) { return &nfsIoMethods; } else { return &posixIoMethods; } - }else{ + } else { return &dotlockIoMethods; } } -static const sqlite3_io_methods - *(*const autolockIoFinder)(const char*,unixFile*) = autolockIoFinderImpl; +static const sqlite3_io_methods* (*const autolockIoFinder)(const char*, unixFile*) = autolockIoFinderImpl; #endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ @@ -41061,13 +40714,12 @@ static const sqlite3_io_methods ** 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 */ -){ +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) { /* If filePath==NULL that means we are dealing with a transient file ** that does not need to be locked. */ return &nolockIoMethods; @@ -41080,22 +40732,20 @@ static const sqlite3_io_methods *vxworksIoFinderImpl( lockInfo.l_start = 0; lockInfo.l_whence = SEEK_SET; lockInfo.l_type = F_RDLCK; - if( osFcntl(pNew->h, F_GETLK, &lockInfo)!=-1 ) { + if (osFcntl(pNew->h, F_GETLK, &lockInfo) != -1) { return &posixIoMethods; - }else{ + } else { return &semIoMethods; } } -static const sqlite3_io_methods - *(*const vxworksIoFinder)(const char*,unixFile*) = vxworksIoFinderImpl; +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*); - +typedef const sqlite3_io_methods* (*finder_type)(const char*, unixFile*); /**************************************************************************** **************************** sqlite3_vfs methods **************************** @@ -41107,49 +40757,47 @@ typedef const sqlite3_io_methods *(*finder_type)(const char*,unixFile*); /* ** 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; +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 ); + assert(pNew->pInode == NULL); /* No locking occurs in temporary files */ - assert( zFilename!=0 || (ctrlFlags & UNIXFILE_NOLOCK)!=0 ); + 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 +#if SQLITE_MAX_MMAP_SIZE > 0 pNew->mmapSizeMax = sqlite3GlobalConfig.szMmap; #endif - if( sqlite3_uri_boolean(((ctrlFlags & UNIXFILE_URI) ? zFilename : 0), - "psow", SQLITE_POWERSAFE_OVERWRITE) ){ + if (sqlite3_uri_boolean(((ctrlFlags & UNIXFILE_URI) ? zFilename : 0), "psow", SQLITE_POWERSAFE_OVERWRITE)) { pNew->ctrlFlags |= UNIXFILE_PSOW; } - if( strcmp(pVfs->zName,"unix-excl")==0 ){ + if (strcmp(pVfs->zName, "unix-excl") == 0) { pNew->ctrlFlags |= UNIXFILE_EXCL; } #if OS_VXWORKS pNew->pId = vxworksFindFileId(zFilename); - if( pNew->pId==0 ){ + if (pNew->pId == 0) { ctrlFlags |= UNIXFILE_NOLOCK; rc = SQLITE_NOMEM_BKPT; } #endif - if( ctrlFlags & UNIXFILE_NOLOCK ){ + if (ctrlFlags & UNIXFILE_NOLOCK) { pLockingStyle = &nolockIoMethods; - }else{ + } else { pLockingStyle = (**(finder_type*)pVfs->pAppData)(zFilename, pNew); #if SQLITE_ENABLE_LOCKING_STYLE /* Cache zFilename in the locking context (AFP and dotlock override) for @@ -41159,14 +40807,14 @@ static int fillInUnixFile( #endif } - if( pLockingStyle == &posixIoMethods + if (pLockingStyle == &posixIoMethods #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE - || pLockingStyle == &nfsIoMethods + || pLockingStyle == &nfsIoMethods #endif - ){ + ) { unixEnterMutex(); rc = findInodeInfo(pNew, &pNew->pInode); - if( rc!=SQLITE_OK ){ + 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: @@ -41192,15 +40840,15 @@ static int fillInUnixFile( } #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) - else if( pLockingStyle == &afpIoMethods ){ + 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 ){ + afpLockingContext* pCtx; + pNew->lockingContext = pCtx = sqlite3_malloc64(sizeof(*pCtx)); + if (pCtx == 0) { rc = SQLITE_NOMEM_BKPT; - }else{ + } 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. */ @@ -41209,7 +40857,7 @@ static int fillInUnixFile( srandomdev(); unixEnterMutex(); rc = findInodeInfo(pNew, &pNew->pInode); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { sqlite3_free(pNew->lockingContext); robust_close(pNew, h, __LINE__); h = -1; @@ -41219,39 +40867,39 @@ static int fillInUnixFile( } #endif - else if( pLockingStyle == &dotlockIoMethods ){ + else if (pLockingStyle == &dotlockIoMethods) { /* Dotfile locking uses the file path so it needs to be included in ** the dotlockLockingContext */ - char *zLockFile; + char* zLockFile; int nFilename; - assert( zFilename!=0 ); + assert(zFilename != 0); nFilename = (int)strlen(zFilename) + 6; - zLockFile = (char *)sqlite3_malloc64(nFilename); - if( zLockFile==0 ){ + zLockFile = (char*)sqlite3_malloc64(nFilename); + if (zLockFile == 0) { rc = SQLITE_NOMEM_BKPT; - }else{ + } else { sqlite3_snprintf(nFilename, zLockFile, "%s" DOTLOCK_SUFFIX, zFilename); } pNew->lockingContext = zLockFile; } #if OS_VXWORKS - else if( pLockingStyle == &semIoMethods ){ + 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; + 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] = '_'; + 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 ){ + if (pNew->pInode->pSem == SEM_FAILED) { rc = SQLITE_NOMEM_BKPT; pNew->pInode->aSemName[0] = '\0'; } @@ -41262,16 +40910,18 @@ static int fillInUnixFile( storeLastErrno(pNew, 0); #if OS_VXWORKS - if( rc!=SQLITE_OK ){ - if( h>=0 ) robust_close(pNew, h, __LINE__); + 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{ + if (rc != SQLITE_OK) { + if (h >= 0) + robust_close(pNew, h, __LINE__); + } else { pId->pMethods = pLockingStyle; OpenCounter(+1); verifyDbFile(pNew); @@ -41282,19 +40932,12 @@ static int fillInUnixFile( /* ** Directories to consider for temp files. */ -static const char *azTempDirs[] = { - 0, - 0, - "/var/tmp", - "/usr/tmp", - "/tmp", - "." -}; +static const char* azTempDirs[] = {0, 0, "/var/tmp", "/usr/tmp", "/tmp", "."}; /* ** Initialize first two members of azTempDirs[] array. */ -static void unixTempFileInit(void){ +static void unixTempFileInit(void) { azTempDirs[0] = getenv("SQLITE_TMPDIR"); azTempDirs[1] = getenv("TMPDIR"); } @@ -41303,20 +40946,17 @@ static void unixTempFileInit(void){ ** 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){ +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 - ){ + 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; + if (i >= sizeof(azTempDirs) / sizeof(azTempDirs[0])) + break; zDir = azTempDirs[i++]; } return 0; @@ -41327,8 +40967,8 @@ static const char *unixTempFileDir(void){ ** 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; +static int unixGetTempname(int nBuf, char* zBuf) { + const char* zDir; int iLimit = 0; int rc = SQLITE_OK; @@ -41337,25 +40977,24 @@ static int unixGetTempname(int nBuf, char *zBuf){ ** function failing. */ zBuf[0] = 0; - SimulateIOError( return SQLITE_IOERR ); + SimulateIOError(return SQLITE_IOERR); sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); zDir = unixTempFileDir(); - if( zDir==0 ){ + if (zDir == 0) { rc = SQLITE_IOERR_GETTEMPPATH; - }else{ - do{ + } else { + 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 ){ + 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) { rc = SQLITE_ERROR; break; } - }while( osAccess(zBuf,0)==0 ); + } while (osAccess(zBuf, 0) == 0); } sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); return rc; @@ -41386,8 +41025,8 @@ static int proxyTransformUnixFile(unixFile*, const char*); ** 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; +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), @@ -41395,7 +41034,7 @@ static UnixUnusedFd *findReusableFd(const char *zPath, int flags){ ** not to risk breaking vxworks support for the sake of such an obscure ** feature. */ #if !OS_VXWORKS - struct stat sStat; /* Results of stat() call */ + struct stat sStat; /* Results of stat() call */ unixEnterMutex(); @@ -41407,48 +41046,47 @@ static UnixUnusedFd *findReusableFd(const char *zPath, int flags){ ** ** 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; + 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; + 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) ); + 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)); + flags &= (SQLITE_OPEN_READONLY | SQLITE_OPEN_READWRITE); + for (pp = &pInode->pUnused; *pp && (*pp)->flags != flags; pp = &((*pp)->pNext)) + ; pUnused = *pp; - if( pUnused ){ + if (pUnused) { *pp = pUnused->pNext; } sqlite3_mutex_leave(pInode->pLockMutex); } } unixLeaveMutex(); -#endif /* if !OS_VXWORKS */ +#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 */ +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) ){ + if (0 == osStat(zFile, &sStat)) { *pMode = sStat.st_mode & 0777; *pUid = sStat.st_uid; *pGid = sStat.st_gid; - }else{ + } else { rc = SQLITE_IOERR_FSTAT; } return rc; @@ -41475,20 +41113,19 @@ static int getFileMode( ** 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 */ +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 */ + 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 @@ -41509,8 +41146,8 @@ static int findCreateFileMode( ** the filename. In that case, just return SQLITE_OK with *pMode==0. */ nDb = sqlite3Strlen30(zPath) - 1; - while( nDb>0 && zPath[nDb]!='.' ){ - if( zPath[nDb]=='-' ){ + while (nDb > 0 && zPath[nDb] != '.') { + if (zPath[nDb] == '-') { memcpy(zDb, zPath, nDb); zDb[nDb] = '\0'; rc = getFileMode(zDb, pMode, pUid, pGid); @@ -41518,15 +41155,15 @@ static int findCreateFileMode( } nDb--; } - }else if( flags & SQLITE_OPEN_DELETEONCLOSE ){ + } else if (flags & SQLITE_OPEN_DELETEONCLOSE) { *pMode = 0600; - }else if( flags & SQLITE_OPEN_URI ){ + } 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 ){ + const char* z = sqlite3_uri_parameter(zPath, "modeof"); + if (z) { rc = getFileMode(z, pMode, pUid, pGid); } } @@ -41555,28 +41192,27 @@ static int findCreateFileMode( ** 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); +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); + int isAutoProxy = (flags & SQLITE_OPEN_AUTOPROXY); #endif #if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE struct statfs fsInfo; @@ -41586,17 +41222,13 @@ static int unixOpen( ** 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 - )); + 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; + char zTmpname[MAX_PATHNAME + 2]; + const char* zName = zPath; /* Check the following statements are true: ** @@ -41605,49 +41237,47 @@ static int unixOpen( ** (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); + 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((!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(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) ){ + if (randomnessPid != osGetpid(0)) { randomnessPid = osGetpid(0); - sqlite3_randomness(0,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 ); + assert(zName == 0); #endif - if( eType==SQLITE_OPEN_MAIN_DB ){ - UnixUnusedFd *pUnused; + if (eType == SQLITE_OPEN_MAIN_DB) { + UnixUnusedFd* pUnused; pUnused = findReusableFd(zName, flags); - if( pUnused ){ + if (pUnused) { fd = pUnused->fd; - }else{ + } else { pUnused = sqlite3_malloc64(sizeof(*pUnused)); - if( !pUnused ){ + if (!pUnused) { return SQLITE_NOMEM_BKPT; } } @@ -41656,63 +41286,68 @@ static int unixOpen( /* 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 ); + assert((flags & SQLITE_OPEN_URI) || zName[strlen(zName) + 1] == 0); - }else if( !zName ){ + } 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 ){ + 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 ); + 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 */ + 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 ); + 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) ){ + 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 ){ + } 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_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 ){ + if (fd < 0) { int rc2 = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zName); - if( rc==SQLITE_OK ) rc = rc2; + if (rc == SQLITE_OK) + rc = rc2; goto open_finished; } @@ -41728,27 +41363,26 @@ static int unixOpen( ** (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 ){ + if (openMode && (flags & (SQLITE_OPEN_WAL | SQLITE_OPEN_MAIN_JOURNAL)) != 0) { robustFchown(fd, uid, gid); } } - assert( fd>=0 ); - if( pOutFlags ){ + assert(fd >= 0); + if (pOutFlags) { *pOutFlags = flags; } - if( p->pPreallocatedUnused ){ + if (p->pPreallocatedUnused) { p->pPreallocatedUnused->fd = fd; - p->pPreallocatedUnused->flags = - flags & (SQLITE_OPEN_READONLY|SQLITE_OPEN_READWRITE); + p->pPreallocatedUnused->flags = flags & (SQLITE_OPEN_READONLY | SQLITE_OPEN_READWRITE); } - if( isDelete ){ + if (isDelete) { #if OS_VXWORKS zPath = zName; #elif defined(SQLITE_UNLINK_AFTER_CLOSE) zPath = sqlite3_mprintf("%s", zName); - if( zPath==0 ){ + if (zPath == 0) { robust_close(p, fd, __LINE__); return SQLITE_NOMEM_BKPT; } @@ -41757,13 +41391,13 @@ static int unixOpen( #endif } #if SQLITE_ENABLE_LOCKING_STYLE - else{ + else { p->openFlags = openFlags; } #endif #if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE - if( fstatfs(fd, &fsInfo) == -1 ){ + if (fstatfs(fd, &fsInfo) == -1) { storeLastErrno(p, errno); robust_close(p, fd, __LINE__); return SQLITE_IOERR_ACCESS; @@ -41777,33 +41411,38 @@ static int unixOpen( #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 (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"); + 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 (envforce != NULL) { + useProxy = atoi(envforce) > 0; + } else { + useProxy = !(fsInfo.f_flags & MNT_LOCAL); } - if( useProxy ){ + if (useProxy) { rc = fillInUnixFile(pVfs, fd, pFile, zPath, ctrlFlags); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = proxyTransformUnixFile((unixFile*)pFile, ":auto:"); - if( rc!=SQLITE_OK ){ + 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 @@ -41817,54 +41456,50 @@ static int unixOpen( } #endif - assert( zPath==0 || zPath[0]=='/' - || eType==SQLITE_OPEN_SUPER_JOURNAL || eType==SQLITE_OPEN_MAIN_JOURNAL - ); + 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 ){ + 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 */ -){ +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 (osUnlink(zPath) == (-1)) { + if (errno == ENOENT #if OS_VXWORKS - || osAccess(zPath,0)!=0 + || osAccess(zPath, 0) != 0 #endif - ){ + ) { rc = SQLITE_IOERR_DELETE_NOENT; - }else{ + } else { rc = unixLogError(SQLITE_IOERR_DELETE, "unlink", zPath); } return rc; } #ifndef SQLITE_DISABLE_DIRSYNC - if( (dirSync & 1)!=0 ){ + if ((dirSync & 1) != 0) { int fd; rc = osOpenDirectory(zPath, &fd); - if( rc==SQLITE_OK ){ - if( full_fsync(fd,0,0) ){ + 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 ); + } else { + assert(rc == SQLITE_CANTOPEN); rc = SQLITE_OK; } } @@ -41882,26 +41517,24 @@ static int unixDelete( ** ** 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 */ -){ +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 ); + 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 ); + assert(flags == SQLITE_ACCESS_EXISTS || flags == SQLITE_ACCESS_READWRITE); - if( flags==SQLITE_ACCESS_EXISTS ){ + 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; + *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; } @@ -41911,39 +41544,40 @@ static int unixAccess( */ 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 */ + 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*); +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 ){ +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]!='/' ){} + assert(pPath->zOut[0] == '/'); + while (pPath->zOut[--pPath->nUsed] != '/') { + } return; } } - if( pPath->nUsed + nName + 2 >= pPath->nOut ){ + if (pPath->nUsed + nName + 2 >= pPath->nOut) { pPath->rc = SQLITE_ERROR; return; } @@ -41951,31 +41585,31 @@ static void appendOnePathElement( 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; + 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 ){ + if (osLstat(zIn, &buf) != 0) { + if (errno != ENOENT) { pPath->rc = unixLogError(SQLITE_CANTOPEN_BKPT, "lstat", zIn); } - }else if( S_ISLNK(buf.st_mode) ){ + } else if (S_ISLNK(buf.st_mode)) { ssize_t got; - char zLnk[SQLITE_MAX_PATHLEN+2]; - if( pPath->nSymlink++ > SQLITE_MAX_SYMLINK ){ + 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 ){ + 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]=='/' ){ + if (zLnk[0] == '/') { pPath->nUsed = 0; - }else{ + } else { pPath->nUsed -= nName + 1; } appendAllPathElements(pPath, zLnk); @@ -41987,19 +41621,20 @@ static void appendOnePathElement( /* ** 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 */ -){ +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); + do { + while (zPath[i] && zPath[i] != '/') { + i++; + } + if (i > j) { + appendOnePathElement(pPath, &zPath[j], i - j); } - j = i+1; - }while( zPath[i++] ); + j = i + 1; + } while (zPath[i++]); } /* @@ -42011,12 +41646,11 @@ static void appendAllPathElements( ** (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 */ -){ +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; @@ -42024,17 +41658,19 @@ static int unixFullPathname( 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 ){ + 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; + if (path.rc || path.nUsed < 2) + return SQLITE_CANTOPEN_BKPT; + if (path.nSymlink) + return SQLITE_OK_SYMLINK; return SQLITE_OK; } @@ -42044,7 +41680,7 @@ static int unixFullPathname( ** within the shared library, and closing the shared library. */ #include -static void *unixDlOpen(sqlite3_vfs *NotUsed, const char *zFilename){ +static void* unixDlOpen(sqlite3_vfs* NotUsed, const char* zFilename) { UNUSED_PARAMETER(NotUsed); return dlopen(zFilename, RTLD_NOW | RTLD_GLOBAL); } @@ -42056,17 +41692,17 @@ static void *unixDlOpen(sqlite3_vfs *NotUsed, const char *zFilename){ ** 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; +static void unixDlError(sqlite3_vfs* NotUsed, int nBuf, char* zBufOut) { + const char* zErr; UNUSED_PARAMETER(NotUsed); unixEnterMutex(); zErr = dlerror(); - if( zErr ){ + if (zErr) { sqlite3_snprintf(nBuf, zBufOut, "%s", zErr); } unixLeaveMutex(); } -static void (*unixDlSym(sqlite3_vfs *NotUsed, void *p, const char*zSym))(void){ +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 @@ -42084,28 +41720,28 @@ static void (*unixDlSym(sqlite3_vfs *NotUsed, void *p, const char*zSym))(void){ ** other hand, dlsym() will not work on such a system either, so we have ** not really lost anything. */ - void (*(*x)(void*,const char*))(void); + void (*(*x)(void*, const char*))(void); UNUSED_PARAMETER(NotUsed); - x = (void(*(*)(void*,const char*))(void))dlsym; + x = (void (*(*)(void*, const char*))(void))dlsym; return (*x)(p, zSym); } -static void unixDlClose(sqlite3_vfs *NotUsed, void *pHandle){ +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 +#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){ +static int unixRandomness(sqlite3_vfs* NotUsed, int nBuf, char* zBuf) { UNUSED_PARAMETER(NotUsed); - assert((size_t)nBuf>=(sizeof(time_t)+sizeof(int))); + 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 @@ -42125,15 +41761,17 @@ static int unixRandomness(sqlite3_vfs *NotUsed, int nBuf, char *zBuf){ { int fd, got; fd = robust_open("/dev/urandom", O_RDONLY, 0); - if( fd<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 ); + 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 ); + } else { + do { + got = osRead(fd, zBuf, nBuf); + } while (got < 0 && errno == EINTR); robust_close(0, fd, __LINE__); } } @@ -42141,7 +41779,6 @@ static int unixRandomness(sqlite3_vfs *NotUsed, int nBuf, char *zBuf){ return nBuf; } - /* ** Sleep for a little while. Return the amount of time slept. ** The argument is the number of microseconds we want to sleep. @@ -42150,7 +41787,7 @@ static int unixRandomness(sqlite3_vfs *NotUsed, int nBuf, char *zBuf){ ** might be greater than or equal to the argument, but not less ** than the argument. */ -static int unixSleep(sqlite3_vfs *NotUsed, int microseconds){ +static int unixSleep(sqlite3_vfs* NotUsed, int microseconds) { #if OS_VXWORKS struct timespec sp; @@ -42160,15 +41797,17 @@ static int unixSleep(sqlite3_vfs *NotUsed, int microseconds){ UNUSED_PARAMETER(NotUsed); return microseconds; #elif defined(HAVE_USLEEP) && HAVE_USLEEP - if( microseconds>=1000000 ) sleep(microseconds/1000000); - if( microseconds%1000000 ) usleep(microseconds%1000000); + if (microseconds >= 1000000) + sleep(microseconds / 1000000); + if (microseconds % 1000000) + usleep(microseconds % 1000000); UNUSED_PARAMETER(NotUsed); return microseconds; #else - int seconds = (microseconds+999999)/1000000; + int seconds = (microseconds + 999999) / 1000000; sleep(seconds); UNUSED_PARAMETER(NotUsed); - return seconds*1000000; + return seconds * 1000000; #endif } @@ -42178,7 +41817,7 @@ static int unixSleep(sqlite3_vfs *NotUsed, int microseconds){ ** sqlite3OsCurrentTime() during testing. */ #ifdef SQLITE_TEST -SQLITE_API int sqlite3_current_time = 0; /* Fake system time in seconds since 1970. */ +SQLITE_API int sqlite3_current_time = 0; /* Fake system time in seconds since 1970. */ #endif /* @@ -42191,26 +41830,26 @@ SQLITE_API int sqlite3_current_time = 0; /* Fake system time in seconds since 1 ** 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; +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; + *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; + *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; + (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; + if (sqlite3_current_time) { + *piNow = 1000 * (sqlite3_int64)sqlite3_current_time + unixEpoch; } #endif UNUSED_PARAMETER(NotUsed); @@ -42223,16 +41862,16 @@ static int unixCurrentTimeInt64(sqlite3_vfs *NotUsed, sqlite3_int64 *piNow){ ** 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){ +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; + *prNow = i / 86400000.0; return rc; } #else -# define unixCurrentTime 0 +#define unixCurrentTime 0 #endif /* @@ -42241,14 +41880,13 @@ static int unixCurrentTime(sqlite3_vfs *NotUsed, double *prNow){ ** during SQLite operation. Only the integer return code is currently ** used. */ -static int unixGetLastError(sqlite3_vfs *NotUsed, int NotUsed2, char *NotUsed3){ +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 *************************** ******************************************************************************/ @@ -42414,15 +42052,15 @@ static int unixGetLastError(sqlite3_vfs *NotUsed, int NotUsed2, char *NotUsed3){ */ 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 */ + 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 */ }; /* @@ -42430,7 +42068,7 @@ struct proxyLockingContext { ** 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){ +static int proxyGetLockPath(const char* dbPath, char* lPath, size_t maxLen) { int len; int dbLen; int i; @@ -42438,31 +42076,30 @@ static int proxyGetLockPath(const char *dbPath, char *lPath, size_t maxLen){ #ifdef LOCKPROXYDIR len = strlcpy(lPath, LOCKPROXYDIR, maxLen); #else -# ifdef _CS_DARWIN_USER_TEMP_DIR +#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))); + 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 +#else len = strlcpy(lPath, "/tmp/", maxLen); -# endif +#endif #endif - if( lPath[len-1]!='/' ){ + 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) ){ + for (i = 1; i < len; i++) { + if (lockPath[i] == '/' && (i - start > 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 ) { + 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))); @@ -42496,11 +42133,11 @@ static int proxyCreateLockPath(const char *lockPath){ } } } - start=i+1; + start = i + 1; } buf[i] = lockPath[i]; } - OSTRACE(("CREATELOCKPATH proxy lock path=%s pid=%d\n",lockPath,osGetpid(0))); + OSTRACE(("CREATELOCKPATH proxy lock path=%s pid=%d\n", lockPath, osGetpid(0))); return 0; } @@ -42511,18 +42148,17 @@ static int proxyCreateLockPath(const char *lockPath){ ** 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 */ +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; + unixFile* pNew; int rc = SQLITE_OK; int openFlags = O_RDWR | O_CREAT | O_NOFOLLOW; sqlite3_vfs dummyVfs; int terrno = 0; - UnixUnusedFd *pUnused = NULL; + 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 @@ -42531,30 +42167,30 @@ static int proxyCreateUnixFile( ** otherwise return BUSY (if lock file) or CANTOPEN for the conch file */ pUnused = findReusableFd(path, openFlags); - if( pUnused ){ + if (pUnused) { fd = pUnused->fd; - }else{ + } else { pUnused = sqlite3_malloc64(sizeof(*pUnused)); - if( !pUnused ){ + if (!pUnused) { return SQLITE_NOMEM_BKPT; } } - if( fd<0 ){ + if (fd < 0) { fd = robust_open(path, openFlags, 0); terrno = errno; - if( fd<0 && errno==ENOENT && islockfile ){ - if( proxyCreateLockPath(path) == SQLITE_OK ){ + if (fd < 0 && errno == ENOENT && islockfile) { + if (proxyCreateLockPath(path) == SQLITE_OK) { fd = robust_open(path, openFlags, 0); } } } - if( fd<0 ){ + if (fd < 0) { openFlags = O_RDONLY | O_NOFOLLOW; fd = robust_open(path, openFlags, 0); terrno = errno; } - if( fd<0 ){ - if( islockfile ){ + if (fd < 0) { + if (islockfile) { return SQLITE_BUSY; } switch (terrno) { @@ -42567,8 +42203,8 @@ static int proxyCreateUnixFile( } } - pNew = (unixFile *)sqlite3_malloc64(sizeof(*pNew)); - if( pNew==NULL ){ + pNew = (unixFile*)sqlite3_malloc64(sizeof(*pNew)); + if (pNew == NULL) { rc = SQLITE_NOMEM_BKPT; goto end_create_proxy; } @@ -42582,7 +42218,7 @@ static int proxyCreateUnixFile( pNew->pPreallocatedUnused = pUnused; rc = fillInUnixFile(&dummyVfs, fd, (sqlite3_file*)pNew, path, 0); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { *ppFile = pNew; return SQLITE_OK; } @@ -42598,25 +42234,25 @@ static int proxyCreateUnixFile( SQLITE_API int sqlite3_hostid_num = 0; #endif -#define PROXY_HOSTIDLEN 16 /* conch file host id length */ +#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); +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){ +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) ){ + if (gethostuuid(pHostID, &timeout)) { int err = errno; - if( pError ){ + if (pError) { *pError = err; } return SQLITE_IOERR; @@ -42627,7 +42263,7 @@ static int proxyGetHostID(unsigned char *pHostID, int *pError){ #endif #ifdef SQLITE_TEST /* simulate multiple hosts by creating unique hostid file paths */ - if( sqlite3_hostid_num != 0){ + if (sqlite3_hostid_num != 0) { pHostID[0] = (char)(pHostID[0] + (char)(sqlite3_hostid_num & 0xFF)); } #endif @@ -42637,10 +42273,10 @@ static int proxyGetHostID(unsigned char *pHostID, int *pError){ /* 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) +#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 @@ -42648,12 +42284,12 @@ static int proxyGetHostID(unsigned char *pHostID, int *pError){ ** 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; +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; + char* cPath = pCtx->conchFilePath; size_t readLen = 0; size_t pathLen = 0; char errmsg[64] = ""; @@ -42663,28 +42299,27 @@ static int proxyBreakConchLock(unixFile *pFile, uuid_t 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); + 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( readLenopenFlags = O_RDWR | O_CREAT; end_breaklock: - if( rc ){ - if( fd>=0 ){ + if (rc) { + if (fd >= 0) { osUnlink(tPath); robust_close(pFile, fd, __LINE__); } @@ -42708,9 +42343,9 @@ static int proxyBreakConchLock(unixFile *pFile, uuid_t myHostID){ /* 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; +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; @@ -42718,8 +42353,8 @@ static int proxyConchLock(unixFile *pFile, uuid_t myHostID, int lockType){ memset(&conchModTime, 0, sizeof(conchModTime)); do { rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, lockType); - nTries ++; - if( rc==SQLITE_BUSY ){ + 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 @@ -42727,55 +42362,54 @@ static int proxyConchLock(unixFile *pFile, uuid_t myHostID, int lockType){ * 3rd try: break the lock unless the mod time has changed. */ struct stat buf; - if( osFstat(conchFile->h, &buf) ){ + if (osFstat(conchFile->h, &buf)) { storeLastErrno(pFile, errno); return SQLITE_IOERR_LOCK; } - if( nTries==1 ){ + if (nTries == 1) { conchModTime = buf.st_mtimespec; - unixSleep(0,500000); /* wait 0.5 sec and try the lock again*/ + 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 ){ + 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 ){ + if (nTries == 2) { char tBuf[PROXY_MAXCONCHLEN]; int len = osPread(conchFile->h, tBuf, PROXY_MAXCONCHLEN, 0); - if( len<0 ){ + if (len < 0) { storeLastErrno(pFile, errno); return SQLITE_IOERR_LOCK; } - if( len>PROXY_PATHINDEX && tBuf[0]==(char)PROXY_CONCHVERSION){ + 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) ){ + if (0 != memcmp(&tBuf[PROXY_HEADERLEN], myHostID, PROXY_HOSTIDLEN)) { return SQLITE_BUSY; } - }else{ + } 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 */ + unixSleep(0, 10000000); /* wait 10 sec and try the lock again */ continue; } - assert( nTries==3 ); - if( 0==proxyBreakConchLock(pFile, myHostID) ){ + assert(nTries == 3); + if (0 == proxyBreakConchLock(pFile, myHostID)) { rc = SQLITE_OK; - if( lockType==EXCLUSIVE_LOCK ){ + if (lockType == EXCLUSIVE_LOCK) { rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, SHARED_LOCK); } - if( !rc ){ + if (!rc) { rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, lockType); } } } - } while( rc==SQLITE_BUSY && nTries<3 ); + } while (rc == SQLITE_BUSY && nTries < 3); return rc; } @@ -42786,18 +42420,18 @@ static int proxyConchLock(unixFile *pFile, uuid_t myHostID, int lockType){ ** 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; +static int proxyTakeConch(unixFile* pFile) { + proxyLockingContext* pCtx = (proxyLockingContext*)pFile->lockingContext; - if( pCtx->conchHeld!=0 ){ + if (pCtx->conchHeld != 0) { return SQLITE_OK; - }else{ - unixFile *conchFile = pCtx->conchFile; + } else { + unixFile* conchFile = pCtx->conchFile; uuid_t myHostID; int pError = 0; char readBuf[PROXY_MAXCONCHLEN]; char lockPath[MAXPATHLEN]; - char *tempLockPath = NULL; + char* tempLockPath = NULL; int rc = SQLITE_OK; int createConch = 0; int hostIdMatch = 0; @@ -42805,28 +42439,25 @@ static int proxyTakeConch(unixFile *pFile){ int tryOldLockPath = 0; int forceNewLockPath = 0; - OSTRACE(("TAKECONCH %d for %s pid=%d\n", conchFile->h, - (pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"), - osGetpid(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 ){ + if ((rc & 0xff) == SQLITE_IOERR) { storeLastErrno(pFile, pError); goto end_takeconch; } rc = proxyConchLock(pFile, myHostID, SHARED_LOCK); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { goto end_takeconch; } /* read the existing conch file */ readLen = seekAndRead((unixFile*)conchFile, 0, readBuf, PROXY_MAXCONCHLEN); - if( readLen<0 ){ + 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 ){ + } 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. */ @@ -42838,19 +42469,18 @@ static int proxyTakeConch(unixFile *pFile){ */ 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 (!createConch && !forceNewLockPath) { + hostIdMatch = !memcmp(&readBuf[PROXY_HEADERLEN], myHostID, PROXY_HOSTIDLEN); /* if the conch has data compare the contents */ - if( !pCtx->lockProxyPath ){ + 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 ){ + if (hostIdMatch) { size_t pathLen = (readLen - PROXY_PATHINDEX); - if( pathLen>=MAXPATHLEN ){ - pathLen=MAXPATHLEN-1; + if (pathLen >= MAXPATHLEN) { + pathLen = MAXPATHLEN - 1; } memcpy(lockPath, &readBuf[PROXY_PATHINDEX], pathLen); lockPath[pathLen] = 0; @@ -42859,23 +42489,20 @@ static int proxyTakeConch(unixFile *pFile){ /* 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) - ){ + } 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 ){ + 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 ){ + if (!pCtx->lockProxyPath) { proxyGetLockPath(pCtx->dbPath, lockPath, MAXPATHLEN); tempLockPath = lockPath; /* create a copy of the lock path _only_ if the conch is taken */ @@ -42886,60 +42513,56 @@ static int proxyTakeConch(unixFile *pFile){ ** stick. */ futimes(conchFile->h, NULL); - if( hostIdMatch && !createConch ){ - if( conchFile->pInode && conchFile->pInode->nShared>1 ){ + 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{ + } else { rc = proxyConchLock(pFile, myHostID, EXCLUSIVE_LOCK); } - if( rc==SQLITE_OK ){ + 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{ + 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); + 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 ){ + 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); + 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{ + do { rc = osFchmod(conchFile->h, cmode); - }while( rc==(-1) && errno==EINTR ); - if( rc!=0 ){ + } while (rc == (-1) && errno == EINTR); + if (rc != 0) { int code = errno; - fprintf(stderr, "fchmod %o FAILED with %d %s\n", - cmode, code, strerror(code)); + fprintf(stderr, "fchmod %o FAILED with %d %s\n", cmode, code, strerror(code)); } else { - fprintf(stderr, "fchmod %o SUCCEDED\n",cmode); + fprintf(stderr, "fchmod %o SUCCEDED\n", cmode); } - }else{ + } else { int code = errno; - fprintf(stderr, "STAT FAILED[%d] with %d %s\n", - err, code, strerror(code)); + fprintf(stderr, "STAT FAILED[%d] with %d %s\n", err, code, strerror(code)); #endif } } @@ -42948,25 +42571,25 @@ static int proxyTakeConch(unixFile *pFile){ end_takeconch: OSTRACE(("TRANSPROXY: CLOSE %d\n", pFile->h)); - if( rc==SQLITE_OK && pFile->openFlags ){ + if (rc == SQLITE_OK && pFile->openFlags) { int fd; - if( pFile->h>=0 ){ + 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 ){ + if (fd >= 0) { pFile->h = fd; - }else{ - rc=SQLITE_CANTOPEN_BKPT; /* SQLITE_BUSY? proxyTakeConch called - during locking */ + } else { + rc = SQLITE_CANTOPEN_BKPT; /* SQLITE_BUSY? proxyTakeConch called + during locking */ } } - if( rc==SQLITE_OK && !pCtx->lockProxy ){ - char *path = tempLockPath ? tempLockPath : pCtx->lockProxyPath; + 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 ){ + 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 */ @@ -42975,30 +42598,29 @@ static int proxyTakeConch(unixFile *pFile){ continue; /* go back to the do {} while start point, try again */ } } - if( rc==SQLITE_OK ){ + 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 ){ + if (tempLockPath) { pCtx->lockProxyPath = sqlite3DbStrDup(0, tempLockPath); - if( !pCtx->lockProxyPath ){ + if (!pCtx->lockProxyPath) { rc = SQLITE_NOMEM_BKPT; } } } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pCtx->conchHeld = 1; - if( pCtx->lockProxy->pMethod == &afpIoMethods ){ - afpLockingContext *afpCtx; - afpCtx = (afpLockingContext *)pCtx->lockProxy->lockingContext; + 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")); + 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. */ @@ -43008,22 +42630,19 @@ static int proxyTakeConch(unixFile *pFile){ /* ** 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 */ +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; + 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 ){ + 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"))); + OSTRACE(("RELEASECONCH %d %s\n", conchFile->h, (rc == SQLITE_OK ? "ok" : "failed"))); return rc; } @@ -43038,63 +42657,62 @@ static int proxyReleaseConch(unixFile *pFile){ ** ** *pConchPath is set to NULL if a memory allocation error occurs. */ -static int proxyCreateConchPathname(char *dbPath, char **pConchPath){ - int i; /* Loop counter */ +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 */ + 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 ){ + *pConchPath = conchPath = (char*)sqlite3_malloc64(len + 8); + if (conchPath == 0) { return SQLITE_NOMEM_BKPT; } - memcpy(conchPath, dbPath, len+1); + memcpy(conchPath, dbPath, len + 1); /* now insert a "." before the last / character */ - for( i=(len-1); i>=0; i-- ){ - if( conchPath[i]=='/' ){ + for (i = (len - 1); i >= 0; i--) { + if (conchPath[i] == '/') { i++; break; } } - conchPath[i]='.'; - while ( ilockingContext; - char *oldPath = pCtx->lockProxyPath; +static int switchLockProxyPath(unixFile* pFile, const char* path) { + proxyLockingContext* pCtx = (proxyLockingContext*)pFile->lockingContext; + char* oldPath = pCtx->lockProxyPath; int rc = SQLITE_OK; - if( pFile->eFileLock!=NO_LOCK ){ + 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)) ){ + if (!path || path[0] == '\0' || !strcmp(path, ":auto:") || (oldPath && !strncmp(oldPath, path, MAXPATHLEN))) { return SQLITE_OK; - }else{ - unixFile *lockProxy = pCtx->lockProxy; - pCtx->lockProxy=NULL; + } 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; + if (lockProxy != NULL) { + rc = lockProxy->pMethod->xClose((sqlite3_file*)lockProxy); + if (rc) + return rc; sqlite3_free(lockProxy); } sqlite3_free(oldPath); @@ -43111,25 +42729,24 @@ static int switchLockProxyPath(unixFile *pFile, const char *path) { ** This routine find the filename associated with pFile and writes it ** int dbPath. */ -static int proxyGetDbPathForUnixFile(unixFile *pFile, char *dbPath){ +static int proxyGetDbPathForUnixFile(unixFile* pFile, char* dbPath) { #if defined(__APPLE__) - if( pFile->pMethod == &afpIoMethods ){ + 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); + assert((int)strlen((char*)pFile->lockingContext) <= MAXPATHLEN); + strlcpy(dbPath, ((afpLockingContext*)pFile->lockingContext)->dbPath, MAXPATHLEN); } else #endif - if( pFile->pMethod == &dotlockIoMethods ){ + 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{ + 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); + assert(strlen((char*)pFile->lockingContext) <= MAXPATHLEN); + strlcpy(dbPath, (char*)pFile->lockingContext, MAXPATHLEN); } return SQLITE_OK; } @@ -43142,35 +42759,34 @@ static int proxyGetDbPathForUnixFile(unixFile *pFile, char *dbPath){ ** ->lockingContext ** ->pMethod */ -static int proxyTransformUnixFile(unixFile *pFile, const char *path) { - proxyLockingContext *pCtx; - char dbPath[MAXPATHLEN+1]; /* Name of the database file */ - char *lockPath=NULL; +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 ){ + 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; + 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))); + OSTRACE(("TRANSPROXY %d for %s pid=%d\n", pFile->h, (lockPath ? lockPath : ":auto:"), osGetpid(0))); - pCtx = sqlite3_malloc64( sizeof(*pCtx) ); - if( pCtx==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 ){ + if (rc == SQLITE_OK) { rc = proxyCreateUnixFile(pCtx->conchFilePath, &pCtx->conchFile, 0); - if( rc==SQLITE_CANTOPEN && ((pFile->openFlags&O_RDWR) == 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 @@ -43180,29 +42796,29 @@ static int proxyTransformUnixFile(unixFile *pFile, const char *path) { struct stat conchInfo; int goLockless = 0; - if( osStat(pCtx->conchFilePath, &conchInfo) == -1 ) { + 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 ((err == ENOENT) && (statfs(dbPath, &fsInfo) != -1)) { + goLockless = (fsInfo.f_flags & MNT_RDONLY) == MNT_RDONLY; } } - if( goLockless ){ + if (goLockless) { pCtx->conchHeld = -1; /* read only FS/ lockless */ rc = SQLITE_OK; } } } - if( rc==SQLITE_OK && lockPath ){ + if (rc == SQLITE_OK && lockPath) { pCtx->lockProxyPath = sqlite3DbStrDup(0, lockPath); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pCtx->dbPath = sqlite3DbStrDup(0, dbPath); - if( pCtx->dbPath==NULL ){ + if (pCtx->dbPath == NULL) { rc = SQLITE_NOMEM_BKPT; } } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { /* all memory is allocated, proxys are created and assigned, ** switch the locking context and pMethod then return. */ @@ -43210,71 +42826,65 @@ static int proxyTransformUnixFile(unixFile *pFile, const char *path) { pFile->lockingContext = pCtx; pCtx->pOldMethod = pFile->pMethod; pFile->pMethod = &proxyIoMethods; - }else{ - if( pCtx->conchFile ){ - pCtx->conchFile->pMethod->xClose((sqlite3_file *)pCtx->conchFile); + } 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"))); + 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 ){ +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; + 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)"; + if (pCtx->lockProxyPath) { + *(const char**)pArg = pCtx->lockProxyPath; + } else { + *(const char**)pArg = ":auto: (not held)"; } } else { - *(const char **)pArg = NULL; + *(const char**)pArg = NULL; } return SQLITE_OK; } case SQLITE_FCNTL_SET_LOCKPROXYFILE: { - unixFile *pFile = (unixFile*)id; + unixFile* pFile = (unixFile*)id; int rc = SQLITE_OK; int isProxyStyle = (pFile->pMethod == &proxyIoMethods); - if( pArg==NULL || (const char *)pArg==0 ){ - if( isProxyStyle ){ + 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{ + } 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)) - ){ + } 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{ + } else { rc = switchLockProxyPath(pFile, proxyPath); } - }else{ + } else { /* turn on proxy file locking */ rc = proxyTransformUnixFile(pFile, proxyPath); } @@ -43282,7 +42892,7 @@ static int proxyFileControl(sqlite3_file *id, int op, void *pArg){ return rc; } default: { - assert( 0 ); /* The call assures that only valid opcodes are sent */ + assert(0); /* The call assures that only valid opcodes are sent */ } } /*NOTREACHED*/ assert(0); @@ -43295,23 +42905,22 @@ static int proxyFileControl(sqlite3_file *id, int op, void *pArg){ ** 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; +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; + 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; + } else { /* conchHeld < 0 is lockless */ + pResOut = 0; } } return rc; @@ -43341,23 +42950,22 @@ static int proxyCheckReservedLock(sqlite3_file *id, int *pResOut) { ** 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; +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; + 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{ + } 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. @@ -43365,16 +42973,16 @@ static int proxyLock(sqlite3_file *id, int eFileLock) { ** 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; +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; + 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{ + } else { /* conchHeld < 0 is lockless */ } } @@ -43384,29 +42992,33 @@ static int proxyUnlock(sqlite3_file *id, int eFileLock) { /* ** 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; +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 ){ + if (lockProxy) { rc = lockProxy->pMethod->xUnlock((sqlite3_file*)lockProxy, NO_LOCK); - if( rc ) return rc; + if (rc) + return rc; rc = lockProxy->pMethod->xClose((sqlite3_file*)lockProxy); - if( rc ) return rc; + if (rc) + return rc; sqlite3_free(lockProxy); pCtx->lockProxy = 0; } - if( conchFile ){ - if( pCtx->conchHeld ){ + if (conchFile) { + if (pCtx->conchHeld) { rc = proxyReleaseConch(pFile); - if( rc ) return rc; + if (rc) + return rc; } rc = conchFile->pMethod->xClose((sqlite3_file*)conchFile); - if( rc ) return rc; + if (rc) + return rc; sqlite3_free(conchFile); } sqlite3DbFree(0, pCtx->lockProxyPath); @@ -43421,8 +43033,6 @@ static int proxyClose(sqlite3_file *id) { return SQLITE_OK; } - - #endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ /* ** The proxy locking style is intended for use with AFP filesystems. @@ -43446,50 +43056,51 @@ static int proxyClose(sqlite3_file *id) { ** 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 */ \ +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 */ \ } /* @@ -43501,46 +43112,42 @@ SQLITE_API int sqlite3_os_init(void){ */ static sqlite3_vfs aVfs[] = { #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) - UNIXVFS("unix", autolockIoFinder ), + 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 ), + UNIXVFS("unix-none", nolockIoFinder), UNIXVFS("unix-dotfile", dotlockIoFinder), UNIXVFS("unix-excl", posixIoFinder), #if OS_VXWORKS - UNIXVFS("unix-namedsem", semIoFinder ), + UNIXVFS("unix-namedsem", semIoFinder), #endif #if SQLITE_ENABLE_LOCKING_STYLE || OS_VXWORKS - UNIXVFS("unix-posix", posixIoFinder ), + UNIXVFS("unix-posix", posixIoFinder), #endif #if SQLITE_ENABLE_LOCKING_STYLE - UNIXVFS("unix-flock", flockIoFinder ), + UNIXVFS("unix-flock", flockIoFinder), #endif #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) - UNIXVFS("unix-afp", afpIoFinder ), - UNIXVFS("unix-nfs", nfsIoFinder ), - UNIXVFS("unix-proxy", proxyIoFinder ), + UNIXVFS("unix-afp", afpIoFinder), UNIXVFS("unix-nfs", nfsIoFinder), UNIXVFS("unix-proxy", proxyIoFinder), #endif }; - unsigned int i; /* Loop counter */ + unsigned int i; /* Loop counter */ /* Double-check that the aSyscall[] array has been constructed ** correctly. See ticket [bb3a86e890c8e96ab] */ - assert( ArraySize(aSyscall)==29 ); + 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); + 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 */ + 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 @@ -43552,7 +43159,7 @@ SQLITE_API int sqlite3_os_init(void){ ** READ-4 UNIX_SHM_BASE+7 127 ** DMS UNIX_SHM_BASE+8 128 */ - assert( UNIX_SHM_DMS==128 ); /* Byte offset of the deadman-switch */ + assert(UNIX_SHM_DMS == 128); /* Byte offset of the deadman-switch */ #endif /* Initialize temp file dir array. */ @@ -43568,7 +43175,7 @@ SQLITE_API int sqlite3_os_init(void){ ** to release dynamically allocated objects. But not on unix. ** This routine is a no-op for unix. */ -SQLITE_API int sqlite3_os_end(void){ +SQLITE_API int sqlite3_os_end(void) { unixBigLock = 0; return SQLITE_OK; } @@ -43592,7 +43199,7 @@ SQLITE_API int sqlite3_os_end(void){ ** This file contains code that is specific to Windows. */ /* #include "sqliteInt.h" */ -#if SQLITE_OS_WIN /* This file is used for Windows only */ +#if SQLITE_OS_WIN /* This file is used for Windows only */ /* ** Include code that is common to all os_*.c files @@ -43609,12 +43216,12 @@ SQLITE_API int sqlite3_os_end(void){ ** 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\ +#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,\ +#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 @@ -43623,23 +43230,22 @@ SQLITE_API int sqlite3_os_end(void){ ** based on the sub-platform)? */ #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(SQLITE_WIN32_NO_ANSI) -# define SQLITE_WIN32_HAS_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 +#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\ +#error "At least one of SQLITE_WIN32_HAS_ANSI and SQLITE_WIN32_HAS_WIDE\ must be defined." #endif @@ -43648,15 +43254,15 @@ SQLITE_API int sqlite3_os_end(void){ ** already available. */ #ifndef NTDDI_WIN8 -# define NTDDI_WIN8 0x06020000 +#define NTDDI_WIN8 0x06020000 #endif #ifndef NTDDI_WINBLUE -# define NTDDI_WINBLUE 0x06030000 +#define NTDDI_WINBLUE 0x06030000 #endif #ifndef NTDDI_WINTHRESHOLD -# define NTDDI_WINTHRESHOLD 0x06040000 +#define NTDDI_WINTHRESHOLD 0x06040000 #endif /* @@ -43664,11 +43270,11 @@ SQLITE_API int sqlite3_os_end(void){ ** 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 +#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 /* @@ -43677,18 +43283,18 @@ SQLITE_API int sqlite3_os_end(void){ ** 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 +#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) +#define MAX_PATH (260) #endif /* @@ -43696,14 +43302,14 @@ SQLITE_API int sqlite3_os_end(void){ ** MAX_PATH. */ #ifndef SQLITE_WIN32_MAX_PATH_CHARS -# define SQLITE_WIN32_MAX_PATH_CHARS (MAX_PATH) +#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) +#define UNICODE_STRING_MAX_CHARS (32767) #endif /* @@ -43711,7 +43317,7 @@ SQLITE_API int sqlite3_os_end(void){ ** UNICODE_STRING_MAX_CHARS. */ #ifndef SQLITE_WINNT_MAX_PATH_CHARS -# define SQLITE_WINNT_MAX_PATH_CHARS (UNICODE_STRING_MAX_CHARS) +#define SQLITE_WINNT_MAX_PATH_CHARS (UNICODE_STRING_MAX_CHARS) #endif /* @@ -43720,7 +43326,7 @@ SQLITE_API int sqlite3_os_end(void){ ** 4-bytes-per-character for UTF8. */ #ifndef SQLITE_WIN32_MAX_PATH_BYTES -# define SQLITE_WIN32_MAX_PATH_BYTES (SQLITE_WIN32_MAX_PATH_CHARS*4) +#define SQLITE_WIN32_MAX_PATH_BYTES (SQLITE_WIN32_MAX_PATH_CHARS * 4) #endif /* @@ -43728,15 +43334,14 @@ SQLITE_API int sqlite3_os_end(void){ ** 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) +#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) +#define SQLITE_WIN32_MAX_ERRMSG_CHARS (1024) #endif /* @@ -43744,7 +43349,7 @@ SQLITE_API int sqlite3_os_end(void){ ** separator. */ #ifndef winIsDirSep -# define winIsDirSep(a) (((a) == '/') || ((a) == '\\')) +#define winIsDirSep(a) (((a) == '/') || ((a) == '\\')) #endif /* @@ -43752,14 +43357,14 @@ SQLITE_API int sqlite3_os_end(void){ ** [sometimes] not used by the code (e.g. via conditional compilation). */ #ifndef UNUSED_VARIABLE_VALUE -# define UNUSED_VARIABLE_VALUE(x) (void)(x) +#define UNUSED_VARIABLE_VALUE(x) (void)(x) #endif /* ** Returns the character that should be used as the directory separator. */ #ifndef winGetDirSep -# define winGetDirSep() '\\' +#define winGetDirSep() '\\' #endif /* @@ -43767,26 +43372,22 @@ SQLITE_API int sqlite3_os_end(void){ ** 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) +#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 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); +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); +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); @@ -43804,21 +43405,21 @@ WINBASEAPI BOOL WINAPI UnmapViewOfFile(LPCVOID); ** Some Microsoft compilers lack this definition. */ #ifndef INVALID_FILE_ATTRIBUTES -# define INVALID_FILE_ATTRIBUTES ((DWORD)-1) +#define INVALID_FILE_ATTRIBUTES ((DWORD) - 1) #endif #ifndef FILE_FLAG_MASK -# define FILE_FLAG_MASK (0xFF3C0000) +#define FILE_FLAG_MASK (0xFF3C0000) #endif #ifndef FILE_ATTRIBUTE_MASK -# define FILE_ATTRIBUTE_MASK (0x0003FFF7) +#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 */ +typedef struct winShm winShm; /* A connection to shared-memory */ +typedef struct winShmNode winShmNode; /* A region of shared-memory */ #endif /* @@ -43827,10 +43428,10 @@ typedef struct winShmNode winShmNode; /* A region of shared-memory */ */ #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 */ + 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 @@ -43840,31 +43441,31 @@ typedef struct winceLock { */ 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 */ + 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 */ + 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 */ + 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 */ + 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 }; @@ -43874,23 +43475,23 @@ struct winFile { */ 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. */ + 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 */ +#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))) +#define SQLITE_WIN32_DBG_BUF_SIZE ((int)(4096 - sizeof(DWORD))) #endif /* @@ -43914,7 +43515,7 @@ struct winVfsAppData { ****************************************************************************** */ #ifndef SQLITE_WIN32_HEAP_CREATE -# define SQLITE_WIN32_HEAP_CREATE (TRUE) +#define SQLITE_WIN32_HEAP_CREATE (TRUE) #endif /* @@ -43922,7 +43523,7 @@ struct winVfsAppData { * bytes. */ #ifndef SQLITE_WIN32_HEAP_MAX_INIT_SIZE -# define SQLITE_WIN32_HEAP_MAX_INIT_SIZE (4294967295U) +#define SQLITE_WIN32_HEAP_MAX_INIT_SIZE (4294967295U) #endif /* @@ -43930,7 +43531,7 @@ struct winVfsAppData { * in bytes. This value may be zero. */ #ifndef SQLITE_WIN32_HEAP_INIT_EXTRA -# define SQLITE_WIN32_HEAP_INIT_EXTRA (4194304) +#define SQLITE_WIN32_HEAP_INIT_EXTRA (4194304) #endif /* @@ -43939,9 +43540,7 @@ struct winVfsAppData { * 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)) +#define SQLITE_WIN32_MAX_CACHE_SIZE (((SQLITE_WIN32_HEAP_MAX_INIT_SIZE) - (SQLITE_WIN32_HEAP_INIT_EXTRA)) / (SQLITE_DEFAULT_PAGE_SIZE)) #endif /* @@ -43949,11 +43548,11 @@ struct winVfsAppData { * 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 +#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 /* @@ -43961,25 +43560,23 @@ struct winVfsAppData { * 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) +#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)) +#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) +#define SQLITE_WIN32_HEAP_MAX_SIZE (0) #endif /* @@ -43987,10 +43584,9 @@ struct winVfsAppData { * zero for the default behavior. */ #ifndef SQLITE_WIN32_HEAP_FLAGS -# define SQLITE_WIN32_HEAP_FLAGS (0) +#define SQLITE_WIN32_HEAP_FLAGS (0) #endif - /* ** The winMemData structure stores information required by the Win32-specific ** sqlite3_mem_methods implementation. @@ -43998,51 +43594,54 @@ struct winVfsAppData { typedef struct winMemData winMemData; struct winMemData { #ifndef NDEBUG - u32 magic1; /* Magic number to detect structure corruption. */ + 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. */ + u32 magic2; /* Magic number to detect structure corruption. */ #endif }; #ifndef NDEBUG -#define WINMEM_MAGIC1 0x42b2830b -#define WINMEM_MAGIC2 0xbd4d7cf4 +#define WINMEM_MAGIC1 0x42b2830b +#define WINMEM_MAGIC2 0xbd4d7cf4 #endif static struct winMemData win_mem_data = { #ifndef NDEBUG - WINMEM_MAGIC1, + WINMEM_MAGIC1, #endif - NULL, FALSE + NULL, FALSE #ifndef NDEBUG - ,WINMEM_MAGIC2 + , + 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(); +#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 +#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 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); +static int winMemInit(void* pAppData); +static void winMemShutdown(void* pAppData); -SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetWin32(void); +SQLITE_PRIVATE const sqlite3_mem_methods* sqlite3MemGetWin32(void); #endif /* SQLITE_WIN32_MALLOC */ /* @@ -44064,15 +43663,15 @@ static LONG SQLITE_WIN32_VOLATILE sqlite3_os_type = 0; #endif #ifndef SYSCALL -# define SYSCALL sqlite3_syscall_ptr +#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 +#define osAreFileApisANSI() 1 #endif /* @@ -44082,14 +43681,14 @@ static LONG SQLITE_WIN32_VOLATILE sqlite3_os_type = 0; ** to all overrideable system calls. */ static struct win_syscall { - const char *zName; /* Name of the system call */ + 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 }, + {"AreFileApisANSI", (SYSCALL)AreFileApisANSI, 0}, #else - { "AreFileApisANSI", (SYSCALL)0, 0 }, + {"AreFileApisANSI", (SYSCALL)0, 0}, #endif #ifndef osAreFileApisANSI @@ -44097,600 +43696,550 @@ static struct win_syscall { #endif #if SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_WIDE) - { "CharLowerW", (SYSCALL)CharLowerW, 0 }, + {"CharLowerW", (SYSCALL)CharLowerW, 0}, #else - { "CharLowerW", (SYSCALL)0, 0 }, + {"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 }, + {"CharUpperW", (SYSCALL)CharUpperW, 0}, #else - { "CharUpperW", (SYSCALL)0, 0 }, + {"CharUpperW", (SYSCALL)0, 0}, #endif #define osCharUpperW ((LPWSTR(WINAPI*)(LPWSTR))aSyscall[2].pCurrent) - { "CloseHandle", (SYSCALL)CloseHandle, 0 }, + {"CloseHandle", (SYSCALL)CloseHandle, 0}, #define osCloseHandle ((BOOL(WINAPI*)(HANDLE))aSyscall[3].pCurrent) #if defined(SQLITE_WIN32_HAS_ANSI) - { "CreateFileA", (SYSCALL)CreateFileA, 0 }, + {"CreateFileA", (SYSCALL)CreateFileA, 0}, #else - { "CreateFileA", (SYSCALL)0, 0 }, + {"CreateFileA", (SYSCALL)0, 0}, #endif -#define osCreateFileA ((HANDLE(WINAPI*)(LPCSTR,DWORD,DWORD, \ - LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE))aSyscall[4].pCurrent) +#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 }, + {"CreateFileW", (SYSCALL)CreateFileW, 0}, #else - { "CreateFileW", (SYSCALL)0, 0 }, + {"CreateFileW", (SYSCALL)0, 0}, #endif -#define osCreateFileW ((HANDLE(WINAPI*)(LPCWSTR,DWORD,DWORD, \ - LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE))aSyscall[5].pCurrent) +#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 }, +#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 }, + {"CreateFileMappingA", (SYSCALL)0, 0}, #endif -#define osCreateFileMappingA ((HANDLE(WINAPI*)(HANDLE,LPSECURITY_ATTRIBUTES, \ - DWORD,DWORD,DWORD,LPCSTR))aSyscall[6].pCurrent) +#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 }, +#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 }, + {"CreateFileMappingW", (SYSCALL)0, 0}, #endif -#define osCreateFileMappingW ((HANDLE(WINAPI*)(HANDLE,LPSECURITY_ATTRIBUTES, \ - DWORD,DWORD,DWORD,LPCWSTR))aSyscall[7].pCurrent) +#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 }, + {"CreateMutexW", (SYSCALL)CreateMutexW, 0}, #else - { "CreateMutexW", (SYSCALL)0, 0 }, + {"CreateMutexW", (SYSCALL)0, 0}, #endif -#define osCreateMutexW ((HANDLE(WINAPI*)(LPSECURITY_ATTRIBUTES,BOOL, \ - LPCWSTR))aSyscall[8].pCurrent) +#define osCreateMutexW ((HANDLE(WINAPI*)(LPSECURITY_ATTRIBUTES, BOOL, LPCWSTR))aSyscall[8].pCurrent) #if defined(SQLITE_WIN32_HAS_ANSI) - { "DeleteFileA", (SYSCALL)DeleteFileA, 0 }, + {"DeleteFileA", (SYSCALL)DeleteFileA, 0}, #else - { "DeleteFileA", (SYSCALL)0, 0 }, + {"DeleteFileA", (SYSCALL)0, 0}, #endif #define osDeleteFileA ((BOOL(WINAPI*)(LPCSTR))aSyscall[9].pCurrent) #if defined(SQLITE_WIN32_HAS_WIDE) - { "DeleteFileW", (SYSCALL)DeleteFileW, 0 }, + {"DeleteFileW", (SYSCALL)DeleteFileW, 0}, #else - { "DeleteFileW", (SYSCALL)0, 0 }, + {"DeleteFileW", (SYSCALL)0, 0}, #endif #define osDeleteFileW ((BOOL(WINAPI*)(LPCWSTR))aSyscall[10].pCurrent) #if SQLITE_OS_WINCE - { "FileTimeToLocalFileTime", (SYSCALL)FileTimeToLocalFileTime, 0 }, + {"FileTimeToLocalFileTime", (SYSCALL)FileTimeToLocalFileTime, 0}, #else - { "FileTimeToLocalFileTime", (SYSCALL)0, 0 }, + {"FileTimeToLocalFileTime", (SYSCALL)0, 0}, #endif -#define osFileTimeToLocalFileTime ((BOOL(WINAPI*)(CONST FILETIME*, \ - LPFILETIME))aSyscall[11].pCurrent) +#define osFileTimeToLocalFileTime ((BOOL(WINAPI*)(CONST FILETIME*, LPFILETIME))aSyscall[11].pCurrent) #if SQLITE_OS_WINCE - { "FileTimeToSystemTime", (SYSCALL)FileTimeToSystemTime, 0 }, + {"FileTimeToSystemTime", (SYSCALL)FileTimeToSystemTime, 0}, #else - { "FileTimeToSystemTime", (SYSCALL)0, 0 }, + {"FileTimeToSystemTime", (SYSCALL)0, 0}, #endif -#define osFileTimeToSystemTime ((BOOL(WINAPI*)(CONST FILETIME*, \ - LPSYSTEMTIME))aSyscall[12].pCurrent) +#define osFileTimeToSystemTime ((BOOL(WINAPI*)(CONST FILETIME*, LPSYSTEMTIME))aSyscall[12].pCurrent) - { "FlushFileBuffers", (SYSCALL)FlushFileBuffers, 0 }, + {"FlushFileBuffers", (SYSCALL)FlushFileBuffers, 0}, #define osFlushFileBuffers ((BOOL(WINAPI*)(HANDLE))aSyscall[13].pCurrent) #if defined(SQLITE_WIN32_HAS_ANSI) - { "FormatMessageA", (SYSCALL)FormatMessageA, 0 }, + {"FormatMessageA", (SYSCALL)FormatMessageA, 0}, #else - { "FormatMessageA", (SYSCALL)0, 0 }, + {"FormatMessageA", (SYSCALL)0, 0}, #endif -#define osFormatMessageA ((DWORD(WINAPI*)(DWORD,LPCVOID,DWORD,DWORD,LPSTR, \ - DWORD,va_list*))aSyscall[14].pCurrent) +#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 }, + {"FormatMessageW", (SYSCALL)FormatMessageW, 0}, #else - { "FormatMessageW", (SYSCALL)0, 0 }, + {"FormatMessageW", (SYSCALL)0, 0}, #endif -#define osFormatMessageW ((DWORD(WINAPI*)(DWORD,LPCVOID,DWORD,DWORD,LPWSTR, \ - DWORD,va_list*))aSyscall[15].pCurrent) +#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 }, + {"FreeLibrary", (SYSCALL)FreeLibrary, 0}, #else - { "FreeLibrary", (SYSCALL)0, 0 }, + {"FreeLibrary", (SYSCALL)0, 0}, #endif #define osFreeLibrary ((BOOL(WINAPI*)(HMODULE))aSyscall[16].pCurrent) - { "GetCurrentProcessId", (SYSCALL)GetCurrentProcessId, 0 }, + {"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 }, + {"GetDiskFreeSpaceA", (SYSCALL)GetDiskFreeSpaceA, 0}, #else - { "GetDiskFreeSpaceA", (SYSCALL)0, 0 }, + {"GetDiskFreeSpaceA", (SYSCALL)0, 0}, #endif -#define osGetDiskFreeSpaceA ((BOOL(WINAPI*)(LPCSTR,LPDWORD,LPDWORD,LPDWORD, \ - LPDWORD))aSyscall[18].pCurrent) +#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 }, + {"GetDiskFreeSpaceW", (SYSCALL)GetDiskFreeSpaceW, 0}, #else - { "GetDiskFreeSpaceW", (SYSCALL)0, 0 }, + {"GetDiskFreeSpaceW", (SYSCALL)0, 0}, #endif -#define osGetDiskFreeSpaceW ((BOOL(WINAPI*)(LPCWSTR,LPDWORD,LPDWORD,LPDWORD, \ - LPDWORD))aSyscall[19].pCurrent) +#define osGetDiskFreeSpaceW ((BOOL(WINAPI*)(LPCWSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD))aSyscall[19].pCurrent) #if defined(SQLITE_WIN32_HAS_ANSI) - { "GetFileAttributesA", (SYSCALL)GetFileAttributesA, 0 }, + {"GetFileAttributesA", (SYSCALL)GetFileAttributesA, 0}, #else - { "GetFileAttributesA", (SYSCALL)0, 0 }, + {"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 }, + {"GetFileAttributesW", (SYSCALL)GetFileAttributesW, 0}, #else - { "GetFileAttributesW", (SYSCALL)0, 0 }, + {"GetFileAttributesW", (SYSCALL)0, 0}, #endif #define osGetFileAttributesW ((DWORD(WINAPI*)(LPCWSTR))aSyscall[21].pCurrent) #if defined(SQLITE_WIN32_HAS_WIDE) - { "GetFileAttributesExW", (SYSCALL)GetFileAttributesExW, 0 }, + {"GetFileAttributesExW", (SYSCALL)GetFileAttributesExW, 0}, #else - { "GetFileAttributesExW", (SYSCALL)0, 0 }, + {"GetFileAttributesExW", (SYSCALL)0, 0}, #endif -#define osGetFileAttributesExW ((BOOL(WINAPI*)(LPCWSTR,GET_FILEEX_INFO_LEVELS, \ - LPVOID))aSyscall[22].pCurrent) +#define osGetFileAttributesExW ((BOOL(WINAPI*)(LPCWSTR, GET_FILEEX_INFO_LEVELS, LPVOID))aSyscall[22].pCurrent) #if !SQLITE_OS_WINRT - { "GetFileSize", (SYSCALL)GetFileSize, 0 }, + {"GetFileSize", (SYSCALL)GetFileSize, 0}, #else - { "GetFileSize", (SYSCALL)0, 0 }, + {"GetFileSize", (SYSCALL)0, 0}, #endif -#define osGetFileSize ((DWORD(WINAPI*)(HANDLE,LPDWORD))aSyscall[23].pCurrent) +#define osGetFileSize ((DWORD(WINAPI*)(HANDLE, LPDWORD))aSyscall[23].pCurrent) #if !SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_ANSI) - { "GetFullPathNameA", (SYSCALL)GetFullPathNameA, 0 }, + {"GetFullPathNameA", (SYSCALL)GetFullPathNameA, 0}, #else - { "GetFullPathNameA", (SYSCALL)0, 0 }, + {"GetFullPathNameA", (SYSCALL)0, 0}, #endif -#define osGetFullPathNameA ((DWORD(WINAPI*)(LPCSTR,DWORD,LPSTR, \ - LPSTR*))aSyscall[24].pCurrent) +#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 }, + {"GetFullPathNameW", (SYSCALL)GetFullPathNameW, 0}, #else - { "GetFullPathNameW", (SYSCALL)0, 0 }, + {"GetFullPathNameW", (SYSCALL)0, 0}, #endif -#define osGetFullPathNameW ((DWORD(WINAPI*)(LPCWSTR,DWORD,LPWSTR, \ - LPWSTR*))aSyscall[25].pCurrent) +#define osGetFullPathNameW ((DWORD(WINAPI*)(LPCWSTR, DWORD, LPWSTR, LPWSTR*))aSyscall[25].pCurrent) - { "GetLastError", (SYSCALL)GetLastError, 0 }, + {"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 }, + /* 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 }, + /* 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 }, + {"GetProcAddressA", (SYSCALL)0, 0}, #endif -#define osGetProcAddressA ((FARPROC(WINAPI*)(HMODULE, \ - LPCSTR))aSyscall[27].pCurrent) +#define osGetProcAddressA ((FARPROC(WINAPI*)(HMODULE, LPCSTR))aSyscall[27].pCurrent) #if !SQLITE_OS_WINRT - { "GetSystemInfo", (SYSCALL)GetSystemInfo, 0 }, + {"GetSystemInfo", (SYSCALL)GetSystemInfo, 0}, #else - { "GetSystemInfo", (SYSCALL)0, 0 }, + {"GetSystemInfo", (SYSCALL)0, 0}, #endif #define osGetSystemInfo ((VOID(WINAPI*)(LPSYSTEM_INFO))aSyscall[28].pCurrent) - { "GetSystemTime", (SYSCALL)GetSystemTime, 0 }, + {"GetSystemTime", (SYSCALL)GetSystemTime, 0}, #define osGetSystemTime ((VOID(WINAPI*)(LPSYSTEMTIME))aSyscall[29].pCurrent) #if !SQLITE_OS_WINCE - { "GetSystemTimeAsFileTime", (SYSCALL)GetSystemTimeAsFileTime, 0 }, + {"GetSystemTimeAsFileTime", (SYSCALL)GetSystemTimeAsFileTime, 0}, #else - { "GetSystemTimeAsFileTime", (SYSCALL)0, 0 }, + {"GetSystemTimeAsFileTime", (SYSCALL)0, 0}, #endif -#define osGetSystemTimeAsFileTime ((VOID(WINAPI*)( \ - LPFILETIME))aSyscall[30].pCurrent) +#define osGetSystemTimeAsFileTime ((VOID(WINAPI*)(LPFILETIME))aSyscall[30].pCurrent) #if defined(SQLITE_WIN32_HAS_ANSI) - { "GetTempPathA", (SYSCALL)GetTempPathA, 0 }, + {"GetTempPathA", (SYSCALL)GetTempPathA, 0}, #else - { "GetTempPathA", (SYSCALL)0, 0 }, + {"GetTempPathA", (SYSCALL)0, 0}, #endif -#define osGetTempPathA ((DWORD(WINAPI*)(DWORD,LPSTR))aSyscall[31].pCurrent) +#define osGetTempPathA ((DWORD(WINAPI*)(DWORD, LPSTR))aSyscall[31].pCurrent) #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) - { "GetTempPathW", (SYSCALL)GetTempPathW, 0 }, + {"GetTempPathW", (SYSCALL)GetTempPathW, 0}, #else - { "GetTempPathW", (SYSCALL)0, 0 }, + {"GetTempPathW", (SYSCALL)0, 0}, #endif -#define osGetTempPathW ((DWORD(WINAPI*)(DWORD,LPWSTR))aSyscall[32].pCurrent) +#define osGetTempPathW ((DWORD(WINAPI*)(DWORD, LPWSTR))aSyscall[32].pCurrent) #if !SQLITE_OS_WINRT - { "GetTickCount", (SYSCALL)GetTickCount, 0 }, + {"GetTickCount", (SYSCALL)GetTickCount, 0}, #else - { "GetTickCount", (SYSCALL)0, 0 }, + {"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 }, + {"GetVersionExA", (SYSCALL)GetVersionExA, 0}, #else - { "GetVersionExA", (SYSCALL)0, 0 }, + {"GetVersionExA", (SYSCALL)0, 0}, #endif -#define osGetVersionExA ((BOOL(WINAPI*)( \ - LPOSVERSIONINFOA))aSyscall[34].pCurrent) +#define osGetVersionExA ((BOOL(WINAPI*)(LPOSVERSIONINFOA))aSyscall[34].pCurrent) -#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) && \ - SQLITE_WIN32_GETVERSIONEX - { "GetVersionExW", (SYSCALL)GetVersionExW, 0 }, +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) && SQLITE_WIN32_GETVERSIONEX + {"GetVersionExW", (SYSCALL)GetVersionExW, 0}, #else - { "GetVersionExW", (SYSCALL)0, 0 }, + {"GetVersionExW", (SYSCALL)0, 0}, #endif -#define osGetVersionExW ((BOOL(WINAPI*)( \ - LPOSVERSIONINFOW))aSyscall[35].pCurrent) +#define osGetVersionExW ((BOOL(WINAPI*)(LPOSVERSIONINFOW))aSyscall[35].pCurrent) - { "HeapAlloc", (SYSCALL)HeapAlloc, 0 }, + {"HeapAlloc", (SYSCALL)HeapAlloc, 0}, -#define osHeapAlloc ((LPVOID(WINAPI*)(HANDLE,DWORD, \ - SIZE_T))aSyscall[36].pCurrent) +#define osHeapAlloc ((LPVOID(WINAPI*)(HANDLE, DWORD, SIZE_T))aSyscall[36].pCurrent) #if !SQLITE_OS_WINRT - { "HeapCreate", (SYSCALL)HeapCreate, 0 }, + {"HeapCreate", (SYSCALL)HeapCreate, 0}, #else - { "HeapCreate", (SYSCALL)0, 0 }, + {"HeapCreate", (SYSCALL)0, 0}, #endif -#define osHeapCreate ((HANDLE(WINAPI*)(DWORD,SIZE_T, \ - SIZE_T))aSyscall[37].pCurrent) +#define osHeapCreate ((HANDLE(WINAPI*)(DWORD, SIZE_T, SIZE_T))aSyscall[37].pCurrent) #if !SQLITE_OS_WINRT - { "HeapDestroy", (SYSCALL)HeapDestroy, 0 }, + {"HeapDestroy", (SYSCALL)HeapDestroy, 0}, #else - { "HeapDestroy", (SYSCALL)0, 0 }, + {"HeapDestroy", (SYSCALL)0, 0}, #endif #define osHeapDestroy ((BOOL(WINAPI*)(HANDLE))aSyscall[38].pCurrent) - { "HeapFree", (SYSCALL)HeapFree, 0 }, + {"HeapFree", (SYSCALL)HeapFree, 0}, -#define osHeapFree ((BOOL(WINAPI*)(HANDLE,DWORD,LPVOID))aSyscall[39].pCurrent) +#define osHeapFree ((BOOL(WINAPI*)(HANDLE, DWORD, LPVOID))aSyscall[39].pCurrent) - { "HeapReAlloc", (SYSCALL)HeapReAlloc, 0 }, + {"HeapReAlloc", (SYSCALL)HeapReAlloc, 0}, -#define osHeapReAlloc ((LPVOID(WINAPI*)(HANDLE,DWORD,LPVOID, \ - SIZE_T))aSyscall[40].pCurrent) +#define osHeapReAlloc ((LPVOID(WINAPI*)(HANDLE, DWORD, LPVOID, SIZE_T))aSyscall[40].pCurrent) - { "HeapSize", (SYSCALL)HeapSize, 0 }, + {"HeapSize", (SYSCALL)HeapSize, 0}, -#define osHeapSize ((SIZE_T(WINAPI*)(HANDLE,DWORD, \ - LPCVOID))aSyscall[41].pCurrent) +#define osHeapSize ((SIZE_T(WINAPI*)(HANDLE, DWORD, LPCVOID))aSyscall[41].pCurrent) #if !SQLITE_OS_WINRT - { "HeapValidate", (SYSCALL)HeapValidate, 0 }, + {"HeapValidate", (SYSCALL)HeapValidate, 0}, #else - { "HeapValidate", (SYSCALL)0, 0 }, + {"HeapValidate", (SYSCALL)0, 0}, #endif -#define osHeapValidate ((BOOL(WINAPI*)(HANDLE,DWORD, \ - LPCVOID))aSyscall[42].pCurrent) +#define osHeapValidate ((BOOL(WINAPI*)(HANDLE, DWORD, LPCVOID))aSyscall[42].pCurrent) #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT - { "HeapCompact", (SYSCALL)HeapCompact, 0 }, + {"HeapCompact", (SYSCALL)HeapCompact, 0}, #else - { "HeapCompact", (SYSCALL)0, 0 }, + {"HeapCompact", (SYSCALL)0, 0}, #endif -#define osHeapCompact ((UINT(WINAPI*)(HANDLE,DWORD))aSyscall[43].pCurrent) +#define osHeapCompact ((UINT(WINAPI*)(HANDLE, DWORD))aSyscall[43].pCurrent) #if defined(SQLITE_WIN32_HAS_ANSI) && !defined(SQLITE_OMIT_LOAD_EXTENSION) - { "LoadLibraryA", (SYSCALL)LoadLibraryA, 0 }, + {"LoadLibraryA", (SYSCALL)LoadLibraryA, 0}, #else - { "LoadLibraryA", (SYSCALL)0, 0 }, + {"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 }, +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) + {"LoadLibraryW", (SYSCALL)LoadLibraryW, 0}, #else - { "LoadLibraryW", (SYSCALL)0, 0 }, + {"LoadLibraryW", (SYSCALL)0, 0}, #endif #define osLoadLibraryW ((HMODULE(WINAPI*)(LPCWSTR))aSyscall[45].pCurrent) #if !SQLITE_OS_WINRT - { "LocalFree", (SYSCALL)LocalFree, 0 }, + {"LocalFree", (SYSCALL)LocalFree, 0}, #else - { "LocalFree", (SYSCALL)0, 0 }, + {"LocalFree", (SYSCALL)0, 0}, #endif #define osLocalFree ((HLOCAL(WINAPI*)(HLOCAL))aSyscall[46].pCurrent) #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT - { "LockFile", (SYSCALL)LockFile, 0 }, + {"LockFile", (SYSCALL)LockFile, 0}, #else - { "LockFile", (SYSCALL)0, 0 }, + {"LockFile", (SYSCALL)0, 0}, #endif #ifndef osLockFile -#define osLockFile ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ - DWORD))aSyscall[47].pCurrent) +#define osLockFile ((BOOL(WINAPI*)(HANDLE, DWORD, DWORD, DWORD, DWORD))aSyscall[47].pCurrent) #endif #if !SQLITE_OS_WINCE - { "LockFileEx", (SYSCALL)LockFileEx, 0 }, + {"LockFileEx", (SYSCALL)LockFileEx, 0}, #else - { "LockFileEx", (SYSCALL)0, 0 }, + {"LockFileEx", (SYSCALL)0, 0}, #endif #ifndef osLockFileEx -#define osLockFileEx ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD,DWORD, \ - LPOVERLAPPED))aSyscall[48].pCurrent) +#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 }, +#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 }, + {"MapViewOfFile", (SYSCALL)0, 0}, #endif -#define osMapViewOfFile ((LPVOID(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ - SIZE_T))aSyscall[49].pCurrent) +#define osMapViewOfFile ((LPVOID(WINAPI*)(HANDLE, DWORD, DWORD, DWORD, SIZE_T))aSyscall[49].pCurrent) - { "MultiByteToWideChar", (SYSCALL)MultiByteToWideChar, 0 }, + {"MultiByteToWideChar", (SYSCALL)MultiByteToWideChar, 0}, -#define osMultiByteToWideChar ((int(WINAPI*)(UINT,DWORD,LPCSTR,int,LPWSTR, \ - int))aSyscall[50].pCurrent) +#define osMultiByteToWideChar ((int(WINAPI*)(UINT, DWORD, LPCSTR, int, LPWSTR, int))aSyscall[50].pCurrent) - { "QueryPerformanceCounter", (SYSCALL)QueryPerformanceCounter, 0 }, + {"QueryPerformanceCounter", (SYSCALL)QueryPerformanceCounter, 0}, -#define osQueryPerformanceCounter ((BOOL(WINAPI*)( \ - LARGE_INTEGER*))aSyscall[51].pCurrent) +#define osQueryPerformanceCounter ((BOOL(WINAPI*)(LARGE_INTEGER*))aSyscall[51].pCurrent) - { "ReadFile", (SYSCALL)ReadFile, 0 }, + {"ReadFile", (SYSCALL)ReadFile, 0}, -#define osReadFile ((BOOL(WINAPI*)(HANDLE,LPVOID,DWORD,LPDWORD, \ - LPOVERLAPPED))aSyscall[52].pCurrent) +#define osReadFile ((BOOL(WINAPI*)(HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED))aSyscall[52].pCurrent) - { "SetEndOfFile", (SYSCALL)SetEndOfFile, 0 }, + {"SetEndOfFile", (SYSCALL)SetEndOfFile, 0}, #define osSetEndOfFile ((BOOL(WINAPI*)(HANDLE))aSyscall[53].pCurrent) #if !SQLITE_OS_WINRT - { "SetFilePointer", (SYSCALL)SetFilePointer, 0 }, + {"SetFilePointer", (SYSCALL)SetFilePointer, 0}, #else - { "SetFilePointer", (SYSCALL)0, 0 }, + {"SetFilePointer", (SYSCALL)0, 0}, #endif -#define osSetFilePointer ((DWORD(WINAPI*)(HANDLE,LONG,PLONG, \ - DWORD))aSyscall[54].pCurrent) +#define osSetFilePointer ((DWORD(WINAPI*)(HANDLE, LONG, PLONG, DWORD))aSyscall[54].pCurrent) #if !SQLITE_OS_WINRT - { "Sleep", (SYSCALL)Sleep, 0 }, + {"Sleep", (SYSCALL)Sleep, 0}, #else - { "Sleep", (SYSCALL)0, 0 }, + {"Sleep", (SYSCALL)0, 0}, #endif #define osSleep ((VOID(WINAPI*)(DWORD))aSyscall[55].pCurrent) - { "SystemTimeToFileTime", (SYSCALL)SystemTimeToFileTime, 0 }, + {"SystemTimeToFileTime", (SYSCALL)SystemTimeToFileTime, 0}, -#define osSystemTimeToFileTime ((BOOL(WINAPI*)(CONST SYSTEMTIME*, \ - LPFILETIME))aSyscall[56].pCurrent) +#define osSystemTimeToFileTime ((BOOL(WINAPI*)(CONST SYSTEMTIME*, LPFILETIME))aSyscall[56].pCurrent) #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT - { "UnlockFile", (SYSCALL)UnlockFile, 0 }, + {"UnlockFile", (SYSCALL)UnlockFile, 0}, #else - { "UnlockFile", (SYSCALL)0, 0 }, + {"UnlockFile", (SYSCALL)0, 0}, #endif #ifndef osUnlockFile -#define osUnlockFile ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ - DWORD))aSyscall[57].pCurrent) +#define osUnlockFile ((BOOL(WINAPI*)(HANDLE, DWORD, DWORD, DWORD, DWORD))aSyscall[57].pCurrent) #endif #if !SQLITE_OS_WINCE - { "UnlockFileEx", (SYSCALL)UnlockFileEx, 0 }, + {"UnlockFileEx", (SYSCALL)UnlockFileEx, 0}, #else - { "UnlockFileEx", (SYSCALL)0, 0 }, + {"UnlockFileEx", (SYSCALL)0, 0}, #endif -#define osUnlockFileEx ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ - LPOVERLAPPED))aSyscall[58].pCurrent) +#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 }, +#if SQLITE_OS_WINCE || !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE > 0 + {"UnmapViewOfFile", (SYSCALL)UnmapViewOfFile, 0}, #else - { "UnmapViewOfFile", (SYSCALL)0, 0 }, + {"UnmapViewOfFile", (SYSCALL)0, 0}, #endif #define osUnmapViewOfFile ((BOOL(WINAPI*)(LPCVOID))aSyscall[59].pCurrent) - { "WideCharToMultiByte", (SYSCALL)WideCharToMultiByte, 0 }, + {"WideCharToMultiByte", (SYSCALL)WideCharToMultiByte, 0}, -#define osWideCharToMultiByte ((int(WINAPI*)(UINT,DWORD,LPCWSTR,int,LPSTR,int, \ - LPCSTR,LPBOOL))aSyscall[60].pCurrent) +#define osWideCharToMultiByte ((int(WINAPI*)(UINT, DWORD, LPCWSTR, int, LPSTR, int, LPCSTR, LPBOOL))aSyscall[60].pCurrent) - { "WriteFile", (SYSCALL)WriteFile, 0 }, + {"WriteFile", (SYSCALL)WriteFile, 0}, -#define osWriteFile ((BOOL(WINAPI*)(HANDLE,LPCVOID,DWORD,LPDWORD, \ - LPOVERLAPPED))aSyscall[61].pCurrent) +#define osWriteFile ((BOOL(WINAPI*)(HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED))aSyscall[61].pCurrent) #if SQLITE_OS_WINRT - { "CreateEventExW", (SYSCALL)CreateEventExW, 0 }, + {"CreateEventExW", (SYSCALL)CreateEventExW, 0}, #else - { "CreateEventExW", (SYSCALL)0, 0 }, + {"CreateEventExW", (SYSCALL)0, 0}, #endif -#define osCreateEventExW ((HANDLE(WINAPI*)(LPSECURITY_ATTRIBUTES,LPCWSTR, \ - DWORD,DWORD))aSyscall[62].pCurrent) +#define osCreateEventExW ((HANDLE(WINAPI*)(LPSECURITY_ATTRIBUTES, LPCWSTR, DWORD, DWORD))aSyscall[62].pCurrent) #if !SQLITE_OS_WINRT - { "WaitForSingleObject", (SYSCALL)WaitForSingleObject, 0 }, + {"WaitForSingleObject", (SYSCALL)WaitForSingleObject, 0}, #else - { "WaitForSingleObject", (SYSCALL)0, 0 }, + {"WaitForSingleObject", (SYSCALL)0, 0}, #endif -#define osWaitForSingleObject ((DWORD(WINAPI*)(HANDLE, \ - DWORD))aSyscall[63].pCurrent) +#define osWaitForSingleObject ((DWORD(WINAPI*)(HANDLE, DWORD))aSyscall[63].pCurrent) #if !SQLITE_OS_WINCE - { "WaitForSingleObjectEx", (SYSCALL)WaitForSingleObjectEx, 0 }, + {"WaitForSingleObjectEx", (SYSCALL)WaitForSingleObjectEx, 0}, #else - { "WaitForSingleObjectEx", (SYSCALL)0, 0 }, + {"WaitForSingleObjectEx", (SYSCALL)0, 0}, #endif -#define osWaitForSingleObjectEx ((DWORD(WINAPI*)(HANDLE,DWORD, \ - BOOL))aSyscall[64].pCurrent) +#define osWaitForSingleObjectEx ((DWORD(WINAPI*)(HANDLE, DWORD, BOOL))aSyscall[64].pCurrent) #if SQLITE_OS_WINRT - { "SetFilePointerEx", (SYSCALL)SetFilePointerEx, 0 }, + {"SetFilePointerEx", (SYSCALL)SetFilePointerEx, 0}, #else - { "SetFilePointerEx", (SYSCALL)0, 0 }, + {"SetFilePointerEx", (SYSCALL)0, 0}, #endif -#define osSetFilePointerEx ((BOOL(WINAPI*)(HANDLE,LARGE_INTEGER, \ - PLARGE_INTEGER,DWORD))aSyscall[65].pCurrent) +#define osSetFilePointerEx ((BOOL(WINAPI*)(HANDLE, LARGE_INTEGER, PLARGE_INTEGER, DWORD))aSyscall[65].pCurrent) #if SQLITE_OS_WINRT - { "GetFileInformationByHandleEx", (SYSCALL)GetFileInformationByHandleEx, 0 }, + {"GetFileInformationByHandleEx", (SYSCALL)GetFileInformationByHandleEx, 0}, #else - { "GetFileInformationByHandleEx", (SYSCALL)0, 0 }, + {"GetFileInformationByHandleEx", (SYSCALL)0, 0}, #endif -#define osGetFileInformationByHandleEx ((BOOL(WINAPI*)(HANDLE, \ - FILE_INFO_BY_HANDLE_CLASS,LPVOID,DWORD))aSyscall[66].pCurrent) +#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 }, +#if SQLITE_OS_WINRT && (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE > 0) + {"MapViewOfFileFromApp", (SYSCALL)MapViewOfFileFromApp, 0}, #else - { "MapViewOfFileFromApp", (SYSCALL)0, 0 }, + {"MapViewOfFileFromApp", (SYSCALL)0, 0}, #endif -#define osMapViewOfFileFromApp ((LPVOID(WINAPI*)(HANDLE,ULONG,ULONG64, \ - SIZE_T))aSyscall[67].pCurrent) +#define osMapViewOfFileFromApp ((LPVOID(WINAPI*)(HANDLE, ULONG, ULONG64, SIZE_T))aSyscall[67].pCurrent) #if SQLITE_OS_WINRT - { "CreateFile2", (SYSCALL)CreateFile2, 0 }, + {"CreateFile2", (SYSCALL)CreateFile2, 0}, #else - { "CreateFile2", (SYSCALL)0, 0 }, + {"CreateFile2", (SYSCALL)0, 0}, #endif -#define osCreateFile2 ((HANDLE(WINAPI*)(LPCWSTR,DWORD,DWORD,DWORD, \ - LPCREATEFILE2_EXTENDED_PARAMETERS))aSyscall[68].pCurrent) +#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 }, + {"LoadPackagedLibrary", (SYSCALL)LoadPackagedLibrary, 0}, #else - { "LoadPackagedLibrary", (SYSCALL)0, 0 }, + {"LoadPackagedLibrary", (SYSCALL)0, 0}, #endif -#define osLoadPackagedLibrary ((HMODULE(WINAPI*)(LPCWSTR, \ - DWORD))aSyscall[69].pCurrent) +#define osLoadPackagedLibrary ((HMODULE(WINAPI*)(LPCWSTR, DWORD))aSyscall[69].pCurrent) #if SQLITE_OS_WINRT - { "GetTickCount64", (SYSCALL)GetTickCount64, 0 }, + {"GetTickCount64", (SYSCALL)GetTickCount64, 0}, #else - { "GetTickCount64", (SYSCALL)0, 0 }, + {"GetTickCount64", (SYSCALL)0, 0}, #endif #define osGetTickCount64 ((ULONGLONG(WINAPI*)(VOID))aSyscall[70].pCurrent) #if SQLITE_OS_WINRT - { "GetNativeSystemInfo", (SYSCALL)GetNativeSystemInfo, 0 }, + {"GetNativeSystemInfo", (SYSCALL)GetNativeSystemInfo, 0}, #else - { "GetNativeSystemInfo", (SYSCALL)0, 0 }, + {"GetNativeSystemInfo", (SYSCALL)0, 0}, #endif -#define osGetNativeSystemInfo ((VOID(WINAPI*)( \ - LPSYSTEM_INFO))aSyscall[71].pCurrent) +#define osGetNativeSystemInfo ((VOID(WINAPI*)(LPSYSTEM_INFO))aSyscall[71].pCurrent) #if defined(SQLITE_WIN32_HAS_ANSI) - { "OutputDebugStringA", (SYSCALL)OutputDebugStringA, 0 }, + {"OutputDebugStringA", (SYSCALL)OutputDebugStringA, 0}, #else - { "OutputDebugStringA", (SYSCALL)0, 0 }, + {"OutputDebugStringA", (SYSCALL)0, 0}, #endif #define osOutputDebugStringA ((VOID(WINAPI*)(LPCSTR))aSyscall[72].pCurrent) #if defined(SQLITE_WIN32_HAS_WIDE) - { "OutputDebugStringW", (SYSCALL)OutputDebugStringW, 0 }, + {"OutputDebugStringW", (SYSCALL)OutputDebugStringW, 0}, #else - { "OutputDebugStringW", (SYSCALL)0, 0 }, + {"OutputDebugStringW", (SYSCALL)0, 0}, #endif #define osOutputDebugStringW ((VOID(WINAPI*)(LPCWSTR))aSyscall[73].pCurrent) - { "GetProcessHeap", (SYSCALL)GetProcessHeap, 0 }, + {"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 }, +#if SQLITE_OS_WINRT && (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE > 0) + {"CreateFileMappingFromApp", (SYSCALL)CreateFileMappingFromApp, 0}, #else - { "CreateFileMappingFromApp", (SYSCALL)0, 0 }, + {"CreateFileMappingFromApp", (SYSCALL)0, 0}, #endif -#define osCreateFileMappingFromApp ((HANDLE(WINAPI*)(HANDLE, \ - LPSECURITY_ATTRIBUTES,ULONG,ULONG64,LPCWSTR))aSyscall[75].pCurrent) +#define osCreateFileMappingFromApp ((HANDLE(WINAPI*)(HANDLE, LPSECURITY_ATTRIBUTES, ULONG, ULONG64, LPCWSTR))aSyscall[75].pCurrent) /* ** NOTE: On some sub-platforms, the InterlockedCompareExchange "function" @@ -44698,41 +44247,38 @@ static struct win_syscall { ** So do not try to make this is into a redefinable interface. */ #if defined(InterlockedCompareExchange) - { "InterlockedCompareExchange", (SYSCALL)0, 0 }, + {"InterlockedCompareExchange", (SYSCALL)0, 0}, #define osInterlockedCompareExchange InterlockedCompareExchange #else - { "InterlockedCompareExchange", (SYSCALL)InterlockedCompareExchange, 0 }, + {"InterlockedCompareExchange", (SYSCALL)InterlockedCompareExchange, 0}, -#define osInterlockedCompareExchange ((LONG(WINAPI*)(LONG \ - SQLITE_WIN32_VOLATILE*, LONG,LONG))aSyscall[76].pCurrent) +#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 }, + {"UuidCreate", (SYSCALL)UuidCreate, 0}, #else - { "UuidCreate", (SYSCALL)0, 0 }, + {"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 }, + {"UuidCreateSequential", (SYSCALL)UuidCreateSequential, 0}, #else - { "UuidCreateSequential", (SYSCALL)0, 0 }, + {"UuidCreateSequential", (SYSCALL)0, 0}, #endif -#define osUuidCreateSequential \ - ((RPC_STATUS(RPC_ENTRY*)(UUID*))aSyscall[78].pCurrent) +#define osUuidCreateSequential ((RPC_STATUS(RPC_ENTRY*)(UUID*))aSyscall[78].pCurrent) -#if !defined(SQLITE_NO_SYNC) && SQLITE_MAX_MMAP_SIZE>0 - { "FlushViewOfFile", (SYSCALL)FlushViewOfFile, 0 }, +#if !defined(SQLITE_NO_SYNC) && SQLITE_MAX_MMAP_SIZE > 0 + {"FlushViewOfFile", (SYSCALL)FlushViewOfFile, 0}, #else - { "FlushViewOfFile", (SYSCALL)0, 0 }, + {"FlushViewOfFile", (SYSCALL)0, 0}, #endif -#define osFlushViewOfFile \ - ((BOOL(WINAPI*)(LPCVOID,SIZE_T))aSyscall[79].pCurrent) +#define osFlushViewOfFile ((BOOL(WINAPI*)(LPCVOID, SIZE_T))aSyscall[79].pCurrent) }; /* End of the overrideable system calls */ @@ -44742,36 +44288,36 @@ static struct win_syscall { ** 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 */ -){ +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 (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 ){ + if (nMin > 0) { memset(zDbgBuf, 0, SQLITE_WIN32_DBG_BUF_SIZE); memcpy(zDbgBuf, zBuf, nMin); osOutputDebugStringA(zDbgBuf); - }else{ + } 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 ){ + 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 ){ + if (nMin > 0) { memset(zDbgBuf, 0, SQLITE_WIN32_DBG_BUF_SIZE); memcpy(zDbgBuf, zBuf, nMin); fprintf(stderr, "%s", zDbgBuf); - }else{ + } else { fprintf(stderr, "%s", zBuf); } #endif @@ -44958,25 +44502,23 @@ SQLITE_API void sqlite3_win32_write_debug(const char *zBuf, int nBuf){ static HANDLE sleepObj = NULL; #endif -SQLITE_API void sqlite3_win32_sleep(DWORD milliseconds){ +SQLITE_API void sqlite3_win32_sleep(DWORD milliseconds) { #if SQLITE_OS_WINRT - if ( sleepObj==NULL ){ - sleepObj = osCreateEventExW(NULL, NULL, CREATE_EVENT_MANUAL_RESET, - SYNCHRONIZE); + if (sleepObj == NULL) { + sleepObj = osCreateEventExW(NULL, NULL, CREATE_EVENT_MANUAL_RESET, SYNCHRONIZE); } - assert( sleepObj!=NULL ); + 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){ +#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 ){} + while ((rc = osWaitForSingleObjectEx(hObject, INFINITE, TRUE)) == WAIT_IO_COMPLETION) { + } return rc; } #endif @@ -44994,20 +44536,20 @@ SQLITE_PRIVATE DWORD sqlite3Win32Wait(HANDLE hObject){ */ #if !SQLITE_WIN32_GETVERSIONEX -# define osIsNT() (1) +#define osIsNT() (1) #elif SQLITE_OS_WINCE || SQLITE_OS_WINRT || !defined(SQLITE_WIN32_HAS_ANSI) -# define osIsNT() (1) +#define osIsNT() (1) #elif !defined(SQLITE_WIN32_HAS_WIDE) -# define osIsNT() (0) +#define osIsNT() (0) #else -# define osIsNT() ((sqlite3_os_type==2) || sqlite3_win32_is_nt()) +#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){ +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 @@ -45015,24 +44557,22 @@ SQLITE_API int sqlite3_win32_is_nt(void){ */ return 1; #elif SQLITE_WIN32_GETVERSIONEX - if( osInterlockedCompareExchange(&sqlite3_os_type, 0, 0)==0 ){ + 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); + 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); + osInterlockedCompareExchange(&sqlite3_os_type, (sInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) ? 2 : 1, 0); #endif } - return osInterlockedCompareExchange(&sqlite3_os_type, 2, 2)==2; + return osInterlockedCompareExchange(&sqlite3_os_type, 2, 2) == 2; #elif SQLITE_TEST - return osInterlockedCompareExchange(&sqlite3_os_type, 2, 2)==2; + return osInterlockedCompareExchange(&sqlite3_os_type, 2, 2) == 2; #else /* ** NOTE: All sub-platforms where the GetVersionEx[AW] functions are @@ -45046,22 +44586,21 @@ SQLITE_API int sqlite3_win32_is_nt(void){ /* ** Allocate nBytes of memory. */ -static void *winMemMalloc(int nBytes){ +static void* winMemMalloc(int nBytes) { HANDLE hHeap; - void *p; + void* p; winMemAssertMagic(); hHeap = winMemGetHeap(); - assert( hHeap!=0 ); - assert( hHeap!=INVALID_HANDLE_VALUE ); + 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) ); + assert(osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL)); #endif - assert( nBytes>=0 ); + 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); + if (!p) { + sqlite3_log(SQLITE_NOMEM, "failed to HeapAlloc %u bytes (%lu), heap=%p", nBytes, osGetLastError(), (void*)hHeap); } return p; } @@ -45069,46 +44608,45 @@ static void *winMemMalloc(int nBytes){ /* ** Free memory. */ -static void winMemFree(void *pPrior){ +static void winMemFree(void* pPrior) { HANDLE hHeap; winMemAssertMagic(); hHeap = winMemGetHeap(); - assert( hHeap!=0 ); - assert( hHeap!=INVALID_HANDLE_VALUE ); + 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) ); + 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); + 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){ +static void* winMemRealloc(void* pPrior, int nBytes) { HANDLE hHeap; - void *p; + void* p; winMemAssertMagic(); hHeap = winMemGetHeap(); - assert( hHeap!=0 ); - assert( hHeap!=INVALID_HANDLE_VALUE ); + 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) ); + assert(osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior)); #endif - assert( nBytes>=0 ); - if( !pPrior ){ + assert(nBytes >= 0); + if (!pPrior) { p = osHeapAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, (SIZE_T)nBytes); - }else{ + } 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(), + if (!p) { + sqlite3_log(SQLITE_NOMEM, "failed to %s %u bytes (%lu), heap=%p", pPrior ? "HeapReAlloc" : "HeapAlloc", nBytes, osGetLastError(), (void*)hHeap); } return p; @@ -45117,22 +44655,22 @@ static void *winMemRealloc(void *pPrior, int nBytes){ /* ** Return the size of an outstanding allocation, in bytes. */ -static int winMemSize(void *p){ +static int winMemSize(void* p) { HANDLE hHeap; SIZE_T n; winMemAssertMagic(); hHeap = winMemGetHeap(); - assert( hHeap!=0 ); - assert( hHeap!=INVALID_HANDLE_VALUE ); + 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) ); + assert(osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, p)); #endif - if( !p ) return 0; + 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); + 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; @@ -45141,55 +44679,52 @@ static int winMemSize(void *p){ /* ** Round up a request size to the next valid allocation size. */ -static int winMemRoundup(int n){ +static int winMemRoundup(int n) { return n; } /* ** Initialize this module. */ -static int winMemInit(void *pAppData){ - winMemData *pWinMemData = (winMemData *)pAppData; +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 (!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 ){ + if (!pWinMemData->hHeap) { DWORD dwInitialSize = SQLITE_WIN32_HEAP_INIT_SIZE; DWORD dwMaximumSize = (DWORD)sqlite3GlobalConfig.nHeap; - if( dwMaximumSize==0 ){ + if (dwMaximumSize == 0) { dwMaximumSize = SQLITE_WIN32_HEAP_MAX_SIZE; - }else if( dwInitialSize>dwMaximumSize ){ + } 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); + 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 ); + assert(pWinMemData->bOwned); } #else pWinMemData->hHeap = osGetProcessHeap(); - if( !pWinMemData->hHeap ){ - sqlite3_log(SQLITE_NOMEM, - "failed to GetProcessHeap (%lu)", osGetLastError()); + if (!pWinMemData->hHeap) { + sqlite3_log(SQLITE_NOMEM, "failed to GetProcessHeap (%lu)", osGetLastError()); return SQLITE_NOMEM_BKPT; } pWinMemData->bOwned = FALSE; - assert( !pWinMemData->bOwned ); + assert(!pWinMemData->bOwned); #endif - assert( pWinMemData->hHeap!=0 ); - assert( pWinMemData->hHeap!=INVALID_HANDLE_VALUE ); + 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) ); + assert(osHeapValidate(pWinMemData->hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL)); #endif return SQLITE_OK; } @@ -45197,22 +44732,22 @@ static int winMemInit(void *pAppData){ /* ** Deinitialize this module. */ -static void winMemShutdown(void *pAppData){ - winMemData *pWinMemData = (winMemData *)pAppData; +static void winMemShutdown(void* pAppData) { + winMemData* pWinMemData = (winMemData*)pAppData; - if( !pWinMemData ) return; - assert( pWinMemData->magic1==WINMEM_MAGIC1 ); - assert( pWinMemData->magic2==WINMEM_MAGIC2 ); + if (!pWinMemData) + return; + assert(pWinMemData->magic1 == WINMEM_MAGIC1); + assert(pWinMemData->magic2 == WINMEM_MAGIC2); - if( pWinMemData->hHeap ){ - assert( pWinMemData->hHeap!=INVALID_HANDLE_VALUE ); + 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) ); + 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); + if (pWinMemData->bOwned) { + if (!osHeapDestroy(pWinMemData->hHeap)) { + sqlite3_log(SQLITE_NOMEM, "failed to HeapDestroy (%lu), heap=%p", osGetLastError(), (void*)pWinMemData->hHeap); } pWinMemData->bOwned = FALSE; } @@ -45228,21 +44763,13 @@ static void winMemShutdown(void *pAppData){ ** 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 - }; +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){ +SQLITE_PRIVATE void sqlite3MemSetDefault(void) { sqlite3_config(SQLITE_CONFIG_MALLOC, sqlite3MemGetWin32()); } #endif /* SQLITE_WIN32_MALLOC */ @@ -45252,21 +44779,20 @@ SQLITE_PRIVATE void sqlite3MemSetDefault(void){ ** ** Space to hold the returned string is obtained from sqlite3_malloc(). */ -static LPWSTR winUtf8ToUnicode(const char *zText){ +static LPWSTR winUtf8ToUnicode(const char* zText) { int nChar; LPWSTR zWideText; nChar = osMultiByteToWideChar(CP_UTF8, 0, zText, -1, NULL, 0); - if( nChar==0 ){ + if (nChar == 0) { return 0; } - zWideText = sqlite3MallocZero( nChar*sizeof(WCHAR) ); - if( zWideText==0 ){ + zWideText = sqlite3MallocZero(nChar * sizeof(WCHAR)); + if (zWideText == 0) { return 0; } - nChar = osMultiByteToWideChar(CP_UTF8, 0, zText, -1, zWideText, - nChar); - if( nChar==0 ){ + nChar = osMultiByteToWideChar(CP_UTF8, 0, zText, -1, zWideText, nChar); + if (nChar == 0) { sqlite3_free(zWideText); zWideText = 0; } @@ -45278,21 +44804,20 @@ static LPWSTR winUtf8ToUnicode(const char *zText){ ** ** Space to hold the returned string is obtained from sqlite3_malloc(). */ -static char *winUnicodeToUtf8(LPCWSTR zWideText){ +static char* winUnicodeToUtf8(LPCWSTR zWideText) { int nByte; - char *zText; + char* zText; nByte = osWideCharToMultiByte(CP_UTF8, 0, zWideText, -1, 0, 0, 0, 0); - if( nByte == 0 ){ + if (nByte == 0) { return 0; } - zText = sqlite3MallocZero( nByte ); - if( zText==0 ){ + zText = sqlite3MallocZero(nByte); + if (zText == 0) { return 0; } - nByte = osWideCharToMultiByte(CP_UTF8, 0, zWideText, -1, zText, nByte, - 0, 0); - if( nByte == 0 ){ + nByte = osWideCharToMultiByte(CP_UTF8, 0, zWideText, -1, zText, nByte, 0, 0); + if (nByte == 0) { sqlite3_free(zText); zText = 0; } @@ -45305,23 +44830,21 @@ static char *winUnicodeToUtf8(LPCWSTR zWideText){ ** ** Space to hold the returned string is obtained from sqlite3_malloc(). */ -static LPWSTR winMbcsToUnicode(const char *zText, int useAnsi){ +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 ){ + nByte = osMultiByteToWideChar(codepage, 0, zText, -1, NULL, 0) * sizeof(WCHAR); + if (nByte == 0) { return 0; } - zMbcsText = sqlite3MallocZero( nByte*sizeof(WCHAR) ); - if( zMbcsText==0 ){ + zMbcsText = sqlite3MallocZero(nByte * sizeof(WCHAR)); + if (zMbcsText == 0) { return 0; } - nByte = osMultiByteToWideChar(codepage, 0, zText, -1, zMbcsText, - nByte); - if( nByte==0 ){ + nByte = osMultiByteToWideChar(codepage, 0, zText, -1, zMbcsText, nByte); + if (nByte == 0) { sqlite3_free(zMbcsText); zMbcsText = 0; } @@ -45334,22 +44857,21 @@ static LPWSTR winMbcsToUnicode(const char *zText, int useAnsi){ ** ** Space to hold the returned string is obtained from sqlite3_malloc(). */ -static char *winUnicodeToMbcs(LPCWSTR zWideText, int useAnsi){ +static char* winUnicodeToMbcs(LPCWSTR zWideText, int useAnsi) { int nByte; - char *zText; + char* zText; int codepage = useAnsi ? CP_ACP : CP_OEMCP; nByte = osWideCharToMultiByte(codepage, 0, zWideText, -1, 0, 0, 0, 0); - if( nByte == 0 ){ + if (nByte == 0) { return 0; } - zText = sqlite3MallocZero( nByte ); - if( zText==0 ){ + zText = sqlite3MallocZero(nByte); + if (zText == 0) { return 0; } - nByte = osWideCharToMultiByte(codepage, 0, zWideText, -1, zText, - nByte, 0, 0); - if( nByte == 0 ){ + nByte = osWideCharToMultiByte(codepage, 0, zWideText, -1, zText, nByte, 0, 0); + if (nByte == 0) { sqlite3_free(zText); zText = 0; } @@ -45361,12 +44883,12 @@ static char *winUnicodeToMbcs(LPCWSTR zWideText, int useAnsi){ ** ** Space to hold the returned string is obtained from sqlite3_malloc(). */ -static char *winMbcsToUtf8(const char *zText, int useAnsi){ - char *zTextUtf8; +static char* winMbcsToUtf8(const char* zText, int useAnsi) { + char* zTextUtf8; LPWSTR zTmpWide; zTmpWide = winMbcsToUnicode(zText, useAnsi); - if( zTmpWide==0 ){ + if (zTmpWide == 0) { return 0; } zTextUtf8 = winUnicodeToUtf8(zTmpWide); @@ -45379,12 +44901,12 @@ static char *winMbcsToUtf8(const char *zText, int useAnsi){ ** ** Space to hold the returned string is obtained from sqlite3_malloc(). */ -static char *winUtf8ToMbcs(const char *zText, int useAnsi){ - char *zTextMbcs; +static char* winUtf8ToMbcs(const char* zText, int useAnsi) { + char* zTextMbcs; LPWSTR zTmpWide; zTmpWide = winUtf8ToUnicode(zText); - if( zTmpWide==0 ){ + if (zTmpWide == 0) { return 0; } zTextMbcs = winUnicodeToMbcs(zTmpWide, useAnsi); @@ -45395,15 +44917,16 @@ static char *winUtf8ToMbcs(const char *zText, int useAnsi){ /* ** This is a public wrapper for the winUtf8ToUnicode() function. */ -SQLITE_API LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText){ +SQLITE_API LPWSTR sqlite3_win32_utf8_to_unicode(const char* zText) { #ifdef SQLITE_ENABLE_API_ARMOR - if( !zText ){ + if (!zText) { (void)SQLITE_MISUSE_BKPT; return 0; } #endif #ifndef SQLITE_OMIT_AUTOINIT - if( sqlite3_initialize() ) return 0; + if (sqlite3_initialize()) + return 0; #endif return winUtf8ToUnicode(zText); } @@ -45411,15 +44934,16 @@ SQLITE_API LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText){ /* ** This is a public wrapper for the winUnicodeToUtf8() function. */ -SQLITE_API char *sqlite3_win32_unicode_to_utf8(LPCWSTR zWideText){ +SQLITE_API char* sqlite3_win32_unicode_to_utf8(LPCWSTR zWideText) { #ifdef SQLITE_ENABLE_API_ARMOR - if( !zWideText ){ + if (!zWideText) { (void)SQLITE_MISUSE_BKPT; return 0; } #endif #ifndef SQLITE_OMIT_AUTOINIT - if( sqlite3_initialize() ) return 0; + if (sqlite3_initialize()) + return 0; #endif return winUnicodeToUtf8(zWideText); } @@ -45427,15 +44951,16 @@ SQLITE_API char *sqlite3_win32_unicode_to_utf8(LPCWSTR zWideText){ /* ** This is a public wrapper for the winMbcsToUtf8() function. */ -SQLITE_API char *sqlite3_win32_mbcs_to_utf8(const char *zText){ +SQLITE_API char* sqlite3_win32_mbcs_to_utf8(const char* zText) { #ifdef SQLITE_ENABLE_API_ARMOR - if( !zText ){ + if (!zText) { (void)SQLITE_MISUSE_BKPT; return 0; } #endif #ifndef SQLITE_OMIT_AUTOINIT - if( sqlite3_initialize() ) return 0; + if (sqlite3_initialize()) + return 0; #endif return winMbcsToUtf8(zText, osAreFileApisANSI()); } @@ -45443,15 +44968,16 @@ SQLITE_API char *sqlite3_win32_mbcs_to_utf8(const char *zText){ /* ** This is a public wrapper for the winMbcsToUtf8() function. */ -SQLITE_API char *sqlite3_win32_mbcs_to_utf8_v2(const char *zText, int useAnsi){ +SQLITE_API char* sqlite3_win32_mbcs_to_utf8_v2(const char* zText, int useAnsi) { #ifdef SQLITE_ENABLE_API_ARMOR - if( !zText ){ + if (!zText) { (void)SQLITE_MISUSE_BKPT; return 0; } #endif #ifndef SQLITE_OMIT_AUTOINIT - if( sqlite3_initialize() ) return 0; + if (sqlite3_initialize()) + return 0; #endif return winMbcsToUtf8(zText, useAnsi); } @@ -45459,15 +44985,16 @@ SQLITE_API char *sqlite3_win32_mbcs_to_utf8_v2(const char *zText, int useAnsi){ /* ** This is a public wrapper for the winUtf8ToMbcs() function. */ -SQLITE_API char *sqlite3_win32_utf8_to_mbcs(const char *zText){ +SQLITE_API char* sqlite3_win32_utf8_to_mbcs(const char* zText) { #ifdef SQLITE_ENABLE_API_ARMOR - if( !zText ){ + if (!zText) { (void)SQLITE_MISUSE_BKPT; return 0; } #endif #ifndef SQLITE_OMIT_AUTOINIT - if( sqlite3_initialize() ) return 0; + if (sqlite3_initialize()) + return 0; #endif return winUtf8ToMbcs(zText, osAreFileApisANSI()); } @@ -45475,15 +45002,16 @@ SQLITE_API char *sqlite3_win32_utf8_to_mbcs(const char *zText){ /* ** This is a public wrapper for the winUtf8ToMbcs() function. */ -SQLITE_API char *sqlite3_win32_utf8_to_mbcs_v2(const char *zText, int useAnsi){ +SQLITE_API char* sqlite3_win32_utf8_to_mbcs_v2(const char* zText, int useAnsi) { #ifdef SQLITE_ENABLE_API_ARMOR - if( !zText ){ + if (!zText) { (void)SQLITE_MISUSE_BKPT; return 0; } #endif #ifndef SQLITE_OMIT_AUTOINIT - if( sqlite3_initialize() ) return 0; + if (sqlite3_initialize()) + return 0; #endif return winUtf8ToMbcs(zText, useAnsi); } @@ -45492,31 +45020,29 @@ SQLITE_API char *sqlite3_win32_utf8_to_mbcs_v2(const char *zText, int 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; +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; int rc; #ifndef SQLITE_OMIT_AUTOINIT rc = sqlite3_initialize(); - if( rc ) return rc; + if (rc) + return rc; #endif sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); - if( type==SQLITE_WIN32_DATA_DIRECTORY_TYPE ){ + if (type == SQLITE_WIN32_DATA_DIRECTORY_TYPE) { ppDirectory = &sqlite3_data_directory; - }else if( type==SQLITE_WIN32_TEMP_DIRECTORY_TYPE ){ + } 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] ){ + 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 ){ + if (zCopy == 0) { rc = SQLITE_NOMEM_BKPT; goto set_directory8_done; } @@ -45524,7 +45050,7 @@ SQLITE_API int sqlite3_win32_set_directory8( sqlite3_free(*ppDirectory); *ppDirectory = zCopy; rc = SQLITE_OK; - }else{ + } else { rc = SQLITE_ERROR; } set_directory8_done: @@ -45536,18 +45062,19 @@ SQLITE_API int sqlite3_win32_set_directory8( ** 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 */ -){ +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 ){ + char* zUtf8 = 0; + if (zValue) { zUtf8 = sqlite3_win32_unicode_to_utf8(zValue); - if( zUtf8==0 ) return SQLITE_NOMEM_BKPT; + if (zUtf8 == 0) + return SQLITE_NOMEM_BKPT; } rc = sqlite3_win32_set_directory8(type, zUtf8); - if( zUtf8 ) sqlite3_free(zUtf8); + if (zUtf8) + sqlite3_free(zUtf8); return rc; } @@ -45558,10 +45085,9 @@ SQLITE_API int sqlite3_win32_set_directory16( ** 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 */ -){ +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); } @@ -45570,38 +45096,25 @@ SQLITE_API int sqlite3_win32_set_directory( ** 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){ +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; + char* zOut = 0; - if( osIsNT() ){ + 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); + 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 ){ + 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); @@ -45613,18 +45126,11 @@ static int winGetLastErrorMsg(DWORD lastErrno, int nBuf, char *zBuf){ } } #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 ){ + 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()); @@ -45634,9 +45140,9 @@ static int winGetLastErrorMsg(DWORD lastErrno, int nBuf, char *zBuf){ } } #endif - if( 0 == dwLen ){ + if (0 == dwLen) { sqlite3_snprintf(nBuf, zBuf, "OsError 0x%lx (%lu)", lastErrno, lastErrno); - }else{ + } else { /* copy a maximum of nBuf chars to output buffer */ sqlite3_snprintf(nBuf, zBuf, "%s", zOut); /* free the UTF8 buffer */ @@ -45660,27 +45166,25 @@ static int winGetLastErrorMsg(DWORD lastErrno, int nBuf, char *zBuf){ ** 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 */ +#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++){} + 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 - ); + sqlite3_log(errcode, "os_win.c:%d: (%lu) %s(%s) - %s", iLine, lastErrno, zFunc, zPath, zMsg); return errcode; } @@ -45692,10 +45196,10 @@ static int winLogErrorAtLine( ** The delay increases linearly with each retry. */ #ifndef SQLITE_WIN32_IOERR_RETRY -# define SQLITE_WIN32_IOERR_RETRY 10 +#define SQLITE_WIN32_IOERR_RETRY 10 #endif #ifndef SQLITE_WIN32_IOERR_RETRY_DELAY -# define SQLITE_WIN32_IOERR_RETRY_DELAY 25 +#define SQLITE_WIN32_IOERR_RETRY_DELAY 25 #endif static int winIoerrRetry = SQLITE_WIN32_IOERR_RETRY; static int winIoerrRetryDelay = SQLITE_WIN32_IOERR_RETRY_DELAY; @@ -45717,13 +45221,9 @@ static int winIoerrRetryDelay = SQLITE_WIN32_IOERR_RETRY_DELAY; ** 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)) +#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 /* @@ -45731,27 +45231,27 @@ static int winIoerrRetryDelay = SQLITE_WIN32_IOERR_RETRY_DELAY; ** 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){ +static int winRetryIoerr(int* pnRetry, DWORD* pError) { DWORD e = osGetLastError(); - if( *pnRetry>=winIoerrRetry ){ - if( pError ){ + if (*pnRetry >= winIoerrRetry) { + if (pError) { *pError = e; } return 0; } - if( winIoerrCanRetry1(e) ){ - sqlite3_win32_sleep(winIoerrRetryDelay*(1+*pnRetry)); + 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)); + else if (winIoerrCanRetry2(e)) { + sqlite3_win32_sleep(winIoerrRetryDelay * (1 + *pnRetry)); ++*pnRetry; return 1; } #endif - if( pError ){ + if (pError) { *pError = e; } return 0; @@ -45760,12 +45260,9 @@ static int winRetryIoerr(int *pnRetry, DWORD *pError){ /* ** 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 - ); +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); } } @@ -45773,25 +45270,23 @@ static void winLogIoerr(int nRetry, int 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) +#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) -{ +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; + t64 = (t64 + 11644473600) * 10000000; uTm.dwLowDateTime = (DWORD)(t64 & 0xFFFFFFFF); - uTm.dwHighDateTime= (DWORD)(t64 >> 32); - osFileTimeToLocalFileTime(&uTm,&lTm); - osFileTimeToSystemTime(&lTm,&pTm); + 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; @@ -45807,16 +45302,16 @@ struct tm *__cdecl localtime(const time_t *t) /************************************************************************* ** This section contains code for WinCE only. */ -#define HANDLE_TO_WINFILE(a) (winFile*)&((char*)a)[-(int)offsetof(winFile,h)] +#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); +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() @@ -45827,7 +45322,7 @@ static void winceMutexAcquire(HANDLE h){ ** Create the mutex and shared memory used for locking in the file ** descriptor pFile */ -static int winceCreateLock(const char *zFilename, winFile *pFile){ +static int winceCreateLock(const char* zFilename, winFile* pFile) { LPWSTR zTok; LPWSTR zName; DWORD lastErrno; @@ -45835,7 +45330,7 @@ static int winceCreateLock(const char *zFilename, winFile *pFile){ BOOL bInit = TRUE; zName = winUtf8ToUnicode(zFilename); - if( zName==0 ){ + if (zName == 0) { /* out of memory */ return SQLITE_IOERR_NOMEM_BKPT; } @@ -45846,17 +45341,17 @@ static int winceCreateLock(const char *zFilename, winFile *pFile){ /* Replace the backslashes from the filename and lowercase it ** to derive a mutex name. */ zTok = osCharLowerW(zName); - for (;*zTok;zTok++){ - if (*zTok == '\\') *zTok = '_'; + for (; *zTok; zTok++) { + if (*zTok == '\\') + *zTok = '_'; } /* Create/open the named mutex */ pFile->hMutex = osCreateMutexW(NULL, FALSE, zName); - if (!pFile->hMutex){ + if (!pFile->hMutex) { pFile->lastErrno = osGetLastError(); sqlite3_free(zName); - return winLogError(SQLITE_IOERR, pFile->lastErrno, - "winceCreateLock1", zFilename); + return winLogError(SQLITE_IOERR, pFile->lastErrno, "winceCreateLock1", zFilename); } /* Acquire the mutex before continuing */ @@ -45867,28 +45362,24 @@ static int winceCreateLock(const char *zFilename, winFile *pFile){ ** and using that as the shared filemapping name. */ osCharUpperW(zName); - pFile->hShared = osCreateFileMappingW(INVALID_HANDLE_VALUE, NULL, - PAGE_READWRITE, 0, sizeof(winceLock), - 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){ + 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 (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 ){ + if (!pFile->shared) { pFile->lastErrno = osGetLastError(); - winLogError(SQLITE_IOERR, pFile->lastErrno, - "winceCreateLock2", zFilename); + winLogError(SQLITE_IOERR, pFile->lastErrno, "winceCreateLock2", zFilename); bLogged = TRUE; osCloseHandle(pFile->hShared); pFile->hShared = NULL; @@ -45896,11 +45387,10 @@ static int winceCreateLock(const char *zFilename, winFile *pFile){ } /* If shared memory could not be created, then close the mutex and fail */ - if( pFile->hShared==NULL ){ - if( !bLogged ){ + if (pFile->hShared == NULL) { + if (!bLogged) { pFile->lastErrno = lastErrno; - winLogError(SQLITE_IOERR, pFile->lastErrno, - "winceCreateLock3", zFilename); + winLogError(SQLITE_IOERR, pFile->lastErrno, "winceCreateLock3", zFilename); bLogged = TRUE; } winceMutexRelease(pFile->hMutex); @@ -45910,7 +45400,7 @@ static int winceCreateLock(const char *zFilename, winFile *pFile){ } /* Initialize the shared memory if we're supposed to */ - if( bInit ){ + if (bInit) { memset(pFile->shared, 0, sizeof(winceLock)); } @@ -45921,23 +45411,23 @@ static int winceCreateLock(const char *zFilename, winFile *pFile){ /* ** Destroy the part of winFile that deals with wince locks */ -static void winceDestroyLock(winFile *pFile){ - if (pFile->hMutex){ +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.nReaders) { + pFile->shared->nReaders--; } - if (pFile->local.bReserved){ + if (pFile->local.bReserved) { pFile->shared->bReserved = FALSE; } - if (pFile->local.bPending){ + if (pFile->local.bPending) { pFile->shared->bPending = FALSE; } - if (pFile->local.bExclusive){ + if (pFile->local.bExclusive) { pFile->shared->bExclusive = FALSE; } @@ -45955,47 +45445,40 @@ static void winceDestroyLock(winFile *pFile){ /* ** 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); +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; + 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; + 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 ++; + 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){ + 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; @@ -46005,8 +45488,7 @@ static BOOL winceLockFile( } /* Want a reserved lock? */ - else if (dwFileOffsetLow == (DWORD)RESERVED_BYTE - && nNumberOfBytesToLockLow == 1){ + else if (dwFileOffsetLow == (DWORD)RESERVED_BYTE && nNumberOfBytesToLockLow == 1) { if (pFile->shared->bReserved == 0) { pFile->shared->bReserved = TRUE; pFile->local.bReserved = TRUE; @@ -46021,26 +45503,22 @@ static BOOL winceLockFile( /* ** 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); +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; + if (!pFile->hMutex) + return TRUE; winceMutexAcquire(pFile->hMutex); /* Releasing a reader lock or an exclusive lock */ - if (dwFileOffsetLow == (DWORD)SHARED_FIRST){ + if (dwFileOffsetLow == (DWORD)SHARED_FIRST) { /* Did we have an exclusive lock? */ - if (pFile->local.bExclusive){ + if (pFile->local.bExclusive) { assert(nNumberOfBytesToUnlockLow == (DWORD)SHARED_SIZE); pFile->local.bExclusive = FALSE; pFile->shared->bExclusive = FALSE; @@ -46048,30 +45526,26 @@ static BOOL winceUnlockFile( } /* 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 --; + 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){ + 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){ + else if (dwFileOffsetLow == (DWORD)RESERVED_BYTE && nNumberOfBytesToUnlockLow == 1) { if (pFile->local.bReserved) { pFile->local.bReserved = FALSE; pFile->shared->bReserved = FALSE; @@ -46090,62 +45564,45 @@ static BOOL winceUnlockFile( /* ** Lock a file region. */ -static BOOL winLockFile( - LPHANDLE phFile, - DWORD flags, - DWORD offsetLow, - DWORD offsetHigh, - DWORD numBytesLow, - DWORD numBytesHigh -){ +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); + return winceLockFile(phFile, offsetLow, offsetHigh, numBytesLow, numBytesHigh); #else - if( osIsNT() ){ + 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); + } 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 -){ +*/ +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); + return winceUnlockFile(phFile, offsetLow, offsetHigh, numBytesLow, numBytesHigh); #else - if( osIsNT() ){ + 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); + } else { + return osUnlockFile(*phFile, offsetLow, offsetHigh, numBytesLow, numBytesHigh); } #endif } @@ -46159,7 +45616,7 @@ static BOOL winUnlockFile( ** Some Microsoft compilers lack this definition. */ #ifndef INVALID_SET_FILE_POINTER -# define INVALID_SET_FILE_POINTER ((DWORD)-1) +#define INVALID_SET_FILE_POINTER ((DWORD) - 1) #endif /* @@ -46167,16 +45624,16 @@ static BOOL winUnlockFile( ** 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){ +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() */ + 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); + upperBits = (LONG)((iOffset >> 32) & 0x7fffffff); lowerBits = (LONG)(iOffset & 0xffffffff); /* API oddity: If successful, SetFilePointer() returns a dword @@ -46188,11 +45645,9 @@ static int winSeekFile(winFile *pFile, sqlite3_int64 iOffset){ */ dwRet = osSetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN); - if( (dwRet==INVALID_SET_FILE_POINTER - && ((lastErrno = osGetLastError())!=NO_ERROR)) ){ + if ((dwRet == INVALID_SET_FILE_POINTER && ((lastErrno = osGetLastError()) != NO_ERROR))) { pFile->lastErrno = lastErrno; - winLogError(SQLITE_IOERR_SEEK, pFile->lastErrno, - "winSeekFile", pFile->zPath); + winLogError(SQLITE_IOERR_SEEK, pFile->lastErrno, "winSeekFile", pFile->zPath); OSTRACE(("SEEK file=%p, rc=SQLITE_IOERR_SEEK\n", pFile->h)); return 1; } @@ -46204,16 +45659,15 @@ static int winSeekFile(winFile *pFile, sqlite3_int64 iOffset){ ** Same as above, except that this implementation works for WinRT. */ - LARGE_INTEGER x; /* The new offset */ - BOOL bRet; /* Value returned by SetFilePointerEx() */ + 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){ + if (!bRet) { pFile->lastErrno = osGetLastError(); - winLogError(SQLITE_IOERR_SEEK, pFile->lastErrno, - "winSeekFile", pFile->zPath); + winLogError(SQLITE_IOERR_SEEK, pFile->lastErrno, "winSeekFile", pFile->zPath); OSTRACE(("SEEK file=%p, rc=SQLITE_IOERR_SEEK\n", pFile->h)); return 1; } @@ -46223,7 +45677,7 @@ static int winSeekFile(winFile *pFile, sqlite3_int64 iOffset){ #endif } -#if SQLITE_MAX_MMAP_SIZE>0 +#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*); @@ -46240,55 +45694,48 @@ static int winUnmapfile(winFile*); ** giving up and returning an error. */ #define MX_CLOSE_ATTEMPT 3 -static int winClose(sqlite3_file *id){ +static int winClose(sqlite3_file* id) { int rc, cnt = 0; - winFile *pFile = (winFile*)id; + winFile* pFile = (winFile*)id; - assert( id!=0 ); + assert(id != 0); #ifndef SQLITE_OMIT_WAL - assert( pFile->pShm==0 ); + 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)); + 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 +#if SQLITE_MAX_MMAP_SIZE > 0 winUnmapfile(pFile); #endif - do{ + do { rc = osCloseHandle(pFile->h); /* SimulateIOError( rc=0; cnt=MX_CLOSE_ATTEMPT; ); */ - }while( rc==0 && ++cnt < MX_CLOSE_ATTEMPT && (sqlite3_win32_sleep(100), 1) ); + } 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 ){ + winVfsAppData* pAppData = (winVfsAppData*)pFile->pVfs->pAppData; + if (pAppData == NULL || !pAppData->bNoLock) { winceDestroyLock(pFile); } } - if( pFile->zDeleteOnClose ){ + 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 */ + 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 ){ + 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); + 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); } /* @@ -46296,40 +45743,38 @@ static int winClose(sqlite3_file *id){ ** 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 */ -){ +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. */ + 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 */ + 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 ); + 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)); + "offset=%lld, lock=%d\n", + osGetCurrentProcessId(), pFile, pFile->h, pBuf, amt, offset, pFile->locktype)); -#if SQLITE_MAX_MMAP_SIZE>0 +#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)); + if (offset < pFile->mmapSize) { + 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{ + } else { int nCopy = (int)(pFile->mmapSize - offset); - memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], nCopy); - pBuf = &((u8 *)pBuf)[nCopy]; + memcpy(pBuf, &((u8*)(pFile->pMapRegion))[offset], nCopy); + pBuf = &((u8*)pBuf)[nCopy]; amt -= nCopy; offset += nCopy; } @@ -46337,38 +45782,33 @@ static int winRead( #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)); + 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) ){ + 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 ){ + 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; + 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); + 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 ){ + 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)); + 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)); + OSTRACE(("READ pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", osGetCurrentProcessId(), pFile, pFile->h)); return SQLITE_OK; } @@ -46376,38 +45816,36 @@ static int winRead( ** 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 */ +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 ); + 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)); + "offset=%lld, lock=%d\n", + osGetCurrentProcessId(), pFile, pFile->h, pBuf, amt, offset, pFile->locktype)); -#if defined(SQLITE_MMAP_READWRITE) && SQLITE_MAX_MMAP_SIZE>0 +#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)); + if (offset < pFile->mmapSize) { + 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{ + } else { int nCopy = (int)(pFile->mmapSize - offset); - memcpy(&((u8 *)(pFile->pMapRegion))[offset], pBuf, nCopy); - pBuf = &((u8 *)pBuf)[nCopy]; + memcpy(&((u8*)(pFile->pMapRegion))[offset], pBuf, nCopy); + pBuf = &((u8*)pBuf)[nCopy]; amt -= nCopy; offset += nCopy; } @@ -46416,82 +45854,77 @@ static int winWrite( #if SQLITE_OS_WINCE || defined(SQLITE_WIN32_NO_OVERLAPPED) rc = winSeekFile(pFile, offset); - if( rc==0 ){ + if (rc == 0) { #else { #endif #if !SQLITE_OS_WINCE && !defined(SQLITE_WIN32_NO_OVERLAPPED) - OVERLAPPED overlapped; /* The offset for WriteFile. */ + 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() */ + 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); + overlapped.OffsetHigh = (LONG)((offset >> 32) & 0x7fffffff); #endif - while( nRem>0 ){ + while (nRem > 0) { #if SQLITE_OS_WINCE || defined(SQLITE_WIN32_NO_OVERLAPPED) - if( !osWriteFile(pFile->h, aRem, nRem, &nWrite, 0) ){ + if (!osWriteFile(pFile->h, aRem, nRem, &nWrite, 0)) { #else - if( !osWriteFile(pFile->h, aRem, nRem, &nWrite, &overlapped) ){ + if (!osWriteFile(pFile->h, aRem, nRem, &nWrite, &overlapped)) { #endif - if( winRetryIoerr(&nRetry, &lastErrno) ) continue; + if (winRetryIoerr(&nRetry, &lastErrno)) + continue; break; } - assert( nWrite==0 || nWrite<=(DWORD)nRem ); - if( nWrite==0 || nWrite>(DWORD)nRem ){ + 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); + overlapped.OffsetHigh = (LONG)((offset >> 32) & 0x7fffffff); #endif aRem += nWrite; nRem -= nWrite; } - if( nRem>0 ){ + 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); + 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{ + 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)); + 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 */ +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 +#if SQLITE_MAX_MMAP_SIZE > 0 sqlite3_int64 oldMmapSize; - if( pFile->nFetchOut>0 ){ + 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. @@ -46513,52 +45946,47 @@ static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){ } #endif - assert( pFile ); + 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)); + 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 (pFile->szChunk > 0) { + nByte = ((nByte + pFile->szChunk - 1) / pFile->szChunk) * pFile->szChunk; } -#if SQLITE_MAX_MMAP_SIZE>0 - if( pFile->pMapRegion ){ +#if SQLITE_MAX_MMAP_SIZE > 0 + if (pFile->pMapRegion) { oldMmapSize = pFile->mmapSize; - }else{ + } 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) ){ + 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); + 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 ){ +#if SQLITE_MAX_MMAP_SIZE > 0 + if (rc == SQLITE_OK && oldMmapSize > 0) { + if (oldMmapSize > nByte) { winMapfile(pFile, -1); - }else{ + } else { winMapfile(pFile, oldMmapSize); } } #endif - OSTRACE(("TRUNCATE pid=%lu, pFile=%p, file=%p, rc=%s\n", - osGetCurrentProcessId(), pFile, pFile->h, sqlite3ErrName(rc))); + OSTRACE(("TRUNCATE pid=%lu, pFile=%p, file=%p, rc=%s\n", osGetCurrentProcessId(), pFile, pFile->h, sqlite3ErrName(rc))); return rc; } @@ -46574,43 +46002,38 @@ SQLITE_API int sqlite3_fullsync_count = 0; /* ** Make sure all writes to a particular file are committed to disk. */ -static int winSync(sqlite3_file *id, int flags){ +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) +#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; + */ + winFile* pFile = (winFile*)id; #else UNUSED_PARAMETER(id); #endif - assert( pFile ); + assert(pFile); /* Check that one of SQLITE_SYNC_NORMAL or FULL was passed */ - assert((flags&0x0F)==SQLITE_SYNC_NORMAL - || (flags&0x0F)==SQLITE_SYNC_FULL - ); + 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 ); + SimulateDiskfullError(return SQLITE_FULL); - OSTRACE(("SYNC pid=%lu, pFile=%p, file=%p, flags=%x, lock=%d\n", - osGetCurrentProcessId(), pFile, pFile->h, flags, - pFile->locktype)); + 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 ){ + if ((flags & 0x0F) == SQLITE_SYNC_FULL) { sqlite3_fullsync_count++; } sqlite3_sync_count++; @@ -46620,38 +46043,33 @@ static int winSync(sqlite3_file *id, int flags){ ** no-op */ #ifdef SQLITE_NO_SYNC - OSTRACE(("SYNC-NOP pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", - osGetCurrentProcessId(), pFile, pFile->h)); + 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) ){ +#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{ + "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); + "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)); + 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{ + } 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); + 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 } @@ -46659,25 +46077,23 @@ static int winSync(sqlite3_file *id, int flags){ /* ** Determine the current size of a file in bytes */ -static int winFileSize(sqlite3_file *id, sqlite3_int64 *pSize){ - winFile *pFile = (winFile*)id; +static int winFileSize(sqlite3_file* id, sqlite3_int64* pSize) { + winFile* pFile = (winFile*)id; int rc = SQLITE_OK; - assert( id!=0 ); - assert( pSize!=0 ); + 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)) ){ + if (osGetFileInformationByHandleEx(pFile->h, FileStandardInfo, &info, sizeof(info))) { *pSize = info.EndOfFile.QuadPart; - }else{ + } else { pFile->lastErrno = osGetLastError(); - rc = winLogError(SQLITE_IOERR_FSTAT, pFile->lastErrno, - "winFileSize", pFile->zPath); + rc = winLogError(SQLITE_IOERR_FSTAT, pFile->lastErrno, "winFileSize", pFile->zPath); } } #else @@ -46687,17 +46103,14 @@ static int winFileSize(sqlite3_file *id, sqlite3_int64 *pSize){ DWORD lastErrno; lowerBits = osGetFileSize(pFile->h, &upperBits); - *pSize = (((sqlite3_int64)upperBits)<<32) + lowerBits; - if( (lowerBits == INVALID_FILE_SIZE) - && ((lastErrno = osGetLastError())!=NO_ERROR) ){ + *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); + 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))); + OSTRACE(("SIZE file=%p, pSize=%p, *pSize=%lld, rc=%s\n", pFile->h, pSize, *pSize, sqlite3ErrName(rc))); return rc; } @@ -46705,11 +46118,11 @@ static int winFileSize(sqlite3_file *id, sqlite3_int64 *pSize){ ** LOCKFILE_FAIL_IMMEDIATELY is undefined on some Windows systems. */ #ifndef LOCKFILE_FAIL_IMMEDIATELY -# define LOCKFILE_FAIL_IMMEDIATELY 1 +#define LOCKFILE_FAIL_IMMEDIATELY 1 #endif #ifndef LOCKFILE_EXCLUSIVE_LOCK -# define LOCKFILE_EXCLUSIVE_LOCK 2 +#define LOCKFILE_EXCLUSIVE_LOCK 2 #endif /* @@ -46720,8 +46133,7 @@ static int winFileSize(sqlite3_file *id, sqlite3_int64 *pSize){ ** and reflect those expectations; therefore, they should not be changed. */ #ifndef SQLITE_LOCKFILE_FLAGS -# define SQLITE_LOCKFILE_FLAGS (LOCKFILE_FAIL_IMMEDIATELY | \ - LOCKFILE_EXCLUSIVE_LOCK) +#define SQLITE_LOCKFILE_FLAGS (LOCKFILE_FAIL_IMMEDIATELY | LOCKFILE_EXCLUSIVE_LOCK) #endif /* @@ -46729,7 +46141,7 @@ static int winFileSize(sqlite3_file *id, sqlite3_int64 *pSize){ ** call to fail immediately if the lock cannot be obtained. */ #ifndef SQLITE_LOCKFILEEX_FLAGS -# define SQLITE_LOCKFILEEX_FLAGS (LOCKFILE_FAIL_IMMEDIATELY) +#define SQLITE_LOCKFILEEX_FLAGS (LOCKFILE_FAIL_IMMEDIATELY) #endif /* @@ -46737,10 +46149,10 @@ static int winFileSize(sqlite3_file *id, sqlite3_int64 *pSize){ ** Different API routines are called depending on whether or not this ** is Win9x or WinNT. */ -static int winGetReadLock(winFile *pFile){ +static int winGetReadLock(winFile* pFile) { int res; OSTRACE(("READ-LOCK file=%p, lock=%d\n", pFile->h, pFile->locktype)); - if( osIsNT() ){ + if (osIsNT()) { #if SQLITE_OS_WINCE /* ** NOTE: Windows CE is handled differently here due its lack of the Win32 @@ -46748,20 +46160,18 @@ static int winGetReadLock(winFile *pFile){ */ res = winceLockFile(&pFile->h, SHARED_FIRST, 0, 1, 0); #else - res = winLockFile(&pFile->h, SQLITE_LOCKFILEEX_FLAGS, SHARED_FIRST, 0, - SHARED_SIZE, 0); + res = winLockFile(&pFile->h, SQLITE_LOCKFILEEX_FLAGS, SHARED_FIRST, 0, SHARED_SIZE, 0); #endif } #ifdef SQLITE_WIN32_HAS_ANSI - else{ + 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); + 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 ){ + if (res == 0) { pFile->lastErrno = osGetLastError(); /* No need to log a failure to lock */ } @@ -46772,22 +46182,21 @@ static int winGetReadLock(winFile *pFile){ /* ** Undo a readlock */ -static int winUnlockReadLock(winFile *pFile){ +static int winUnlockReadLock(winFile* pFile) { int res; DWORD lastErrno; OSTRACE(("READ-UNLOCK file=%p, lock=%d\n", pFile->h, pFile->locktype)); - if( osIsNT() ){ + 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); + else { + res = winUnlockFile(&pFile->h, SHARED_FIRST + pFile->sharedLockByte, 0, 1, 0); } #endif - if( res==0 && ((lastErrno = osGetLastError())!=ERROR_NOT_LOCKED) ){ + if (res == 0 && ((lastErrno = osGetLastError()) != ERROR_NOT_LOCKED)) { pFile->lastErrno = lastErrno; - winLogError(SQLITE_IOERR_UNLOCK, pFile->lastErrno, - "winUnlockReadLock", pFile->zPath); + winLogError(SQLITE_IOERR_UNLOCK, pFile->lastErrno, "winUnlockReadLock", pFile->zPath); } OSTRACE(("READ-UNLOCK file=%p, result=%d\n", pFile->h, res)); return res; @@ -46819,50 +46228,46 @@ static int winUnlockReadLock(winFile *pFile){ ** 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; +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)); + 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 ){ + 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 ){ + */ + 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 ); + */ + 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) - ){ + 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 ){ + 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. @@ -46870,64 +46275,62 @@ static int winLock(sqlite3_file *id, int locktype){ ** 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 ){ + 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))); + OSTRACE(("LOCK-FAIL file=%p, count=%d, rc=%s\n", pFile->h, cnt, sqlite3ErrName(rc))); return rc; } - if( cnt ) sqlite3_win32_sleep(1); + if (cnt) + sqlite3_win32_sleep(1); } gotPendingLock = res; - if( !res ){ + if (!res) { lastErrno = osGetLastError(); } } /* Acquire a shared lock - */ - if( locktype==SHARED_LOCK && res ){ - assert( pFile->locktype==NO_LOCK ); + */ + if (locktype == SHARED_LOCK && res) { + assert(pFile->locktype == NO_LOCK); res = winGetReadLock(pFile); - if( res ){ + if (res) { newLocktype = SHARED_LOCK; - }else{ + } else { lastErrno = osGetLastError(); } } /* Acquire a RESERVED lock - */ - if( locktype==RESERVED_LOCK && res ){ - assert( pFile->locktype==SHARED_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 ){ + if (res) { newLocktype = RESERVED_LOCK; - }else{ + } else { lastErrno = osGetLastError(); } } /* Acquire a PENDING lock - */ - if( locktype==EXCLUSIVE_LOCK && res ){ + */ + if (locktype == EXCLUSIVE_LOCK && res) { newLocktype = PENDING_LOCK; gotPendingLock = 0; } /* Acquire an EXCLUSIVE lock - */ - if( locktype==EXCLUSIVE_LOCK && res ){ - assert( pFile->locktype>=SHARED_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 ){ + res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS, SHARED_FIRST, 0, SHARED_SIZE, 0); + if (res) { newLocktype = EXCLUSIVE_LOCK; - }else{ + } else { lastErrno = osGetLastError(); winGetReadLock(pFile); } @@ -46936,24 +46339,22 @@ static int winLock(sqlite3_file *id, int locktype){ /* If we are holding a PENDING lock that ought to be released, then ** release it now. */ - if( gotPendingLock && locktype==SHARED_LOCK ){ + 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 ){ + if (res) { rc = SQLITE_OK; - }else{ + } else { pFile->lastErrno = lastErrno; rc = SQLITE_BUSY; - OSTRACE(("LOCK-FAIL file=%p, wanted=%d, got=%d\n", - pFile->h, locktype, newLocktype)); + 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))); + OSTRACE(("LOCK file=%p, lock=%d, rc=%s\n", pFile->h, pFile->locktype, sqlite3ErrName(rc))); return rc; } @@ -46962,28 +46363,27 @@ static int winLock(sqlite3_file *id, int locktype){ ** 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){ +static int winCheckReservedLock(sqlite3_file* id, int* pResOut) { int res; - winFile *pFile = (winFile*)id; + winFile* pFile = (winFile*)id; - SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); + 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 ){ + 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 ){ + } 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)); + OSTRACE(("TEST-WR-LOCK file=%p, pResOut=%p, *pResOut=%d, rc=SQLITE_OK\n", pFile->h, pResOut, *pResOut)); return SQLITE_OK; } @@ -46998,36 +46398,33 @@ static int winCheckReservedLock(sqlite3_file *id, int *pResOut){ ** 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){ +static int winUnlock(sqlite3_file* id, int locktype) { int type; - winFile *pFile = (winFile*)id; + 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)); + 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 ){ + if (type >= EXCLUSIVE_LOCK) { winUnlockFile(&pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); - if( locktype==SHARED_LOCK && !winGetReadLock(pFile) ){ + 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); + rc = winLogError(SQLITE_IOERR_UNLOCK, osGetLastError(), "winUnlock", pFile->zPath); } } - if( type>=RESERVED_LOCK ){ + if (type >= RESERVED_LOCK) { winUnlockFile(&pFile->h, RESERVED_BYTE, 0, 1, 0); } - if( locktype==NO_LOCK && type>=SHARED_LOCK ){ + if (locktype == NO_LOCK && type >= SHARED_LOCK) { winUnlockReadLock(pFile); } - if( type>=PENDING_LOCK ){ + 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))); + OSTRACE(("UNLOCK file=%p, lock=%d, rc=%s\n", pFile->h, pFile->locktype, sqlite3ErrName(rc))); return rc; } @@ -47048,19 +46445,19 @@ static int winUnlock(sqlite3_file *id, int locktype){ ** time and one or more of those connections are writing. */ -static int winNolockLock(sqlite3_file *id, int locktype){ +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){ +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){ +static int winNolockUnlock(sqlite3_file* id, int locktype) { UNUSED_PARAMETER(id); UNUSED_PARAMETER(locktype); return SQLITE_OK; @@ -47075,29 +46472,29 @@ static int winNolockUnlock(sqlite3_file *id, int locktype){ ** ** 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 ){ +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{ + } 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 *); +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; +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 ){ + switch (op) { case SQLITE_FCNTL_LOCKSTATE: { *(int*)pArg = pFile->locktype; OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); @@ -47109,17 +46506,17 @@ static int winFileControl(sqlite3_file *id, int op, void *pArg){ return SQLITE_OK; } case SQLITE_FCNTL_CHUNK_SIZE: { - pFile->szChunk = *(int *)pArg; + 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 ){ + if (pFile->szChunk > 0) { sqlite3_int64 oldSz; int rc = winFileSize(id, &oldSz); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { sqlite3_int64 newSz = *(sqlite3_int64*)pArg; - if( newSz>oldSz ){ + if (newSz > oldSz) { SimulateIOErrorBenign(1); rc = winTruncate(id, newSz); SimulateIOErrorBenign(0); @@ -47147,15 +46544,15 @@ static int winFileControl(sqlite3_file *id, int op, void *pArg){ return SQLITE_OK; } case SQLITE_FCNTL_WIN32_AV_RETRY: { - int *a = (int*)pArg; - if( a[0]>0 ){ + int* a = (int*)pArg; + if (a[0] > 0) { winIoerrRetry = a[0]; - }else{ + } else { a[0] = winIoerrRetry; } - if( a[1]>0 ){ + if (a[1] > 0) { winIoerrRetryDelay = a[1]; - }else{ + } else { a[1] = winIoerrRetryDelay; } OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); @@ -47173,39 +46570,38 @@ static int winFileControl(sqlite3_file *id, int op, void *pArg){ HANDLE hOldFile = pFile->h; pFile->h = *phFile; *phFile = hOldFile; - OSTRACE(("FCNTL oldFile=%p, newFile=%p, rc=SQLITE_OK\n", - hOldFile, pFile->h)); + OSTRACE(("FCNTL oldFile=%p, newFile=%p, rc=SQLITE_OK\n", hOldFile, pFile->h)); return SQLITE_OK; } #endif case SQLITE_FCNTL_TEMPFILENAME: { - char *zTFile = 0; + char* zTFile = 0; int rc = winGetTempname(pFile->pVfs, &zTFile); - if( rc==SQLITE_OK ){ + 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 +#if SQLITE_MAX_MMAP_SIZE > 0 case SQLITE_FCNTL_MMAP_SIZE: { i64 newLimit = *(i64*)pArg; int rc = SQLITE_OK; - if( newLimit>sqlite3GlobalConfig.mxMmap ){ + 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 ){ + if (newLimit > 0 && sizeof(SIZE_T) < 8) { newLimit = (newLimit & 0x7FFFFFFF); } *(i64*)pArg = pFile->mmapSizeMax; - if( newLimit>=0 && newLimit!=pFile->mmapSizeMax && pFile->nFetchOut==0 ){ + if (newLimit >= 0 && newLimit != pFile->mmapSizeMax && pFile->nFetchOut == 0) { pFile->mmapSizeMax = newLimit; - if( pFile->mmapSize>0 ){ + if (pFile->mmapSize > 0) { winUnmapfile(pFile); rc = winMapfile(pFile, -1); } @@ -47229,7 +46625,7 @@ static int winFileControl(sqlite3_file *id, int op, void *pArg){ ** a database and its journal file) that the sector size will be the ** same for both. */ -static int winSectorSize(sqlite3_file *id){ +static int winSectorSize(sqlite3_file* id) { (void)id; return SQLITE_DEFAULT_SECTOR_SIZE; } @@ -47237,10 +46633,9 @@ static int winSectorSize(sqlite3_file *id){ /* ** 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); +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); } /* @@ -47266,11 +46661,11 @@ static SYSTEM_INFO winSysInfo; ** assert( winShmMutexHeld() ); ** winShmLeaveMutex() */ -static sqlite3_mutex *winBigLock = 0; -static void winShmEnterMutex(void){ +static sqlite3_mutex* winBigLock = 0; +static void winShmEnterMutex(void) { sqlite3_mutex_enter(winBigLock); } -static void winShmLeaveMutex(void){ +static void winShmLeaveMutex(void) { sqlite3_mutex_leave(winBigLock); } #ifndef NDEBUG @@ -47303,26 +46698,26 @@ static int winShmMutexHeld(void) { ** */ struct winShmNode { - sqlite3_mutex *mutex; /* Mutex to access this object */ - char *zFilename; /* Name of the file */ - winFile hFile; /* File handle from winOpen */ + 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 */ + 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 */ + 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 */ + u8 nextShmId; /* Next available winShm.id value */ #endif }; @@ -47331,7 +46726,7 @@ struct winShmNode { ** ** The winShmMutexHeld() must be true while reading or writing this list. */ -static winShmNode *winShmNodeList = 0; +static winShmNode* winShmNodeList = 0; /* ** Structure used internally by this VFS to record the state of an @@ -47347,69 +46742,67 @@ static winShmNode *winShmNodeList = 0; ** 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 */ + 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 */ + 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 */ +#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() */ +#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) ); + 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)); + 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 ){ + if (lockType == WINSHM_UNLCK) { rc = winUnlockFile(&pFile->hFile.h, ofst, 0, nByte, 0); - }else{ + } else { /* Initialize the locking parameters */ DWORD dwFlags = LOCKFILE_FAIL_IMMEDIATELY; - if( lockType == WINSHM_WRLCK ) dwFlags |= LOCKFILE_EXCLUSIVE_LOCK; + if (lockType == WINSHM_WRLCK) + dwFlags |= LOCKFILE_EXCLUSIVE_LOCK; rc = winLockFile(&pFile->hFile.h, dwFlags, ofst, 0, nByte, 0); } - if( rc!= 0 ){ + if (rc != 0) { rc = SQLITE_OK; - }else{ - pFile->lastErrno = osGetLastError(); + } 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))); + 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); +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. @@ -47417,33 +46810,32 @@ static int winDelete(sqlite3_vfs *,const char*,int); ** 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)); +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 ){ + while ((p = *pp) != 0) { + if (p->nRef == 0) { int i; - if( p->mutex ){ sqlite3_mutex_free(p->mutex); } - for(i=0; inRegion; i++){ + if (p->mutex) { + sqlite3_mutex_free(p->mutex); + } + for (i = 0; i < p->nRegion; i++) { BOOL bRc = osUnmapViewOfFile(p->aRegion[i].pMap); - OSTRACE(("SHM-PURGE-UNMAP pid=%lu, region=%d, rc=%s\n", - osGetCurrentProcessId(), i, bRc ? "ok" : "failed")); + 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")); + 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 ){ + if (p->hFile.h != NULL && p->hFile.h != INVALID_HANDLE_VALUE) { SimulateIOErrorBenign(1); - winClose((sqlite3_file *)&p->hFile); + winClose((sqlite3_file*)&p->hFile); SimulateIOErrorBenign(0); } - if( deleteFlag ){ + if (deleteFlag) { SimulateIOErrorBenign(1); sqlite3BeginBenignMalloc(); winDelete(pVfs, p->zFilename, 0); @@ -47453,7 +46845,7 @@ static void winShmPurge(sqlite3_vfs *pVfs, int deleteFlag){ *pp = p->pNext; sqlite3_free(p->aRegion); sqlite3_free(p); - }else{ + } else { pp = &p->pNext; } } @@ -47468,22 +46860,21 @@ static void winShmPurge(sqlite3_vfs *pVfs, int deleteFlag){ ** connection and no other process already holds a lock, return ** SQLITE_READONLY_CANTINIT and set pShmNode->isUnlocked=1. */ -static int winLockSharedMemory(winShmNode *pShmNode){ +static int winLockSharedMemory(winShmNode* pShmNode) { int rc = winShmSystemLock(pShmNode, WINSHM_WRLCK, WIN_SHM_DMS, 1); - if( rc==SQLITE_OK ){ - if( pShmNode->isReadonly ){ + 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) ){ + } 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); + return winLogError(SQLITE_IOERR_SHMOPEN, osGetLastError(), "winLockSharedMemory", pShmNode->zFilename); } } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1); } @@ -47497,43 +46888,45 @@ static int winLockSharedMemory(winShmNode *pShmNode){ ** 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 */ +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 */ + 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; + 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 ){ + 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); + 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){ + 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 (sqlite3StrICmp(pShmNode->zFilename, pNew->zFilename) == 0) + break; } - if( pShmNode ){ + if (pShmNode) { sqlite3_free(pNew); - }else{ + } else { int inFlags = SQLITE_OPEN_WAL; int outFlags = 0; @@ -47543,31 +46936,30 @@ static int winOpenSharedMemory(winFile *pDbFd){ pShmNode->pNext = winShmNodeList; winShmNodeList = pShmNode; - if( sqlite3GlobalConfig.bCoreMutex ){ + if (sqlite3GlobalConfig.bCoreMutex) { pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); - if( pShmNode->mutex==0 ){ + if (pShmNode->mutex == 0) { rc = SQLITE_IOERR_NOMEM_BKPT; goto shm_open_err; } } - if( 0==sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){ + if (0 == sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0)) { inFlags |= SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE; - }else{ + } 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); + 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; + if (outFlags == SQLITE_OPEN_READONLY) + pShmNode->isReadonly = 1; rc = winLockSharedMemory(pShmNode); - if( rc!=SQLITE_OK && rc!=SQLITE_READONLY_CANTINIT ) goto shm_open_err; + if (rc != SQLITE_OK && rc != SQLITE_READONLY_CANTINIT) + goto shm_open_err; } /* Make the new connection a child of the winShmNode */ @@ -47595,7 +46987,7 @@ static int winOpenSharedMemory(winFile *pDbFd){ /* 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 */ + winShmPurge(pDbFd->pVfs, 0); /* This call frees pShmNode if required */ sqlite3_free(p); sqlite3_free(pNew); winShmLeaveMutex(); @@ -47606,24 +46998,25 @@ static int winOpenSharedMemory(winFile *pDbFd){ ** 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 */ +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; + 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){} + for (pp = &pShmNode->pFirst; (*pp) != p; pp = &(*pp)->pNext) { + } *pp = p->pNext; /* Free the connection p */ @@ -47634,9 +47027,9 @@ static int winShmUnmap( /* If pShmNode->nRef has reached 0, then close the underlying ** shared-memory file, too */ winShmEnterMutex(); - assert( pShmNode->nRef>0 ); + assert(pShmNode->nRef > 0); pShmNode->nRef--; - if( pShmNode->nRef==0 ){ + if (pShmNode->nRef == 0) { winShmPurge(pDbFd->pVfs, deleteFlag); } winShmLeaveMutex(); @@ -47647,65 +47040,65 @@ static int winShmUnmap( /* ** 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; +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<= 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 << ofst)); + assert(n > 1 || mask == (1 << ofst)); sqlite3_mutex_enter(pShmNode->mutex); - if( flags & SQLITE_SHM_UNLOCK ){ + 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 ); + 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{ + 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 ){ + 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" */ + } 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 ){ + for (pX = pShmNode->pFirst; pX; pX = pX->pNext) { + if ((pX->exclMask & mask) != 0) { rc = SQLITE_BUSY; break; } @@ -47713,24 +47106,24 @@ static int winShmLock( } /* 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{ + 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 ){ + if (rc == SQLITE_OK) { p->sharedMask |= mask; } - }else{ + } 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 ){ + for (pX = pShmNode->pFirst; pX; pX = pX->pNext) { + if ((pX->exclMask & mask) != 0 || (pX->sharedMask & mask) != 0) { rc = SQLITE_BUSY; break; } @@ -47739,17 +47132,16 @@ static int winShmLock( /* 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 ); + 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, + 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; } @@ -47760,12 +47152,11 @@ static int winShmLock( ** 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 */ -){ +static void winShmBarrier(sqlite3_file* fd /* Database holding the shared memory */ +) { UNUSED_PARAMETER(fd); - sqlite3MemoryBarrier(); /* compiler-defined memory barrier */ - winShmEnterMutex(); /* Also mutex, for redundancy */ + sqlite3MemoryBarrier(); /* compiler-defined memory barrier */ + winShmEnterMutex(); /* Also mutex, for redundancy */ winShmLeaveMutex(); } @@ -47788,40 +47179,41 @@ static void winShmBarrier( ** 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; +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 ){ + if (!pShm) { rc = winOpenSharedMemory(pDbFd); - if( rc!=SQLITE_OK ) return rc; + if (rc != SQLITE_OK) + return rc; pShm = pDbFd->pShm; - assert( pShm!=0 ); + assert(pShm != 0); } pShmNode = pShm->pShmNode; sqlite3_mutex_enter(pShmNode->mutex); - if( pShmNode->isUnlocked ){ + if (pShmNode->isUnlocked) { rc = winLockSharedMemory(pShmNode); - if( rc!=SQLITE_OK ) goto shmpage_out; + if (rc != SQLITE_OK) + goto shmpage_out; pShmNode->isUnlocked = 0; } - assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==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 */ + 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; @@ -47829,85 +47221,70 @@ static int winShmMap( ** 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); + 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); + if (!isWrite) + goto shmpage_out; + rc = winTruncate((sqlite3_file*)&pShmNode->hFile, 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 ){ + 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 ){ + 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 */ + 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 - ); + 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 - ); + 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 - ); + 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, + 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; + if (hMap) { + int iOffset = pShmNode->nRegion * szRegion; int iOffsetShift = iOffset % winSysInfo.dwAllocationGranularity; #if SQLITE_OS_WINRT - pMap = osMapViewOfFileFromApp(hMap, flags, - iOffset - iOffsetShift, szRegion + iOffsetShift - ); + pMap = osMapViewOfFileFromApp(hMap, flags, iOffset - iOffsetShift, szRegion + iOffsetShift); #else - pMap = osMapViewOfFile(hMap, flags, - 0, iOffset - iOffsetShift, szRegion + iOffsetShift - ); + 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, + 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 ){ + if (!pMap) { pShmNode->lastErrno = osGetLastError(); - rc = winLogError(SQLITE_IOERR_SHMMAP, pShmNode->lastErrno, - "winShmMap3", pDbFd->zPath); - if( hMap ) osCloseHandle(hMap); + rc = winLogError(SQLITE_IOERR_SHMMAP, pShmNode->lastErrno, "winShmMap3", pDbFd->zPath); + if (hMap) + osCloseHandle(hMap); goto shmpage_out; } @@ -47918,60 +47295,56 @@ static int winShmMap( } shmpage_out: - if( pShmNode->nRegion>iRegion ){ - int iOffset = iRegion*szRegion; + 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{ + char* p = (char*)pShmNode->aRegion[iRegion].pMap; + *pp = (void*)&p[iOffsetShift]; + } else { *pp = 0; } - if( pShmNode->isReadonly && rc==SQLITE_OK ) rc = SQLITE_READONLY; + 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 +#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 ); +#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) ){ + 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); + "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) ){ + 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); + 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)); + OSTRACE(("UNMAP-FILE pid=%lu, pFile=%p, rc=SQLITE_OK\n", osGetCurrentProcessId(), pFile)); return SQLITE_OK; } @@ -47991,40 +47364,39 @@ static int winUnmapfile(winFile *pFile){ ** recreated as a result of outstanding references) or an SQLite error ** code otherwise. */ -static int winMapfile(winFile *pFd, sqlite3_int64 nByte){ +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)); + 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 (pFd->nFetchOut > 0) + return SQLITE_OK; - if( nMap<0 ){ + 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)); + if (rc) { + OSTRACE(("MAP-FILE pid=%lu, pFile=%p, rc=SQLITE_IOERR_FSTAT\n", osGetCurrentProcessId(), pFd)); return SQLITE_IOERR_FSTAT; } } - if( nMap>pFd->mmapSizeMax ){ + if (nMap > pFd->mmapSizeMax) { nMap = pFd->mmapSizeMax; } nMap &= ~(sqlite3_int64)(winSysInfo.dwPageSize - 1); - if( nMap==0 && pFd->mmapSize>0 ){ + if (nMap == 0 && pFd->mmapSize > 0) { winUnmapfile(pFd); } - if( nMap!=pFd->mmapSize ){ - void *pNew = 0; + 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 ){ + if ((pFd->ctrlFlags & WINFILE_RDONLY) == 0) { protect = PAGE_READWRITE; flags |= FILE_MAP_WRITE; } @@ -48032,47 +47404,38 @@ static int winMapfile(winFile *pFd, sqlite3_int64 nByte){ #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); + 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); + pFd->hMap = osCreateFileMappingA(pFd->h, NULL, protect, (DWORD)((nMap >> 32) & 0xffffffff), (DWORD)(nMap & 0xffffffff), NULL); #endif - if( pFd->hMap==NULL ){ + if (pFd->hMap == NULL) { pFd->lastErrno = osGetLastError(); - rc = winLogError(SQLITE_IOERR_MMAP, pFd->lastErrno, - "winMapfile1", pFd->zPath); + 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))); + 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 ); + 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 ){ + if (pNew == NULL) { osCloseHandle(pFd->hMap); pFd->hMap = NULL; pFd->lastErrno = osGetLastError(); - rc = winLogError(SQLITE_IOERR_MMAP, pFd->lastErrno, - "winMapfile2", pFd->zPath); + 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))); + 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)); + OSTRACE(("MAP-FILE pid=%lu, pFile=%p, rc=SQLITE_OK\n", osGetCurrentProcessId(), pFd)); return SQLITE_OK; } #endif /* SQLITE_MAX_MMAP_SIZE>0 */ @@ -48089,35 +47452,32 @@ static int winMapfile(winFile *pFd, sqlite3_int64 nByte){ ** 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 */ +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)); + 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 ){ +#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))); + 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]; + 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)); + OSTRACE(("FETCH pid=%lu, pFile=%p, pp=%p, *pp=%p, rc=SQLITE_OK\n", osGetCurrentProcessId(), fd, pp, *pp)); return SQLITE_OK; } @@ -48131,24 +47491,23 @@ static int winFetch(sqlite3_file *fd, i64 iOff, int nAmt, void **pp){ ** 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 */ +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) ); + assert((p == 0) == (pFd->nFetchOut == 0)); /* If p!=0, it must match the iOff value. */ - assert( p==0 || p==&((u8 *)pFd->pMapRegion)[iOff] ); + assert(p == 0 || p == &((u8*)pFd->pMapRegion)[iOff]); - OSTRACE(("UNFETCH pid=%lu, pFile=%p, offset=%lld, p=%p\n", - osGetCurrentProcessId(), pFd, iOff, p)); + OSTRACE(("UNFETCH pid=%lu, pFile=%p, offset=%lld, p=%p\n", osGetCurrentProcessId(), pFd, iOff, p)); - if( p ){ + if (p) { pFd->nFetchOut--; - }else{ + } 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 @@ -48156,11 +47515,10 @@ static int winUnfetch(sqlite3_file *fd, i64 iOff, void *p){ winUnmapfile(pFd); } - assert( pFd->nFetchOut>=0 ); + assert(pFd->nFetchOut >= 0); #endif - OSTRACE(("UNFETCH pid=%lu, pFile=%p, rc=SQLITE_OK\n", - osGetCurrentProcessId(), fd)); + OSTRACE(("UNFETCH pid=%lu, pFile=%p, rc=SQLITE_OK\n", osGetCurrentProcessId(), fd)); return SQLITE_OK; } @@ -48175,25 +47533,25 @@ static int winUnfetch(sqlite3_file *fd, i64 iOff, void *p){ ** 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 */ + 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 */ }; /* @@ -48201,37 +47559,37 @@ static const sqlite3_io_methods winIoMethod = { ** 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 */ + 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 */ + &winIoMethod, /* pMethod */ + 0, /* pAppData */ + 0 /* bNoLock */ }; static winVfsAppData winNolockAppData = { - &winIoNolockMethod, /* pMethod */ - 0, /* pAppData */ - 1 /* bNoLock */ + &winIoNolockMethod, /* pMethod */ + 0, /* pAppData */ + 1 /* bNoLock */ }; /**************************************************************************** @@ -48247,13 +47605,13 @@ static winVfsAppData winNolockAppData = { ** 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() ){ +static char* winConvertToUtf8Filename(const void* zFilename) { + char* zConverted = 0; + if (osIsNT()) { zConverted = winUnicodeToUtf8(zFilename); } #ifdef SQLITE_WIN32_HAS_ANSI - else{ + else { zConverted = winMbcsToUtf8(zFilename, osAreFileApisANSI()); } #endif @@ -48268,13 +47626,13 @@ static char *winConvertToUtf8Filename(const void *zFilename){ ** is obtained from malloc and must be freed by the calling ** function. */ -static void *winConvertFromUtf8Filename(const char *zFilename){ - void *zConverted = 0; - if( osIsNT() ){ +static void* winConvertFromUtf8Filename(const char* zFilename) { + void* zConverted = 0; + if (osIsNT()) { zConverted = winUtf8ToUnicode(zFilename); } #ifdef SQLITE_WIN32_HAS_ANSI - else{ + else { zConverted = winUtf8ToMbcs(zFilename, osAreFileApisANSI()); } #endif @@ -48287,15 +47645,15 @@ static void *winConvertFromUtf8Filename(const char *zFilename){ ** ends with a directory separator character or one was successfully ** added to it. */ -static int winMakeEndInDirSep(int nBuf, char *zBuf){ - if( zBuf ){ +static int winMakeEndInDirSep(int nBuf, char* zBuf) { + if (zBuf) { int nLen = sqlite3Strlen30(zBuf); - if( nLen>0 ){ - if( winIsDirSep(zBuf[nLen-1]) ){ + if (nLen > 0) { + if (winIsDirSep(zBuf[nLen - 1])) { return 1; - }else if( nLen+1mxPathname; nBuf = nMax + 2; - zBuf = sqlite3MallocZero( nBuf ); - if( !zBuf ){ + nMax = pVfs->mxPathname; + nBuf = nMax + 2; + zBuf = sqlite3MallocZero(nBuf); + if (!zBuf) { OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n")); return SQLITE_IOERR_NOMEM_BKPT; } @@ -48350,14 +47709,14 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){ ** configured by the operating system. */ nDir = nMax - (nPre + 15); - assert( nDir>0 ); - if( winTempDirDefined() ){ + assert(nDir > 0); + if (winTempDirDefined()) { int nDirLen = sqlite3Strlen30(sqlite3_temp_directory); - if( nDirLen>0 ){ - if( !winIsDirSep(sqlite3_temp_directory[nDirLen-1]) ){ + if (nDirLen > 0) { + if (!winIsDirSep(sqlite3_temp_directory[nDirLen - 1])) { nDirLen++; } - if( nDirLen>nDir ){ + if (nDirLen > nDir) { sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); sqlite3_free(zBuf); OSTRACE(("TEMP-FILENAME rc=SQLITE_ERROR\n")); @@ -48369,71 +47728,70 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){ } #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 */ + 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 nBuf ){ + 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); + 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) ]; + 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; + zBuf[j + 1] = 0; *pzBuf = zBuf; OSTRACE(("TEMP-FILENAME name=%s, rc=SQLITE_OK\n", zBuf)); @@ -48553,48 +47909,45 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){ ** it is something other than a directory, or if there is any kind of memory ** allocation failure. */ -static int winIsDir(const void *zConverted){ +static int winIsDir(const void* zConverted) { DWORD attr; int rc = 0; DWORD lastErrno; - if( osIsNT() ){ + 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 ){ + 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{ +#if SQLITE_OS_WINCE == 0 + } else { attr = osGetFileAttributesA((char*)zConverted); #endif } - return (attr!=INVALID_FILE_ATTRIBUTES) && (attr&FILE_ATTRIBUTE_DIRECTORY); + 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 */ +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 */ -){ +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; @@ -48604,38 +47957,33 @@ static int winOpen( #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 */ + 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. */ + char* zTmpname = 0; /* For temporary filename, if necessary. */ - int rc = SQLITE_OK; /* Function Return Code */ + int rc = SQLITE_OK; /* Function Return Code */ #if !defined(NDEBUG) || SQLITE_OS_WINCE - int eType = flags&0xFFFFFF00; /* Type of file to open */ + 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); + 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 - )); + 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)); + OSTRACE(("OPEN name=%s, pFile=%p, flags=%x, pOutFlags=%p\n", zUtf8Name, id, flags, pOutFlags)); /* Check the following statements are true: ** @@ -48644,43 +47992,40 @@ static int winOpen( ** (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); + 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((!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(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 ); + 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"); + 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 ); + if (!zUtf8Name) { + assert(isDelete && !isOpenJournal); rc = winGetTempname(pVfs, &zTmpname); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { OSTRACE(("OPEN name=%s, rc=%s", zUtf8Name, sqlite3ErrName(rc))); return rc; } @@ -48691,27 +48036,26 @@ static int winOpen( ** 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 ); + 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 ){ + if (zConverted == 0) { sqlite3_free(zTmpname); OSTRACE(("OPEN name=%s, rc=SQLITE_IOERR_NOMEM", zUtf8Name)); return SQLITE_IOERR_NOMEM_BKPT; } - if( winIsDir(zConverted) ){ + if (winIsDir(zConverted)) { sqlite3_free(zConverted); sqlite3_free(zTmpname); OSTRACE(("OPEN name=%s, rc=SQLITE_CANTOPEN_ISDIR", zUtf8Name)); return SQLITE_CANTOPEN_ISDIR; } - if( isReadWrite ){ + if (isReadWrite) { dwDesiredAccess = GENERIC_READ | GENERIC_WRITE; - }else{ + } else { dwDesiredAccess = GENERIC_READ; } @@ -48719,34 +48063,32 @@ static int winOpen( ** created. SQLite doesn't use it to indicate "exclusive access" ** as it is usually understood. */ - if( isExclusive ){ + 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 ){ + } else if (isCreate) { /* Open existing file, or create if it doesn't exist */ dwCreationDisposition = OPEN_ALWAYS; - }else{ + } else { /* Opens a file, only if it exists. */ dwCreationDisposition = OPEN_EXISTING; } - if( 0==sqlite3_uri_boolean(zName, "exclusive", 0) ){ + if (0 == sqlite3_uri_boolean(zName, "exclusive", 0)) { dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; - }else{ + } else { dwShareMode = 0; } - if( isDelete ){ + 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; + dwFlagsAndAttributes = FILE_ATTRIBUTE_TEMPORARY | FILE_ATTRIBUTE_HIDDEN | FILE_FLAG_DELETE_ON_CLOSE; #endif - }else{ + } else { dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL; } /* Reports from the internet are that performance is always @@ -48755,110 +48097,95 @@ static int winOpen( dwFlagsAndAttributes |= FILE_FLAG_RANDOM_ACCESS; #endif - if( osIsNT() ){ + if (osIsNT()) { #if SQLITE_OS_WINRT CREATEFILE2_EXTENDED_PARAMETERS extendedParameters; extendedParameters.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS); - extendedParameters.dwFileAttributes = - dwFlagsAndAttributes & FILE_ATTRIBUTE_MASK; + 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 ){ + 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 ){ + 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; + if (rc2 == SQLITE_OK && isRO) + break; } - }while( winRetryIoerr(&cnt, &lastErrno) ); + } 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 ){ + 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; + if (rc2 == SQLITE_OK && isRO) + break; } - }while( winRetryIoerr(&cnt, &lastErrno) ); + } 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")); + 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 ){ + 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{ + 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 ){ + if (pOutFlags) { + if (isReadWrite) { *pOutFlags = SQLITE_OPEN_READWRITE; - }else{ + } 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")); + "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 - ){ + 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); @@ -48866,9 +48193,9 @@ static int winOpen( return rc; } } - if( isTemp ){ + if (isTemp) { pFile->zDeleteOnClose = zConverted; - }else + } else #endif { sqlite3_free(zConverted); @@ -48878,17 +48205,15 @@ static int winOpen( id->pMethods = pAppData ? pAppData->pMethod : &winIoMethod; pFile->pVfs = pVfs; pFile->h = h; - if( isReadonly ){ + if (isReadonly) { pFile->ctrlFlags |= WINFILE_RDONLY; } - if( (flags & SQLITE_OPEN_MAIN_DB) - && sqlite3_uri_boolean(zName, "psow", SQLITE_POWERSAFE_OVERWRITE) - ){ + 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 +#if SQLITE_MAX_MMAP_SIZE > 0 pFile->hMap = NULL; pFile->pMapRegion = 0; pFile->mmapSize = 0; @@ -48911,16 +48236,15 @@ static int winOpen( ** 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 */ -){ +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; + void* zConverted; UNUSED_PARAMETER(pVfs); UNUSED_PARAMETER(syncDir); @@ -48928,24 +48252,22 @@ static int winDelete( OSTRACE(("DELETE name=%s, syncDir=%d\n", zFilename, syncDir)); zConverted = winConvertFromUtf8Filename(zFilename); - if( zConverted==0 ){ + if (zConverted == 0) { OSTRACE(("DELETE name=%s, rc=SQLITE_IOERR_NOMEM\n", zFilename)); return SQLITE_IOERR_NOMEM_BKPT; } - if( osIsNT() ){ + if (osIsNT()) { do { #if SQLITE_OS_WINRT WIN32_FILE_ATTRIBUTE_DATA sAttrData; memset(&sAttrData, 0, sizeof(sAttrData)); - if ( osGetFileAttributesExW(zConverted, GetFileExInfoStandard, - &sAttrData) ){ + if (osGetFileAttributesExW(zConverted, GetFileExInfoStandard, &sAttrData)) { attr = sAttrData.dwFileAttributes; - }else{ + } else { lastErrno = osGetLastError(); - if( lastErrno==ERROR_FILE_NOT_FOUND - || lastErrno==ERROR_PATH_NOT_FOUND ){ + if (lastErrno == ERROR_FILE_NOT_FOUND || lastErrno == ERROR_PATH_NOT_FOUND) { rc = SQLITE_IOERR_DELETE_NOENT; /* Already gone? */ - }else{ + } else { rc = SQLITE_ERROR; } break; @@ -48953,62 +48275,60 @@ static int winDelete( #else attr = osGetFileAttributesW(zConverted); #endif - if ( attr==INVALID_FILE_ATTRIBUTES ){ + if (attr == INVALID_FILE_ATTRIBUTES) { lastErrno = osGetLastError(); - if( lastErrno==ERROR_FILE_NOT_FOUND - || lastErrno==ERROR_PATH_NOT_FOUND ){ + if (lastErrno == ERROR_FILE_NOT_FOUND || lastErrno == ERROR_PATH_NOT_FOUND) { rc = SQLITE_IOERR_DELETE_NOENT; /* Already gone? */ - }else{ + } else { rc = SQLITE_ERROR; } break; } - if ( attr&FILE_ATTRIBUTE_DIRECTORY ){ + if (attr & FILE_ATTRIBUTE_DIRECTORY) { rc = SQLITE_ERROR; /* Files only. */ break; } - if ( osDeleteFileW(zConverted) ){ + if (osDeleteFileW(zConverted)) { rc = SQLITE_OK; /* Deleted OK. */ break; } - if ( !winRetryIoerr(&cnt, &lastErrno) ){ + if (!winRetryIoerr(&cnt, &lastErrno)) { rc = SQLITE_ERROR; /* No more retries. */ break; } - } while(1); + } while (1); } #ifdef SQLITE_WIN32_HAS_ANSI - else{ + else { do { attr = osGetFileAttributesA(zConverted); - if ( attr==INVALID_FILE_ATTRIBUTES ){ + if (attr == INVALID_FILE_ATTRIBUTES) { lastErrno = osGetLastError(); - if( lastErrno==ERROR_FILE_NOT_FOUND - || lastErrno==ERROR_PATH_NOT_FOUND ){ + if (lastErrno == ERROR_FILE_NOT_FOUND || lastErrno == ERROR_PATH_NOT_FOUND) { rc = SQLITE_IOERR_DELETE_NOENT; /* Already gone? */ - }else{ + } else { rc = SQLITE_ERROR; } break; } - if ( attr&FILE_ATTRIBUTE_DIRECTORY ){ + if (attr & FILE_ATTRIBUTE_DIRECTORY) { rc = SQLITE_ERROR; /* Files only. */ break; } - if ( osDeleteFileA(zConverted) ){ + if (osDeleteFileA(zConverted)) { rc = SQLITE_OK; /* Deleted OK. */ break; } - if ( !winRetryIoerr(&cnt, &lastErrno) ){ + if (!winRetryIoerr(&cnt, &lastErrno)) { rc = SQLITE_ERROR; /* No more retries. */ break; } - } while(1); + } while (1); } #endif - if( rc && rc!=SQLITE_IOERR_DELETE_NOENT ){ + if (rc && rc != SQLITE_IOERR_DELETE_NOENT) { rc = winLogError(SQLITE_IOERR_DELETE, lastErrno, "winDelete", zFilename); - }else{ + } else { winLogIoerr(cnt, __LINE__); } sqlite3_free(zConverted); @@ -49019,77 +48339,69 @@ static int winDelete( /* ** 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 */ -){ +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; + void* zConverted; UNUSED_PARAMETER(pVfs); - SimulateIOError( return SQLITE_IOERR_ACCESS; ); - OSTRACE(("ACCESS name=%s, flags=%x, pResOut=%p\n", - zFilename, flags, pResOut)); + SimulateIOError(return SQLITE_IOERR_ACCESS;); + OSTRACE(("ACCESS name=%s, flags=%x, pResOut=%p\n", zFilename, flags, pResOut)); zConverted = winConvertFromUtf8Filename(zFilename); - if( zConverted==0 ){ + if (zConverted == 0) { OSTRACE(("ACCESS name=%s, rc=SQLITE_IOERR_NOMEM\n", zFilename)); return SQLITE_IOERR_NOMEM_BKPT; } - if( osIsNT() ){ + 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 ){ + 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 ){ + if (flags == SQLITE_ACCESS_EXISTS && sAttrData.nFileSizeHigh == 0 && sAttrData.nFileSizeLow == 0) { attr = INVALID_FILE_ATTRIBUTES; - }else{ + } else { attr = sAttrData.dwFileAttributes; } - }else{ + } else { winLogIoerr(cnt, __LINE__); - if( lastErrno!=ERROR_FILE_NOT_FOUND && lastErrno!=ERROR_PATH_NOT_FOUND ){ + if (lastErrno != ERROR_FILE_NOT_FOUND && lastErrno != ERROR_PATH_NOT_FOUND) { sqlite3_free(zConverted); - return winLogError(SQLITE_IOERR_ACCESS, lastErrno, "winAccess", - zFilename); - }else{ + return winLogError(SQLITE_IOERR_ACCESS, lastErrno, "winAccess", zFilename); + } else { attr = INVALID_FILE_ATTRIBUTES; } } } #ifdef SQLITE_WIN32_HAS_ANSI - else{ + else { attr = osGetFileAttributesA((char*)zConverted); } #endif sqlite3_free(zConverted); - switch( flags ){ + switch (flags) { case SQLITE_ACCESS_READ: case SQLITE_ACCESS_EXISTS: - rc = attr!=INVALID_FILE_ATTRIBUTES; + rc = attr != INVALID_FILE_ATTRIBUTES; break; case SQLITE_ACCESS_READWRITE: - rc = attr!=INVALID_FILE_ATTRIBUTES && - (attr & FILE_ATTRIBUTE_READONLY)==0; + 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)); + OSTRACE(("ACCESS name=%s, pResOut=%p, *pResOut=%d, rc=SQLITE_OK\n", zFilename, pResOut, *pResOut)); return SQLITE_OK; } @@ -49097,21 +48409,16 @@ static int winAccess( ** 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]=='\\' ); +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]==':' ); +static BOOL winIsDriveLetterAndColon(const char* zPathname) { + return (sqlite3Isalpha(zPathname[0]) && zPathname[1] == ':'); } /* @@ -49120,9 +48427,7 @@ static BOOL winIsDriveLetterAndColon( ** 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 -){ +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 @@ -49130,7 +48435,7 @@ static BOOL winIsVerbatimPathname( ** 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]) ){ + if (winIsDirSep(zPathname[0])) { return TRUE; } @@ -49140,7 +48445,7 @@ static BOOL winIsVerbatimPathname( ** attempt to treat it as a relative path name (i.e. they should simply use ** it verbatim). */ - if ( winIsDriveLetterAndColon(zPathname) ){ + if (winIsDriveLetterAndColon(zPathname)) { return TRUE; } @@ -49156,72 +48461,63 @@ static BOOL winIsVerbatimPathname( ** pathname into zOut[]. zOut[] will be at least pVfs->mxPathname ** bytes in size. */ -static int winFullPathnameNoMutex( - 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 */ -){ +static int winFullPathnameNoMutex(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; + 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)) ){ + if (zRelative[0] == '/' && (winIsDriveLetterAndColon(zRelative + 1) || winIsLongPathPrefix(zRelative + 1))) { zRelative++; } #if defined(__CYGWIN__) - SimulateIOError( return SQLITE_ERROR ); + SimulateIOError(return SQLITE_ERROR); UNUSED_PARAMETER(nFull); - assert( nFull>=pVfs->mxPathname ); - if ( sqlite3_data_directory && !winIsVerbatimPathname(zRelative) ){ + 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 ){ + 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 ){ + 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 ){ + 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_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 ){ + } 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 ){ + 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 ){ + return winLogError(SQLITE_CANTOPEN_CONVPATH, (DWORD)errno, "winFullPathname2", zRelative); + } else { + char* zUtf8 = winConvertToUtf8Filename(zOut); + if (!zUtf8) { sqlite3_free(zOut); return SQLITE_IOERR_NOMEM_BKPT; } @@ -49234,19 +48530,18 @@ static int winFullPathnameNoMutex( #endif #if (SQLITE_OS_WINCE || SQLITE_OS_WINRT) && !defined(__CYGWIN__) - SimulateIOError( return SQLITE_ERROR ); + 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) ){ + 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%c%s", sqlite3_data_directory, winGetDirSep(), zRelative); + } else { sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zRelative); } return SQLITE_OK; @@ -49258,91 +48553,85 @@ static int winFullPathnameNoMutex( ** 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) ){ + 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); + sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s", sqlite3_data_directory, winGetDirSep(), zRelative); return SQLITE_OK; } zConverted = winConvertFromUtf8Filename(zRelative); - if( zConverted==0 ){ + if (zConverted == 0) { return SQLITE_IOERR_NOMEM_BKPT; } - if( osIsNT() ){ + if (osIsNT()) { LPWSTR zTemp; nByte = osGetFullPathNameW((LPCWSTR)zConverted, 0, 0, 0); - if( nByte==0 ){ + if (nByte == 0) { sqlite3_free(zConverted); - return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), - "winFullPathname1", zRelative); + return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), "winFullPathname1", zRelative); } nByte += 3; - zTemp = sqlite3MallocZero( nByte*sizeof(zTemp[0]) ); - if( zTemp==0 ){ + 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 ){ + if (nByte == 0) { sqlite3_free(zConverted); sqlite3_free(zTemp); - return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), - "winFullPathname2", zRelative); + 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; + else { + char* zTemp; nByte = osGetFullPathNameA((char*)zConverted, 0, 0, 0); - if( nByte==0 ){ + if (nByte == 0) { sqlite3_free(zConverted); - return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), - "winFullPathname3", zRelative); + return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), "winFullPathname3", zRelative); } nByte += 3; - zTemp = sqlite3MallocZero( nByte*sizeof(zTemp[0]) ); - if( zTemp==0 ){ + 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 ){ + if (nByte == 0) { sqlite3_free(zConverted); sqlite3_free(zTemp); - return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), - "winFullPathname4", zRelative); + return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), "winFullPathname4", zRelative); } sqlite3_free(zConverted); zOut = winMbcsToUtf8(zTemp, osAreFileApisANSI()); sqlite3_free(zTemp); } #endif - if( zOut ){ + if (zOut) { sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zOut); sqlite3_free(zOut); return SQLITE_OK; - }else{ + } else { return SQLITE_IOERR_NOMEM_BKPT; } #endif } -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 */ -){ +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 */ +) { int rc; - sqlite3_mutex *pMutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR); + sqlite3_mutex* pMutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR); sqlite3_mutex_enter(pMutex); rc = winFullPathnameNoMutex(pVfs, zRelative, nFull, zFull); sqlite3_mutex_leave(pMutex); @@ -49354,17 +48643,17 @@ static int winFullPathname( ** 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){ +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 ){ + 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 ){ + if (winFullPathname(pVfs, zFilename, nFull, zFull) != SQLITE_OK) { sqlite3_free(zFull); OSTRACE(("DLOPEN name=%s, handle=%p\n", zFilename, (void*)0)); return 0; @@ -49372,14 +48661,14 @@ static void *winDlOpen(sqlite3_vfs *pVfs, const char *zFilename){ zConverted = winConvertFromUtf8Filename(zFull); sqlite3_free(zFull); #else - void *zConverted = winConvertFromUtf8Filename(zFilename); + void* zConverted = winConvertFromUtf8Filename(zFilename); UNUSED_PARAMETER(pVfs); #endif - if( zConverted==0 ){ + if (zConverted == 0) { OSTRACE(("DLOPEN name=%s, handle=%p\n", zFilename, (void*)0)); return 0; } - if( osIsNT() ){ + if (osIsNT()) { #if SQLITE_OS_WINRT h = osLoadPackagedLibrary((LPCWSTR)zConverted, 0); #else @@ -49387,7 +48676,7 @@ static void *winDlOpen(sqlite3_vfs *pVfs, const char *zFilename){ #endif } #ifdef SQLITE_WIN32_HAS_ANSI - else{ + else { h = osLoadLibraryA((char*)zConverted); } #endif @@ -49395,46 +48684,46 @@ static void *winDlOpen(sqlite3_vfs *pVfs, const char *zFilename){ sqlite3_free(zConverted); return (void*)h; } -static void winDlError(sqlite3_vfs *pVfs, int nBuf, char *zBufOut){ +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){ +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; + 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){ +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 +#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 */ + 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){ +static void xorMemory(EntropyGatherer* p, unsigned char* x, int sz) { int j, k; - for(j=0, k=p->i; ji; j < sz; j++) { p->a[k++] ^= x[j]; - if( k>=p->na ) k = 0; + if (k >= p->na) + k = 0; } p->i = k; p->nXor += sz; @@ -49444,7 +48733,7 @@ static void xorMemory(EntropyGatherer *p, unsigned char *x, int sz){ /* ** Write up to nBuf bytes of randomness into zBuf. */ -static int winRandomness(sqlite3_vfs *pVfs, int nBuf, char *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); @@ -49493,18 +48782,17 @@ static int winRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ 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; + 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); +static int winSleep(sqlite3_vfs* pVfs, int microsec) { + sqlite3_win32_sleep((microsec + 999) / 1000); UNUSED_PARAMETER(pVfs); - return ((microsec+999)/1000)*1000; + return ((microsec + 999) / 1000) * 1000; } /* @@ -49513,7 +48801,7 @@ static int winSleep(sqlite3_vfs *pVfs, int microsec){ ** sqlite3OsCurrentTime() during testing. */ #ifdef SQLITE_TEST -SQLITE_API int sqlite3_current_time = 0; /* Fake system time in seconds since 1970. */ +SQLITE_API int sqlite3_current_time = 0; /* Fake system time in seconds since 1970. */ #endif /* @@ -49526,38 +48814,35 @@ SQLITE_API int sqlite3_current_time = 0; /* Fake system time in seconds since 1 ** 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){ +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; + static const sqlite3_int64 winFiletimeEpoch = 23058135 * (sqlite3_int64)8640000; #ifdef SQLITE_TEST - static const sqlite3_int64 unixEpoch = 24405875*(sqlite3_int64)8640000; + 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; + 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)){ + if (!osSystemTimeToFileTime(&time, &ft)) { return SQLITE_ERROR; } #else - osGetSystemTimeAsFileTime( &ft ); + osGetSystemTimeAsFileTime(&ft); #endif - *piNow = winFiletimeEpoch + - ((((sqlite3_int64)ft.dwHighDateTime)*max32BitValue) + - (sqlite3_int64)ft.dwLowDateTime)/(sqlite3_int64)10000; + *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; + if (sqlite3_current_time) { + *piNow = 1000 * (sqlite3_int64)sqlite3_current_time + unixEpoch; } #endif UNUSED_PARAMETER(pVfs); @@ -49569,12 +48854,12 @@ static int winCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *piNow){ ** 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){ +static int winCurrentTime(sqlite3_vfs* pVfs, double* prNow) { int rc; sqlite3_int64 i; rc = winCurrentTimeInt64(pVfs, &i); - if( !rc ){ - *prNow = i/86400000.0; + if (!rc) { + *prNow = i / 86400000.0; } return rc; } @@ -49609,121 +48894,122 @@ static int winCurrentTime(sqlite3_vfs *pVfs, double *prNow){ ** 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){ +static int winGetLastError(sqlite3_vfs* pVfs, int nBuf, char* zBuf) { DWORD e = osGetLastError(); UNUSED_PARAMETER(pVfs); - if( nBuf>0 ) winGetLastErrorMsg(e, nBuf, zBuf); + if (nBuf > 0) + winGetLastErrorMsg(e, nBuf, zBuf); return e; } /* ** Initialize and deinitialize the operating system interface. */ -SQLITE_API int sqlite3_os_init(void){ +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 */ + 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 */ + 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 */ + 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 */ + 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 ); + assert(ArraySize(aSyscall) == 80); /* get memory map allocation granularity */ memset(&winSysInfo, 0, sizeof(SYSTEM_INFO)); @@ -49732,8 +49018,8 @@ SQLITE_API int sqlite3_os_init(void){ #else osGetSystemInfo(&winSysInfo); #endif - assert( winSysInfo.dwAllocationGranularity>0 ); - assert( winSysInfo.dwPageSize>0 ); + assert(winSysInfo.dwAllocationGranularity > 0); + assert(winSysInfo.dwPageSize > 0); sqlite3_vfs_register(&winVfs, 1); @@ -49754,9 +49040,9 @@ SQLITE_API int sqlite3_os_init(void){ return SQLITE_OK; } -SQLITE_API int sqlite3_os_end(void){ +SQLITE_API int sqlite3_os_end(void) { #if SQLITE_OS_WINRT - if( sleepObj!=NULL ){ + if (sleepObj != NULL) { osCloseHandle(sleepObj); sleepObj = NULL; } @@ -49843,24 +49129,24 @@ typedef struct MemStore MemStore; ** */ 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 */ + 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 */ + sqlite3_file base; /* IO methods */ + MemStore* pStore; /* The storage */ + int eLock; /* Most recent lock against this file */ }; /* @@ -49870,8 +49156,8 @@ struct MemFile { ** 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 */ + int nMemStore; /* Number of shared MemStore objects */ + MemStore** apMemStore; /* Array of all shared MemStore objects */ } memdb_g; /* @@ -49879,122 +49165,124 @@ static struct MemFS { */ 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 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 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 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); +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 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 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 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 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 */ + 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 */ + 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){ +#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE == 0 +static void memdbEnter(MemStore* p) { UNUSED_PARAMETER(p); } -static void memdbLeave(MemStore *p){ +static void memdbLeave(MemStore* p) { UNUSED_PARAMETER(p); } #else -static void memdbEnter(MemStore *p){ +static void memdbEnter(MemStore* p) { sqlite3_mutex_enter(p->pMutex); } -static void memdbLeave(MemStore *p){ +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 ){ +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); + sqlite3_mutex* pVfsMutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1); #endif sqlite3_mutex_enter(pVfsMutex); - for(i=0; ALWAYS(inRef==1 ){ + if (p->nRef == 1) { memdb_g.apMemStore[i] = memdb_g.apMemStore[--memdb_g.nMemStore]; - if( memdb_g.nMemStore==0 ){ + if (memdb_g.nMemStore == 0) { sqlite3_free(memdb_g.apMemStore); memdb_g.apMemStore = 0; } @@ -50003,18 +49291,18 @@ static int memdbClose(sqlite3_file *pFile){ } } sqlite3_mutex_leave(pVfsMutex); - }else{ + } else { memdbEnter(p); } p->nRef--; - if( p->nRef<=0 ){ - if( p->mFlags & SQLITE_DESERIALIZE_FREEONCLOSE ){ + 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{ + } else { memdbLeave(p); } return SQLITE_OK; @@ -50023,21 +49311,17 @@ static int memdbClose(sqlite3_file *pFile){ /* ** Read data from an memdb-file. */ -static int memdbRead( - sqlite3_file *pFile, - void *zBuf, - int iAmt, - sqlite_int64 iOfst -){ - MemStore *p = ((MemFile*)pFile)->pStore; +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 ){ + if (iOfst + iAmt > p->sz) { memset(zBuf, 0, iAmt); - if( iOfstsz ) memcpy(zBuf, p->aData+iOfst, p->sz - iOfst); + if (iOfst < p->sz) + memcpy(zBuf, p->aData + iOfst, p->sz - iOfst); memdbLeave(p); return SQLITE_IOERR_SHORT_READ; } - memcpy(zBuf, p->aData+iOfst, iAmt); + memcpy(zBuf, p->aData + iOfst, iAmt); memdbLeave(p); return SQLITE_OK; } @@ -50045,18 +49329,20 @@ static int memdbRead( /* ** 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) ){ +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 ){ + if (newSz > p->szMax) { return SQLITE_FULL; } newSz *= 2; - if( newSz>p->szMax ) newSz = p->szMax; + if (newSz > p->szMax) + newSz = p->szMax; pNew = sqlite3Realloc(p->aData, newSz); - if( pNew==0 ) return SQLITE_IOERR_NOMEM; + if (pNew == 0) + return SQLITE_IOERR_NOMEM; p->aData = pNew; p->szAlloc = newSz; return SQLITE_OK; @@ -50065,32 +49351,26 @@ static int memdbEnlarge(MemStore *p, sqlite3_int64 newSz){ /* ** 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; +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) ){ + 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 ){ + if (iOfst + iAmt > p->sz) { int rc; - if( iOfst+iAmt>p->szAlloc - && (rc = memdbEnlarge(p, iOfst+iAmt))!=SQLITE_OK - ){ + 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; + if (iOfst > p->sz) + memset(p->aData + p->sz, 0, iOfst - p->sz); + p->sz = iOfst + iAmt; } - memcpy(p->aData+iOfst, z, iAmt); + memcpy(p->aData + iOfst, z, iAmt); memdbLeave(p); return SQLITE_OK; } @@ -50102,14 +49382,14 @@ static int memdbWrite( ** 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; +static int memdbTruncate(sqlite3_file* pFile, sqlite_int64 size) { + MemStore* p = ((MemFile*)pFile)->pStore; int rc = SQLITE_OK; memdbEnter(p); - if( size>p->sz ){ + if (size > p->sz) { /* This can only happen with a corrupt wal mode db */ rc = SQLITE_CORRUPT; - }else{ + } else { p->sz = size; } memdbLeave(p); @@ -50119,7 +49399,7 @@ static int memdbTruncate(sqlite3_file *pFile, sqlite_int64 size){ /* ** Sync an memdb-file. */ -static int memdbSync(sqlite3_file *pFile, int flags){ +static int memdbSync(sqlite3_file* pFile, int flags) { UNUSED_PARAMETER(pFile); UNUSED_PARAMETER(flags); return SQLITE_OK; @@ -50128,8 +49408,8 @@ static int memdbSync(sqlite3_file *pFile, int flags){ /* ** Return the current file-size of an memdb-file. */ -static int memdbFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){ - MemStore *p = ((MemFile*)pFile)->pStore; +static int memdbFileSize(sqlite3_file* pFile, sqlite_int64* pSize) { + MemStore* p = ((MemFile*)pFile)->pStore; memdbEnter(p); *pSize = p->sz; memdbLeave(p); @@ -50139,41 +49419,43 @@ static int memdbFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){ /* ** Lock an memdb-file. */ -static int memdbLock(sqlite3_file *pFile, int eLock){ - MemFile *pThis = (MemFile*)pFile; - MemStore *p = pThis->pStore; +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; + if (eLock == pThis->eLock) + return SQLITE_OK; memdbEnter(p); - if( eLock>SQLITE_LOCK_SHARED ){ - if( p->mFlags & SQLITE_DESERIALIZE_READONLY ){ + if (eLock > SQLITE_LOCK_SHARED) { + if (p->mFlags & SQLITE_DESERIALIZE_READONLY) { rc = SQLITE_READONLY; - }else if( pThis->eLock<=SQLITE_LOCK_SHARED ){ - if( p->nWrLock ){ + } else if (pThis->eLock <= SQLITE_LOCK_SHARED) { + if (p->nWrLock) { rc = SQLITE_BUSY; - }else{ + } else { p->nWrLock = 1; } } - }else if( eLock==SQLITE_LOCK_SHARED ){ - if( pThis->eLock > SQLITE_LOCK_SHARED ){ - assert( 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 ){ + } else if (p->nWrLock) { rc = SQLITE_BUSY; - }else{ + } else { p->nRdLock++; } - }else{ - assert( eLock==SQLITE_LOCK_NONE ); - if( pThis->eLock>SQLITE_LOCK_SHARED ){ - assert( p->nWrLock==1 ); + } else { + assert(eLock == SQLITE_LOCK_NONE); + if (pThis->eLock > SQLITE_LOCK_SHARED) { + assert(p->nWrLock == 1); p->nWrLock = 0; } - assert( p->nRdLock>0 ); + assert(p->nRdLock > 0); p->nRdLock--; } - if( rc==SQLITE_OK ) pThis->eLock = eLock; + if (rc == SQLITE_OK) + pThis->eLock = eLock; memdbLeave(p); return rc; } @@ -50189,24 +49471,23 @@ static int memdbCheckReservedLock(sqlite3_file *pFile, int *pResOut){ } #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; +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 ){ + 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 ){ + if (op == SQLITE_FCNTL_SIZE_LIMIT) { sqlite3_int64 iLimit = *(sqlite3_int64*)pArg; - if( iLimitsz ){ - if( iLimit<0 ){ + if (iLimit < p->sz) { + if (iLimit < 0) { iLimit = p->szMax; - }else{ + } else { iLimit = p->sz; } } @@ -50218,7 +49499,7 @@ static int memdbFileControl(sqlite3_file *pFile, int op, void *pArg){ return rc; } -#if 0 /* Not used because of SQLITE_IOCAP_POWERSAFE_OVERWRITE */ +#if 0 /* Not used because of SQLITE_IOCAP_POWERSAFE_OVERWRITE */ /* ** Return the sector-size in bytes for an memdb-file. */ @@ -50230,26 +49511,18 @@ static int memdbSectorSize(sqlite3_file *pFile){ /* ** Return the device characteristic flags supported by an memdb-file. */ -static int memdbDeviceCharacteristics(sqlite3_file *pFile){ +static int memdbDeviceCharacteristics(sqlite3_file* pFile) { UNUSED_PARAMETER(pFile); - return SQLITE_IOCAP_ATOMIC | - SQLITE_IOCAP_POWERSAFE_OVERWRITE | - SQLITE_IOCAP_SAFE_APPEND | - SQLITE_IOCAP_SEQUENTIAL; + 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; +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 ){ + if (iOfst + iAmt > p->sz || (p->mFlags & SQLITE_DESERIALIZE_RESIZEABLE) != 0) { *pp = 0; - }else{ + } else { p->nMmap++; *pp = (void*)(p->aData + iOfst); } @@ -50258,8 +49531,8 @@ static int memdbFetch( } /* Release a memory-mapped page */ -static int memdbUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){ - MemStore *p = ((MemFile*)pFile)->pStore; +static int memdbUnfetch(sqlite3_file* pFile, sqlite3_int64 iOfst, void* pPage) { + MemStore* p = ((MemFile*)pFile)->pStore; UNUSED_PARAMETER(iOfst); UNUSED_PARAMETER(pPage); memdbEnter(p); @@ -50271,42 +49544,35 @@ static int memdbUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){ /* ** 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; +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]=='/' ){ + if (szName > 1 && zName[0] == '/') { int i; #ifndef SQLITE_MUTEX_OMIT - sqlite3_mutex *pVfsMutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1); + sqlite3_mutex* pVfsMutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1); #endif sqlite3_mutex_enter(pVfsMutex); - for(i=0; izFName,zName)==0 ){ + for (i = 0; i < memdb_g.nMemStore; i++) { + if (strcmp(memdb_g.apMemStore[i]->zFName, zName) == 0) { p = memdb_g.apMemStore[i]; break; } } - if( p==0 ){ - MemStore **apNew; - p = sqlite3Malloc( sizeof(*p) + szName + 3 ); - if( p==0 ){ + 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 ){ + 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; @@ -50314,12 +49580,12 @@ static int memdbOpen( apNew[memdb_g.nMemStore++] = p; memdb_g.apMemStore = apNew; memset(p, 0, sizeof(*p)); - p->mFlags = SQLITE_DESERIALIZE_RESIZEABLE|SQLITE_DESERIALIZE_FREEONCLOSE; + p->mFlags = SQLITE_DESERIALIZE_RESIZEABLE | SQLITE_DESERIALIZE_FREEONCLOSE; p->szMax = sqlite3GlobalConfig.mxMemdbSize; p->zFName = (char*)&p[1]; - memcpy(p->zFName, zName, szName+1); + memcpy(p->zFName, zName, szName + 1); p->pMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); - if( p->pMutex==0 ){ + if (p->pMutex == 0) { memdb_g.nMemStore--; sqlite3_free(p); sqlite3_mutex_leave(pVfsMutex); @@ -50327,14 +49593,14 @@ static int memdbOpen( } p->nRef = 1; memdbEnter(p); - }else{ + } else { memdbEnter(p); p->nRef++; } sqlite3_mutex_leave(pVfsMutex); - }else{ - p = sqlite3Malloc( sizeof(*p) ); - if( p==0 ){ + } else { + p = sqlite3Malloc(sizeof(*p)); + if (p == 0) { return SQLITE_NOMEM; } memset(p, 0, sizeof(*p)); @@ -50342,7 +49608,7 @@ static int memdbOpen( p->szMax = sqlite3GlobalConfig.mxMemdbSize; } pFile->pStore = p; - if( pOutFlags!=0 ){ + if (pOutFlags != 0) { *pOutFlags = flags | SQLITE_OPEN_MEMORY; } pFd->pMethods = &memdb_io_methods; @@ -50350,7 +49616,7 @@ static int memdbOpen( return SQLITE_OK; } -#if 0 /* Only used to delete rollback journals, super-journals, and WAL +#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, @@ -50368,12 +49634,7 @@ static int memdbDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ ** ** 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 -){ +static int memdbAccess(sqlite3_vfs* pVfs, const char* zPath, int flags, int* pResOut) { UNUSED_PARAMETER(pVfs); UNUSED_PARAMETER(zPath); UNUSED_PARAMETER(flags); @@ -50386,12 +49647,7 @@ static int memdbAccess( ** 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 -){ +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; @@ -50400,7 +49656,7 @@ static int memdbFullPathname( /* ** Open the dynamic library located at zPath and return a handle. */ -static void *memdbDlOpen(sqlite3_vfs *pVfs, const char *zPath){ +static void* memdbDlOpen(sqlite3_vfs* pVfs, const char* zPath) { return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath); } @@ -50409,21 +49665,21 @@ static void *memdbDlOpen(sqlite3_vfs *pVfs, const char *zPath){ ** utf-8 string describing the most recent error encountered associated ** with dynamic libraries. */ -static void memdbDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){ +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){ +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){ +static void memdbDlClose(sqlite3_vfs* pVfs, void* pHandle) { ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle); } @@ -50431,7 +49687,7 @@ static void memdbDlClose(sqlite3_vfs *pVfs, void *pHandle){ ** Populate the buffer pointed to by zBufOut with nByte bytes of ** random data. */ -static int memdbRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ +static int memdbRandomness(sqlite3_vfs* pVfs, int nByte, char* zBufOut) { return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut); } @@ -50439,11 +49695,11 @@ static int memdbRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ ** Sleep for nMicro microseconds. Return the number of microseconds ** actually slept. */ -static int memdbSleep(sqlite3_vfs *pVfs, int nMicro){ +static int memdbSleep(sqlite3_vfs* pVfs, int nMicro) { return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro); } -#if 0 /* Never used. Modern cores only call xCurrentTimeInt64() */ +#if 0 /* Never used. Modern cores only call xCurrentTimeInt64() */ /* ** Return the current time as a Julian Day number in *pTimeOut. */ @@ -50452,10 +49708,10 @@ static int memdbCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){ } #endif -static int memdbGetLastError(sqlite3_vfs *pVfs, int a, char *b){ +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){ +static int memdbCurrentTimeInt64(sqlite3_vfs* pVfs, sqlite3_int64* p) { return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p); } @@ -50463,15 +49719,18 @@ static int memdbCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *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; +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; + if (rc) + return 0; + if (p->base.pMethods != &memdb_io_methods) + return 0; pStore = p->pStore; memdbEnter(pStore); - if( pStore->zFName!=0 ) p = 0; + if (pStore->zFName != 0) + p = 0; memdbLeave(pStore); return p; } @@ -50479,74 +49738,81 @@ static MemFile *memdbFromDbSchema(sqlite3 *db, const char *zSchema){ /* ** 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; +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; + Btree* pBt; sqlite3_int64 sz; int szPage = 0; - sqlite3_stmt *pStmt = 0; - unsigned char *pOut; - char *zSql; + sqlite3_stmt* pStmt = 0; + unsigned char* pOut; + char* zSql; int rc; #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ){ + if (!sqlite3SafetyCheckOk(db)) { (void)SQLITE_MISUSE_BKPT; return 0; } #endif - if( zSchema==0 ) zSchema = db->aDb[0].zDbSName; + 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 ){ + 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); + } 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; + 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; + if (rc) + return 0; rc = sqlite3_step(pStmt); - if( rc!=SQLITE_ROW ){ + if (rc != SQLITE_ROW) { pOut = 0; - }else{ - sz = sqlite3_column_int64(pStmt, 0)*szPage; - if( piSize ) *piSize = sz; - if( mFlags & SQLITE_SERIALIZE_NOCOPY ){ + } 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 ){ + } else { + pOut = sqlite3_malloc64(sz); + if (pOut) { int nPage = sqlite3_column_int(pStmt, 0); - Pager *pPager = sqlite3BtreePager(pBt); + Pager* pPager = sqlite3BtreePager(pBt); int pgno; - for(pgno=1; pgno<=nPage; pgno++){ - DbPage *pPage = 0; - unsigned char *pTo = pOut + szPage*(sqlite3_int64)(pgno-1); + 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 ){ + if (rc == SQLITE_OK) { memcpy(pTo, sqlite3PagerGetData(pPage), szPage); - }else{ + } else { memset(pTo, 0, szPage); } sqlite3PagerUnref(pPage); @@ -50559,64 +49825,67 @@ SQLITE_API unsigned char *sqlite3_serialize( } /* 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; + */ +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) ){ + if (!sqlite3SafetyCheckOk(db)) { return SQLITE_MISUSE_BKPT; } - if( szDb<0 ) return SQLITE_MISUSE_BKPT; - if( szBuf<0 ) 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; + if (zSchema == 0) + zSchema = db->aDb[0].zDbSName; iDb = sqlite3FindDbName(db, zSchema); - testcase( iDb==1 ); - if( iDb<2 && iDb!=0 ){ + 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 ){ + if (zSql == 0) { rc = SQLITE_NOMEM; - }else{ + } else { rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); sqlite3_free(zSql); } - if( rc ) goto end_deserialize; + 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 ){ + if (rc != SQLITE_DONE) { rc = SQLITE_ERROR; goto end_deserialize; } p = memdbFromDbSchema(db, zSchema); - if( p==0 ){ + if (p == 0) { rc = SQLITE_ERROR; - }else{ - MemStore *pStore = p->pStore; + } 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->szMax = sqlite3GlobalConfig.mxMemdbSize; } pStore->mFlags = mFlags; @@ -50625,7 +49894,7 @@ SQLITE_API int sqlite3_deserialize( end_deserialize: sqlite3_finalize(pStmt); - if( pData && (mFlags & SQLITE_DESERIALIZE_FREEONCLOSE)!=0 ){ + if (pData && (mFlags & SQLITE_DESERIALIZE_FREEONCLOSE) != 0) { sqlite3_free(pData); } sqlite3_mutex_leave(db->mutex); @@ -50636,17 +49905,19 @@ SQLITE_API int sqlite3_deserialize( ** 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); +SQLITE_PRIVATE int sqlite3MemdbInit(void) { + sqlite3_vfs* pLower = sqlite3_vfs_find(0); unsigned int sz; - if( NEVER(pLower==0) ) return SQLITE_ERROR; + 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( sz=0 for apSub element. */ - /* Max iDivisor is max(u32) / BITVEC_NPTR + 1. */ - /* For a BITVEC_SZ of 512, this would be 34,359,739. */ + 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 */ + BITVEC_TELEM aBitmap[BITVEC_NELEM]; /* Bitmap representation */ + u32 aHash[BITVEC_NINT]; /* Hash table representation */ + Bitvec* apSub[BITVEC_NPTR]; /* Recursive representation */ } u; }; @@ -50768,11 +50037,11 @@ struct Bitvec { ** 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 ){ +SQLITE_PRIVATE Bitvec* sqlite3BitvecCreate(u32 iSize) { + Bitvec* p; + assert(sizeof(*p) == BITVEC_SZ); + p = sqlite3MallocZero(sizeof(*p)); + if (p) { p->iSize = iSize; } return p; @@ -50783,31 +50052,33 @@ SQLITE_PRIVATE Bitvec *sqlite3BitvecCreate(u32 iSize){ ** 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 ); +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; + 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{ + 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; + 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); +SQLITE_PRIVATE int sqlite3BitvecTest(Bitvec* p, u32 i) { + return p != 0 && sqlite3BitvecTestNotNull(p, i); } /* @@ -50822,31 +50093,33 @@ SQLITE_PRIVATE int sqlite3BitvecTest(Bitvec *p, u32 i){ ** 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){ +SQLITE_PRIVATE int sqlite3BitvecSet(Bitvec* p, u32 i) { u32 h; - if( p==0 ) return SQLITE_OK; - assert( i>0 ); - assert( i<=p->iSize ); + 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; + 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)); + 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)) { + if (!p->u.aHash[h]) { + if (p->nSet < (BITVEC_NINT - 1)) { goto bitvec_set_end; } else { goto bitvec_set_rehash; @@ -50855,27 +50128,30 @@ SQLITE_PRIVATE int sqlite3BitvecSet(Bitvec *p, u32 i){ /* 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; + if (p->u.aHash[h] == i) + return SQLITE_OK; h++; - if( h>=BITVEC_NINT ) h = 0; - } while( p->u.aHash[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 ){ + if (p->nSet >= BITVEC_MXHASH) { unsigned int j; int rc; - u32 *aiValues = sqlite3StackAllocRaw(0, sizeof(p->u.aHash)); - if( aiValues==0 ){ + u32* aiValues = sqlite3StackAllocRaw(0, sizeof(p->u.aHash)); + if (aiValues == 0) { return SQLITE_NOMEM_BKPT; - }else{ + } 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; + p->iDivisor = (p->iSize + BITVEC_NPTR - 1) / BITVEC_NPTR; rc = sqlite3BitvecSet(p, i); - for(j=0; j0 ); +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; + 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{ + if (p->iSize <= BITVEC_NBIT) { + p->u.aBitmap[i / BITVEC_SZELEM] &= ~(1 << (i & (BITVEC_SZELEM - 1))); + } else { unsigned int j; - u32 *aiValues = pBuf; + 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] ){ + while (p->u.aHash[h]) { h++; - if( h>=BITVEC_NINT ) h = 0; + if (h >= BITVEC_NINT) + h = 0; } p->u.aHash[h] = aiValues[j]; } @@ -50930,11 +50208,12 @@ SQLITE_PRIVATE void sqlite3BitvecClear(Bitvec *p, u32 i, void *pBuf){ /* ** Destroy a bitmap object. Reclaim all memory used. */ -SQLITE_PRIVATE void sqlite3BitvecDestroy(Bitvec *p){ - if( p==0 ) return; - if( p->iDivisor ){ +SQLITE_PRIVATE void sqlite3BitvecDestroy(Bitvec* p) { + if (p == 0) + return; + if (p->iDivisor) { unsigned int i; - for(i=0; iu.apSub[i]); } } @@ -50945,7 +50224,7 @@ SQLITE_PRIVATE void sqlite3BitvecDestroy(Bitvec *p){ ** Return the value of the iSize parameter specified when Bitvec *p ** was created. */ -SQLITE_PRIVATE u32 sqlite3BitvecSize(Bitvec *p){ +SQLITE_PRIVATE u32 sqlite3BitvecSize(Bitvec* p) { return p->iSize; } @@ -50956,9 +50235,9 @@ SQLITE_PRIVATE u32 sqlite3BitvecSize(Bitvec *p){ ** Then the following macros can be used to set, clear, or test ** individual bits within V. */ -#define SETBIT(V,I) V[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 +#define SETBIT(V, I) V[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. @@ -50990,19 +50269,20 @@ SQLITE_PRIVATE u32 sqlite3BitvecSize(Bitvec *p){ ** ** If a memory allocation error occurs, return -1. */ -SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){ - Bitvec *pBitvec = 0; - unsigned char *pV = 0; +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; + 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 ); + pBitvec = sqlite3BitvecCreate(sz); + pV = sqlite3MallocZero((sz + 7) / 8 + 1); pTmpSpace = sqlite3_malloc64(BITVEC_SZ); - if( pBitvec==0 || pV==0 || pTmpSpace==0 ) goto bitvec_end; + if (pBitvec == 0 || pV == 0 || pTmpSpace == 0) + goto bitvec_end; /* NULL pBitvec tests */ sqlite3BitvecSet(0, 1); @@ -51010,14 +50290,14 @@ SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){ /* Run the program */ pc = i = 0; - while( (op = aOp[pc])!=0 ){ - switch( op ){ + 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]; + i = aOp[pc + 2] - 1; + aOp[pc + 2] += aOp[pc + 3]; break; } case 3: @@ -51028,17 +50308,19 @@ SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){ break; } } - if( (--aOp[pc+1]) > 0 ) nx = 0; + 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; + 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); + } else { + CLEARBIT(pV, (i + 1)); + sqlite3BitvecClear(pBitvec, i + 1, pTmpSpace); } } @@ -51047,11 +50329,9 @@ SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){ ** 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 = 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; } @@ -51109,18 +50389,18 @@ SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){ ** 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 */ + 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 **********************/ @@ -51133,36 +50413,44 @@ struct PCache { ** 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; +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); - } + 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) +} +#else +#define pcacheTrace(X) +#define pcacheDump(X) #endif /* @@ -51175,20 +50463,20 @@ struct PCache { ** 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 */ +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 ); + 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 */ + 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: @@ -51211,13 +50499,12 @@ SQLITE_PRIVATE int sqlite3PcachePageSanity(PgHdr *pPg){ } #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 */ +#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 @@ -51225,53 +50512,51 @@ SQLITE_PRIVATE int sqlite3PcachePageSanity(PgHdr *pPg){ ** 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; +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 ); + 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 ){ + if (p->pSynced == pPage) { p->pSynced = pPage->pDirtyPrev; } - if( pPage->pDirtyNext ){ + if (pPage->pDirtyNext) { pPage->pDirtyNext->pDirtyPrev = pPage->pDirtyPrev; - }else{ - assert( pPage==p->pDirtyTail ); + } else { + assert(pPage == p->pDirtyTail); p->pDirtyTail = pPage->pDirtyPrev; } - if( pPage->pDirtyPrev ){ + if (pPage->pDirtyPrev) { pPage->pDirtyPrev->pDirtyNext = pPage->pDirtyNext; - }else{ + } 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 ); + 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 ); + 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 ){ + if (addRemove & PCACHE_DIRTYLIST_ADD) { pPage->pDirtyPrev = 0; pPage->pDirtyNext = p->pDirty; - if( pPage->pDirtyNext ){ - assert( pPage->pDirtyNext->pDirtyPrev==0 ); + if (pPage->pDirtyNext) { + assert(pPage->pDirtyNext->pDirtyPrev == 0); pPage->pDirtyNext->pDirtyPrev = pPage; - }else{ + } else { p->pDirtyTail = pPage; - if( p->bPurgeable ){ - assert( p->eCreate==2 ); + if (p->bPurgeable) { + assert(p->eCreate == 2); p->eCreate = 1; } } @@ -51282,9 +50567,8 @@ static void pcacheManageDirtyList(PgHdr *pPage, u8 addRemove){ ** 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*/ - ){ + if (!p->pSynced && 0 == (pPage->flags & PGHDR_NEED_SYNC) /*OPTIMIZATION-IF-FALSE*/ + ) { p->pSynced = pPage; } } @@ -51295,8 +50579,8 @@ static void pcacheManageDirtyList(PgHdr *pPage, u8 addRemove){ ** 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 ){ +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); @@ -51307,19 +50591,20 @@ static void pcacheUnpin(PgHdr *p){ ** 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 ){ +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{ + } 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; + n = ((-1024 * (i64)p->szCache) / (p->szPage + p->szExtra)); + if (n > 1000000000) + n = 1000000000; return (int)n; } } @@ -51329,18 +50614,18 @@ static int numberOfCachePages(PCache *p){ ** Initialize and shutdown the page cache subsystem. Neither of these ** functions are threadsafe. */ -SQLITE_PRIVATE int sqlite3PcacheInitialize(void){ - if( sqlite3GlobalConfig.pcache2.xInit==0 ){ +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 ); + assert(sqlite3GlobalConfig.pcache2.xInit != 0); } return sqlite3GlobalConfig.pcache2.xInit(sqlite3GlobalConfig.pcache2.pArg); } -SQLITE_PRIVATE void sqlite3PcacheShutdown(void){ - if( sqlite3GlobalConfig.pcache2.xShutdown ){ +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); } @@ -51349,7 +50634,9 @@ SQLITE_PRIVATE void sqlite3PcacheShutdown(void){ /* ** Return the size in bytes of a PCache object. */ -SQLITE_PRIVATE int sqlite3PcacheSize(void){ return sizeof(PCache); } +SQLITE_PRIVATE int sqlite3PcacheSize(void) { + return sizeof(PCache); +} /* ** Create a new PCache object. Storage space to hold the object @@ -51363,25 +50650,24 @@ SQLITE_PRIVATE int sqlite3PcacheSize(void){ return sizeof(PCache); } ** 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 */ -){ +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 */ + 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)); + pcacheTrace(("%p.OPEN szPage %d bPurgeable %d\n", p, szPage, bPurgeable)); return sqlite3PcacheSetPageSize(p, szPage); } @@ -51389,22 +50675,20 @@ SQLITE_PRIVATE int sqlite3PcacheOpen( ** 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; +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 ){ + if (pCache->pCache) { sqlite3GlobalConfig.pcache2.xDestroy(pCache->pCache); } pCache->pCache = pNew; pCache->szPage = szPage; - pcacheTrace(("%p.PAGESIZE %d\n",pCache,szPage)); + pcacheTrace(("%p.PAGESIZE %d\n", pCache, szPage)); } return SQLITE_OK; } @@ -51433,18 +50717,17 @@ SQLITE_PRIVATE int sqlite3PcacheSetPageSize(PCache *pCache, int szPage){ ** 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 */ -){ +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; + 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) ); + 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) @@ -51454,12 +50737,11 @@ SQLITE_PRIVATE sqlite3_pcache_page *sqlite3PcacheFetch( ** (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) ); + 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)); + pcacheTrace(("%p.FETCH %d%s (result: %p)\n", pCache, pgno, createFlag ? " create" : "", pRes)); return pRes; } @@ -51474,15 +50756,15 @@ SQLITE_PRIVATE sqlite3_pcache_page *sqlite3PcacheFetch( ** ** 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; +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 ){ + 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 @@ -51492,33 +50774,29 @@ SQLITE_PRIVATE int sqlite3PcacheFetchStress( ** 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 - ); + 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) { + for (pPg = pCache->pDirtyTail; pPg && pPg->nRef; pPg = pPg->pDirtyPrev) + ; } - if( pPg ){ + 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)); + 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)); + pcacheTrace(("%p.SPILL %d\n", pCache, pPg->pgno)); rc = pCache->xStress(pCache->pStress, pPg); pcacheDump(pCache); - if( rc!=SQLITE_OK && rc!=SQLITE_BUSY ){ + 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; + return *ppPage == 0 ? SQLITE_NOMEM_BKPT : SQLITE_OK; } /* @@ -51530,24 +50808,23 @@ SQLITE_PRIVATE int sqlite3PcacheFetchStress( ** 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 ); +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)); + 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]; + 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); + return sqlite3PcacheFetchFinish(pCache, pgno, pPage); } /* @@ -51556,22 +50833,21 @@ static SQLITE_NOINLINE PgHdr *pcacheFetchFinishWithInit( ** 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; +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; + assert(pPage != 0); + pPgHdr = (PgHdr*)pPage->pExtra; - if( !pPgHdr->pPage ){ + if (!pPgHdr->pPage) { return pcacheFetchFinishWithInit(pCache, pgno, pPage); } pCache->nRefSum++; pPgHdr->nRef++; - assert( sqlite3PcachePageSanity(pPgHdr) ); + assert(sqlite3PcachePageSanity(pPgHdr)); return pPgHdr; } @@ -51579,13 +50855,13 @@ SQLITE_PRIVATE PgHdr *sqlite3PcacheFetchFinish( ** 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 ); +SQLITE_PRIVATE void SQLITE_NOINLINE sqlite3PcacheRelease(PgHdr* p) { + assert(p->nRef > 0); p->pCache->nRefSum--; - if( (--p->nRef)==0 ){ - if( p->flags&PGHDR_CLEAN ){ + if ((--p->nRef) == 0) { + if (p->flags & PGHDR_CLEAN) { pcacheUnpin(p); - }else{ + } else { pcacheManageDirtyList(p, PCACHE_DIRTYLIST_FRONT); } } @@ -51594,9 +50870,9 @@ SQLITE_PRIVATE void SQLITE_NOINLINE sqlite3PcacheRelease(PgHdr *p){ /* ** Increase the reference count of a supplied page by 1. */ -SQLITE_PRIVATE void sqlite3PcacheRef(PgHdr *p){ - assert(p->nRef>0); - assert( sqlite3PcachePageSanity(p) ); +SQLITE_PRIVATE void sqlite3PcacheRef(PgHdr* p) { + assert(p->nRef > 0); + assert(sqlite3PcachePageSanity(p)); p->nRef++; p->pCache->nRefSum++; } @@ -51606,10 +50882,10 @@ SQLITE_PRIVATE void sqlite3PcacheRef(PgHdr *p){ ** 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 ){ +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--; @@ -51620,18 +50896,18 @@ SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr *p){ ** 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*/ +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 ); + 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) ); + assert(sqlite3PcachePageSanity(p)); } } @@ -51639,16 +50915,16 @@ SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr *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 ); +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_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 ){ + pcacheTrace(("%p.CLEAN %d\n", p->pCache, p->pgno)); + assert(sqlite3PcachePageSanity(p)); + if (p->nRef == 0) { pcacheUnpin(p); } } @@ -51656,10 +50932,10 @@ SQLITE_PRIVATE void sqlite3PcacheMakeClean(PgHdr *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 ){ +SQLITE_PRIVATE void sqlite3PcacheCleanAll(PCache* pCache) { + PgHdr* p; + pcacheTrace(("%p.CLEAN-ALL\n", pCache)); + while ((p = pCache->pDirty) != 0) { sqlite3PcacheMakeClean(p); } } @@ -51667,11 +50943,11 @@ SQLITE_PRIVATE void sqlite3PcacheCleanAll(PCache *pCache){ /* ** 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); +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; } @@ -51679,9 +50955,9 @@ SQLITE_PRIVATE void sqlite3PcacheClearWritable(PCache *pCache){ /* ** 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){ +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; @@ -51690,26 +50966,26 @@ SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *pCache){ /* ** Change the page number of page p to newPgno. */ -SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr *p, Pgno newPgno){ - PCache *pCache = p->pCache; - sqlite3_pcache_page *pOther; - assert( p->nRef>0 ); - assert( newPgno>0 ); - assert( sqlite3PcachePageSanity(p) ); - pcacheTrace(("%p.MOVE %d -> %d\n",pCache,p->pgno,newPgno)); +SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr* p, Pgno newPgno) { + PCache* pCache = p->pCache; + sqlite3_pcache_page* pOther; + assert(p->nRef > 0); + assert(newPgno > 0); + assert(sqlite3PcachePageSanity(p)); + pcacheTrace(("%p.MOVE %d -> %d\n", pCache, p->pgno, newPgno)); pOther = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, newPgno, 0); - if( pOther ){ - PgHdr *pXPage = (PgHdr*)pOther->pExtra; - assert( pXPage->nRef==0 ); + if (pOther) { + PgHdr* pXPage = (PgHdr*)pOther->pExtra; + assert(pXPage->nRef == 0); pXPage->nRef++; pCache->nRefSum++; sqlite3PcacheDrop(pXPage); } - sqlite3GlobalConfig.pcache2.xRekey(pCache->pCache, p->pPage, 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) ){ + if ((p->flags & PGHDR_DIRTY) && (p->flags & PGHDR_NEED_SYNC)) { pcacheManageDirtyList(p, PCACHE_DIRTYLIST_FRONT); - assert( sqlite3PcachePageSanity(p) ); + assert(sqlite3PcachePageSanity(p)); } } @@ -51722,49 +50998,49 @@ SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr *p, Pgno newPgno){ ** 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){ +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 ); + 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 */ + 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); + 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)); +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){ +SQLITE_PRIVATE void sqlite3PcacheClear(PCache* pCache) { sqlite3PcacheTruncate(pCache, 0); } @@ -51772,24 +51048,24 @@ SQLITE_PRIVATE void sqlite3PcacheClear(PCache *pCache){ ** 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){ +static PgHdr* pcacheMergeDirtyList(PgHdr* pA, PgHdr* pB) { PgHdr result, *pTail; pTail = &result; - assert( pA!=0 && pB!=0 ); - for(;;){ - if( pA->pgnopgno ){ + assert(pA != 0 && pB != 0); + for (;;) { + if (pA->pgno < pB->pgno) { pTail->pDirty = pA; pTail = pA; pA = pA->pDirty; - if( pA==0 ){ + if (pA == 0) { pTail->pDirty = pB; break; } - }else{ + } else { pTail->pDirty = pB; pTail = pB; pB = pB->pDirty; - if( pB==0 ){ + if (pB == 0) { pTail->pDirty = pA; break; } @@ -51808,25 +51084,25 @@ static PgHdr *pcacheMergeDirtyList(PgHdr *pA, PgHdr *pB){ ** 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){ +#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 ){ + while (pIn) { p = pIn; pIn = p->pDirty; p->pDirty = 0; - for(i=0; ALWAYS(ipDirty; p; p=p->pDirtyNext){ +SQLITE_PRIVATE PgHdr* sqlite3PcacheDirtyList(PCache* pCache) { + PgHdr* p; + for (p = pCache->pDirty; p; p = p->pDirtyNext) { p->pDirty = p->pDirtyNext; } return pcacheSortDirtyList(pCache->pDirty); @@ -51858,22 +51135,22 @@ SQLITE_PRIVATE PgHdr *sqlite3PcacheDirtyList(PCache *pCache){ ** 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){ +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){ +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 ); +SQLITE_PRIVATE int sqlite3PcachePagecount(PCache* pCache) { + assert(pCache->pCache != 0); return sqlite3GlobalConfig.pcache2.xPagecount(pCache->pCache); } @@ -51881,7 +51158,7 @@ SQLITE_PRIVATE int sqlite3PcachePagecount(PCache *pCache){ /* ** Get the suggested cache-size value. */ -SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *pCache){ +SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache* pCache) { return numberOfCachePages(pCache); } #endif @@ -51889,11 +51166,10 @@ SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *pCache){ /* ** Set the suggested cache-size value. */ -SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache *pCache, int mxPage){ - assert( pCache->pCache!=0 ); +SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache* pCache, int mxPage) { + assert(pCache->pCache != 0); pCache->szCache = mxPage; - sqlite3GlobalConfig.pcache2.xCachesize(pCache->pCache, - numberOfCachePages(pCache)); + sqlite3GlobalConfig.pcache2.xCachesize(pCache->pCache, numberOfCachePages(pCache)); } /* @@ -51901,25 +51177,26 @@ SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache *pCache, int mxPage){ ** 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){ +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)); + 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; + if (res < p->szSpill) + 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 ); +SQLITE_PRIVATE void sqlite3PcacheShrink(PCache* pCache) { + assert(pCache->pCache != 0); sqlite3GlobalConfig.pcache2.xShrink(pCache->pCache); } @@ -51927,17 +51204,20 @@ SQLITE_PRIVATE void sqlite3PcacheShrink(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)); } +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; +SQLITE_PRIVATE int sqlite3PCachePercentDirty(PCache* pCache) { + PgHdr* pDirty; int nDirty = 0; int nCache = numberOfCachePages(pCache); - for(pDirty=pCache->pDirty; pDirty; pDirty=pDirty->pDirtyNext) nDirty++; + for (pDirty = pCache->pDirty; pDirty; pDirty = pDirty->pDirtyNext) + nDirty++; return nCache ? (int)(((i64)nDirty * 100) / nCache) : 0; } @@ -51945,8 +51225,8 @@ SQLITE_PRIVATE int sqlite3PCachePercentDirty(PCache *pCache){ /* ** 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); +SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache* pCache) { + return (pCache->pDirty != 0); } #endif @@ -51956,9 +51236,9 @@ SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache){ ** 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){ +SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache* pCache, void (*xIter)(PgHdr*)) { + PgHdr* pDirty; + for (pDirty = pCache->pDirty; pDirty; pDirty = pDirty->pDirtyNext) { xIter(pDirty); } } @@ -52072,23 +51352,23 @@ typedef struct PGroup PGroup; ** 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 */ + 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) +#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 @@ -52113,12 +51393,12 @@ struct PgHdr1 { ** 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 */ + 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 @@ -52136,27 +51416,27 @@ struct PCache1 { ** 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*/ + 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 */ + 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 */ }; /* @@ -52164,36 +51444,36 @@ struct PCache1 { ** buffer provided using the SQLITE_CONFIG_PAGECACHE mechanism. */ struct PgFreeslot { - PgFreeslot *pNext; /* Next free slot */ + PgFreeslot* pNext; /* Next free slot */ }; /* ** Global data used by this cache. */ static SQLITE_WSD struct PCacheGlobal { - PGroup grp; /* The global PGroup for mode (2) */ + 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 */ + 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 */ + 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 */ + int bUnderPressure; /* True if low on PAGECACHE memory */ } pcache1_g; /* @@ -52206,20 +51486,19 @@ static SQLITE_WSD struct PCacheGlobal { /* ** 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 +#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 +#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 @@ -52229,19 +51508,21 @@ static SQLITE_WSD struct PCacheGlobal { ** 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; +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.nReserve = n > 90 ? 10 : (n / 10 + 1); pcache1.pStart = pBuf; pcache1.pFree = 0; pcache1.bUnderPressure = 0; - while( n-- ){ + while (n--) { p = (PgFreeslot*)pBuf; p->pNext = pcache1.pFree; pcache1.pFree = p; @@ -52255,38 +51536,40 @@ SQLITE_PRIVATE void sqlite3PCacheBufferSetup(void *pBuf, int sz, int n){ ** 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){ +static int pcache1InitBulk(PCache1* pCache) { i64 szBulk; - char *zBulk; - if( pcache1.nInitPage==0 ) return 0; + 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; + if (pCache->nMax < 3) + return 0; sqlite3BeginBenignMalloc(); - if( pcache1.nInitPage>0 ){ + if (pcache1.nInitPage > 0) { szBulk = pCache->szAlloc * (i64)pcache1.nInitPage; - }else{ + } else { szBulk = -1024 * (i64)pcache1.nInitPage; } - if( szBulk > pCache->szAlloc*(i64)pCache->nMax ){ - szBulk = pCache->szAlloc*(i64)pCache->nMax; + if (szBulk > pCache->szAlloc * (i64)pCache->nMax) { + szBulk = pCache->szAlloc * (i64)pCache->nMax; } - zBulk = pCache->pBulk = sqlite3Malloc( szBulk ); + zBulk = pCache->pBulk = sqlite3Malloc(szBulk); sqlite3EndBenignMalloc(); - if( zBulk ){ - int nBulk = sqlite3MallocSize(zBulk)/pCache->szAlloc; - do{ - PgHdr1 *pX = (PgHdr1*)&zBulk[pCache->szPage]; + 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 */ + pX->pLruPrev = 0; /* Initializing this saves a valgrind error */ pCache->pFree = pX; zBulk += pCache->szAlloc; - }while( --nBulk ); + } while (--nBulk); } - return pCache->pFree!=0; + return pCache->pFree != 0; } /* @@ -52298,29 +51581,29 @@ static int pcache1InitBulk(PCache1 *pCache){ ** 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 ){ +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 ){ + p = (PgHdr1*)pcache1.pFree; + if (p) { pcache1.pFree = pcache1.pFree->pNext; pcache1.nFreeSlot--; - pcache1.bUnderPressure = pcache1.nFreeSlot=0 ); + pcache1.bUnderPressure = pcache1.nFreeSlot < pcache1.nReserve; + assert(pcache1.nFreeSlot >= 0); sqlite3StatusHighwater(SQLITE_STATUS_PAGECACHE_SIZE, nByte); sqlite3StatusUp(SQLITE_STATUS_PAGECACHE_USED, 1); } sqlite3_mutex_leave(pcache1.mutex); } - if( p==0 ){ + 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 ){ + if (p) { int sz = sqlite3MallocSize(p); sqlite3_mutex_enter(pcache1.mutex); sqlite3StatusHighwater(SQLITE_STATUS_PAGECACHE_SIZE, nByte); @@ -52336,21 +51619,22 @@ static void *pcache1Alloc(int nByte){ /* ** 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; +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 && p= pcache1.pStart && p < pcache1.pEnd) { return pcache1.szSlot; - }else{ + } else { int iSize; - assert( sqlite3MemdebugHasType(p, MEMTYPE_PCACHE) ); + assert(sqlite3MemdebugHasType(p, MEMTYPE_PCACHE)); sqlite3MemdebugSetType(p, MEMTYPE_HEAP); iSize = sqlite3MallocSize(p); sqlite3MemdebugSetType(p, MEMTYPE_PCACHE); @@ -52386,30 +51670,32 @@ static int pcache1MemSize(void *p){ /* ** Allocate a new page object initially associated with cache pCache. */ -static PgHdr1 *pcache1AllocPage(PCache1 *pCache, int benignMalloc){ - PgHdr1 *p = 0; - void *pPg; +static PgHdr1* pcache1AllocPage(PCache1* pCache, int benignMalloc) { + PgHdr1* p = 0; + void* pPg; - assert( sqlite3_mutex_held(pCache->pGroup->mutex) ); - if( pCache->pFree || (pCache->nPage==0 && pcache1InitBulk(pCache)) ){ - assert( pCache->pFree!=0 ); + assert(sqlite3_mutex_held(pCache->pGroup->mutex)); + if (pCache->pFree || (pCache->nPage == 0 && pcache1InitBulk(pCache))) { + assert(pCache->pFree != 0); p = pCache->pFree; pCache->pFree = p->pNext; p->pNext = 0; - }else{ + } 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 ); + assert(pcache1.separateCache == 0); + assert(pCache->pGroup == &pcache1.grp); pcache1LeaveMutex(pCache->pGroup); #endif - if( benignMalloc ){ sqlite3BeginBenignMalloc(); } + if (benignMalloc) { + sqlite3BeginBenignMalloc(); + } #ifdef SQLITE_PCACHE_SEPARATE_HEADER pPg = pcache1Alloc(pCache->szPage); p = sqlite3Malloc(sizeof(PgHdr1) + pCache->szExtra); - if( !pPg || !p ){ + if (!pPg || !p) { pcache1Free(pPg); sqlite3_free(p); pPg = 0; @@ -52417,19 +51703,22 @@ static PgHdr1 *pcache1AllocPage(PCache1 *pCache, int benignMalloc){ #else pPg = pcache1Alloc(pCache->szAlloc); #endif - if( benignMalloc ){ sqlite3EndBenignMalloc(); } + if (benignMalloc) { + sqlite3EndBenignMalloc(); + } #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT pcache1EnterMutex(pCache->pGroup); #endif - if( pPg==0 ) return 0; + if (pPg == 0) + return 0; #ifndef SQLITE_PCACHE_SEPARATE_HEADER - p = (PgHdr1 *)&((u8 *)pPg)[pCache->szPage]; + 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 */ + p->pLruPrev = 0; /* Initializing this saves a valgrind error */ } (*pCache->pnPurgeable)++; return p; @@ -52438,15 +51727,15 @@ static PgHdr1 *pcache1AllocPage(PCache1 *pCache, int benignMalloc){ /* ** Free a page object allocated by pcache1AllocPage(). */ -static void pcache1FreePage(PgHdr1 *p){ - PCache1 *pCache; - assert( p!=0 ); +static void pcache1FreePage(PgHdr1* p) { + PCache1* pCache; + assert(p != 0); pCache = p->pCache; - assert( sqlite3_mutex_held(p->pCache->pGroup->mutex) ); - if( p->isBulkLocal ){ + assert(sqlite3_mutex_held(p->pCache->pGroup->mutex)); + if (p->isBulkLocal) { p->pNext = pCache->pFree; pCache->pFree = p; - }else{ + } else { pcache1Free(p->page.pBuf); #ifdef SQLITE_PCACHE_SEPARATE_HEADER sqlite3_free(p); @@ -52460,19 +51749,18 @@ static void pcache1FreePage(PgHdr1 *p){ ** 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 */ +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){ +SQLITE_PRIVATE void sqlite3PageFree(void* p) { pcache1Free(p); } - /* ** Return true if it desirable to avoid allocating a new page cache ** entry. @@ -52489,10 +51777,10 @@ SQLITE_PRIVATE void sqlite3PageFree(void *p){ ** 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 ){ +static int pcache1UnderMemoryPressure(PCache1* pCache) { + if (pcache1.nSlot && (pCache->szPage + pCache->szExtra) <= pcache1.szSlot) { return pcache1.bUnderPressure; - }else{ + } else { return sqlite3HeapNearlyFull(); } } @@ -52506,28 +51794,32 @@ static int pcache1UnderMemoryPressure(PCache1 *pCache){ ** ** The PCache mutex must be held when this function is called. */ -static void pcache1ResizeHash(PCache1 *p){ - PgHdr1 **apNew; +static void pcache1ResizeHash(PCache1* p) { + PgHdr1** apNew; unsigned int nNew; unsigned int i; - assert( sqlite3_mutex_held(p->pGroup->mutex) ); + assert(sqlite3_mutex_held(p->pGroup->mutex)); - nNew = p->nHash*2; - if( nNew<256 ){ + 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(); } + 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 ){ + if (apNew) { + for (i = 0; i < p->nHash; 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]; @@ -52547,24 +51839,23 @@ static void pcache1ResizeHash(PCache1 *p){ ** ** 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) ); +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 ); + 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. @@ -52572,37 +51863,37 @@ static PgHdr1 *pcache1PinPage(PgHdr1 *pPage){ ** ** The PGroup mutex must be held when this function is called. */ -static void pcache1RemoveFromHash(PgHdr1 *pPage, int freeFlag){ +static void pcache1RemoveFromHash(PgHdr1* pPage, int freeFlag) { unsigned int h; - PCache1 *pCache = pPage->pCache; - PgHdr1 **pp; + PCache1* pCache = pPage->pCache; + PgHdr1** pp; - assert( sqlite3_mutex_held(pCache->pGroup->mutex) ); + assert(sqlite3_mutex_held(pCache->pGroup->mutex)); h = pPage->iKey % pCache->nHash; - for(pp=&pCache->apHash[h]; (*pp)!=pPage; pp=&(*pp)->pNext); + for (pp = &pCache->apHash[h]; (*pp) != pPage; pp = &(*pp)->pNext) + ; *pp = (*pp)->pNext; pCache->nPage--; - if( freeFlag ) pcache1FreePage(pPage); + 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) ); +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 ){ + if (pCache->nPage == 0 && pCache->pBulk) { sqlite3_free(pCache->pBulk); pCache->pBulk = pCache->pFree = 0; } @@ -52615,49 +51906,50 @@ static void pcache1EnforceMaxPage(PCache1 *pCache){ ** ** 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 */ +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 ){ + 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{ + 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; + h = pCache->nHash / 2; iStop = h - 1; } - for(;;){ - PgHdr1 **pp; - PgHdr1 *pPage; - assert( hnHash ); + for (;;) { + PgHdr1** pp; + PgHdr1* pPage; + assert(h < pCache->nHash); pp = &pCache->apHash[h]; - while( (pPage = *pp)!=0 ){ - if( pPage->iKey>=iLimit ){ + while ((pPage = *pp) != 0) { + if (pPage->iKey >= iLimit) { pCache->nPage--; *pp = pPage->pNext; - if( PAGE_IS_UNPINNED(pPage) ) pcache1PinPage(pPage); + if (PAGE_IS_UNPINNED(pPage)) + pcache1PinPage(pPage); pcache1FreePage(pPage); - }else{ + } else { pp = &pPage->pNext; - TESTONLY( if( nPage>=0 ) nPage++; ) + TESTONLY(if (nPage >= 0) nPage++;) } } - if( h==iStop ) break; - h = (h+1) % pCache->nHash; + if (h == iStop) + break; + h = (h + 1) % pCache->nHash; } - assert( nPage<0 || pCache->nPage==(unsigned)nPage ); + assert(nPage < 0 || pCache->nPage == (unsigned)nPage); } /******************************************************************************/ @@ -52666,12 +51958,11 @@ static void pcache1TruncateUnsafe( /* ** Implementation of the sqlite3_pcache.xInit method. */ -static int pcache1Init(void *NotUsed){ +static int pcache1Init(void* NotUsed) { UNUSED_PARAMETER(NotUsed); - assert( pcache1.isInit==0 ); + 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 @@ -52689,24 +51980,20 @@ static int pcache1Init(void *NotUsed){ #if defined(SQLITE_ENABLE_MEMORY_MANAGEMENT) pcache1.separateCache = 0; #elif SQLITE_THREADSAFE - pcache1.separateCache = sqlite3GlobalConfig.pPage==0 - || sqlite3GlobalConfig.bCoreMutex>0; + pcache1.separateCache = sqlite3GlobalConfig.pPage == 0 || sqlite3GlobalConfig.bCoreMutex > 0; #else - pcache1.separateCache = sqlite3GlobalConfig.pPage==0; + pcache1.separateCache = sqlite3GlobalConfig.pPage == 0; #endif #if SQLITE_THREADSAFE - if( sqlite3GlobalConfig.bCoreMutex ){ + 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 - ){ + if (pcache1.separateCache && sqlite3GlobalConfig.nPage != 0 && sqlite3GlobalConfig.pPage == 0) { pcache1.nInitPage = sqlite3GlobalConfig.nPage; - }else{ + } else { pcache1.nInitPage = 0; } pcache1.grp.mxPinned = 10; @@ -52719,39 +52006,39 @@ static int pcache1Init(void *NotUsed){ ** Note that the static mutex allocated in xInit does ** not need to be freed. */ -static void pcache1Shutdown(void *NotUsed){ +static void pcache1Shutdown(void* NotUsed) { UNUSED_PARAMETER(NotUsed); - assert( pcache1.isInit!=0 ); + assert(pcache1.isInit != 0); memset(&pcache1, 0, sizeof(pcache1)); } /* forward declaration */ -static void pcache1Destroy(sqlite3_pcache *p); +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 */ +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 ); + 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 ){ + sz = sizeof(PCache1) + sizeof(PGroup) * pcache1.separateCache; + pCache = (PCache1*)sqlite3MallocZero(sz); + if (pCache) { + if (pcache1.separateCache) { pGroup = (PGroup*)&pCache[1]; pGroup->mxPinned = 10; - }else{ + } else { pGroup = &pcache1.grp; } pcache1EnterMutex(pGroup); - if( pGroup->lru.isAnchor==0 ){ + if (pGroup->lru.isAnchor == 0) { pGroup->lru.isAnchor = 1; pGroup->lru.pLruPrev = pGroup->lru.pLruNext = &pGroup->lru; } @@ -52761,21 +52048,21 @@ static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){ pCache->szAlloc = szPage + szExtra + ROUND8(sizeof(PgHdr1)); pCache->bPurgeable = (bPurgeable ? 1 : 0); pcache1ResizeHash(pCache); - if( bPurgeable ){ + if (bPurgeable) { pCache->nMin = 10; pGroup->nMinPage += pCache->nMin; pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage; pCache->pnPurgeable = &pGroup->nPurgeable; - }else{ + } else { pCache->pnPurgeable = &pCache->nPurgeableDummy; } pcache1LeaveMutex(pGroup); - if( pCache->nHash==0 ){ + if (pCache->nHash == 0) { pcache1Destroy((sqlite3_pcache*)pCache); pCache = 0; } } - return (sqlite3_pcache *)pCache; + return (sqlite3_pcache*)pCache; } /* @@ -52783,21 +52070,21 @@ static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){ ** ** Configure the cache_size limit for a cache. */ -static void pcache1Cachesize(sqlite3_pcache *p, int nMax){ - PCache1 *pCache = (PCache1 *)p; +static void pcache1Cachesize(sqlite3_pcache* p, int nMax) { + PCache1* pCache = (PCache1*)p; u32 n; - assert( nMax>=0 ); - if( pCache->bPurgeable ){ - PGroup *pGroup = pCache->pGroup; + assert(nMax >= 0); + if (pCache->bPurgeable) { + PGroup* pGroup = pCache->pGroup; pcache1EnterMutex(pGroup); n = (u32)nMax; - if( n > 0x7fff0000 - pGroup->nMaxPage + pCache->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; + pCache->n90pct = pCache->nMax * 9 / 10; pcache1EnforceMaxPage(pCache); pcache1LeaveMutex(pGroup); } @@ -52808,10 +52095,10 @@ static void pcache1Cachesize(sqlite3_pcache *p, int nMax){ ** ** Free up as much memory as possible. */ -static void pcache1Shrink(sqlite3_pcache *p){ - PCache1 *pCache = (PCache1*)p; - if( pCache->bPurgeable ){ - PGroup *pGroup = pCache->pGroup; +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; @@ -52825,16 +52112,15 @@ static void pcache1Shrink(sqlite3_pcache *p){ /* ** Implementation of the sqlite3_pcache.xPagecount method. */ -static int pcache1Pagecount(sqlite3_pcache *p){ +static int pcache1Pagecount(sqlite3_pcache* p) { int n; - PCache1 *pCache = (PCache1*)p; + 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. @@ -52843,46 +52129,38 @@ static int pcache1Pagecount(sqlite3_pcache *p){ ** 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 -){ +static SQLITE_NOINLINE PgHdr1* pcache1FetchStage2(PCache1* pCache, unsigned int iKey, int createFlag) { unsigned int nPinned; - PGroup *pGroup = pCache->pGroup; - PgHdr1 *pPage = 0; + 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 ); + 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->nRecyclablemxPinned == pGroup->nMaxPage + 10 - pGroup->nMinPage); + assert(pCache->n90pct == pCache->nMax * 9 / 10); + if (createFlag == 1 && + (nPinned >= pGroup->mxPinned || nPinned >= pCache->n90pct || (pcache1UnderMemoryPressure(pCache) && pCache->nRecyclable < nPinned))) { return 0; } - if( pCache->nPage>=pCache->nHash ) pcache1ResizeHash(pCache); - assert( pCache->nHash>0 && pCache->apHash ); + if (pCache->nPage >= 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; + 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) ); + assert(PAGE_IS_UNPINNED(pPage)); pcache1RemoveFromHash(pPage, 0); pcache1PinPage(pPage); pOther = pPage->pCache; - if( pOther->szAlloc != pCache->szAlloc ){ + if (pOther->szAlloc != pCache->szAlloc) { pcache1FreePage(pPage); pPage = 0; - }else{ + } else { pGroup->nPurgeable -= (pOther->bPurgeable - pCache->bPurgeable); } } @@ -52890,11 +52168,11 @@ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( /* 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) { + pPage = pcache1AllocPage(pCache, createFlag == 1); } - if( pPage ){ + if (pPage) { unsigned int h = iKey % pCache->nHash; pCache->nPage++; pPage->iKey = iKey; @@ -52903,9 +52181,9 @@ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( pPage->pLruNext = 0; /* pPage->pLruPrev = 0; ** No need to clear pLruPrev since it is not accessed when pLruNext==0 */ - *(void **)pPage->page.pExtra = 0; + *(void**)pPage->page.pExtra = 0; pCache->apHash[h] = pPage; - if( iKey>pCache->iMaxKey ){ + if (iKey > pCache->iMaxKey) { pCache->iMaxKey = iKey; } } @@ -52971,105 +52249,90 @@ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( ** 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; +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; } + 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) ){ + if (pPage) { + if (PAGE_IS_UNPINNED(pPage)) { return pcache1PinPage(pPage); - }else{ + } else { return pPage; } - }else if( createFlag ){ + } else if (createFlag) { /* Steps 3, 4, and 5 implemented by this subroutine */ return pcache1FetchStage2(pCache, iKey, createFlag); - }else{ + } 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; +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 ); + 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 -){ +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; + 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 ); + 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 ){ + if (pCache->pGroup->mutex) { return (sqlite3_pcache_page*)pcache1FetchWithMutex(p, iKey, createFlag); - }else + } 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; +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 ); + 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) ); + assert(pPage->pLruNext == 0); + assert(PAGE_IS_PINNED(pPage)); - if( reuseUnlikely || pGroup->nPurgeable>pGroup->nMaxPage ){ + if (reuseUnlikely || pGroup->nPurgeable > pGroup->nMaxPage) { pcache1RemoveFromHash(pPage, 1); - }else{ + } else { /* Add the page to the PGroup LRU list. */ - PgHdr1 **ppFirst = &pGroup->lru.pLruNext; + PgHdr1** ppFirst = &pGroup->lru.pLruNext; pPage->pLruPrev = &pGroup->lru; (pPage->pLruNext = *ppFirst)->pLruPrev = pPage; *ppFirst = pPage; @@ -53082,36 +52345,31 @@ static void pcache1Unpin( /* ** 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; +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 hOld, hNew; - assert( pPage->iKey==iOld ); - assert( pPage->pCache==pCache ); - assert( iOld!=iNew ); /* The page number really is changing */ + assert(pPage->iKey == iOld); + assert(pPage->pCache == pCache); + assert(iOld != iNew); /* The page number really is changing */ pcache1EnterMutex(pCache->pGroup); - assert( pcache1FetchNoMutex(p, iOld, 0)==pPage ); /* pPg really is iOld */ - hOld = iOld%pCache->nHash; + assert(pcache1FetchNoMutex(p, iOld, 0) == pPage); /* pPg really is iOld */ + hOld = iOld % pCache->nHash; pp = &pCache->apHash[hOld]; - while( (*pp)!=pPage ){ + while ((*pp) != pPage) { pp = &(*pp)->pNext; } *pp = pPage->pNext; - assert( pcache1FetchNoMutex(p, iNew, 0)==0 ); /* iNew not in cache */ - hNew = iNew%pCache->nHash; + assert(pcache1FetchNoMutex(p, iNew, 0) == 0); /* iNew not in cache */ + hNew = iNew % pCache->nHash; pPage->iKey = iNew; pPage->pNext = pCache->apHash[hNew]; pCache->apHash[hNew] = pPage; - if( iNew>pCache->iMaxKey ){ + if (iNew > pCache->iMaxKey) { pCache->iMaxKey = iNew; } @@ -53125,12 +52383,12 @@ static void pcache1Rekey( ** 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; +static void pcache1Truncate(sqlite3_pcache* p, unsigned int iLimit) { + PCache1* pCache = (PCache1*)p; pcache1EnterMutex(pCache->pGroup); - if( iLimit<=pCache->iMaxKey ){ + if (iLimit <= pCache->iMaxKey) { pcache1TruncateUnsafe(pCache, iLimit); - pCache->iMaxKey = iLimit-1; + pCache->iMaxKey = iLimit - 1; } pcache1LeaveMutex(pCache->pGroup); } @@ -53140,15 +52398,16 @@ static void pcache1Truncate(sqlite3_pcache *p, unsigned int iLimit){ ** ** 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) ); +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 ); + if (pCache->nPage) + pcache1TruncateUnsafe(pCache, 0); + assert(pGroup->nMaxPage >= pCache->nMax); pGroup->nMaxPage -= pCache->nMax; - assert( pGroup->nMinPage >= pCache->nMin ); + assert(pGroup->nMinPage >= pCache->nMin); pGroup->nMinPage -= pCache->nMin; pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage; pcache1EnforceMaxPage(pCache); @@ -53163,21 +52422,21 @@ static void pcache1Destroy(sqlite3_pcache *p){ ** install the default pluggable cache module, assuming the user has not ** already provided an alternative. */ -SQLITE_PRIVATE void sqlite3PCacheSetDefault(void){ +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 */ + 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); } @@ -53185,13 +52444,15 @@ SQLITE_PRIVATE void sqlite3PCacheSetDefault(void){ /* ** Return the size of the header on each page of this PCACHE implementation. */ -SQLITE_PRIVATE int sqlite3HeaderSizePcache1(void){ return ROUND8(sizeof(PgHdr1)); } +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){ +SQLITE_PRIVATE sqlite3_mutex* sqlite3Pcache1Mutex(void) { return pcache1.mutex; } @@ -53205,22 +52466,19 @@ SQLITE_PRIVATE sqlite3_mutex *sqlite3Pcache1Mutex(void){ ** been released, the function returns. The return value is the total number ** of bytes of memory released. */ -SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int nReq){ +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; + 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 - ){ + while ((nReq < 0 || nFree < nReq) && (p = pcache1.grp.lru.pLruPrev) != 0 && p->isAnchor == 0) { nFree += pcache1MemSize(p->page.pBuf); #ifdef SQLITE_PCACHE_SEPARATE_HEADER nFree += sqlite3MemSize(p); #endif - assert( PAGE_IS_UNPINNED(p) ); + assert(PAGE_IS_UNPINNED(p)); pcache1PinPage(p); pcache1RemoveFromHash(p, 1); } @@ -53235,16 +52493,15 @@ SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int nReq){ ** 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; +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) ); + for (p = pcache1.grp.lru.pLruNext; p && !p->isAnchor; p = p->pLruNext) { + assert(PAGE_IS_UNPINNED(p)); nRecyclable++; } *pnCurrent = pcache1.grp.nPurgeable; @@ -53321,7 +52578,6 @@ SQLITE_PRIVATE void sqlite3PcacheStats( */ /* #include "sqliteInt.h" */ - /* ** Target size for allocation chunks. */ @@ -53330,8 +52586,7 @@ SQLITE_PRIVATE void sqlite3PcacheStats( /* ** The number of rowset entries per allocation chunk. */ -#define ROWSET_ENTRY_PER_CHUNK \ - ((ROWSET_ALLOCATION_SIZE-8)/sizeof(struct RowSetEntry)) +#define ROWSET_ENTRY_PER_CHUNK ((ROWSET_ALLOCATION_SIZE - 8) / sizeof(struct RowSetEntry)) /* ** Each entry in a RowSet is an instance of the following object. @@ -53342,9 +52597,9 @@ SQLITE_PRIVATE void sqlite3PcacheStats( ** 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) */ + i64 v; /* ROWID value for this entry */ + struct RowSetEntry* pRight; /* Right subtree (larger entries) or list */ + struct RowSetEntry* pLeft; /* Left subtree (smaller entries) */ }; /* @@ -53354,7 +52609,7 @@ struct RowSetEntry { ** when the RowSet is destroyed. */ struct RowSetChunk { - struct RowSetChunk *pNextChunk; /* Next chunk on list of them all */ + struct RowSetChunk* pNextChunk; /* Next chunk on list of them all */ struct RowSetEntry aEntry[ROWSET_ENTRY_PER_CHUNK]; /* Allocated entries */ }; @@ -53364,30 +52619,30 @@ struct RowSetChunk { ** 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 */ + 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 */ +#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 ){ +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; @@ -53395,7 +52650,7 @@ SQLITE_PRIVATE RowSet *sqlite3RowSetInit(sqlite3 *db){ 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->nFresh = (u16)((N - ROUND8(sizeof(*p))) / sizeof(struct RowSetEntry)); p->rsFlags = ROWSET_SORTED; p->iBatch = 0; } @@ -53407,10 +52662,10 @@ SQLITE_PRIVATE RowSet *sqlite3RowSetInit(sqlite3 *db){ ** 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; +SQLITE_PRIVATE void sqlite3RowSetClear(void* pArg) { + RowSet* p = (RowSet*)pArg; struct RowSetChunk *pChunk, *pNextChunk; - for(pChunk=p->pChunk; pChunk; pChunk = pNextChunk){ + for (pChunk = p->pChunk; pChunk; pChunk = pNextChunk) { pNextChunk = pChunk->pNextChunk; sqlite3DbFree(p->db, pChunk); } @@ -53427,7 +52682,7 @@ SQLITE_PRIVATE void sqlite3RowSetClear(void *pArg){ ** the RowSet has allocated over its lifetime. This routine is ** the destructor for the RowSet. */ -SQLITE_PRIVATE void sqlite3RowSetDelete(void *pArg){ +SQLITE_PRIVATE void sqlite3RowSetDelete(void* pArg) { sqlite3RowSetClear(pArg); sqlite3DbFree(((RowSet*)pArg)->db, pArg); } @@ -53440,14 +52695,14 @@ SQLITE_PRIVATE void sqlite3RowSetDelete(void *pArg){ ** 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*/ +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; + struct RowSetChunk* pNew; pNew = sqlite3DbMallocRawNN(p->db, sizeof(*pNew)); - if( pNew==0 ){ + if (pNew == 0) { return 0; } pNew->pNextChunk = p->pChunk; @@ -53465,26 +52720,27 @@ static struct RowSetEntry *rowSetEntryAlloc(RowSet *p){ ** 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 */ +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 ); + assert(p != 0 && (p->rsFlags & ROWSET_NEXT) == 0); pEntry = rowSetEntryAlloc(p); - if( pEntry==0 ) return; + if (pEntry == 0) + return; pEntry->v = rowid; pEntry->pRight = 0; pLast = p->pLast; - if( pLast ){ - if( rowid<=pLast->v ){ /*OPTIMIZATION-IF-FALSE*/ + 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{ + } else { p->pEntry = pEntry; } p->pLast = pEntry; @@ -53496,29 +52752,29 @@ SQLITE_PRIVATE void sqlite3RowSetInsert(RowSet *p, i64 rowid){ ** 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 */ -){ +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; + 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; + 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->v < pB->v) + pTail = pTail->pRight = pA; pA = pA->pRight; - if( pA==0 ){ + if (pA == 0) { pTail->pRight = pB; break; } - }else{ + } else { pTail = pTail->pRight = pB; pB = pB->pRight; - if( pB==0 ){ + if (pB == 0) { pTail->pRight = pA; break; } @@ -53531,15 +52787,15 @@ static struct RowSetEntry *rowSetEntryMerge( ** Sort all elements on the list of RowSetEntry objects into order of ** increasing v. */ -static struct RowSetEntry *rowSetEntrySort(struct RowSetEntry *pIn){ +static struct RowSetEntry* rowSetEntrySort(struct RowSetEntry* pIn) { unsigned int i; struct RowSetEntry *pNext, *aBucket[40]; memset(aBucket, 0, sizeof(aBucket)); - while( pIn ){ + while (pIn) { pNext = pIn->pRight; pIn->pRight = 0; - for(i=0; aBucket[i]; i++){ + for (i = 0; aBucket[i]; i++) { pIn = rowSetEntryMerge(aBucket[i], pIn); aBucket[i] = 0; } @@ -53547,41 +52803,39 @@ static struct RowSetEntry *rowSetEntrySort(struct RowSetEntry *pIn){ pIn = pNext; } pIn = aBucket[0]; - for(i=1; ipLeft ){ - struct RowSetEntry *p; +static void rowSetTreeToList(struct RowSetEntry* pIn, /* Root of the input tree */ + struct RowSetEntry** ppFirst, /* Write head of the output list here */ + struct RowSetEntry** ppLast /* Write tail of the output list here */ +) { + assert(pIn != 0); + if (pIn->pLeft) { + struct RowSetEntry* p; rowSetTreeToList(pIn->pLeft, ppFirst, &p); p->pRight = pIn; - }else{ + } else { *ppFirst = pIn; } - if( pIn->pRight ){ + if (pIn->pRight) { rowSetTreeToList(pIn->pRight, &pIn->pRight, ppLast); - }else{ + } else { *ppLast = pIn; } - assert( (*ppLast)->pRight==0 ); + 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 @@ -53595,31 +52849,28 @@ static void rowSetTreeToList( ** ** 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*/ +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*/ + 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); + pLeft = rowSetNDeepTree(ppList, iDepth - 1); p = *ppList; - if( p==0 ){ /*OPTIMIZATION-IF-FALSE*/ + 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->pRight = rowSetNDeepTree(ppList, iDepth - 1); + } else { p = *ppList; *ppList = p->pRight; p->pLeft = p->pRight = 0; @@ -53631,16 +52882,16 @@ static struct RowSetEntry *rowSetNDeepTree( ** 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 */ +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 ); + assert(pList != 0); p = pList; pList = p->pRight; p->pLeft = p->pRight = 0; - for(iDepth=1; pList; iDepth++){ + for (iDepth = 1; pList; iDepth++) { pLeft = p; p = pList; pList = p->pRight; @@ -53663,28 +52914,28 @@ static struct RowSetEntry *rowSetListToTree(struct RowSetEntry *pList){ ** 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() */ +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*/ + 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; + p->rsFlags |= ROWSET_SORTED | ROWSET_NEXT; } /* Return the next entry on the list */ - if( p->pEntry ){ + if (p->pEntry) { *pRowid = p->pEntry->v; p->pEntry = p->pEntry->pRight; - if( p->pEntry==0 ){ /*OPTIMIZATION-IF-TRUE*/ + if (p->pEntry == 0) { /*OPTIMIZATION-IF-TRUE*/ /* Free memory immediately, rather than waiting on sqlite3_finalize() */ sqlite3RowSetClear(p); } return 1; - }else{ + } else { return 0; } } @@ -53697,38 +52948,38 @@ SQLITE_PRIVATE int sqlite3RowSetNext(RowSet *p, i64 *pRowid){ ** 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){ +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 ); + 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*/ + 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*/ + 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){ + for (pTree = pRowSet->pForest; pTree; pTree = pTree->pRight) { ppPrevTree = &pTree->pRight; - if( pTree->pLeft==0 ){ + if (pTree->pLeft == 0) { pTree->pLeft = rowSetListToTree(p); break; - }else{ + } else { struct RowSetEntry *pAux, *pTail; rowSetTreeToList(pTree->pLeft, &pAux, &pTail); pTree->pLeft = 0; p = rowSetEntryMerge(pAux, p); } } - if( pTree==0 ){ + if (pTree == 0) { *ppPrevTree = pTree = rowSetEntryAlloc(pRowSet); - if( pTree ){ + if (pTree) { pTree->v = 0; pTree->pRight = 0; pTree->pLeft = rowSetListToTree(p); @@ -53744,14 +52995,14 @@ SQLITE_PRIVATE int sqlite3RowSetTest(RowSet *pRowSet, int iBatch, sqlite3_int64 /* 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){ + for (pTree = pRowSet->pForest; pTree; pTree = pTree->pRight) { p = pTree->pLeft; - while( p ){ - if( p->vv < iRowid) { p = p->pRight; - }else if( p->v>iRowid ){ + } else if (p->v > iRowid) { p = p->pLeft; - }else{ + } else { return 1; } } @@ -53809,29 +53060,29 @@ SQLITE_PRIVATE int sqlite3RowSetTest(RowSet *pRowSet, int iBatch, sqlite3_int64 /* 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) +#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 +#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 @@ -53842,8 +53093,8 @@ SQLITE_PRIVATE int sqlite3RowSetTest(RowSet *pRowSet, int iBatch, sqlite3_int64 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 *); +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); @@ -53855,46 +53106,45 @@ SQLITE_PRIVATE void sqlite3WalLimit(Wal*, i64); ** 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); +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 *); +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); +SQLITE_PRIVATE Pgno sqlite3WalDbsize(Wal* pWal); /* Obtain or release the WRITER lock. */ -SQLITE_PRIVATE int sqlite3WalBeginWriteTransaction(Wal *pWal); -SQLITE_PRIVATE int sqlite3WalEndWriteTransaction(Wal *pWal); +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); +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); +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); +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); +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 */ +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 @@ -53902,40 +53152,40 @@ SQLITE_PRIVATE int sqlite3WalCheckpoint( ** sqlite3WalCallback() was called. If no commits have occurred since ** the last call, then return 0. */ -SQLITE_PRIVATE int sqlite3WalCallback(Wal *pWal); +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); +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); +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); +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); +SQLITE_PRIVATE int sqlite3WalFramesize(Wal* pWal); #endif /* Return the sqlite3_file object for the WAL file */ -SQLITE_PRIVATE sqlite3_file *sqlite3WalFile(Wal *pWal); +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); +SQLITE_PRIVATE int sqlite3WalWriteLock(Wal* pWal, int bLock); +SQLITE_PRIVATE void sqlite3WalDb(Wal* pWal, sqlite3* db); #endif #endif /* ifndef SQLITE_OMIT_WAL */ @@ -53944,7 +53194,6 @@ SQLITE_PRIVATE void sqlite3WalDb(Wal *pWal, sqlite3 *db); /************** 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 @@ -54037,7 +53286,10 @@ SQLITE_PRIVATE void sqlite3WalDb(Wal *pWal, sqlite3 *db); #if 0 int sqlite3PagerTrace=1; /* True to enable tracing */ #define sqlite3DebugPrintf printf -#define PAGERTRACE(X) if( sqlite3PagerTrace ){ sqlite3DebugPrintf X; } +#define PAGERTRACE(X) \ + if (sqlite3PagerTrace) { \ + sqlite3DebugPrintf X; \ + } #else #define PAGERTRACE(X) #endif @@ -54270,13 +53522,13 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ ** ** * 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 +#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 @@ -54326,7 +53578,7 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ ** Pager.eLock may only be set to UNKNOWN_LOCK when the pager is in ** PAGER_OPEN state. */ -#define UNKNOWN_LOCK (EXCLUSIVE_LOCK+1) +#define UNKNOWN_LOCK (EXCLUSIVE_LOCK + 1) /* ** The maximum allowed sector size. 64KiB. If the xSectorsize() method @@ -54336,7 +53588,6 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ */ #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 @@ -54352,23 +53603,23 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ */ 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 */ + 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 */ + 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 */ +#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 @@ -54539,20 +53790,20 @@ struct PagerSavepoint { ** 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 */ + 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 @@ -54579,21 +53830,21 @@ struct Pager { 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 */ + 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 */ + 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) */ + 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 ***************************************************************************/ @@ -54606,21 +53857,21 @@ struct Pager { 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 */ + 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 */ + void* pBusyHandlerArg; /* Context argument for xBusyHandler */ int aStat[4]; /* Total cache hits, misses, writes, spills */ #ifdef SQLITE_TEST - int nRead; /* Database pages read */ + 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 */ - char *pTmpSpace; /* Pager.pageSize bytes of space for tmp use */ - PCache *pPCache; /* Pointer to page cache object */ + void (*xReiniter)(DbPage*); /* Call this routine when reloading pages */ + int (*xGet)(Pager*, Pgno, DbPage**, int); /* Routine to fetch a patch */ + 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 */ + Wal* pWal; /* Write-ahead log used by "journal_mode=wal" */ + char* zWal; /* File name for write-ahead log */ #endif }; @@ -54629,8 +53880,8 @@ struct Pager { ** 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_HIT 0 +#define PAGER_STAT_MISS 1 #define PAGER_STAT_WRITE 2 #define PAGER_STAT_SPILL 3 @@ -54640,16 +53891,14 @@ struct Pager { ** 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++ +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) +#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. @@ -54674,14 +53923,14 @@ SQLITE_API int sqlite3_pager_writej_count = 0; /* Number of pages written to ** is different for every journal, we minimize that risk. */ static const unsigned char aJournalMagic[] = { - 0xd9, 0xd5, 0x05, 0xf9, 0x20, 0xa1, 0x63, 0xd7, + 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) +#define JOURNAL_PG_SZ(pPager) ((pPager->pageSize) + 8) /* ** The journal header size for this pager. This is usually the same @@ -54696,19 +53945,19 @@ static const unsigned char aJournalMagic[] = { ** out code that would never execute. */ #ifdef SQLITE_OMIT_MEMORYDB -# define MEMDB 0 +#define MEMDB 0 #else -# define MEMDB pPager->memDb +#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) +#if SQLITE_MAX_MMAP_SIZE > 0 +#define USEFETCH(x) ((x)->bUseFetch) #else -# define USEFETCH(x) 0 +#define USEFETCH(x) 0 #endif /* @@ -54723,7 +53972,7 @@ static const unsigned char aJournalMagic[] = { ** ** if( pPager->jfd->pMethods ){ ... */ -#define isOpen(pFd) ((pFd)->pMethods!=0) +#define isOpen(pFd) ((pFd)->pMethods != 0) #ifdef SQLITE_DIRECT_OVERFLOW_READ /* @@ -54734,15 +53983,17 @@ static const unsigned char aJournalMagic[] = { ** * 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; +SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager* pPager, Pgno pgno) { + if (pPager->fd->pMethods == 0) + return 0; + if (sqlite3PCacheIsDirty(pPager->pPCache)) + return 0; #ifndef SQLITE_OMIT_WAL - if( pPager->pWal ){ + if (pPager->pWal) { u32 iRead = 0; int rc; rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iRead); - return (rc==SQLITE_OK && iRead==0); + return (rc == SQLITE_OK && iRead == 0); } #endif return 1; @@ -54750,13 +54001,13 @@ SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){ #endif #ifndef SQLITE_OMIT_WAL -# define pagerUseWal(x) ((x)->pWal!=0) +#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 +#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 @@ -54768,31 +54019,25 @@ SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){ ** 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; +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 - ); + 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 ); + 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) ); + 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 @@ -54802,88 +54047,77 @@ static int assert_pager_state(Pager *p){ ** 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 (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 ); + assert(pPager->changeCountDone == 0 || pPager->eLock >= RESERVED_LOCK); + assert(p->eLock != PENDING_LOCK); - switch( p->eState ){ + switch (p->eState) { case PAGER_OPEN: - assert( !MEMDB ); - assert( pPager->errCode==SQLITE_OK ); - assert( sqlite3PcacheRefCount(pPager->pPCache)==0 || pPager->tempFile ); + 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 ); + 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(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 ); + 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) ){ + 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(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 ); + 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 ); + 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) - ); + 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: @@ -54891,8 +54125,8 @@ static int assert_pager_state(Pager *p){ ** 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 ); + assert(pPager->errCode != SQLITE_OK); + assert(sqlite3PcacheRefCount(pPager->pPCache) > 0 || pPager->tempFile); break; } @@ -54913,67 +54147,68 @@ static int assert_pager_state(Pager *p){ ** about an unused function. It is enclosed within SQLITE_DEBUG and so does ** not appear in normal builds. */ -char *print_pager_state(Pager *p){ +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 - ); + "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); +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 ){ +static void setGetterMethod(Pager* pPager) { + if (pPager->errCode) { pPager->xGet = getPageError; -#if SQLITE_MAX_MMAP_SIZE>0 - }else if( USEFETCH(pPager) ){ +#if SQLITE_MAX_MMAP_SIZE > 0 + } else if (USEFETCH(pPager)) { pPager->xGet = getPageMMap; #endif /* SQLITE_MAX_MMAP_SIZE>0 */ - }else{ + } else { pPager->xGet = getPageNormal; } } @@ -54987,15 +54222,15 @@ static void setGetterMethod(Pager *pPager){ ** * The bit corresponding to the page-number is not set in ** PagerSavepoint.pInSavepoint. */ -static int subjRequiresPage(PgHdr *pPg){ - Pager *pPager = pPg->pPager; - PagerSavepoint *p; +static int subjRequiresPage(PgHdr* pPg) { + Pager* pPager = pPg->pPager; + PagerSavepoint* p; Pgno pgno = pPg->pgno; int i; - for(i=0; inSavepoint; i++){ + for (i = 0; i < pPager->nSavepoint; i++) { p = &pPager->aSavepoint[i]; - if( p->nOrig>=pgno && 0==sqlite3BitvecTestNotNull(p->pInSavepoint, pgno) ){ - for(i=i+1; inSavepoint; i++){ + if (p->nOrig >= pgno && 0 == sqlite3BitvecTestNotNull(p->pInSavepoint, pgno)) { + for (i = i + 1; i < pPager->nSavepoint; i++) { pPager->aSavepoint[i].bTruncateOnRelease = 0; } return 1; @@ -55008,7 +54243,7 @@ static int subjRequiresPage(PgHdr *pPg){ /* ** Return true if the page is already in the journal file. */ -static int pageInJournal(Pager *pPager, PgHdr *pPg){ +static int pageInJournal(Pager* pPager, PgHdr* pPg) { return sqlite3BitvecTest(pPager->pInJournal, pPg->pgno); } #endif @@ -55020,10 +54255,10 @@ static int pageInJournal(Pager *pPager, PgHdr *pPg){ ** ** All values are stored on disk as big-endian. */ -static int read32bits(sqlite3_file *fd, i64 offset, u32 *pRes){ +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 ){ + if (rc == SQLITE_OK) { *pRes = sqlite3Get4byte(ac); } return rc; @@ -55032,14 +54267,13 @@ static int read32bits(sqlite3_file *fd, i64 offset, u32 *pRes){ /* ** Write a 32-bit integer into a string buffer in big-endian byte order. */ -#define put32bits(A,B) sqlite3Put4byte((u8*)A,B) - +#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){ +static int write32bits(sqlite3_file* fd, i64 offset, u32 val) { char ac[4]; put32bits(ac, val); return sqlite3OsWrite(fd, ac, 4, offset); @@ -55054,16 +54288,16 @@ static int write32bits(sqlite3_file *fd, i64 offset, u32 val){ ** 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){ +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 ); + 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 ){ + if (pPager->eLock != UNKNOWN_LOCK) { pPager->eLock = (u8)eLock; } IOTRACE(("UNLOCK %p %d\n", pPager, eLock)) @@ -55082,13 +54316,13 @@ static int pagerUnlockDb(Pager *pPager, int eLock){ ** See the comment above the #define of UNKNOWN_LOCK for an explanation ** of this. */ -static int pagerLockDb(Pager *pPager, int eLock){ +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 ){ + assert(eLock == SHARED_LOCK || eLock == RESERVED_LOCK || eLock == EXCLUSIVE_LOCK); + if (pPager->eLock < eLock || pPager->eLock == UNKNOWN_LOCK) { rc = pPager->noLock ? SQLITE_OK : sqlite3OsLock(pPager->fd, eLock); - if( rc==SQLITE_OK && (pPager->eLock!=UNKNOWN_LOCK||eLock==EXCLUSIVE_LOCK) ){ + if (rc == SQLITE_OK && (pPager->eLock != UNKNOWN_LOCK || eLock == EXCLUSIVE_LOCK)) { pPager->eLock = (u8)eLock; IOTRACE(("LOCK %p %d\n", pPager, eLock)) } @@ -55115,21 +54349,20 @@ static int pagerLockDb(Pager *pPager, int eLock){ ** ** If neither optimization can be used, 0 is returned. */ -static int jrnlBufferSize(Pager *pPager){ - assert( !MEMDB ); +static int jrnlBufferSize(Pager* pPager) { + assert(!MEMDB); -#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \ - || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) - int dc; /* Device characteristics */ +#if defined(SQLITE_ENABLE_ATOMIC_WRITE) || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) + int dc; /* Device characteristics */ - assert( isOpen(pPager->fd) ); + 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) ){ + if (pPager->dbSize > 0 && (dc & SQLITE_IOCAP_BATCH_ATOMIC)) { return -1; } #endif @@ -55139,9 +54372,9 @@ static int jrnlBufferSize(Pager *pPager){ 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) ){ + assert(SQLITE_IOCAP_ATOMIC512 == (512 >> 8)); + assert(SQLITE_IOCAP_ATOMIC64K == (65536 >> 8)); + if (0 == (dc & (SQLITE_IOCAP_ATOMIC | (szPage >> 8)) || nSector > szPage)) { return 0; } } @@ -55161,18 +54394,18 @@ static int jrnlBufferSize(Pager *pPager){ /* ** Return a 32-bit hash of the page data for pPage. */ -static u32 pager_datahash(int nByte, unsigned char *pData){ +static u32 pager_datahash(int nByte, unsigned char* pData) { u32 hash = 0; int i; - for(i=0; ipPager->pageSize, (unsigned char *)pPage->pData); +static u32 pager_pagehash(PgHdr* pPage) { + return pager_datahash(pPage->pPager->pageSize, (unsigned char*)pPage->pData); } -static void pager_set_pagehash(PgHdr *pPage){ +static void pager_set_pagehash(PgHdr* pPage) { pPage->pageHash = pager_pagehash(pPage); } @@ -55182,18 +54415,18 @@ static void pager_set_pagehash(PgHdr *pPage){ ** 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) ); +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_datahash(X, Y) 0 +#define pager_pagehash(X) 0 #define pager_set_pagehash(X) #define CHECK_PAGE(x) -#endif /* SQLITE_CHECK_PAGES */ +#endif /* SQLITE_CHECK_PAGES */ /* ** When this is called the journal file for pager pPager must be open. @@ -55220,34 +54453,27 @@ static void checkPage(PgHdr *pPg){ ** 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 */ +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)) - ){ + 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; - if( c ){ - offset = ((c-1)/JOURNAL_HDR_SZ(pPager) + 1) * JOURNAL_HDR_SZ(pPager); + 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)= c); + assert((offset - c) < JOURNAL_HDR_SZ(pPager)); return offset; } @@ -55309,22 +54535,22 @@ static i64 journalHdrOffset(Pager *pPager){ ** If an IO error occurs, abandon processing and return the IO error code. ** Otherwise, return SQLITE_OK. */ -static int zeroJournalHdr(Pager *pPager, int doTruncate){ - int rc = SQLITE_OK; /* Return code */ - assert( isOpen(pPager->jfd) ); - assert( !sqlite3JournalIsInMemory(pPager->jfd) ); - if( pPager->journalOff ){ - const i64 iLimit = pPager->journalSizeLimit; /* Local cache of jsl */ +static int zeroJournalHdr(Pager* pPager, int doTruncate) { + int rc = SQLITE_OK; /* Return code */ + assert(isOpen(pPager->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 ){ + if (doTruncate || iLimit == 0) { rc = sqlite3OsTruncate(pPager->jfd, 0); - }else{ + } 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); + 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 @@ -55333,10 +54559,10 @@ static int zeroJournalHdr(Pager *pPager, int doTruncate){ ** 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 ){ + if (rc == SQLITE_OK && iLimit > 0) { i64 sz; rc = sqlite3OsFileSize(pPager->jfd, &sz); - if( rc==SQLITE_OK && sz>iLimit ){ + if (rc == SQLITE_OK && sz > iLimit) { rc = sqlite3OsTruncate(pPager->jfd, iLimit); } } @@ -55359,16 +54585,16 @@ static int zeroJournalHdr(Pager *pPager, int doTruncate){ ** ** 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 */ +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. */ + assert(isOpen(pPager->jfd)); /* Journal file must be open. */ - if( nHeader>JOURNAL_HDR_SZ(pPager) ){ + if (nHeader > JOURNAL_HDR_SZ(pPager)) { nHeader = JOURNAL_HDR_SZ(pPager); } @@ -55376,8 +54602,8 @@ static int writeJournalHdr(Pager *pPager){ ** 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 ){ + for (ii = 0; ii < pPager->nSavepoint; ii++) { + if (pPager->aSavepoint[ii].iHdrOffset == 0) { pPager->aSavepoint[ii].iHdrOffset = pPager->journalOff; } } @@ -55404,34 +54630,32 @@ static int writeJournalHdr(Pager *pPager){ ** * 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) - ){ + 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); + } 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); + put32bits(&zHeader[sizeof(aJournalMagic) + 4], pPager->cksumInit); /* The initial database size */ - put32bits(&zHeader[sizeof(aJournalMagic)+8], pPager->dbOrigSize); + put32bits(&zHeader[sizeof(aJournalMagic) + 8], pPager->dbOrigSize); /* The assumed sector size for this process */ - put32bits(&zHeader[sizeof(aJournalMagic)+12], pPager->sectorSize); + put32bits(&zHeader[sizeof(aJournalMagic) + 12], pPager->sectorSize); /* The page size */ - put32bits(&zHeader[sizeof(aJournalMagic)+16], pPager->pageSize); + 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)); + 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 @@ -55450,10 +54674,10 @@ static int writeJournalHdr(Pager *pPager){ ** 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 ); + assert(pPager->journalHdr <= pPager->journalOff); pPager->journalOff += nHeader; } @@ -55477,25 +54701,23 @@ static int writeJournalHdr(Pager *pPager){ ** 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 */ +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. */ + 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 ){ + if (pPager->journalOff + JOURNAL_HDR_SZ(pPager) > journalSize) { return SQLITE_DONE; } iHdrOff = pPager->journalOff; @@ -55505,12 +54727,12 @@ static int readJournalHdr( ** SQLITE_DONE. If an IO error occurs, return an error code. Otherwise, ** proceed. */ - if( isHot || iHdrOff!=pPager->journalHdr ){ + if (isHot || iHdrOff != pPager->journalHdr) { rc = sqlite3OsRead(pPager->jfd, aMagic, sizeof(aMagic), iHdrOff); - if( rc ){ + if (rc) { return rc; } - if( memcmp(aMagic, aJournalMagic, sizeof(aMagic))!=0 ){ + if (memcmp(aMagic, aJournalMagic, sizeof(aMagic)) != 0) { return SQLITE_DONE; } } @@ -55519,21 +54741,19 @@ static int readJournalHdr( ** 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)) - ){ + 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 */ + 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)) - ){ + if (SQLITE_OK != (rc = read32bits(pPager->jfd, iHdrOff + 20, &iSectorSize)) || + SQLITE_OK != (rc = read32bits(pPager->jfd, iHdrOff + 24, &iPageSize))) { return rc; } @@ -55541,7 +54761,7 @@ static int readJournalHdr( ** journal header to zero. In this case, assume that the Pager.pageSize ** variable is already set to the correct page size. */ - if( iPageSize==0 ){ + if (iPageSize == 0) { iPageSize = pPager->pageSize; } @@ -55550,10 +54770,8 @@ static int readJournalHdr( ** 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 (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 @@ -55567,7 +54785,7 @@ static int readJournalHdr( ** PagerSetPagesize() is tested. */ rc = sqlite3PagerSetPagesize(pPager, &iPageSize, -1); - testcase( rc!=SQLITE_OK ); + 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 @@ -55582,7 +54800,6 @@ static int readJournalHdr( 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 @@ -55602,27 +54819,24 @@ static int readJournalHdr( ** 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 */ +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) ); + assert(pPager->setSuper == 0); + assert(!pagerUseWal(pPager)); - if( !zSuper - || pPager->journalMode==PAGER_JOURNALMODE_MEMORY - || !isOpen(pPager->jfd) - ){ + if (!zSuper || pPager->journalMode == PAGER_JOURNALMODE_MEMORY || !isOpen(pPager->jfd)) { return SQLITE_OK; } pPager->setSuper = 1; - assert( pPager->journalHdr <= pPager->journalOff ); + assert(pPager->journalHdr <= pPager->journalOff); /* Calculate the length in bytes and the checksum of zSuper */ - for(nSuper=0; zSuper[nSuper]; nSuper++){ + for (nSuper = 0; zSuper[nSuper]; nSuper++) { cksum += zSuper[nSuper]; } @@ -55630,7 +54844,7 @@ static int writeSuperJournal(Pager *pPager, const char *zSuper){ ** the super-journal name. This is in case the previous page written to ** the journal has already been synced. */ - if( pPager->fullSync ){ + if (pPager->fullSync) { pPager->journalOff = journalHdrOffset(pPager); } iHdrOff = pPager->journalOff; @@ -55638,16 +54852,14 @@ static int writeSuperJournal(Pager *pPager, const char *zSuper){ /* 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))) - ){ + 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); + 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 @@ -55659,9 +54871,7 @@ static int writeSuperJournal(Pager *pPager, const char *zSuper){ ** 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 - ){ + if (SQLITE_OK == (rc = sqlite3OsFileSize(pPager->jfd, &jrnlSize)) && jrnlSize > pPager->journalOff) { rc = sqlite3OsTruncate(pPager->jfd, pPager->journalOff); } return rc; @@ -55670,7 +54880,7 @@ static int writeSuperJournal(Pager *pPager, const char *zSuper){ /* ** Discard the entire contents of the in-memory page-cache. */ -static void pager_reset(Pager *pPager){ +static void pager_reset(Pager* pPager) { pPager->iDataVersion++; sqlite3BackupRestart(pPager->pBackup); sqlite3PcacheClear(pPager->pPCache); @@ -55679,7 +54889,7 @@ static void pager_reset(Pager *pPager){ /* ** Return the pPager->iDataVersion value */ -SQLITE_PRIVATE u32 sqlite3PagerDataVersion(Pager *pPager){ +SQLITE_PRIVATE u32 sqlite3PagerDataVersion(Pager* pPager) { return pPager->iDataVersion; } @@ -55688,12 +54898,12 @@ SQLITE_PRIVATE u32 sqlite3PagerDataVersion(Pager *pPager){ ** 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++){ +static void releaseAllSavepoints(Pager* pPager) { + int ii; /* Iterator for looping through Pager.aSavepoint */ + for (ii = 0; ii < pPager->nSavepoint; ii++) { sqlite3BitvecDestroy(pPager->aSavepoint[ii].pInSavepoint); } - if( !pPager->exclusiveMode || sqlite3JournalIsInMemory(pPager->sjfd) ){ + if (!pPager->exclusiveMode || sqlite3JournalIsInMemory(pPager->sjfd)) { sqlite3OsClose(pPager->sjfd); } sqlite3_free(pPager->aSavepoint); @@ -55707,16 +54917,16 @@ static void releaseAllSavepoints(Pager *pPager){ ** 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 */ +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 ){ + for (ii = 0; ii < pPager->nSavepoint; 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 ); + testcase(rc == SQLITE_NOMEM); + assert(rc == SQLITE_OK || rc == SQLITE_NOMEM); } } return rc; @@ -55739,39 +54949,34 @@ static int addToSavepointBitvecs(Pager *pPager, Pgno pgno){ ** 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){ +static void pager_unlock(Pager* pPager) { - assert( pPager->eState==PAGER_READER - || pPager->eState==PAGER_OPEN - || pPager->eState==PAGER_ERROR - ); + 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) ); + 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; + } 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) - ){ + 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); } @@ -55781,7 +54986,7 @@ static void pager_unlock(Pager *pPager){ ** is necessary. */ rc = pagerUnlockDb(pPager, NO_LOCK); - if( rc!=SQLITE_OK && pPager->eState==PAGER_ERROR ){ + if (rc != SQLITE_OK && pPager->eState == PAGER_ERROR) { pPager->eLock = UNKNOWN_LOCK; } @@ -55789,7 +54994,7 @@ static void pager_unlock(Pager *pPager){ ** 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 ); + assert(pPager->errCode || pPager->eState != PAGER_ERROR); pPager->eState = PAGER_OPEN; } @@ -55798,16 +55003,17 @@ static void pager_unlock(Pager *pPager){ ** 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 ){ + assert(pPager->errCode == SQLITE_OK || !MEMDB); + if (pPager->errCode) { + if (pPager->tempFile == 0) { pager_reset(pPager); pPager->changeCountDone = 0; pPager->eState = PAGER_OPEN; - }else{ + } else { pPager->eState = (isOpen(pPager->jfd) ? PAGER_OPEN : PAGER_READER); } - if( USEFETCH(pPager) ) sqlite3OsUnfetch(pPager->fd, 0, 0); + if (USEFETCH(pPager)) + sqlite3OsUnfetch(pPager->fd, 0, 0); pPager->errCode = SQLITE_OK; setGetterMethod(pPager); } @@ -55836,15 +55042,11 @@ static void pager_unlock(Pager *pPager){ ** 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){ +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 ){ + 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); @@ -55852,7 +55054,7 @@ static int pager_error(Pager *pPager, int rc){ return rc; } -static int pager_truncate(Pager *pPager, Pgno nPage); +static int pager_truncate(Pager* pPager, Pgno nPage); /* ** The write transaction open on pPager is being committed (bCommit==1) @@ -55870,11 +55072,14 @@ static int pager_truncate(Pager *pPager, Pgno nPage); ** 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); +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); } /* @@ -55930,9 +55135,9 @@ static int pagerFlushOnCommit(Pager *pPager, int bCommit){ ** 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 */ +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 @@ -55947,29 +55152,27 @@ static int pager_end_transaction(Pager *pPager, int hasSuper, int bCommit){ ** 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->eStateeLockeState != PAGER_ERROR); + if (pPager->eState < PAGER_WRITER_LOCKED && pPager->eLock < RESERVED_LOCK) { return SQLITE_OK; } releaseAllSavepoints(pPager); - assert( isOpen(pPager->jfd) || pPager->pInJournal==0 - || (sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_BATCH_ATOMIC) - ); - if( isOpen(pPager->jfd) ){ - assert( !pagerUseWal(pPager) ); + assert(isOpen(pPager->jfd) || 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) ){ + if (sqlite3JournalIsInMemory(pPager->jfd)) { /* assert( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ); */ sqlite3OsClose(pPager->jfd); - }else if( pPager->journalMode==PAGER_JOURNALMODE_TRUNCATE ){ - if( pPager->journalOff==0 ){ + } else if (pPager->journalMode == PAGER_JOURNALMODE_TRUNCATE) { + if (pPager->journalOff == 0) { rc = SQLITE_OK; - }else{ + } else { rc = sqlite3OsTruncate(pPager->jfd, 0); - if( rc==SQLITE_OK && pPager->fullSync ){ + 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 @@ -55979,25 +55182,22 @@ static int pager_end_transaction(Pager *pPager, int hasSuper, int bCommit){ } } pPager->journalOff = 0; - }else if( pPager->journalMode==PAGER_JOURNALMODE_PERSIST - || (pPager->exclusiveMode && pPager->journalMode!=PAGER_JOURNALMODE_WAL) - ){ - rc = zeroJournalHdr(pPager, hasSuper||pPager->tempFile); + } else if (pPager->journalMode == PAGER_JOURNALMODE_PERSIST || + (pPager->exclusiveMode && pPager->journalMode != PAGER_JOURNALMODE_WAL)) { + rc = zeroJournalHdr(pPager, hasSuper || pPager->tempFile); pPager->journalOff = 0; - }else{ + } 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 - ); + 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 ){ + if (bDelete) { rc = sqlite3OsDelete(pPager->pVfs, pPager->zJournal, pPager->extraSync); } } @@ -56005,9 +55205,9 @@ static int pager_end_transaction(Pager *pPager, int hasSuper, int bCommit){ #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 ){ + if (pPager->dbSize == 0 && sqlite3PcacheRefCount(pPager->pPCache) > 0) { + PgHdr* p = sqlite3PagerLookup(pPager, 1); + if (p) { p->pageHash = 0; sqlite3PagerUnrefNotNull(p); } @@ -56017,47 +55217,46 @@ static int pager_end_transaction(Pager *pPager, int hasSuper, int bCommit){ sqlite3BitvecDestroy(pPager->pInJournal); pPager->pInJournal = 0; pPager->nRec = 0; - if( rc==SQLITE_OK ){ - if( MEMDB || pagerFlushOnCommit(pPager, bCommit) ){ + if (rc == SQLITE_OK) { + if (MEMDB || pagerFlushOnCommit(pPager, bCommit)) { sqlite3PcacheCleanAll(pPager->pPCache); - }else{ + } else { sqlite3PcacheClearWritable(pPager->pPCache); } sqlite3PcacheTruncate(pPager->pPCache, pPager->dbSize); } - if( pagerUseWal(pPager) ){ + 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 ){ + 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 ); + assert(pPager->eLock == EXCLUSIVE_LOCK); rc = pager_truncate(pPager, pPager->dbSize); } - if( rc==SQLITE_OK && bCommit ){ + if (rc == SQLITE_OK && bCommit) { rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_COMMIT_PHASETWO, 0); - if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; + if (rc == SQLITE_NOTFOUND) + rc = SQLITE_OK; } - if( !pPager->exclusiveMode - && (!pagerUseWal(pPager) || sqlite3WalExclusiveMode(pPager->pWal, 0)) - ){ + 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); + return (rc == SQLITE_OK ? rc2 : rc); } /* @@ -56077,15 +55276,15 @@ static int pager_end_transaction(Pager *pPager, int hasSuper, int bCommit){ ** 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 ){ +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 ); + } else if (!pPager->exclusiveMode) { + assert(pPager->eState == PAGER_READER); pager_end_transaction(pPager, 0, 0); } } @@ -56111,10 +55310,10 @@ static void pagerUnlockAndRollback(Pager *pPager){ ** 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 ){ +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; } @@ -56158,29 +55357,28 @@ static u32 pager_cksum(Pager *pPager, const u8 *aData){ ** 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 */ -){ +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 */ - - 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 */ + 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 */ + + 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) ); + 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 @@ -56188,37 +55386,38 @@ static int pager_playback_one_page( ** 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 ); + 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; + 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 ); + if (pgno == 0 || pgno == PAGER_SJ_PGNO(pPager)) { + assert(!isSavepnt); return SQLITE_DONE; } - if( pgno>(Pgno)pPager->dbSize || sqlite3BitvecTest(pDone, pgno) ){ + 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 ){ + if (isMainJrnl) { + rc = read32bits(jfd, (*pOffset) - 4, &cksum); + if (rc) + return rc; + if (!isSavepnt && pager_cksum(pPager, (u8*)aData) != cksum) { return SQLITE_DONE; } } @@ -56226,13 +55425,13 @@ static int pager_playback_one_page( /* 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 ){ + 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] ){ + */ + if (pgno == 1 && pPager->nReserve != ((u8*)aData)[20]) { pPager->nReserve = ((u8*)aData)[20]; } @@ -56271,29 +55470,24 @@ static int pager_playback_one_page( ** 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) ){ + if (pagerUseWal(pPager)) { pPg = 0; - }else{ + } 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 ){ + 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)); + } 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) ); + 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 @@ -56301,15 +55495,15 @@ static int pager_playback_one_page( ** 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. */ - rc = sqlite3OsWrite(pPager->fd, (u8 *)aData, pPager->pageSize, ofst); + rc = sqlite3OsWrite(pPager->fd, (u8*)aData, pPager->pageSize, ofst); - if( pgno>pPager->dbFileSize ){ + if (pgno > pPager->dbFileSize) { pPager->dbFileSize = pgno; } - if( pPager->pBackup ){ + if (pPager->pBackup) { sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)aData); } - }else if( !isMainJrnl && pPg==0 ){ + } 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 @@ -56326,23 +55520,24 @@ static int pager_playback_one_page( ** 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 ); + assert(isSavepnt); + assert((pPager->doNotSpill & SPILLFLAG_ROLLBACK) == 0); pPager->doNotSpill |= SPILLFLAG_ROLLBACK; rc = sqlite3PagerGet(pPager, pgno, &pPg, 1); - assert( (pPager->doNotSpill & SPILLFLAG_ROLLBACK)!=0 ); + assert((pPager->doNotSpill & SPILLFLAG_ROLLBACK) != 0); pPager->doNotSpill &= ~SPILLFLAG_ROLLBACK; - if( rc!=SQLITE_OK ) return rc; + if (rc != SQLITE_OK) + return rc; sqlite3PcacheMakeDirty(pPg); } - if( 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; + void* pData; pData = pPg->pData; memcpy(pData, (u8*)aData, pPager->pageSize); pPager->xReiniter(pPg); @@ -56354,8 +55549,8 @@ static int pager_playback_one_page( /* 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)); + if (pgno == 1) { + memcpy(&pPager->dbFileVers, &((u8*)pData)[24], sizeof(pPager->dbFileVers)); } sqlite3PcacheRelease(pPg); } @@ -56405,31 +55600,32 @@ static int pager_playback_one_page( ** 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[] */ +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 ){ + 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); + } 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); + pJournal = (sqlite3_file*)(((u8*)pSuper) + pVfs->szOsFile); } - if( rc!=SQLITE_OK ) goto delsuper_out; + 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 @@ -56437,29 +55633,31 @@ static int pager_delsuper(Pager *pPager, const char *zSuper){ ** files extracted from regular rollback-journals. */ rc = sqlite3OsFileSize(pSuper, &nSuperJournal); - if( rc!=SQLITE_OK ) goto delsuper_out; - nSuperPtr = pVfs->mxPathname+1; + if (rc != SQLITE_OK) + goto delsuper_out; + nSuperPtr = pVfs->mxPathname + 1; zFree = sqlite3Malloc(4 + nSuperJournal + nSuperPtr + 2); - if( !zFree ){ + 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]; + zSuperPtr = &zSuperJournal[nSuperJournal + 2]; rc = sqlite3OsRead(pSuper, zSuperJournal, (int)nSuperJournal, 0); - if( rc!=SQLITE_OK ) goto delsuper_out; + if (rc != SQLITE_OK) + goto delsuper_out; zSuperJournal[nSuperJournal] = 0; - zSuperJournal[nSuperJournal+1] = 0; + zSuperJournal[nSuperJournal + 1] = 0; zJournal = zSuperJournal; - while( (zJournal-zSuperJournal)eState!=PAGER_ERROR ); - assert( pPager->eState!=PAGER_READER ); + assert(pPager->eState != PAGER_ERROR); + assert(pPager->eState != PAGER_READER); - if( isOpen(pPager->fd) - && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) - ){ + 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 ); + 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 ){ + 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; + } else if ((currentSize + szPage) <= newSize) { + char* pTmp = pPager->pTmpSpace; memset(pTmp, 0, szPage); - testcase( (newSize-szPage) == currentSize ); - testcase( (newSize-szPage) > currentSize ); + testcase((newSize - szPage) == currentSize); + testcase((newSize - szPage) > currentSize); sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_SIZE_HINT, &newSize); - rc = sqlite3OsWrite(pPager->fd, pTmp, szPage, newSize-szPage); + rc = sqlite3OsWrite(pPager->fd, pTmp, szPage, newSize - szPage); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pPager->dbFileSize = nPage; } } @@ -56560,12 +55755,12 @@ static int pager_truncate(Pager *pPager, Pgno nPage){ ** 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){ +SQLITE_PRIVATE int sqlite3SectorSize(sqlite3_file* pFile) { int iRet = sqlite3OsSectorSize(pFile); - if( iRet<32 ){ + if (iRet < 32) { iRet = 512; - }else if( iRet>MAX_SECTOR_SIZE ){ - assert( MAX_SECTOR_SIZE>=512 ); + } else if (iRet > MAX_SECTOR_SIZE) { + assert(MAX_SECTOR_SIZE >= 512); iRet = MAX_SECTOR_SIZE; } return iRet; @@ -56594,18 +55789,15 @@ SQLITE_PRIVATE int sqlite3SectorSize(sqlite3_file *pFile){ ** 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 ); +static void setSectorSize(Pager* pPager) { + assert(isOpen(pPager->fd) || pPager->tempFile); - if( pPager->tempFile - || (sqlite3OsDeviceCharacteristics(pPager->fd) & - SQLITE_IOCAP_POWERSAFE_OVERWRITE)!=0 - ){ + 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{ + } else { pPager->sectorSize = sqlite3SectorSize(pPager->fd); } } @@ -56667,25 +55859,25 @@ static void setSectorSize(Pager *pPager){ ** 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 */ +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) ); + assert(isOpen(pPager->jfd)); rc = sqlite3OsFileSize(pPager->jfd, &szJ); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { goto end_playback; } @@ -56701,12 +55893,12 @@ static int pager_playback(Pager *pPager, int isHot){ ** for pageSize. */ zSuper = pPager->pTmpSpace; - rc = readSuperJournal(pPager->jfd, zSuper, pPager->pVfs->mxPathname+1); - if( rc==SQLITE_OK && zSuper[0] ){ + 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 ){ + if (rc != SQLITE_OK || !res) { goto end_playback; } pPager->journalOff = 0; @@ -56716,15 +55908,15 @@ static int pager_playback(Pager *pPager, int isHot){ ** pager_playback_one_page() call returns SQLITE_DONE or an IO error ** occurs. */ - while( 1 ){ + 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 ){ + if (rc != SQLITE_OK) { + if (rc == SQLITE_DONE) { rc = SQLITE_OK; } goto end_playback; @@ -56735,9 +55927,9 @@ static int pager_playback(Pager *pPager, int isHot){ ** 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 == 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 @@ -56754,21 +55946,20 @@ static int pager_playback(Pager *pPager, int isHot){ ** 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 ){ + 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) ){ + if (pPager->journalOff == JOURNAL_HDR_SZ(pPager)) { rc = pager_truncate(pPager, mxPg); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { goto end_playback; } pPager->dbSize = mxPg; - if( pPager->mxPgnomxPgno < mxPg) { pPager->mxPgno = mxPg; } } @@ -56776,19 +55967,19 @@ static int pager_playback(Pager *pPager, int isHot){ /* 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 ){ + rc = pager_playback_one_page(pPager, &pPager->journalOff, 0, 1, 0); + if (rc == SQLITE_OK) { nPlayback++; - }else{ - if( rc==SQLITE_DONE ){ + } else { + if (rc == SQLITE_DONE) { pPager->journalOff = szJ; break; - }else if( rc==SQLITE_IOERR_SHORT_READ ){ + } 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 @@ -56796,7 +55987,7 @@ static int pager_playback(Pager *pPager, int isHot){ ** first place so it is OK to simply abandon the rollback. */ rc = SQLITE_OK; goto end_playback; - }else{ + } 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 @@ -56808,10 +55999,10 @@ static int pager_playback(Pager *pPager, int isHot){ } } /*NOTREACHED*/ - assert( 0 ); + assert(0); end_playback: - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = sqlite3PagerSetPagesize(pPager, &savedPageSize, -1); } /* Following a rollback, the database file should be back in its original @@ -56820,7 +56011,7 @@ static int pager_playback(Pager *pPager, int isHot){ ** assertion that the transaction counter was modified. */ #ifdef SQLITE_DEBUG - sqlite3OsFileControlHint(pPager->fd,SQLITE_FCNTL_DB_UNCHANGED,0); + sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_DB_UNCHANGED, 0); #endif /* If this playback is happening automatically as a result of an IO or @@ -56834,36 +56025,33 @@ static int pager_playback(Pager *pPager, int isHot){ */ pPager->changeCountDone = pPager->tempFile; - if( rc==SQLITE_OK ){ + 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 ); + 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) - ){ + 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) { + rc = pager_end_transaction(pPager, zSuper[0] != '\0', 0); + testcase(rc != SQLITE_OK); } - if( rc==SQLITE_OK && zSuper[0] && res ){ + 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] ); + assert(zSuper == &pPager->pTmpSpace[4]); memset(&zSuper[-4], 0, 4); rc = pager_delsuper(pPager, zSuper); - testcase( rc!=SQLITE_OK ); + testcase(rc != SQLITE_OK); } - if( isHot && nPlayback ){ - sqlite3_log(SQLITE_NOTICE_RECOVER_ROLLBACK, "recovered %d pages from %s", - nPlayback, pPager->zJournal); + 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 @@ -56874,7 +56062,6 @@ static int pager_playback(Pager *pPager, int isHot){ 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 @@ -56887,34 +56074,35 @@ static int pager_playback(Pager *pPager, int isHot){ ** 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 */ +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 */ + u32 iFrame = 0; /* Frame of WAL containing pgno */ - assert( pPager->eState>=PAGER_READER && !MEMDB ); - assert( isOpen(pPager->fd) ); + assert(pPager->eState >= PAGER_READER && !MEMDB); + assert(isOpen(pPager->fd)); - if( pagerUseWal(pPager) ){ + if (pagerUseWal(pPager)) { rc = sqlite3WalFindFrame(pPager->pWal, pPg->pgno, &iFrame); - if( rc ) return rc; + if (rc) + return rc; } - if( iFrame ){ - rc = sqlite3WalReadFrame(pPager->pWal, iFrame,pPager->pageSize,pPg->pData); - }else + if (iFrame) { + rc = sqlite3WalReadFrame(pPager->pWal, iFrame, pPager->pageSize, pPg->pData); + } else #endif { - i64 iOffset = (pPg->pgno-1)*(i64)pPager->pageSize; + i64 iOffset = (pPg->pgno - 1) * (i64)pPager->pageSize; rc = sqlite3OsRead(pPager->fd, pPg->pData, pPager->pageSize, iOffset); - if( rc==SQLITE_IOERR_SHORT_READ ){ + if (rc == SQLITE_IOERR_SHORT_READ) { rc = SQLITE_OK; } } - if( pPg->pgno==1 ){ - if( rc ){ + 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 @@ -56928,16 +56116,15 @@ static int readDbPage(PgHdr *pPg){ ** we should still be ok. */ memset(pPager->dbFileVers, 0xff, sizeof(pPager->dbFileVers)); - }else{ - u8 *dbFileVers = &((u8*)pPg->pData)[24]; + } else { + u8* dbFileVers = &((u8*)pPg->pData)[24]; memcpy(&pPager->dbFileVers, dbFileVers, sizeof(pPager->dbFileVers)); } } 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))); + PAGERTRACE(("FETCH %d page %d hash(%08x)\n", PAGERID(pPager), pPg->pgno, pager_pagehash(pPg))); return rc; } @@ -56950,19 +56137,20 @@ static int readDbPage(PgHdr *pPg){ ** 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){ +static void pager_write_changecounter(PgHdr* pPg) { u32 change_counter; - if( NEVER(pPg==0) ) return; + 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); + 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); + put32bits(((char*)pPg->pData) + 92, change_counter); + put32bits(((char*)pPg->pData) + 96, SQLITE_VERSION_NUMBER); } #ifndef SQLITE_OMIT_WAL @@ -56978,19 +56166,19 @@ static void pager_write_changecounter(PgHdr *pPg){ ** 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){ +static int pagerUndoCallback(void* pCtx, Pgno iPg) { int rc = SQLITE_OK; - Pager *pPager = (Pager *)pCtx; - PgHdr *pPg; + Pager* pPager = (Pager*)pCtx; + PgHdr* pPg; - assert( pagerUseWal(pPager) ); + assert(pagerUseWal(pPager)); pPg = sqlite3PagerLookup(pPager, iPg); - if( pPg ){ - if( sqlite3PcachePageRefcount(pPg)==1 ){ + if (pPg) { + if (sqlite3PcachePageRefcount(pPg) == 1) { sqlite3PcacheDrop(pPg); - }else{ + } else { rc = readDbPage(pPg); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pPager->xReiniter(pPg); } sqlite3PagerUnrefNotNull(pPg); @@ -57013,9 +56201,9 @@ static int pagerUndoCallback(void *pCtx, Pgno iPg){ /* ** 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 */ +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 @@ -57025,11 +56213,11 @@ static int pagerRollbackWal(Pager *pPager){ ** + Reload page content from the database (if refcount>0). */ pPager->dbSize = pPager->dbOrigSize; - rc = sqlite3WalUndo(pPager->pWal, pagerUndoCallback, (void *)pPager); + 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); + while (pList && rc == SQLITE_OK) { + PgHdr* pNext = pList->pDirty; + rc = pagerUndoCallback((void*)pPager, pList->pgno); pList = pNext; } @@ -57045,58 +56233,56 @@ static int pagerRollbackWal(Pager *pPager){ ** 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 */ +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 ); + 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 ); + for (p = pList; p && p->pDirty; p = p->pDirty) { + assert(p->pgno < p->pDirty->pgno); } #endif - assert( pList->pDirty==0 || isCommit ); - if( isCommit ){ + 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; + PgHdr** ppNext = &pList; nList = 0; - for(p=pList; (*ppNext = p)!=0; p=p->pDirty){ - if( p->pgno<=nTruncate ){ + for (p = pList; (*ppNext = p) != 0; p = p->pDirty) { + if (p->pgno <= nTruncate) { ppNext = &p->pDirty; nList++; } } - assert( pList ); - }else{ + 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); + 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){ + for (p = pList; p; p = p->pDirty) { pager_set_pagehash(p); } #endif @@ -57112,12 +56298,12 @@ static int pagerWalFrames( ** 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 */ +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 ); + 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 @@ -57127,9 +56313,10 @@ static int pagerBeginReadTransaction(Pager *pPager){ sqlite3WalEndReadTransaction(pPager->pWal); rc = sqlite3WalBeginReadTransaction(pPager->pWal, &changed); - if( rc!=SQLITE_OK || changed ){ + if (rc != SQLITE_OK || changed) { pager_reset(pPager); - if( USEFETCH(pPager) ) sqlite3OsUnfetch(pPager->fd, 0, 0); + if (USEFETCH(pPager)) + sqlite3OsUnfetch(pPager->fd, 0, 0); } return rc; @@ -57145,8 +56332,8 @@ static int pagerBeginReadTransaction(Pager *pPager){ ** 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 */ +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 @@ -57154,10 +56341,10 @@ static int pagerPagecount(Pager *pPager, Pgno *pnPage){ ** 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 ); + 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 @@ -57165,20 +56352,20 @@ static int pagerPagecount(Pager *pPager, Pgno *pnPage){ ** 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 */ + 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 ){ + if (rc != SQLITE_OK) { return rc; } - nPage = (Pgno)((n+pPager->pageSize-1) / pPager->pageSize); + 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 ){ + if (nPage > pPager->mxPgno) { pPager->mxPgno = (Pgno)nPage; } @@ -57205,29 +56392,28 @@ static int pagerPagecount(Pager *pPager, Pgno *pnPage){ ** between the xAccess() below and an xDelete() being executed by some ** other connection. */ -static int pagerOpenWalIfPresent(Pager *pPager){ +static int pagerOpenWalIfPresent(Pager* pPager) { int rc = SQLITE_OK; - assert( pPager->eState==PAGER_OPEN ); - assert( pPager->eLock>=SHARED_LOCK ); + 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 */ + 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 ){ + if (rc) + return rc; + if (nPage == 0) { rc = sqlite3OsDelete(pPager->pVfs, pPager->zWal, 0); - }else{ - testcase( sqlite3PcachePagecount(pPager->pPCache)==0 ); + } else { + testcase(sqlite3PcachePagecount(pPager->pPCache) == 0); rc = sqlite3PagerOpenWal(pPager, 0); } - }else if( pPager->journalMode==PAGER_JOURNALMODE_WAL ){ + } else if (pPager->journalMode == PAGER_JOURNALMODE_WAL) { pPager->journalMode = PAGER_JOURNALMODE_DELETE; } } @@ -57272,19 +56458,19 @@ static int pagerOpenWalIfPresent(Pager *pPager){ ** (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 */ +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 ); + 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 ){ + if (pSavepoint) { pDone = sqlite3BitvecCreate(pSavepoint->nOrig); - if( !pDone ){ + if (!pDone) { return SQLITE_NOMEM_BKPT; } } @@ -57295,7 +56481,7 @@ static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){ pPager->dbSize = pSavepoint ? pSavepoint->nOrig : pPager->dbOrigSize; pPager->changeCountDone = pPager->tempFile; - if( !pSavepoint && pagerUseWal(pPager) ){ + if (!pSavepoint && pagerUseWal(pPager)) { return pagerRollbackWal(pPager); } @@ -57305,7 +56491,7 @@ static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){ ** past pPager->journalOff is off-limits to us. */ szJ = pPager->journalOff; - assert( pagerUseWal(pPager)==0 || szJ==0 ); + 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. @@ -57314,14 +56500,14 @@ static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){ ** will be skipped automatically. Pages are added to pDone as they ** are played back. */ - if( pSavepoint && !pagerUseWal(pPager) ){ + if (pSavepoint && !pagerUseWal(pPager)) { iHdrOff = pSavepoint->iHdrOffset ? pSavepoint->iHdrOffset : szJ; pPager->journalOff = pSavepoint->iOffset; - while( rc==SQLITE_OK && pPager->journalOffjournalOff < iHdrOff) { rc = pager_playback_one_page(pPager, &pPager->journalOff, pDone, 1, 1); } - assert( rc!=SQLITE_DONE ); - }else{ + assert(rc != SQLITE_DONE); + } else { pPager->journalOff = 0; } @@ -57330,50 +56516,48 @@ static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){ ** 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->journalOffjournalOff < szJ) { + u32 ii; /* Loop counter */ + u32 nJRec = 0; /* Number of Journal Records */ u32 dummy; rc = readJournalHdr(pPager, 0, szJ, &nJRec, &dummy); - assert( rc!=SQLITE_DONE ); + assert(rc != SQLITE_DONE); /* ** The "pPager->journalHdr+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)); + 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 < szJ; ii++) { rc = pager_playback_one_page(pPager, &pPager->journalOff, pDone, 1, 1); } - assert( rc!=SQLITE_DONE ); + assert(rc != SQLITE_DONE); } - assert( rc!=SQLITE_OK || pPager->journalOff>=szJ ); + 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 (pSavepoint) { + u32 ii; /* Loop counter */ + i64 offset = (i64)pSavepoint->iSubRec * (4 + pPager->pageSize); - if( pagerUseWal(pPager) ){ + 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) ); + for (ii = pSavepoint->iSubRec; rc == SQLITE_OK && ii < pPager->nSubRec; ii++) { + assert(offset == (i64)ii * (4 + pPager->pageSize)); rc = pager_playback_one_page(pPager, &offset, pDone, 0, 1); } - assert( rc!=SQLITE_DONE ); + assert(rc != SQLITE_DONE); } sqlite3BitvecDestroy(pDone); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pPager->journalOff = szJ; } @@ -57384,7 +56568,7 @@ static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){ ** 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){ +SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager* pPager, int mxPage) { sqlite3PcacheSetCachesize(pPager->pPCache, mxPage); } @@ -57392,20 +56576,20 @@ SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager *pPager, int 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){ +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 ){ +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); + pPager->bUseFetch = (sz > 0); setGetterMethod(pPager); sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_MMAP_SIZE, &sz); } @@ -57415,7 +56599,7 @@ static void pagerFixMaplimit(Pager *pPager){ /* ** Change the maximum size of any memory mapping made of the database file. */ -SQLITE_PRIVATE void sqlite3PagerSetMmapLimit(Pager *pPager, sqlite3_int64 szMmap){ +SQLITE_PRIVATE void sqlite3PagerSetMmapLimit(Pager* pPager, sqlite3_int64 szMmap) { pPager->szMmap = szMmap; pagerFixMaplimit(pPager); } @@ -57423,7 +56607,7 @@ SQLITE_PRIVATE void sqlite3PagerSetMmapLimit(Pager *pPager, sqlite3_int64 szMmap /* ** Free as much memory as possible from the pager. */ -SQLITE_PRIVATE void sqlite3PagerShrink(Pager *pPager){ +SQLITE_PRIVATE void sqlite3PagerShrink(Pager* pPager) { sqlite3PcacheShrink(pPager->pPCache); } @@ -57479,37 +56663,36 @@ SQLITE_PRIVATE void sqlite3PagerShrink(Pager *pPager){ ** 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 */ -){ +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 ){ + 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; + } 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 ){ + if (pPager->noSync) { pPager->syncFlags = 0; - }else if( pgFlags & PAGER_FULLFSYNC ){ + } else if (pgFlags & PAGER_FULLFSYNC) { pPager->syncFlags = SQLITE_SYNC_FULL; - }else{ + } else { pPager->syncFlags = SQLITE_SYNC_NORMAL; } - pPager->walSyncFlags = (pPager->syncFlags<<2); - if( pPager->fullSync ){ + 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_CKPT_FULLFSYNC) && !pPager->noSync) { + pPager->walSyncFlags |= (SQLITE_SYNC_FULL << 2); } - if( pgFlags & PAGER_CACHESPILL ){ + if (pgFlags & PAGER_CACHESPILL) { pPager->doNotSpill &= ~SPILLFLAG_OFF; - }else{ + } else { pPager->doNotSpill |= SPILLFLAG_OFF; } } @@ -57539,21 +56722,19 @@ SQLITE_API int sqlite3_opentemp_count = 0; ** 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 */ +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 */ + sqlite3_opentemp_count++; /* Used for testing and analysis only */ #endif - vfsFlags |= SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | - SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_DELETEONCLOSE; + 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) ); + assert(rc != SQLITE_OK || isOpen(pFile)); return rc; } @@ -57578,18 +56759,17 @@ static int pagerOpentemp( ** 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; +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); + ap = (void**)&pPager->xBusyHandler; + assert(((int (*)(void*))(ap[0])) == xBusyHandler); + assert(ap[1] == pBusyHandlerArg); + sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_BUSYHANDLER, (void*)ap); } /* @@ -57622,7 +56802,7 @@ SQLITE_PRIVATE void sqlite3PagerSetBusyHandler( ** 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){ +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 @@ -57636,47 +56816,46 @@ SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nR */ 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 */ + 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) ){ + if (pPager->eState > PAGER_OPEN && isOpen(pPager->fd)) { rc = sqlite3OsFileSize(pPager->fd, &nByte); } - if( rc==SQLITE_OK ){ + 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 ){ + * 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); + } else { + memset(pNew + pageSize, 0, 8); } } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pager_reset(pPager); rc = sqlite3PcacheSetPageSize(pPager->pPCache, pageSize); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { sqlite3PageFree(pPager->pTmpSpace); pPager->pTmpSpace = pNew; - pPager->dbSize = (Pgno)((nByte+pageSize-1)/pageSize); + pPager->dbSize = (Pgno)((nByte + pageSize - 1) / pageSize); pPager->pageSize = pageSize; - pPager->lckPgno = (Pgno)(PENDING_BYTE/pageSize) + 1; - }else{ + 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 ); + if (rc == SQLITE_OK) { + if (nReserve < 0) + nReserve = pPager->nReserve; + assert(nReserve >= 0 && nReserve < 1000); pPager->nReserve = (i16)nReserve; pagerFixMaplimit(pPager); } @@ -57691,7 +56870,7 @@ SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nR ** occurs. But other modules are free to use it too, as long as ** no rollbacks are happening. */ -SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager *pPager){ +SQLITE_PRIVATE void* sqlite3PagerTempSpace(Pager* pPager) { return pPager->pTmpSpace; } @@ -57702,11 +56881,11 @@ SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager *pPager){ ** ** Regardless of mxPage, return the current maximum page count. */ -SQLITE_PRIVATE Pgno sqlite3PagerMaxPageCount(Pager *pPager, Pgno mxPage){ - if( mxPage>0 ){ +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->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 @@ -57726,16 +56905,16 @@ SQLITE_PRIVATE Pgno sqlite3PagerMaxPageCount(Pager *pPager, Pgno mxPage){ 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){ +void disable_simulated_io_errors(void) { saved_cnt = sqlite3_io_error_pending; sqlite3_io_error_pending = -1; } -void enable_simulated_io_errors(void){ +void enable_simulated_io_errors(void) { sqlite3_io_error_pending = saved_cnt; } #else -# define disable_simulated_io_errors() -# define enable_simulated_io_errors() +#define disable_simulated_io_errors() +#define enable_simulated_io_errors() #endif /* @@ -57752,21 +56931,21 @@ void enable_simulated_io_errors(void){ ** 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){ +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 ); + 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) ); + assert(!pagerUseWal(pPager)); - if( isOpen(pPager->fd) ){ + 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 ){ + if (rc == SQLITE_IOERR_SHORT_READ) { rc = SQLITE_OK; } } @@ -57780,13 +56959,12 @@ SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager *pPager, int N, unsigned cha ** 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 ); +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 @@ -57801,22 +56979,20 @@ SQLITE_PRIVATE void sqlite3PagerPagecount(Pager *pPager, int *pnPage){ ** 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 */ +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) - ); + 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) ); + } while (rc == SQLITE_BUSY && pPager->xBusyHandler(pPager->pBusyHandlerArg)); return rc; } @@ -57842,23 +57018,23 @@ static int pager_wait_on_lock(Pager *pPager, int locktype){ ** 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 */ +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) ); + for (i = 0; i < pPg->pPager->nSavepoint; i++) { + PagerSavepoint* p = &pPager->aSavepoint[i]; + assert(p->nOrig < pgno || sqlite3BitvecTestNotNull(p->pInSavepoint, pgno)); } } } -static void assertTruncateConstraint(Pager *pPager){ +static void assertTruncateConstraint(Pager* pPager) { sqlite3PcacheIterateDirty(pPager->pPCache, assertTruncateConstraintCb); } #else -# define assertTruncateConstraint(pPager) +#define assertTruncateConstraint(pPager) #endif /* @@ -57872,9 +57048,9 @@ static void assertTruncateConstraint(Pager *pPager){ ** 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 ); +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 @@ -57888,7 +57064,6 @@ SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager *pPager, Pgno nPage){ ** 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 @@ -57903,18 +57078,18 @@ SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager *pPager, Pgno nPage){ ** If everything goes as planned, SQLITE_OK is returned. Otherwise, ** an SQLite error code. */ -static int pagerSyncHotJournal(Pager *pPager){ +static int pagerSyncHotJournal(Pager* pPager) { int rc = SQLITE_OK; - if( !pPager->noSync ){ + if (!pPager->noSync) { rc = sqlite3OsSync(pPager->jfd, SQLITE_SYNC_NORMAL); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = sqlite3OsFileSize(pPager->jfd, &pPager->journalHdr); } return rc; } -#if SQLITE_MAX_MMAP_SIZE>0 +#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(). @@ -57925,37 +57100,36 @@ static int pagerSyncHotJournal(Pager *pPager){ ** 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 */ +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 ){ + if (pPager->pMmapFreelist) { *ppPage = p = pPager->pMmapFreelist; pPager->pMmapFreelist = p->pDirty; p->pDirty = 0; - assert( pPager->nExtra>=8 ); + 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); + } 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->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 ); + 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; @@ -57969,23 +57143,23 @@ static int pagerAcquireMapPage( ** 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; +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); + 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){ +static void pagerFreeMapHdrs(Pager* pPager) { + PgHdr* p; + PgHdr* pNext; + for (p = pPager->pMmapFreelist; p; p = pNext) { pNext = p->pDirty; sqlite3_free(p); } @@ -57996,26 +57170,27 @@ static void pagerFreeMapHdrs(Pager *pPager){ ** 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){ +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] ); + 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 (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 ){ + } else if (rc == SQLITE_OK && bHasMoved) { rc = SQLITE_READONLY_DBMOVED; } return rc; } - /* ** Shutdown the page cache. Free all memory and close all files. ** @@ -58030,10 +57205,10 @@ static int databaseIsUnmoved(Pager *pPager){ ** 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) ); +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); @@ -58041,21 +57216,19 @@ SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager, sqlite3 *db){ 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) - ){ + 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); + sqlite3WalClose(pPager->pWal, db, pPager->walSyncFlags, pPager->pageSize, a); pPager->pWal = 0; } #endif pager_reset(pPager); - if( MEMDB ){ + if (MEMDB) { pager_unlock(pPager); - }else{ + } 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 @@ -58067,7 +57240,7 @@ SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager, sqlite3 *db){ ** back or finalize it. The next database user will have to do hot-journal ** rollback before accessing the database file. */ - if( isOpen(pPager->jfd) ){ + if (isOpen(pPager->jfd)) { pager_error(pPager, pagerSyncHotJournal(pPager)); } pagerUnlockAndRollback(pPager); @@ -58080,8 +57253,8 @@ SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager, sqlite3 *db){ sqlite3OsClose(pPager->fd); sqlite3PageFree(pTmp); sqlite3PcacheClose(pPager->pPCache); - assert( !pPager->aSavepoint && !pPager->pInJournal ); - assert( !isOpen(pPager->jfd) && !isOpen(pPager->sjfd) ); + assert(!pPager->aSavepoint && !pPager->pInJournal); + assert(!isOpen(pPager->jfd) && !isOpen(pPager->sjfd)); sqlite3_free(pPager); return SQLITE_OK; @@ -58091,7 +57264,7 @@ SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager, sqlite3 *db){ /* ** Return the page number for page pPg. */ -SQLITE_PRIVATE Pgno sqlite3PagerPagenumber(DbPage *pPg){ +SQLITE_PRIVATE Pgno sqlite3PagerPagenumber(DbPage* pPg) { return pPg->pgno; } #endif @@ -58099,7 +57272,7 @@ SQLITE_PRIVATE Pgno sqlite3PagerPagenumber(DbPage *pPg){ /* ** Increment the reference count for page pPg. */ -SQLITE_PRIVATE void sqlite3PagerRef(DbPage *pPg){ +SQLITE_PRIVATE void sqlite3PagerRef(DbPage* pPg) { sqlite3PcacheRef(pPg); } @@ -58138,25 +57311,24 @@ SQLITE_PRIVATE void sqlite3PagerRef(DbPage *pPg){ ** 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 */ +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) ); + 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 (rc != SQLITE_OK) + return rc; - if( !pPager->noSync ){ - assert( !pPager->tempFile ); - if( isOpen(pPager->jfd) && pPager->journalMode!=PAGER_JOURNALMODE_MEMORY ){ + 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) ); + assert(isOpen(pPager->jfd)); - if( 0==(iDc&SQLITE_IOCAP_SAFE_APPEND) ){ + 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 @@ -58181,18 +57353,18 @@ static int syncJournal(Pager *pPager, int newHdr){ */ i64 iNextHdrOffset; u8 aMagic[8]; - u8 zHeader[sizeof(aJournalMagic)+4]; + 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) ){ + 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 ){ + if (rc != SQLITE_OK && rc != SQLITE_IOERR_SHORT_READ) { return rc; } @@ -58207,34 +57379,34 @@ static int syncJournal(Pager *pPager, int newHdr){ ** is populated with 0xFFFFFFFF when the journal header is written ** and never needs to be updated. */ - if( pPager->fullSync && 0==(iDc&SQLITE_IOCAP_SEQUENTIAL) ){ + 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; + 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; + rc = sqlite3OsWrite(pPager->jfd, zHeader, sizeof(zHeader), pPager->journalHdr); + if (rc != SQLITE_OK) + return rc; } - if( 0==(iDc&SQLITE_IOCAP_SEQUENTIAL) ){ + 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; + 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) ){ + if (newHdr && 0 == (iDc & SQLITE_IOCAP_SAFE_APPEND)) { pPager->nRec = 0; rc = writeJournalHdr(pPager); - if( rc!=SQLITE_OK ) return rc; + if (rc != SQLITE_OK) + return rc; } - }else{ + } else { pPager->journalHdr = pPager->journalOff; } } @@ -58245,7 +57417,7 @@ static int syncJournal(Pager *pPager, int newHdr){ */ sqlite3PcacheClearSyncFlags(pPager->pPCache); pPager->eState = PAGER_WRITER_DBMOD; - assert( assert_pager_state(pPager) ); + assert(assert_pager_state(pPager)); return SQLITE_OK; } @@ -58281,38 +57453,35 @@ static int syncJournal(Pager *pPager, int newHdr){ ** 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 */ +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 ); + 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 ); + 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) - ){ + assert(rc != SQLITE_OK || isOpen(pPager->fd)); + if (rc == SQLITE_OK && pPager->dbHintSize < pPager->dbSize && (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 ){ + while (rc == SQLITE_OK && pList) { Pgno pgno = pList->pgno; /* If there are dirty pages in the page cache with page numbers greater @@ -58323,12 +57492,13 @@ static int pager_write_pagelist(Pager *pPager, PgHdr *pList){ ** 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 */ + 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); + assert((pList->flags & PGHDR_NEED_SYNC) == 0); + if (pList->pgno == 1) + pager_write_changecounter(pList); pData = pList->pData; @@ -58339,10 +57509,10 @@ static int pager_write_pagelist(Pager *pPager, PgHdr *pList){ ** the value now stored in the database file. If writing this ** page caused the database file to grow, update dbFileSize. */ - if( pgno==1 ){ + if (pgno == 1) { memcpy(&pPager->dbFileVers, &pData[24], sizeof(pPager->dbFileVers)); } - if( pgno>pPager->dbFileSize ){ + if (pgno > pPager->dbFileSize) { pPager->dbFileSize = pgno; } pPager->aStat[PAGER_STAT_WRITE]++; @@ -58350,11 +57520,10 @@ static int pager_write_pagelist(Pager *pPager, PgHdr *pList){ /* 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))); + 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{ + } else { PAGERTRACE(("NOSTORE %d page %d\n", PAGERID(pPager), pgno)); } pager_set_pagehash(pList); @@ -58372,14 +57541,13 @@ static int pager_write_pagelist(Pager *pPager, PgHdr *pList){ ** SQLITE_IOERR_XXX error code is returned if a call to sqlite3OsOpen() ** fails. */ -static int openSubJournal(Pager *pPager){ +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; + 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 ){ + if (pPager->journalMode == PAGER_JOURNALMODE_MEMORY || pPager->subjInMemory) { nStmtSpill = -1; } rc = sqlite3JournalOpen(pPager->pVfs, 0, pPager->sjfd, flags, nStmtSpill); @@ -58398,46 +57566,43 @@ static int openSubJournal(Pager *pPager){ ** SQLITE_NOMEM if a malloc fails while setting a bit in a savepoint ** bitvec. */ -static int subjournalPage(PgHdr *pPg){ +static int subjournalPage(PgHdr* pPg) { int rc = SQLITE_OK; - Pager *pPager = pPg->pPager; - if( pPager->journalMode!=PAGER_JOURNALMODE_OFF ){ + 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 - ); + 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; + if (rc == SQLITE_OK) { + void* pData = pPg->pData; + i64 offset = (i64)pPager->nSubRec * (4 + pPager->pageSize); + char* pData2; 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) { + rc = sqlite3OsWrite(pPager->sjfd, pData2, pPager->pageSize, offset + 4); } } } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pPager->nSubRec++; - assert( pPager->nSavepoint>0 ); + assert(pPager->nSavepoint > 0); rc = addToSavepointBitvecs(pPager, pPg->pgno); } return rc; } -static int subjournalPageIfRequired(PgHdr *pPg){ - if( subjRequiresPage(pPg) ){ +static int subjournalPageIfRequired(PgHdr* pPg) { + if (subjRequiresPage(pPg)) { return subjournalPage(pPg); - }else{ + } else { return SQLITE_OK; } } @@ -58461,12 +57626,12 @@ static int subjournalPageIfRequired(PgHdr *pPg){ ** 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; +static int pagerStress(void* p, PgHdr* pPg) { + Pager* pPager = (Pager*)p; int rc = SQLITE_OK; - assert( pPg->pPager==pPager ); - assert( pPg->flags&PGHDR_DIRTY ); + 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 @@ -58484,50 +57649,47 @@ static int pagerStress(void *p, PgHdr *pPg){ ** 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) - ){ + 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) ){ + if (pagerUseWal(pPager)) { /* Write a single frame for this page to the log. */ rc = subjournalPageIfRequired(pPg); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = pagerWalFrames(pPager, pPg, 0, 0); } - }else{ + } else { #ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE - if( pPager->tempFile==0 ){ + if (pPager->tempFile == 0) { rc = sqlite3JournalCreate(pPager->jfd); - if( rc!=SQLITE_OK ) return pager_error(pPager, rc); + 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 - ){ + 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 ); + 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 ){ + if (rc == SQLITE_OK) { PAGERTRACE(("STRESS %d page %d\n", PAGERID(pPager), pPg->pgno)); sqlite3PcacheMakeClean(pPg); } @@ -58538,14 +57700,14 @@ static int pagerStress(void *p, PgHdr *pPg){ /* ** Flush all unreferenced dirty pages to disk. */ -SQLITE_PRIVATE int sqlite3PagerFlush(Pager *pPager){ +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 ){ + 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; @@ -58587,35 +57749,34 @@ SQLITE_PRIVATE int sqlite3PagerFlush(Pager *pPager){ ** (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 */ +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 */ + int memJM = 0; /* Memory journal mode */ #else -# define memJM 0 +#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 */ + 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). */ @@ -58625,11 +57786,12 @@ SQLITE_PRIVATE int sqlite3PagerOpen( *ppPager = 0; #ifndef SQLITE_OMIT_MEMORYDB - if( flags & PAGER_MEMORY ){ + if (flags & PAGER_MEMORY) { memDb = 1; - if( zFilename && zFilename[0] ){ + if (zFilename && zFilename[0]) { zPathname = sqlite3DbStrDup(0, zFilename); - if( zPathname==0 ) return SQLITE_NOMEM_BKPT; + if (zPathname == 0) + return SQLITE_NOMEM_BKPT; nPathname = sqlite3Strlen30(zPathname); zFilename = 0; } @@ -58640,34 +57802,34 @@ SQLITE_PRIVATE int sqlite3PagerOpen( ** 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 ){ + 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 ){ + if (rc != SQLITE_OK) { + if (rc == SQLITE_OK_SYMLINK) { + if (vfsFlags & SQLITE_OPEN_NOFOLLOW) { rc = SQLITE_CANTOPEN_SYMLINK; - }else{ + } else { rc = SQLITE_OK; } } } nPathname = sqlite3Strlen30(zPathname); - z = zUri = &zFilename[sqlite3Strlen30(zFilename)+1]; - while( *z ){ - z += strlen(z)+1; - z += strlen(z)+1; + 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 ){ + 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, @@ -58676,7 +57838,7 @@ SQLITE_PRIVATE int sqlite3PagerOpen( */ rc = SQLITE_CANTOPEN_BKPT; } - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { sqlite3DbFree(0, zPathname); return rc; } @@ -58726,90 +57888,101 @@ SQLITE_PRIVATE int sqlite3PagerOpen( ** 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 */ + 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 */ + nPathname + 4 + 1 + /* WAL filename */ #endif - 3 /* Terminator */ + 3 /* Terminator */ ); - assert( EIGHT_BYTE_ALIGNMENT(SQLITE_INT_TO_PTR(journalFileSize)) ); - if( !pPtr ){ + 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); + 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 */ + 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++; + 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 ){ + if (nPathname > 0) { pPager->zJournal = (char*)pPtr; - memcpy(pPtr, zPathname, nPathname); pPtr += nPathname; - memcpy(pPtr, "-journal",8); pPtr += 8 + 1; + 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); + sqlite3FileSuffix3(zFilename, pPager->zJournal); + pPtr = (u8*)(pPager->zJournal + sqlite3Strlen30(pPager->zJournal) + 1); #endif - }else{ + } else { pPager->zJournal = 0; } #ifndef SQLITE_OMIT_WAL /* Fill in Pager.zWal */ - if( nPathname>0 ){ + if (nPathname > 0) { pPager->zWal = (char*)pPtr; - memcpy(pPtr, zPathname, nPathname); pPtr += nPathname; - memcpy(pPtr, "-wal", 4); pPtr += 4 + 1; + 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); + pPtr = (u8*)(pPager->zWal + sqlite3Strlen30(pPager->zWal) + 1); #endif - }else{ + } else { pPager->zWal = 0; } #endif - (void)pPtr; /* Suppress warning about unused pPtr value */ + (void)pPtr; /* Suppress warning about unused pPtr value */ - if( nPathname ) sqlite3DbFree(0, zPathname); + 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() */ + */ + if (zFilename && zFilename[0]) { + int fout = 0; /* VFS flags returned by xOpen() */ rc = sqlite3OsOpen(pVfs, pPager->zFilename, pPager->fd, vfsFlags, &fout); - assert( !memDb ); + assert(!memDb); #ifndef SQLITE_OMIT_DESERIALIZE - pPager->memVfs = memJM = (fout&SQLITE_OPEN_MEMORY)!=0; + pPager->memVfs = memJM = (fout & SQLITE_OPEN_MEMORY) != 0; #endif - readOnly = (fout&SQLITE_OPEN_READONLY)!=0; + 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 @@ -58819,26 +57992,26 @@ SQLITE_PRIVATE int sqlite3PagerOpen( ** + The value returned by sqlite3OsSectorSize() ** + The largest page size that can be written atomically. */ - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { int iDc = sqlite3OsDeviceCharacteristics(pPager->fd); - if( !readOnly ){ + if (!readOnly) { setSectorSize(pPager); - assert(SQLITE_DEFAULT_PAGE_SIZE<=SQLITE_MAX_DEFAULT_PAGE_SIZE); - if( szPageDfltsectorSize ){ - if( pPager->sectorSize>SQLITE_MAX_DEFAULT_PAGE_SIZE ){ + assert(SQLITE_DEFAULT_PAGE_SIZE <= SQLITE_MAX_DEFAULT_PAGE_SIZE); + if (szPageDflt < pPager->sectorSize) { + if (pPager->sectorSize > SQLITE_MAX_DEFAULT_PAGE_SIZE) { szPageDflt = SQLITE_MAX_DEFAULT_PAGE_SIZE; - }else{ + } 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)) ){ + 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; } } @@ -58846,13 +58019,12 @@ SQLITE_PRIVATE int sqlite3PagerOpen( #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; + if ((iDc & SQLITE_IOCAP_IMMUTABLE) != 0 || sqlite3_uri_boolean(pPager->zFilename, "immutable", 0)) { + vfsFlags |= SQLITE_OPEN_READONLY; + goto act_like_temp_file; } } - }else{ + } 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(). @@ -58863,34 +58035,33 @@ SQLITE_PRIVATE int sqlite3PagerOpen( ** ** This branch also runs for files marked as immutable. */ -act_like_temp_file: + 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); + 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 ); + if (rc == SQLITE_OK) { + assert(pPager->memDb == 0); rc = sqlite3PagerSetPagesize(pPager, &szPageDflt, -1); - testcase( rc!=SQLITE_OK ); + testcase(rc != SQLITE_OK); } /* Initialize the PCache object. */ - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { nExtra = ROUND8(nExtra); - assert( nExtra>=8 && nExtra<1000 ); - rc = sqlite3PcacheOpen(szPageDflt, nExtra, !memDb, - !memDb?pagerStress:0, (void *)pPager, pPager->pPCache); + 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 ){ + */ + if (rc != SQLITE_OK) { sqlite3OsClose(pPager->fd); sqlite3PageFree(pPager->pTmpSpace); sqlite3_free(pPager); @@ -58911,36 +58082,35 @@ SQLITE_PRIVATE int sqlite3PagerOpen( /* 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 ); + 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 ); + 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{ + 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->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 ); + assert(isOpen(pPager->fd) || tempFile); setSectorSize(pPager); - if( !useJournal ){ + if (!useJournal) { pPager->journalMode = PAGER_JOURNALMODE_OFF; - }else if( memDb || memJM ){ + } else if (memDb || memJM) { pPager->journalMode = PAGER_JOURNALMODE_MEMORY; } /* pPager->xBusyHandler = 0; */ @@ -58959,16 +58129,15 @@ SQLITE_PRIVATE int sqlite3PagerOpen( ** 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 ){ +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 @@ -59000,26 +58169,24 @@ SQLITE_API sqlite3_file *sqlite3_database_file_object(const char *zName){ ** 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 */ +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(pPager->useJournal); + assert(isOpen(pPager->fd)); + assert(pPager->eState == PAGER_OPEN); - assert( jrnlOpen==0 || ( sqlite3OsDeviceCharacteristics(pPager->jfd) & - SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN - )); + assert(jrnlOpen == 0 || (sqlite3OsDeviceCharacteristics(pPager->jfd) & SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN)); *pExists = 0; - if( !jrnlOpen ){ + 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 */ + 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() @@ -59030,12 +58197,12 @@ static int hasHotJournal(Pager *pPager, int *pExists){ ** 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 */ + if (rc == SQLITE_OK && !locked) { + Pgno nPage; /* Number of pages in database file */ - assert( pPager->tempFile==0 ); + assert(pPager->tempFile == 0); rc = pagerPagecount(pPager, &nPage); - if( rc==SQLITE_OK ){ + 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 @@ -59044,35 +58211,36 @@ static int hasHotJournal(Pager *pPager, int *pExists){ ** not to delete the journal file if it is already open due to ** journal_mode=PERSIST. */ - if( nPage==0 && !jrnlOpen ){ + if (nPage == 0 && !jrnlOpen) { sqlite3BeginBenignMalloc(); - if( pagerLockDb(pPager, RESERVED_LOCK)==SQLITE_OK ){ + if (pagerLockDb(pPager, RESERVED_LOCK) == SQLITE_OK) { sqlite3OsDelete(pVfs, pPager->zJournal, 0); - if( !pPager->exclusiveMode ) pagerUnlockDb(pPager, SHARED_LOCK); + if (!pPager->exclusiveMode) + pagerUnlockDb(pPager, SHARED_LOCK); } sqlite3EndBenignMalloc(); - }else{ + } 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; + if (!jrnlOpen) { + int f = SQLITE_OPEN_READONLY | SQLITE_OPEN_MAIN_JOURNAL; rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &f); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { u8 first = 0; - rc = sqlite3OsRead(pPager->jfd, (void *)&first, 1, 0); - if( rc==SQLITE_IOERR_SHORT_READ ){ + rc = sqlite3OsRead(pPager->jfd, (void*)&first, 1, 0); + if (rc == SQLITE_IOERR_SHORT_READ) { rc = SQLITE_OK; } - if( !jrnlOpen ){ + if (!jrnlOpen) { sqlite3OsClose(pPager->jfd); } - *pExists = (first!=0); - }else if( rc==SQLITE_CANTOPEN ){ + *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 @@ -59120,41 +58288,41 @@ static int hasHotJournal(Pager *pPager, int *pExists){ ** 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 */ +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 ); + 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 */ + 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 ); + 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 ); + 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 ){ + if (pPager->eLock <= SHARED_LOCK) { rc = hasHotJournal(pPager, &bHotJournal); } - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { goto failed; } - if( bHotJournal ){ - if( pPager->readOnly ){ + if (bHotJournal) { + if (pPager->readOnly) { rc = SQLITE_READONLY_ROLLBACK; goto failed; } @@ -59175,7 +58343,7 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ ** downgraded to SHARED_LOCK before this function returns. */ rc = pagerLockDb(pPager, EXCLUSIVE_LOCK); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { goto failed; } @@ -59192,18 +58360,17 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ ** 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 ){ + 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 ); + 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 ){ + assert(rc != SQLITE_OK || isOpen(pPager->jfd)); + if (rc == SQLITE_OK && fout & SQLITE_OPEN_READONLY) { rc = SQLITE_CANTOPEN_BKPT; sqlite3OsClose(pPager->jfd); } @@ -59218,18 +58385,18 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ ** 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 ); + if (isOpen(pPager->jfd)) { + assert(rc == SQLITE_OK); rc = pagerSyncHotJournal(pPager); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = pager_playback(pPager, !pPager->tempFile); pPager->eState = PAGER_OPEN; } - }else if( !pPager->exclusiveMode ){ + } else if (!pPager->exclusiveMode) { pagerUnlockDb(pPager, SHARED_LOCK); } - if( rc!=SQLITE_OK ){ + 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 @@ -59250,13 +58417,11 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ goto failed; } - assert( pPager->eState==PAGER_OPEN ); - assert( (pPager->eLock==SHARED_LOCK) - || (pPager->exclusiveMode && pPager->eLock>SHARED_LOCK) - ); + assert(pPager->eState == PAGER_OPEN); + assert((pPager->eLock == SHARED_LOCK) || (pPager->exclusiveMode && pPager->eLock > SHARED_LOCK)); } - if( !pPager->tempFile && pPager->hasHeldSharedLock ){ + 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 @@ -59277,14 +58442,14 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ 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 ){ + 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 ){ + if (memcmp(pPager->dbFileVers, dbFileVers, sizeof(dbFileVers)) != 0) { pager_reset(pPager); /* Unmap the database file. It is possible that external processes @@ -59293,7 +58458,7 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ ** 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) ){ + if (USEFETCH(pPager)) { sqlite3OsUnfetch(pPager->fd, 0, 0); } } @@ -59304,25 +58469,25 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ */ rc = pagerOpenWalIfPresent(pPager); #ifndef SQLITE_OMIT_WAL - assert( pPager->pWal==0 || rc==SQLITE_OK ); + assert(pPager->pWal == 0 || rc == SQLITE_OK); #endif } - if( pagerUseWal(pPager) ){ - assert( rc==SQLITE_OK ); + if (pagerUseWal(pPager)) { + assert(rc == SQLITE_OK); rc = pagerBeginReadTransaction(pPager); } - if( pPager->tempFile==0 && pPager->eState==PAGER_OPEN && rc==SQLITE_OK ){ + if (pPager->tempFile == 0 && pPager->eState == PAGER_OPEN && rc == SQLITE_OK) { rc = pagerPagecount(pPager, &pPager->dbSize); } - failed: - if( rc!=SQLITE_OK ){ - assert( !MEMDB ); +failed: + if (rc != SQLITE_OK) { + assert(!MEMDB); pager_unlock(pPager); - assert( pPager->eState==PAGER_OPEN ); - }else{ + assert(pPager->eState == PAGER_OPEN); + } else { pPager->eState = PAGER_READER; pPager->hasHeldSharedLock = 1; } @@ -59337,9 +58502,9 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ ** 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 */ +static void pagerUnlockIfUnused(Pager* pPager) { + if (sqlite3PcacheRefCount(pPager->pPCache) == 0) { + assert(pPager->nMmapOut == 0); /* because page1 is never memory mapped */ pagerUnlockAndRollback(pPager); } } @@ -59401,67 +58566,68 @@ static void pagerUnlockIfUnused(Pager *pPager){ ** 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 */ -){ +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; + 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 ); + 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; + if (pgno == 0) + return SQLITE_CORRUPT_BKPT; pBase = sqlite3PcacheFetch(pPager->pPCache, pgno, 3); - if( pBase==0 ){ + if (pBase == 0) { pPg = 0; rc = sqlite3PcacheFetchStress(pPager->pPCache, pgno, &pBase); - if( rc!=SQLITE_OK ) goto pager_acquire_err; - if( pBase==0 ){ + 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 ); + assert(pPg == (*ppPage)); + assert(pPg->pgno == pgno); + assert(pPg->pPager == pPager || pPg->pPager == 0); - noContent = (flags & PAGER_GET_NOCONTENT)!=0; - if( pPg->pPager && !noContent ){ + 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) ); + assert(pgno != PAGER_SJ_PGNO(pPager)); pPager->aStat[PAGER_STAT_HIT]++; return SQLITE_OK; - }else{ + } 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) ){ + 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 ){ + assert(!isOpen(pPager->fd) || !MEMDB); + if (!isOpen(pPager->fd) || pPager->dbSize < pgno || noContent) { + if (pgno > pPager->mxPgno) { rc = SQLITE_FULL; goto pager_acquire_err; } - if( noContent ){ + 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 @@ -59469,21 +58635,21 @@ static int getPageNormal( ** a bit in a bit vector. */ sqlite3BeginBenignMalloc(); - if( pgno<=pPager->dbOrigSize ){ - TESTONLY( rc = ) sqlite3BitvecSet(pPager->pInJournal, pgno); - testcase( rc==SQLITE_NOMEM ); + if (pgno <= pPager->dbOrigSize) { + TESTONLY(rc =) sqlite3BitvecSet(pPager->pInJournal, pgno); + testcase(rc == SQLITE_NOMEM); } - TESTONLY( rc = ) addToSavepointBitvecs(pPager, 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 ); + } else { + assert(pPg->pPager == pPager); pPager->aStat[PAGER_STAT_MISS]++; rc = readDbPage(pPg); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { goto pager_acquire_err; } } @@ -59492,8 +58658,8 @@ static int getPageNormal( return SQLITE_OK; pager_acquire_err: - assert( rc!=SQLITE_OK ); - if( pPg ){ + assert(rc != SQLITE_OK); + if (pPg) { sqlite3PcacheDrop(pPg); } pagerUnlockIfUnused(pPager); @@ -59501,68 +58667,63 @@ static int getPageNormal( return rc; } -#if SQLITE_MAX_MMAP_SIZE>0 +#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 */ -){ +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 */ + 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)) - ); + const int bMmapOk = (pgno > 1 && (pPager->eState == PAGER_READER || (flags & PAGER_GET_READONLY))); - assert( USEFETCH(pPager) ); + assert(USEFETCH(pPager)); /* 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 ){ + 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 ); + assert(pPager->eState >= PAGER_READER); + assert(assert_pager_state(pPager)); + assert(pPager->hasHeldSharedLock == 1); + assert(pPager->errCode == SQLITE_OK); - if( bMmapOk && pagerUseWal(pPager) ){ + if (bMmapOk && pagerUseWal(pPager)) { rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iFrame); - if( rc!=SQLITE_OK ){ + 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 ){ + 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 ){ + if (pPg == 0) { rc = pagerAcquireMapPage(pPager, pgno, pData, &pPg); - }else{ - sqlite3OsUnfetch(pPager->fd, (i64)(pgno-1)*pPager->pageSize, pData); + } else { + sqlite3OsUnfetch(pPager->fd, (i64)(pgno - 1) * pPager->pageSize, pData); } - if( pPg ){ - assert( rc==SQLITE_OK ); + if (pPg) { + assert(rc == SQLITE_OK); *ppPage = pPg; return SQLITE_OK; } } - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { *ppPage = 0; return rc; } @@ -59572,28 +58733,25 @@ static int getPageMMap( #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 */ -){ +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 ); + 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 */ -){ + */ +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); } @@ -59609,14 +58767,15 @@ SQLITE_PRIVATE int sqlite3PagerGet( ** 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 ); +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; + assert(pPage == 0 || pPager->hasHeldSharedLock); + if (pPage == 0) + return 0; return sqlite3PcacheFetchFinish(pPager->pPCache, pgno, pPage); } @@ -59632,26 +58791,27 @@ SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno){ ** 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 */ +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{ + } else { sqlite3PcacheRelease(pPg); } /* Do not use this routine to release the last reference to page1 */ - assert( sqlite3PcacheRefCount(pPager->pPCache)>0 ); + assert(sqlite3PcacheRefCount(pPager->pPCache) > 0); } -SQLITE_PRIVATE void sqlite3PagerUnref(DbPage *pPg){ - if( pPg ) sqlite3PagerUnrefNotNull(pPg); +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 */ +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); @@ -59679,37 +58839,38 @@ SQLITE_PRIVATE void sqlite3PagerUnrefPageOne(DbPage *pPg){ ** 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 */ +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 ); + 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 (NEVER(pPager->errCode)) + return pPager->errCode; - if( !pagerUseWal(pPager) && pPager->journalMode!=PAGER_JOURNALMODE_OFF ){ + if (!pagerUseWal(pPager) && pPager->journalMode != PAGER_JOURNALMODE_OFF) { pPager->pInJournal = sqlite3BitvecCreate(pPager->dbSize); - if( pPager->pInJournal==0 ){ + 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 ){ + if (!isOpen(pPager->jfd)) { + if (pPager->journalMode == PAGER_JOURNALMODE_MEMORY) { sqlite3MemJournalOpen(pPager->jfd); - }else{ - int flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; + } else { + int flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE; int nSpill; - if( pPager->tempFile ){ - flags |= (SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL); + if (pPager->tempFile) { + flags |= (SQLITE_OPEN_DELETEONCLOSE | SQLITE_OPEN_TEMP_JOURNAL); nSpill = sqlite3Config.nStmtSpill; - }else{ + } else { flags |= SQLITE_OPEN_MAIN_JOURNAL; nSpill = jrnlBufferSize(pPager); } @@ -59717,20 +58878,17 @@ static int pager_open_journal(Pager *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 - ); + if (rc == SQLITE_OK) { + rc = sqlite3JournalOpen(pVfs, pPager->zJournal, pPager->jfd, flags, nSpill); } } - assert( rc!=SQLITE_OK || isOpen(pPager->jfd) ); + 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 ){ + if (rc == SQLITE_OK) { /* TODO: Check if all of these are really required. */ pPager->nRec = 0; pPager->journalOff = 0; @@ -59740,12 +58898,12 @@ static int pager_open_journal(Pager *pPager){ } } - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { sqlite3BitvecDestroy(pPager->pInJournal); pPager->pInJournal = 0; pPager->journalOff = 0; - }else{ - assert( pPager->eState==PAGER_WRITER_LOCKED ); + } else { + assert(pPager->eState == PAGER_WRITER_LOCKED); pPager->eState = PAGER_WRITER_CACHEMOD; } @@ -59769,23 +58927,24 @@ static int pager_open_journal(Pager *pPager){ ** 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){ +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->eStateerrCode) + return pPager->errCode; + assert(pPager->eState >= PAGER_READER && pPager->eState < PAGER_ERROR); pPager->subjInMemory = (u8)subjInMemory; - if( pPager->eState==PAGER_READER ){ - assert( pPager->pInJournal==0 ); + if (pPager->eState == PAGER_READER) { + assert(pPager->pInJournal == 0); - if( pagerUseWal(pPager) ){ + 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) ){ + if (pPager->exclusiveMode && sqlite3WalExclusiveMode(pPager->pWal, -1)) { rc = pagerLockDb(pPager, EXCLUSIVE_LOCK); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } (void)sqlite3WalExclusiveMode(pPager->pWal, 1); @@ -59797,19 +58956,19 @@ SQLITE_PRIVATE int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory ** holds the write-lock. If possible, the upper layer will call it. */ rc = sqlite3WalBeginWriteTransaction(pPager->pWal); - }else{ + } 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 ){ + if (rc == SQLITE_OK && exFlag) { rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); } } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { /* Change to WRITER_LOCKED state. ** ** WAL mode sets Pager.eState to PAGER_WRITER_LOCKED or CACHEMOD @@ -59826,9 +58985,9 @@ SQLITE_PRIVATE int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory 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) ); + 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))); @@ -59838,19 +58997,19 @@ SQLITE_PRIVATE int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory /* ** Write page pPg onto the end of the rollback journal. */ -static SQLITE_NOINLINE int pagerAddPageToRollbackJournal(PgHdr *pPg){ - Pager *pPager = pPg->pPager; +static SQLITE_NOINLINE int pagerAddPageToRollbackJournal(PgHdr* pPg) { + Pager* pPager = pPg->pPager; int rc; u32 cksum; - char *pData2; + 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(pPg->pgno != PAGER_SJ_PGNO(pPager)); - assert( pPager->journalHdr<=pPager->journalOff ); + assert(pPager->journalHdr <= pPager->journalOff); pData2 = pPg->pData; cksum = pager_cksum(pPager, (u8*)pData2); @@ -59864,27 +59023,28 @@ static SQLITE_NOINLINE int pagerAddPageToRollbackJournal(PgHdr *pPg){ 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)); + 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))); + 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 ); + assert(pPager->pInJournal != 0); rc = sqlite3BitvecSet(pPager->pInJournal, pPg->pgno); - testcase( rc==SQLITE_NOMEM ); - assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + testcase(rc == SQLITE_NOMEM); + assert(rc == SQLITE_OK || rc == SQLITE_NOMEM); rc |= addToSavepointBitvecs(pPager, pPg->pgno); - assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + assert(rc == SQLITE_OK || rc == SQLITE_NOMEM); return rc; } @@ -59895,21 +59055,18 @@ static SQLITE_NOINLINE int pagerAddPageToRollbackJournal(PgHdr *pPg){ ** Pager.pInJournal bitvec and the PagerSavepoint.pInSavepoint bitvecs ** of any open savepoints as appropriate. */ -static int pager_write(PgHdr *pPg){ - Pager *pPager = pPg->pPager; +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 ); + 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 @@ -59921,12 +59078,13 @@ static int pager_write(PgHdr *pPg){ ** 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 ){ + if (pPager->eState == PAGER_WRITER_LOCKED) { rc = pager_open_journal(pPager); - if( rc!=SQLITE_OK ) return rc; + if (rc != SQLITE_OK) + return rc; } - assert( pPager->eState>=PAGER_WRITER_CACHEMOD ); - assert( assert_pager_state(pPager) ); + assert(pPager->eState >= PAGER_WRITER_CACHEMOD); + assert(assert_pager_state(pPager)); /* Mark the page that is about to be modified as dirty. */ sqlite3PcacheMakeDirty(pPg); @@ -59935,23 +59093,19 @@ static int pager_write(PgHdr *pPg){ ** 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 ){ + 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 ){ + if (rc != SQLITE_OK) { return rc; } - }else{ - if( pPager->eState!=PAGER_WRITER_DBMOD ){ + } 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))); + PAGERTRACE(("APPEND %d page %d needSync=%d\n", PAGERID(pPager), pPg->pgno, ((pPg->flags & PGHDR_NEED_SYNC) ? 1 : 0))); } } @@ -59965,12 +59119,12 @@ static int pager_write(PgHdr *pPg){ /* 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 ){ + if (pPager->nSavepoint > 0) { rc = subjournalPageIfRequired(pPg); } /* Update the database size and return. */ - if( pPager->dbSizepgno ){ + if (pPager->dbSize < pPg->pgno) { pPager->dbSize = pPg->pgno; } return rc; @@ -59987,58 +59141,58 @@ static int pager_write(PgHdr *pPg){ ** 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){ +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); + 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 ); + 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; + 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{ + 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); + 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) ){ + for (ii = 0; ii < nPage && rc == SQLITE_OK; ii++) { + Pgno pg = pg1 + ii; + PgHdr* pPage; + if (pg == pPg->pgno || !sqlite3BitvecTest(pPager->pInJournal, pg)) { + if (pg != PAGER_SJ_PGNO(pPager)) { rc = sqlite3PagerGet(pPager, pg, &pPage, 0); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = pager_write(pPage); - if( pPage->flags&PGHDR_NEED_SYNC ){ + if (pPage->flags & PGHDR_NEED_SYNC) { needSync = 1; } sqlite3PagerUnrefNotNull(pPage); } } - }else if( (pPage = sqlite3PagerLookup(pPager, pg))!=0 ){ - if( pPage->flags&PGHDR_NEED_SYNC ){ + } else if ((pPage = sqlite3PagerLookup(pPager, pg)) != 0) { + if (pPage->flags & PGHDR_NEED_SYNC) { needSync = 1; } sqlite3PagerUnrefNotNull(pPage); @@ -60051,18 +59205,18 @@ static SQLITE_NOINLINE int pagerWriteLargeSector(PgHdr *pPg){ ** 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 ); + assert((pPager->doNotSpill & SPILLFLAG_NOSYNC) != 0); pPager->doNotSpill &= ~SPILLFLAG_NOSYNC; return rc; } @@ -60081,20 +59235,21 @@ static SQLITE_NOINLINE int pagerWriteLargeSector(PgHdr *pPg){ ** 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); +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 ){ + } else if (pPager->errCode) { return pPager->errCode; - }else if( pPager->sectorSize > (u32)pPager->pageSize ){ - assert( pPager->tempFile==0 ); + } else if (pPager->sectorSize > (u32)pPager->pageSize) { + assert(pPager->tempFile == 0); return pagerWriteLargeSector(pPg); - }else{ + } else { return pager_write(pPg); } } @@ -60105,7 +59260,7 @@ SQLITE_PRIVATE int sqlite3PagerWrite(PgHdr *pPg){ ** to change the content of the page. */ #ifndef NDEBUG -SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage *pPg){ +SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage* pPg) { return pPg->flags & PGHDR_WRITEABLE; } #endif @@ -60130,14 +59285,14 @@ SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage *pPg){ ** 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 ){ +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 ); + testcase(pPg->flags & PGHDR_NEED_SYNC); pager_set_pagehash(pPg); } } @@ -60164,13 +59319,11 @@ SQLITE_PRIVATE void sqlite3PagerDontWrite(PgHdr *pPg){ ** by writing an updated version of page 1 using a call to the ** sqlite3OsWrite() function. */ -static int pager_incr_changecounter(Pager *pPager, int isDirectMode){ +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) ); + 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 @@ -60183,53 +59336,53 @@ static int pager_incr_changecounter(Pager *pPager, int isDirectMode){ ** "if( isDirect )" condition. */ #ifndef SQLITE_ENABLE_ATOMIC_WRITE -# define DIRECT_MODE 0 - assert( isDirectMode==0 ); +#define DIRECT_MODE 0 + assert(isDirectMode == 0); UNUSED_PARAMETER(isDirectMode); #else -# define DIRECT_MODE isDirectMode +#define DIRECT_MODE isDirectMode #endif - if( !pPager->changeCountDone && ALWAYS(pPager->dbSize>0) ){ - PgHdr *pPgHdr; /* Reference to page 1 */ + if (!pPager->changeCountDone && ALWAYS(pPager->dbSize > 0)) { + PgHdr* pPgHdr; /* Reference to page 1 */ - assert( !pPager->tempFile && isOpen(pPager->fd) ); + 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 ); + 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) ){ + if (!DIRECT_MODE && ALWAYS(rc == SQLITE_OK)) { rc = sqlite3PagerWrite(pPgHdr); } - if( rc==SQLITE_OK ){ + 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 ); + if (DIRECT_MODE) { + const void* zBuf; + assert(pPager->dbFileSize > 0); zBuf = pPgHdr->pData; - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = sqlite3OsWrite(pPager->fd, zBuf, pPager->pageSize, 0); pPager->aStat[PAGER_STAT_WRITE]++; } - if( rc==SQLITE_OK ){ + 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]; + const void* pCopy = (const void*)&((const char*)zBuf)[24]; memcpy(&pPager->dbFileVers, pCopy, sizeof(pPager->dbFileVers)); pPager->changeCountDone = 1; } - }else{ + } else { pPager->changeCountDone = 1; } } @@ -60247,13 +59400,14 @@ static int pager_incr_changecounter(Pager *pPager, int isDirectMode){ ** 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){ +SQLITE_PRIVATE int sqlite3PagerSync(Pager* pPager, const char* zSuper) { int rc = SQLITE_OK; - void *pArg = (void*)zSuper; + 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 ); + if (rc == SQLITE_NOTFOUND) + rc = SQLITE_OK; + if (rc == SQLITE_OK && !pPager->noSync) { + assert(!MEMDB); rc = sqlite3OsSync(pPager->fd, pPager->syncFlags); } return rc; @@ -60270,16 +59424,13 @@ SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager, const char *zSuper){ ** Otherwise, either SQLITE_BUSY or an SQLITE_IOERR_XXX error code is ** returned. */ -SQLITE_PRIVATE int sqlite3PagerExclusiveLock(Pager *pPager){ +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) ){ + 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); } } @@ -60312,72 +59463,69 @@ SQLITE_PRIVATE int sqlite3PagerExclusiveLock(Pager *pPager){ ** 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 */ +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) ); + 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; + 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; + if (sqlite3FaultSim(400)) + return SQLITE_IOERR; - PAGERTRACE(("DATABASE SYNC: File=%s zSuper=%s nSize=%d\n", - pPager->zFilename, zSuper, pPager->dbSize)); + 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->eStateeState < PAGER_WRITER_CACHEMOD) + return SQLITE_OK; - assert( MEMDB==0 || pPager->tempFile ); - assert( isOpen(pPager->fd) || pPager->tempFile ); - if( 0==pagerFlushOnCommit(pPager, 1) ){ + assert(MEMDB == 0 || pPager->tempFile); + 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; + } else { + PgHdr* pList; + if (pagerUseWal(pPager)) { + PgHdr* pPageOne = 0; pList = sqlite3PcacheDirtyList(pPager->pPCache); - if( pList==0 ){ + 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) ){ + assert(rc == SQLITE_OK); + if (ALWAYS(pList)) { rc = pagerWalFrames(pPager, pList, pPager->dbSize, 1); } sqlite3PagerUnref(pPageOne); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { sqlite3PcacheCleanAll(pPager->pPCache); } - }else{ + } 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); + 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 +#define bBatch 0 #endif #ifdef SQLITE_ENABLE_ATOMIC_WRITE @@ -60404,17 +59552,11 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( ** 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) - ){ + 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 @@ -60422,31 +59564,34 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( ** property of the host file-system, this is safe. */ rc = pager_incr_changecounter(pPager, 1); - }else{ + } else { rc = sqlite3JournalCreate(pPager->jfd); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = pager_incr_changecounter(pPager, 0); } } } -#else /* SQLITE_ENABLE_ATOMIC_WRITE */ +#else /* SQLITE_ENABLE_ATOMIC_WRITE */ #ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE - if( zSuper ){ + if (zSuper) { rc = sqlite3JournalCreate(pPager->jfd); - if( rc!=SQLITE_OK ) goto commit_phase_one_exit; - assert( bBatch==0 ); + 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; + 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; + 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 @@ -60460,40 +59605,41 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( ** 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; + if (rc != SQLITE_OK) + goto commit_phase_one_exit; pList = sqlite3PcacheDirtyList(pPager->pPCache); #ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE - if( bBatch ){ + if (bBatch) { rc = sqlite3OsFileControl(fd, SQLITE_FCNTL_BEGIN_ATOMIC_WRITE, 0); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = pager_write_pagelist(pPager, pList); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = sqlite3OsFileControl(fd, SQLITE_FCNTL_COMMIT_ATOMIC_WRITE, 0); } - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { sqlite3OsFileControlHint(fd, SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE, 0); } } - if( (rc&0xFF)==SQLITE_IOERR && rc!=SQLITE_IOERR_NOMEM ){ + if ((rc & 0xFF) == SQLITE_IOERR && rc != SQLITE_IOERR_NOMEM) { rc = sqlite3JournalCreate(pPager->jfd); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { sqlite3OsClose(pPager->jfd); goto commit_phase_one_exit; } bBatch = 0; - }else{ + } else { sqlite3OsClose(pPager->jfd); } } #endif /* SQLITE_ENABLE_BATCH_ATOMIC_WRITE */ - if( bBatch==0 ){ + if (bBatch == 0) { rc = pager_write_pagelist(pPager, pList); } - if( rc!=SQLITE_OK ){ - assert( rc!=SQLITE_IOERR_BLOCKED ); + if (rc != SQLITE_OK) { + assert(rc != SQLITE_IOERR_BLOCKED); goto commit_phase_one_exit; } sqlite3PcacheCleanAll(pPager->pPCache); @@ -60504,15 +59650,16 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( ** 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 ); + 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; + if (rc != SQLITE_OK) + goto commit_phase_one_exit; } /* Finally, sync the database file. */ - if( !noSync ){ + if (!noSync) { rc = sqlite3PagerSync(pPager, zSuper); } IOTRACE(("DBSYNC %p\n", pPager)) @@ -60520,13 +59667,12 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( } commit_phase_one_exit: - if( rc==SQLITE_OK && !pagerUseWal(pPager) ){ + 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 @@ -60542,20 +59688,19 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( ** 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 */ +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; + 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) ); + 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 @@ -60568,11 +59713,8 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager *pPager){ ** 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 ); + 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; } @@ -60608,27 +59750,30 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager *pPager){ ** 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 */ +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; + assert(assert_pager_state(pPager)); + if (pPager->eState == PAGER_ERROR) + return pPager->errCode; + if (pPager->eState <= PAGER_READER) + return SQLITE_OK; - if( pagerUseWal(pPager) ){ + 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 ){ + 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 ){ + 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. @@ -60638,15 +59783,13 @@ SQLITE_PRIVATE int sqlite3PagerRollback(Pager *pPager){ setGetterMethod(pPager); return rc; } - }else{ + } 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 - ); + 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. @@ -60658,7 +59801,7 @@ SQLITE_PRIVATE int sqlite3PagerRollback(Pager *pPager){ ** 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){ +SQLITE_PRIVATE u8 sqlite3PagerIsreadonly(Pager* pPager) { return pPager->readOnly; } @@ -60666,7 +59809,7 @@ SQLITE_PRIVATE u8 sqlite3PagerIsreadonly(Pager *pPager){ /* ** Return the sum of the reference counts for all pages held by pPager. */ -SQLITE_PRIVATE int sqlite3PagerRefcount(Pager *pPager){ +SQLITE_PRIVATE int sqlite3PagerRefcount(Pager* pPager) { return sqlite3PcacheRefCount(pPager->pPCache); } #endif @@ -60675,18 +59818,15 @@ SQLITE_PRIVATE int sqlite3PagerRefcount(Pager *pPager){ ** 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; +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){ +SQLITE_PRIVATE int sqlite3PagerPageRefcount(DbPage* pPage) { return sqlite3PcachePageRefcount(pPage); } @@ -60694,17 +59834,17 @@ SQLITE_PRIVATE int sqlite3PagerPageRefcount(DbPage *pPage){ /* ** This routine is used for testing and analysis only. */ -SQLITE_PRIVATE int *sqlite3PagerStats(Pager *pPager){ +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[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[8] = 0; /* Used to be pPager->nOvfl */ a[9] = pPager->nRead; a[10] = pPager->aStat[PAGER_STAT_WRITE]; return a; @@ -60722,22 +59862,18 @@ SQLITE_PRIVATE int *sqlite3PagerStats(Pager *pPager){ ** 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){ +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(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 ); + 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 ){ + if (reset) { pPager->aStat[eStat] = 0; } } @@ -60745,7 +59881,7 @@ SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *pPager, int eStat, int reset, i /* ** Return true if this is an in-memory or temp-file backed pager. */ -SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager *pPager){ +SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager* pPager) { return pPager->tempFile || pPager->memVfs; } @@ -60759,64 +59895,61 @@ SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager *pPager){ ** 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 */ +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 ); + 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 ){ + aNew = (PagerSavepoint*)sqlite3Realloc(pPager->aSavepoint, sizeof(PagerSavepoint) * nSavepoint); + if (!aNew) { return SQLITE_NOMEM_BKPT; } - memset(&aNew[nCurrent], 0, (nSavepoint-nCurrent) * sizeof(PagerSavepoint)); + 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 ){ + if (isOpen(pPager->jfd) && pPager->journalOff > 0) { aNew[ii].iOffset = pPager->journalOff; - }else{ + } 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 ){ + if (!aNew[ii].pInSavepoint) { return SQLITE_NOMEM_BKPT; } - if( pagerUseWal(pPager) ){ + if (pagerUseWal(pPager)) { sqlite3WalSavepoint(pPager->pWal, aNew[ii].aWalData); } - pPager->nSavepoint = ii+1; + pPager->nSavepoint = ii + 1; } - assert( pPager->nSavepoint==nSavepoint ); + 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) ); +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 ){ + if (nSavepoint > pPager->nSavepoint && pPager->useJournal) { return pagerOpenSavepoint(pPager, nSavepoint); - }else{ + } 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 @@ -60847,40 +59980,41 @@ SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int nSavepoint){ ** 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){ +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; + if (op == SAVEPOINT_RELEASE) + rc = SQLITE_OK; #endif - assert( op==SAVEPOINT_RELEASE || op==SAVEPOINT_ROLLBACK ); - assert( iSavepoint>=0 || op==SAVEPOINT_ROLLBACK ); + 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. */ + if (rc == SQLITE_OK && iSavepoint < pPager->nSavepoint) { + 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++){ + nNew = iSavepoint + ((op == SAVEPOINT_RELEASE) ? 0 : 1); + for (ii = nNew; ii < pPager->nSavepoint; 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) ){ + 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; + if (sqlite3JournalIsInMemory(pPager->sjfd)) { + i64 sz = (pPager->pageSize + 4) * (i64)pRel->iSubRec; rc = sqlite3OsTruncate(pPager->sjfd, sz); - assert( rc==SQLITE_OK ); + assert(rc == SQLITE_OK); } pPager->nSubRec = pRel->iSubRec; } @@ -60890,10 +60024,10 @@ SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){ ** 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]; + else if (pagerUseWal(pPager) || isOpen(pPager->jfd)) { + PagerSavepoint* pSavepoint = (nNew == 0) ? 0 : &pPager->aSavepoint[nNew - 1]; rc = pagerPlaybackSavepoint(pPager, pSavepoint); - assert(rc!=SQLITE_DONE); + assert(rc != SQLITE_DONE); } #ifdef SQLITE_ENABLE_ZIPVFS @@ -60901,10 +60035,7 @@ SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){ ** 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 - ){ + else if (pPager->journalMode == PAGER_JOURNALMODE_OFF && pPager->eState >= PAGER_WRITER_CACHEMOD) { pPager->errCode = SQLITE_ABORT; pPager->eState = PAGER_ERROR; setGetterMethod(pPager); @@ -60928,15 +60059,15 @@ SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){ ** 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 }; +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){ +SQLITE_PRIVATE sqlite3_vfs* sqlite3PagerVfs(Pager* pPager) { return pPager->pVfs; } @@ -60945,7 +60076,7 @@ SQLITE_PRIVATE sqlite3_vfs *sqlite3PagerVfs(Pager *pPager){ ** with the pager. This might return NULL if the file has ** not yet been opened. */ -SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager *pPager){ +SQLITE_PRIVATE sqlite3_file* sqlite3PagerFile(Pager* pPager) { return pPager->fd; } @@ -60953,7 +60084,7 @@ SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager *pPager){ ** 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){ +SQLITE_PRIVATE sqlite3_file* sqlite3PagerJrnlFile(Pager* pPager) { #if SQLITE_OMIT_WAL return pPager->jfd; #else @@ -60964,7 +60095,7 @@ SQLITE_PRIVATE sqlite3_file *sqlite3PagerJrnlFile(Pager *pPager){ /* ** Return the full pathname of the journal file. */ -SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager *pPager){ +SQLITE_PRIVATE const char* sqlite3PagerJournalname(Pager* pPager) { return pPager->zJournal; } @@ -60994,25 +60125,24 @@ SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager *pPager){ ** 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 */ +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) ); + 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 ){ + assert(pPager->tempFile || !MEMDB); + if (pPager->tempFile) { rc = sqlite3PagerWrite(pPg); - if( rc ) return rc; + if (rc) + return rc; } /* If the page being moved is dirty and has not been saved by the latest @@ -61033,14 +60163,11 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i ** 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)) - ){ + 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)); + 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 @@ -61050,11 +60177,10 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i ** 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 ){ + 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 ); + 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 @@ -61064,18 +60190,18 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i */ pPg->flags &= ~PGHDR_NEED_SYNC; pPgOld = sqlite3PagerLookup(pPager, pgno); - assert( !pPgOld || pPgOld->nRef==1 || CORRUPT_DB ); - if( pPgOld ){ - if( NEVER(pPgOld->nRef>1) ){ + 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 ){ + 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{ + sqlite3PcacheMove(pPgOld, pPager->dbSize + 1); + } else { sqlite3PcacheDrop(pPgOld); } } @@ -61088,12 +60214,12 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i ** 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 ){ + if (pPager->tempFile && pPgOld) { sqlite3PcacheMove(pPgOld, origPgno); sqlite3PagerUnrefNotNull(pPgOld); } - if( needSyncPgno ){ + 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 @@ -61108,11 +60234,11 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i ** 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; + PgHdr* pPgHdr; rc = sqlite3PagerGet(pPager, needSyncPgno, &pPgHdr, 0); - if( rc!=SQLITE_OK ){ - if( needSyncPgno<=pPager->dbOrigSize ){ - assert( pPager->pTmpSpace!=0 ); + if (rc != SQLITE_OK) { + if (needSyncPgno <= pPager->dbOrigSize) { + assert(pPager->pTmpSpace != 0); sqlite3BitvecClear(pPager->pInJournal, needSyncPgno, pPager->pTmpSpace); } return rc; @@ -61132,8 +60258,8 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i ** 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 ); +SQLITE_PRIVATE void sqlite3PagerRekey(DbPage* pPg, Pgno iNew, u16 flags) { + assert(pPg->pgno != iNew); pPg->flags = flags; sqlite3PcacheMove(pPg, iNew); } @@ -61141,8 +60267,8 @@ SQLITE_PRIVATE void sqlite3PagerRekey(DbPage *pPg, Pgno iNew, u16 flags){ /* ** Return a pointer to the data for the specified page. */ -SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *pPg){ - assert( pPg->nRef>0 || pPg->pPager->memDb ); +SQLITE_PRIVATE void* sqlite3PagerGetData(DbPage* pPg) { + assert(pPg->nRef > 0 || pPg->pPager->memDb); return pPg->pData; } @@ -61150,7 +60276,7 @@ SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *pPg){ ** Return a pointer to the Pager.nExtra bytes of "extra" space ** allocated along with the specified page. */ -SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *pPg){ +SQLITE_PRIVATE void* sqlite3PagerGetExtra(DbPage* pPg) { return pPg->pExtra; } @@ -61164,14 +60290,12 @@ SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *pPg){ ** 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) ){ +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; @@ -61197,52 +60321,52 @@ SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *pPager, int eMode){ ** ** The returned indicate the current (possibly updated) journal-mode. */ -SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){ - u8 eOld = pPager->journalMode; /* Prior journalmode */ +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 */ ); + 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 ); + 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 ){ + 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 ){ + if (eMode != eOld) { /* Change the journal mode. */ - assert( pPager->eState!=PAGER_ERROR ); + 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 ){ + 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. @@ -61252,30 +60376,30 @@ SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){ ** while it is in use by some other client. */ sqlite3OsClose(pPager->jfd); - if( pPager->eLock>=RESERVED_LOCK ){ + if (pPager->eLock >= RESERVED_LOCK) { sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0); - }else{ + } else { int rc = SQLITE_OK; int state = pPager->eState; - assert( state==PAGER_OPEN || state==PAGER_READER ); - if( state==PAGER_OPEN ){ + assert(state == PAGER_OPEN || state == PAGER_READER); + if (state == PAGER_OPEN) { rc = sqlite3PagerSharedLock(pPager); } - if( pPager->eState==PAGER_READER ){ - assert( rc==SQLITE_OK ); + if (pPager->eState == PAGER_READER) { + assert(rc == SQLITE_OK); rc = pagerLockDb(pPager, RESERVED_LOCK); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0); } - if( rc==SQLITE_OK && state==PAGER_READER ){ + if (rc == SQLITE_OK && state == PAGER_READER) { pagerUnlockDb(pPager, SHARED_LOCK); - }else if( state==PAGER_OPEN ){ + } else if (state == PAGER_OPEN) { pager_unlock(pPager); } - assert( state==pPager->eState ); + assert(state == pPager->eState); } - }else if( eMode==PAGER_JOURNALMODE_OFF ){ + } else if (eMode == PAGER_JOURNALMODE_OFF) { sqlite3OsClose(pPager->jfd); } } @@ -61287,7 +60411,7 @@ SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){ /* ** Return the current journal mode. */ -SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager *pPager){ +SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager* pPager) { return (int)pPager->journalMode; } @@ -61296,10 +60420,12 @@ SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager *pPager){ ** 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( isOpen(pPager->jfd) && pPager->journalOff>0 ) return 0; +SQLITE_PRIVATE int sqlite3PagerOkToChangeJournalMode(Pager* pPager) { + assert(assert_pager_state(pPager)); + if (pPager->eState >= PAGER_WRITER_CACHEMOD) + return 0; + if (isOpen(pPager->jfd) && pPager->journalOff > 0) + return 0; return 1; } @@ -61309,8 +60435,8 @@ SQLITE_PRIVATE int sqlite3PagerOkToChangeJournalMode(Pager *pPager){ ** 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 ){ +SQLITE_PRIVATE i64 sqlite3PagerJournalSizeLimit(Pager* pPager, i64 iLimit) { + if (iLimit >= -1) { pPager->journalSizeLimit = iLimit; sqlite3WalLimit(pPager->pWal, iLimit); } @@ -61323,7 +60449,7 @@ SQLITE_PRIVATE i64 sqlite3PagerJournalSizeLimit(Pager *pPager, i64 iLimit){ ** uses it opaquely as an argument to sqlite3BackupRestart() and ** sqlite3BackupUpdate() only. */ -SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager *pPager){ +SQLITE_PRIVATE sqlite3_backup** sqlite3PagerBackupPtr(Pager* pPager) { return &pPager->pBackup; } @@ -61331,13 +60457,13 @@ SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager *pPager){ /* ** 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); +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", @@ -61346,15 +60472,14 @@ SQLITE_PRIVATE void sqlite3PagerClearCache(Pager *pPager){ ** ** 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 */ -){ +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 ){ + 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 @@ -61364,20 +60489,16 @@ SQLITE_PRIVATE int sqlite3PagerCheckpoint( ** 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 - ); + 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){ +SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager* pPager) { return sqlite3WalCallback(pPager->pWal); } @@ -61385,22 +60506,23 @@ SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager){ ** 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); +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 */ +static int pagerExclusiveLock(Pager* pPager) { + int rc; /* Return code */ - assert( pPager->eLock==SHARED_LOCK || pPager->eLock==EXCLUSIVE_LOCK ); + assert(pPager->eLock == SHARED_LOCK || pPager->eLock == EXCLUSIVE_LOCK); rc = pagerLockDb(pPager, EXCLUSIVE_LOCK); - if( rc!=SQLITE_OK ){ + 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); @@ -61415,36 +60537,32 @@ static int pagerExclusiveLock(Pager *pPager){ ** 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){ +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 ); + 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 ){ + 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 - ); + 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. @@ -61460,30 +60578,30 @@ static int pagerOpenWal(Pager *pPager){ ** 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 */ +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) ); + 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; + 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 ){ + if (rc == SQLITE_OK) { pPager->journalMode = PAGER_JOURNALMODE_WAL; pPager->eState = PAGER_OPEN; } - }else{ + } else { *pbOpen = 1; } @@ -61499,24 +60617,22 @@ SQLITE_PRIVATE int sqlite3PagerOpenWal( ** 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){ +SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager* pPager, sqlite3* db) { int rc = SQLITE_OK; - assert( pPager->journalMode==PAGER_JOURNALMODE_WAL ); + 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 ){ + 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) { + rc = sqlite3OsAccess(pPager->pVfs, pPager->zWal, SQLITE_ACCESS_EXISTS, &logexists); } - if( rc==SQLITE_OK && logexists ){ + if (rc == SQLITE_OK && logexists) { rc = pagerOpenWal(pPager); } } @@ -61524,14 +60640,14 @@ SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager, sqlite3 *db){ /* 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 ){ + 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); + 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); + if (rc && !pPager->exclusiveMode) + pagerUnlockDb(pPager, SHARED_LOCK); } } return rc; @@ -61544,9 +60660,9 @@ SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager, sqlite3 *db){ ** 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){ +SQLITE_PRIVATE int sqlite3PagerWalWriteLock(Pager* pPager, int bLock) { int rc = SQLITE_OK; - if( pagerUseWal(pPager) && pPager->exclusiveMode==0 ){ + if (pagerUseWal(pPager) && pPager->exclusiveMode == 0) { rc = sqlite3WalWriteLock(pPager->pWal, bLock); } return rc; @@ -61556,8 +60672,8 @@ SQLITE_PRIVATE int sqlite3PagerWalWriteLock(Pager *pPager, int bLock){ ** 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) ){ +SQLITE_PRIVATE void sqlite3PagerWalDb(Pager* pPager, sqlite3* db) { + if (pagerUseWal(pPager)) { sqlite3WalDb(pPager->pWal, db); } } @@ -61568,9 +60684,9 @@ SQLITE_PRIVATE void sqlite3PagerWalDb(Pager *pPager, sqlite3 *db){ ** 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){ +SQLITE_PRIVATE int sqlite3PagerSnapshotGet(Pager* pPager, sqlite3_snapshot** ppSnapshot) { int rc = SQLITE_ERROR; - if( pPager->pWal ){ + if (pPager->pWal) { rc = sqlite3WalSnapshotGet(pPager->pWal, ppSnapshot); } return rc; @@ -61581,14 +60697,11 @@ SQLITE_PRIVATE int sqlite3PagerSnapshotGet(Pager *pPager, sqlite3_snapshot **ppS ** 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 -){ +SQLITE_PRIVATE int sqlite3PagerSnapshotOpen(Pager* pPager, sqlite3_snapshot* pSnapshot) { int rc = SQLITE_OK; - if( pPager->pWal ){ + if (pPager->pWal) { sqlite3WalSnapshotOpen(pPager->pWal, pSnapshot); - }else{ + } else { rc = SQLITE_ERROR; } return rc; @@ -61598,11 +60711,11 @@ SQLITE_PRIVATE int sqlite3PagerSnapshotOpen( ** If this is a WAL database, call sqlite3WalSnapshotRecover(). If this ** is not a WAL database, return an error. */ -SQLITE_PRIVATE int sqlite3PagerSnapshotRecover(Pager *pPager){ +SQLITE_PRIVATE int sqlite3PagerSnapshotRecover(Pager* pPager) { int rc; - if( pPager->pWal ){ + if (pPager->pWal) { rc = sqlite3WalSnapshotRecover(pPager->pWal); - }else{ + } else { rc = SQLITE_ERROR; } return rc; @@ -61620,11 +60733,11 @@ SQLITE_PRIVATE int sqlite3PagerSnapshotRecover(Pager *pPager){ ** 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){ +SQLITE_PRIVATE int sqlite3PagerSnapshotCheck(Pager* pPager, sqlite3_snapshot* pSnapshot) { int rc; - if( pPager->pWal ){ + if (pPager->pWal) { rc = sqlite3WalSnapshotCheck(pPager->pWal, pSnapshot); - }else{ + } else { rc = SQLITE_ERROR; } return rc; @@ -61634,8 +60747,8 @@ SQLITE_PRIVATE int sqlite3PagerSnapshotCheck(Pager *pPager, sqlite3_snapshot *pS ** Release a lock obtained by an earlier successful call to ** sqlite3PagerSnapshotCheck(). */ -SQLITE_PRIVATE void sqlite3PagerSnapshotUnlock(Pager *pPager){ - assert( pPager->pWal ); +SQLITE_PRIVATE void sqlite3PagerSnapshotUnlock(Pager* pPager) { + assert(pPager->pWal); sqlite3WalSnapshotUnlock(pPager->pWal); } @@ -61650,8 +60763,8 @@ SQLITE_PRIVATE void sqlite3PagerSnapshotUnlock(Pager *pPager){ ** 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 ); +SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager* pPager) { + assert(pPager->eState >= PAGER_READER); return sqlite3WalFramesize(pPager->pWal); } #endif @@ -61918,9 +61031,11 @@ SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){ */ #if defined(SQLITE_TEST) && defined(SQLITE_DEBUG) SQLITE_PRIVATE int sqlite3WalTrace = 0; -# define WALTRACE(X) if(sqlite3WalTrace) sqlite3DebugPrintf X +#define WALTRACE(X) \ + if (sqlite3WalTrace) \ + sqlite3DebugPrintf X #else -# define WALTRACE(X) +#define WALTRACE(X) #endif /* @@ -61936,7 +61051,7 @@ SQLITE_PRIVATE int sqlite3WalTrace = 0; ** WALINDEX_MAX_VERSION, then no read-transaction is opened and SQLite ** returns SQLITE_CANTOPEN. */ -#define WAL_MAX_VERSION 3007000 +#define WAL_MAX_VERSION 3007000 #define WALINDEX_MAX_VERSION 3007000 /* @@ -61953,20 +61068,18 @@ SQLITE_PRIVATE int sqlite3WalTrace = 0; ** 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) - +#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. ** @@ -61981,17 +61094,17 @@ typedef struct WalCkptInfo WalCkptInfo; ** 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 */ + 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 */ }; /* @@ -62054,13 +61167,13 @@ struct WalIndexHdr { ** 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 */ + 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 +#define READMARK_NOT_USED 0xffffffff /* ** This is a schematic view of the complete 136-byte header of the @@ -62132,8 +61245,8 @@ struct WalCkptInfo { ** 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)) +#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 @@ -62157,63 +61270,61 @@ struct WalCkptInfo { ** 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) \ -) +#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 */ + 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 */ + u8 lockError; /* True if a locking error has occurred */ #endif #ifdef SQLITE_ENABLE_SNAPSHOT - WalIndexHdr *pSnapshot; /* Start transaction here if not NULL */ + WalIndexHdr* pSnapshot; /* Start transaction here if not NULL */ #endif #ifdef SQLITE_ENABLE_SETLK_TIMEOUT - sqlite3 *db; + sqlite3* db; #endif }; /* ** Candidate values for Wal.exclusiveMode. */ -#define WAL_NORMAL_MODE 0 -#define WAL_EXCLUSIVE_MODE 1 +#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 */ +#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 @@ -62237,15 +61348,15 @@ typedef u16 ht_slot; ** 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[] */ + 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 */ + 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 */ }; /* @@ -62256,21 +61367,19 @@ struct WalIterator { ** 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 */ +#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))) +#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) \ -) +#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 @@ -62290,61 +61399,56 @@ struct WalIterator { ** ** 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 */ -){ +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 ){ + 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)); + memset((void*)&apNew[pWal->nWiData], 0, sizeof(u32*) * (iPage + 1 - pWal->nWiData)); pWal->apWiData = apNew; - pWal->nWiData = iPage+1; + 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 ){ + 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 ){ + if (rc == SQLITE_READONLY) { rc = SQLITE_OK; } } } *ppPage = pWal->apWiData[iPage]; - assert( iPage==0 || *ppPage || rc!=SQLITE_OK ); + 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 ){ +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; @@ -62353,16 +61457,16 @@ static int walIndexPage( /* ** 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]); +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] ); +static volatile WalIndexHdr* walIndexHdr(Wal* pWal) { + assert(pWal->nWiData > 0 && pWal->apWiData[0]); return (volatile WalIndexHdr*)pWal->apWiData[0]; } @@ -62373,10 +61477,7 @@ static volatile WalIndexHdr *walIndexHdr(Wal *pWal){ ** 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) \ -) +#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 @@ -62387,39 +61488,38 @@ static volatile WalIndexHdr *walIndexHdr(Wal *pWal){ ** ** 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 */ -){ +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]; + u32* aData = (u32*)a; + u32* aEnd = (u32*)&a[nByte]; - if( aIn ){ + if (aIn) { s1 = aIn[0]; s2 = aIn[1]; - }else{ + } else { s1 = s2 = 0; } - assert( nByte>=8 ); - assert( (nByte&0x00000007)==0 ); - assert( nByte<=65536 ); + assert(nByte >= 8); + assert((nByte & 0x00000007) == 0); + assert(nByte <= 65536); - if( nativeCksum ){ + if (nativeCksum) { do { s1 += *aData++ + s2; s2 += *aData++ + s1; - }while( aDataexclusiveMode!=WAL_HEAPMEMORY_MODE ){ +static void walShmBarrier(Wal* pWal) { + if (pWal->exclusiveMode != WAL_HEAPMEMORY_MODE) { sqlite3OsShmBarrier(pWal->pDbFd); } } @@ -62444,9 +61544,9 @@ static void walShmBarrier(Wal *pWal){ ** See tag-20200519-1. */ #if defined(__clang__) && !defined(SQLITE_NO_TSAN) -# define SQLITE_NO_TSAN __attribute__((no_sanitize_thread)) +#define SQLITE_NO_TSAN __attribute__((no_sanitize_thread)) #else -# define SQLITE_NO_TSAN +#define SQLITE_NO_TSAN #endif /* @@ -62454,11 +61554,11 @@ static void walShmBarrier(Wal *pWal){ ** ** The checksum on pWal->hdr is updated before it is written. */ -static SQLITE_NO_TSAN void walIndexWriteHdr(Wal *pWal){ - volatile WalIndexHdr *aHdr = walIndexHdr(pWal); +static SQLITE_NO_TSAN void walIndexWriteHdr(Wal* pWal) { + volatile WalIndexHdr* aHdr = walIndexHdr(pWal); const int nCksum = offsetof(WalIndexHdr, aCksum); - assert( pWal->writeLock ); + assert(pWal->writeLock); pWal->hdr.isInit = 1; pWal->hdr.iVersion = WALINDEX_MAX_VERSION; walChecksumBytes(1, (u8*)&pWal->hdr, nCksum, 0, pWal->hdr.aCksum); @@ -62481,28 +61581,27 @@ static SQLITE_NO_TSAN void walIndexWriteHdr(Wal *pWal){ ** 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 ); +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 ){ + if (pWal->iReCksum == 0) { memcpy(&aFrame[8], pWal->hdr.aSalt, 8); - nativeCksum = (pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN); + 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{ + } else { memset(&aFrame[8], 0, 16); } } @@ -62512,29 +61611,28 @@ static void walEncodeFrame( ** 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 ); +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 ){ + 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 ){ + if (pgno == 0) { return 0; } @@ -62543,12 +61641,10 @@ static int walDecodeFrame( ** and the frame-data matches the checksum in the last 8 ** bytes of this frame-header. */ - nativeCksum = (pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN); + 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]) - ){ + if (aCksum[0] != sqlite3Get4byte(&aFrame[16]) || aCksum[1] != sqlite3Get4byte(&aFrame[20])) { /* Checksum failed. */ return 0; } @@ -62561,29 +61657,26 @@ static int walDecodeFrame( 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 ){ +static const char* walLockName(int lockIdx) { + if (lockIdx == WAL_WRITE_LOCK) { return "WRITE-LOCK"; - }else if( lockIdx==WAL_CKPT_LOCK ){ + } else if (lockIdx == WAL_CKPT_LOCK) { return "CKPT-LOCK"; - }else if( lockIdx==WAL_RECOVER_LOCK ){ + } else if (lockIdx == WAL_RECOVER_LOCK) { return "RECOVER-LOCK"; - }else{ + } else { static char zName[15]; - sqlite3_snprintf(sizeof(zName), zName, "READ-LOCK[%d]", - lockIdx-WAL_READ_LOCK(0)); + 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 @@ -62591,38 +61684,35 @@ static const char *walLockName(int lockIdx){ ** ** In locking_mode=EXCLUSIVE, all of these routines become no-ops. */ -static int walLockShared(Wal *pWal, int lockIdx){ +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); + 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){ +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); ) + 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)); +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)); } /* @@ -62630,13 +61720,13 @@ static void walUnlockExclusive(Wal *pWal, int lockIdx, int n){ ** 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 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); +static int walNextHash(int iPriorHash) { + return (iPriorHash + 1) & (HASHTABLE_NSLOT - 1); } /* @@ -62646,9 +61736,9 @@ static int walNextHash(int iPriorHash){ */ 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*/ + 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*/ }; /* @@ -62665,25 +61755,24 @@ struct WalHashLoc { ** 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 */ +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 ); + 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)]; + 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 { + pLoc->iZero = HASHTABLE_NPAGE_ONE + (iHash - 1) * HASHTABLE_NPAGE; } - }else if( NEVER(rc==SQLITE_OK) ){ + } else if (NEVER(rc == SQLITE_OK)) { rc = SQLITE_ERROR; } return rc; @@ -62695,27 +61784,25 @@ static int walHashGet( ** 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 ); +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){ +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]; + 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]; + return pWal->apWiData[iHash][(iFrame - 1 - HASHTABLE_NPAGE_ONE) % HASHTABLE_NPAGE]; } /* @@ -62730,35 +61817,37 @@ static u32 walFramePgno(Wal *pWal, u32 iFrame){ ** 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[] */ +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 ); + 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; + 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)] ); + 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 */ + 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 ){ + assert(iLimit > 0); + for (i = 0; i < HASHTABLE_NSLOT; i++) { + if (sLoc.aHash[i] > iLimit) { sLoc.aHash[i] = 0; } } @@ -62766,55 +61855,55 @@ static void walCleanupHash(Wal *pWal){ /* 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); + 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 ); + assert(nByte >= 0); memset((void*)sLoc.aPgno, 0, nByte); } @@ -62824,17 +61913,18 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){ ** Remove the remnants of that writers uncommitted transaction from ** the hash-table before writing any new entries. */ - if( sLoc.aPgno[idx-1] ){ + if (sLoc.aPgno[idx - 1]) { walCleanupHash(pWal); - assert( !sLoc.aPgno[idx-1] ); + 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; + for (iKey = walHash(iPage); sLoc.aHash[iKey]; iKey = walNextHash(iKey)) { + if ((nCollide--) == 0) + return SQLITE_CORRUPT_BKPT; } - sLoc.aPgno[idx-1] = iPage; + sLoc.aPgno[idx - 1] = iPage; AtomicStore(&sLoc.aHash[iKey], (ht_slot)idx); #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT @@ -62842,10 +61932,13 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){ ** 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 ); + assert(pWal->ckptLock == 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 ){ + rc = walLockExclusive(pWal, iLock, WAL_READ_LOCK(0) - iLock); + if (rc) { return rc; } @@ -62908,26 +61999,26 @@ static int walIndexRecover(Wal *pWal){ memset(&pWal->hdr, 0, sizeof(WalIndexHdr)); rc = sqlite3OsFileSize(pWal->pWalFd, &nSize); - if( rc!=SQLITE_OK ){ + 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 */ + 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 ){ + if (rc != SQLITE_OK) { goto recovery_error; } @@ -62938,40 +62029,32 @@ static int walIndexRecover(Wal *pWal){ */ magic = sqlite3Get4byte(&aBuf[0]); szPage = sqlite3Get4byte(&aBuf[8]); - if( (magic&0xFFFFFFFE)!=WAL_MAGIC - || szPage&(szPage-1) - || szPage>SQLITE_MAX_PAGE_SIZE - || szPage<512 - ){ + if ((magic & 0xFFFFFFFE) != WAL_MAGIC || szPage & (szPage - 1) || szPage > SQLITE_MAX_PAGE_SIZE || szPage < 512) { goto finished; } - pWal->hdr.bigEndCksum = (u8)(magic&0x00000001); + 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]) - ){ + 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 ){ + 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 ){ + aFrame = (u8*)sqlite3_malloc64(szFrame + WALINDEX_PGSZ); + if (!aFrame) { rc = SQLITE_NOMEM_BKPT; goto recovery_error; } @@ -62980,43 +62063,47 @@ static int walIndexRecover(Wal *pWal){ /* 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); + 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; + assert(aShare != 0 || rc != SQLITE_OK); + if (aShare == 0) + break; pWal->apWiData[iPg] = aPrivate; - for(iFrame=iFirst; iFrame<=iLast; iFrame++){ + 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 */ + 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 (rc != SQLITE_OK) + break; isValid = walDecodeFrame(pWal, &pgno, &nTruncate, aData, aFrame); - if( !isValid ) break; + if (!isValid) + break; rc = walIndexAppend(pWal, iFrame, pgno); - if( NEVER(rc!=SQLITE_OK) ) break; + if (NEVER(rc != SQLITE_OK)) + break; /* If nTruncate is non-zero, this is a commit record. */ - if( nTruncate ){ + if (nTruncate) { pWal->hdr.mxFrame = iFrame; pWal->hdr.nPage = nTruncate; - pWal->hdr.szPage = (u16)((szPage&0xff00) | (szPage>>16)); - testcase( szPage<=32768 ); - testcase( szPage>=65536 ); + 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); + 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. @@ -63027,7 +62114,7 @@ static int walIndexRecover(Wal *pWal){ ** 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); + 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 @@ -63036,8 +62123,8 @@ static int walIndexRecover(Wal *pWal){ */ { int i; - for(i=nHdr32; ihdr.aFrameCksum[0] = aFrameCksum[0]; pWal->hdr.aFrameCksum[1] = aFrameCksum[1]; @@ -63068,16 +62156,16 @@ static int walIndexRecover(Wal *pWal){ pInfo->nBackfill = 0; pInfo->nBackfillAttempted = pWal->hdr.mxFrame; pInfo->aReadMark[0] = 0; - for(i=1; ihdr.mxFrame ){ + if (rc == SQLITE_OK) { + if (i == 1 && pWal->hdr.mxFrame) { pInfo->aReadMark[i] = pWal->hdr.mxFrame; - }else{ + } else { pInfo->aReadMark[i] = READMARK_NOT_USED; } walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1); - }else if( rc!=SQLITE_BUSY ){ + } else if (rc != SQLITE_BUSY) { goto recovery_error; } } @@ -63087,32 +62175,29 @@ static int walIndexRecover(Wal *pWal){ ** 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 - ); + 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); + 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 ){ +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]); + for (i = 0; i < pWal->nWiData; i++) { + sqlite3_free((void*)pWal->apWiData[i]); pWal->apWiData[i] = 0; } } - if( pWal->exclusiveMode!=WAL_HEAPMEMORY_MODE ){ + if (pWal->exclusiveMode != WAL_HEAPMEMORY_MODE) { sqlite3OsShmUnmap(pWal->pDbFd, isDelete); } } @@ -63132,20 +62217,19 @@ static void walIndexClose(Wal *pWal, int isDelete){ ** *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() */ +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 ); + 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 @@ -63156,27 +62240,27 @@ SQLITE_PRIVATE int sqlite3WalOpen( ** 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) ); + 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 @@ -63185,45 +62269,46 @@ SQLITE_PRIVATE int sqlite3WalOpen( ** 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 ); + assert(WIN_SHM_BASE == WALINDEX_LOCK_OFFSET); #endif #ifdef UNIX_SHM_BASE - assert( UNIX_SHM_BASE==WALINDEX_LOCK_OFFSET ); + 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 ){ + if (!pRet) { return SQLITE_NOMEM_BKPT; } pRet->pVfs = pVfs; - pRet->pWalFd = (sqlite3_file *)&pRet[1]; + 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); + 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); + 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 ){ + if (rc == SQLITE_OK && flags & SQLITE_OPEN_READONLY) { pRet->readOnly = WAL_RDONLY; } - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { walIndexClose(pRet, 0); sqlite3OsClose(pRet->pWalFd); sqlite3_free(pRet); - }else{ + } else { int iDC = sqlite3OsDeviceCharacteristics(pDbFd); - if( iDC & SQLITE_IOCAP_SEQUENTIAL ){ pRet->syncHeader = 0; } - if( iDC & SQLITE_IOCAP_POWERSAFE_OVERWRITE ){ + if (iDC & SQLITE_IOCAP_SEQUENTIAL) { + pRet->syncHeader = 0; + } + if (iDC & SQLITE_IOCAP_POWERSAFE_OVERWRITE) { pRet->padToSectorBoundary = 0; } *ppWal = pRet; @@ -63235,8 +62320,9 @@ SQLITE_PRIVATE int sqlite3WalOpen( /* ** 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; +SQLITE_PRIVATE void sqlite3WalLimit(Wal* pWal, i64 iLimit) { + if (pWal) + pWal->mxWalSize = iLimit; } /* @@ -63249,23 +62335,22 @@ SQLITE_PRIVATE void sqlite3WalLimit(Wal *pWal, i64 iLimit){ ** 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 */ +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 ){ + assert(iMin < 0xffffffff); + for (i = p->nSegment - 1; i >= 0; i--) { + struct WalSegment* pSegment = &p->aSegment[i]; + while (pSegment->iNext < pSegment->nEntry) { u32 iPg = pSegment->aPgno[pSegment->aIndex[pSegment->iNext]]; - if( iPg>iMin ){ - if( iPg iMin) { + if (iPg < iRet) { iRet = iPg; *piFrame = pSegment->iZero + pSegment->aIndex[pSegment->iNext]; } @@ -63276,7 +62361,7 @@ static int walIteratorNext( } *piPage = p->iPrior = iRet; - return (iRet==0xFFFFFFFF); + return (iRet == 0xFFFFFFFF); } /* @@ -63302,44 +62387,42 @@ static int walIteratorNext( ** ** When that happens, omit the aLeft[X] and use the aRight[Y] index. */ -static void walMerge( - const u32 *aContent, /* Pages in wal - keys for the sort */ - ht_slot *aLeft, /* IN: Left hand input list */ - int nLeft, /* IN: Elements in array *paLeft */ - ht_slot **paRight, /* IN/OUT: Right hand input list */ - int *pnRight, /* IN/OUT: Elements in *paRight */ - ht_slot *aTmp /* Temporary buffer */ -){ - int iLeft = 0; /* Current index in aLeft */ - int iRight = 0; /* Current index in aRight */ - int iOut = 0; /* Current index in output buffer */ +static void walMerge(const u32* aContent, /* Pages in wal - keys for the sort */ + ht_slot* aLeft, /* IN: Left hand input list */ + int nLeft, /* IN: Elements in array *paLeft */ + ht_slot** paRight, /* IN/OUT: Right hand input list */ + int* pnRight, /* IN/OUT: Elements in *paRight */ + ht_slot* aTmp /* Temporary buffer */ +) { + int iLeft = 0; /* Current index in aLeft */ + int iRight = 0; /* Current index in aRight */ + int iOut = 0; /* Current index in output buffer */ int nRight = *pnRight; - ht_slot *aRight = *paRight; + ht_slot* aRight = *paRight; - assert( nLeft>0 && nRight>0 ); - while( iRight 0 && nRight > 0); + while (iRight < nRight || iLeft < nLeft) { ht_slot logpage; Pgno dbpage; - if( (iLeft=nRight || aContent[aLeft[iLeft]]= nRight || aContent[aLeft[iLeft]] < aContent[aRight[iRight]])) { logpage = aLeft[iLeft++]; - }else{ + } else { logpage = aRight[iRight++]; } dbpage = aContent[logpage]; aTmp[iOut++] = logpage; - if( iLeft=nLeft || aContent[aLeft[iLeft]]>dbpage ); - assert( iRight>=nRight || aContent[aRight[iRight]]>dbpage ); + assert(iLeft >= nLeft || aContent[aLeft[iLeft]] > dbpage); + assert(iRight >= nRight || aContent[aRight[iRight]] > dbpage); } *paRight = aLeft; *pnRight = iOut; - memcpy(aLeft, aTmp, sizeof(aTmp[0])*iOut); + memcpy(aLeft, aTmp, sizeof(aTmp[0]) * iOut); } /* @@ -63359,61 +62442,60 @@ static void walMerge( ** Keep the larger of the two values aList[X] and aList[Y] and discard ** the smaller. */ -static void walMergesort( - const u32 *aContent, /* Pages in wal */ - ht_slot *aBuffer, /* Buffer of at least *pnList items to use */ - ht_slot *aList, /* IN/OUT: List to sort */ - int *pnList /* IN/OUT: Number of elements in aList[] */ -){ +static void walMergesort(const u32* aContent, /* Pages in wal */ + ht_slot* aBuffer, /* Buffer of at least *pnList items to use */ + ht_slot* aList, /* IN/OUT: List to sort */ + int* pnList /* IN/OUT: Number of elements in aList[] */ +) { struct Sublist { - int nList; /* Number of elements in aList */ - ht_slot *aList; /* Pointer to sub-list content */ + int nList; /* Number of elements in aList */ + ht_slot* aList; /* Pointer to sub-list content */ }; - const int nList = *pnList; /* Size of input list */ - int nMerge = 0; /* Number of elements in list aMerge */ - ht_slot *aMerge = 0; /* List to be merged */ - int iList; /* Index into input list */ - u32 iSub = 0; /* Index into aSub array */ - struct Sublist aSub[13]; /* Array of sub-lists */ + const int nList = *pnList; /* Size of input list */ + int nMerge = 0; /* Number of elements in list aMerge */ + ht_slot* aMerge = 0; /* List to be merged */ + int iList; /* Index into input list */ + u32 iSub = 0; /* Index into aSub array */ + struct Sublist aSub[13]; /* Array of sub-lists */ memset(aSub, 0, sizeof(aSub)); - assert( nList<=HASHTABLE_NPAGE && nList>0 ); - assert( HASHTABLE_NPAGE==(1<<(ArraySize(aSub)-1)) ); + assert(nList <= HASHTABLE_NPAGE && nList > 0); + assert(HASHTABLE_NPAGE == (1 << (ArraySize(aSub) - 1))); - for(iList=0; iListaList && p->nList<=(1<aList==&aList[iList&~((2<aList && p->nList <= (1 << iSub)); + assert(p->aList == &aList[iList & ~((2 << iSub) - 1)]); walMerge(aContent, p->aList, p->nList, &aMerge, &nMerge, aBuffer); } aSub[iSub].aList = aMerge; aSub[iSub].nList = nMerge; } - for(iSub++; iSubnList<=(1<aList==&aList[nList&~((2<nList <= (1 << iSub)); + assert(p->aList == &aList[nList & ~((2 << iSub) - 1)]); walMerge(aContent, p->aList, p->nList, &aMerge, &nMerge, aBuffer); } } - assert( aMerge==aList ); + assert(aMerge == aList); *pnList = nMerge; #ifdef SQLITE_DEBUG { int i; - for(i=1; i<*pnList; i++){ - assert( aContent[aList[i]] > aContent[aList[i-1]] ); + for (i = 1; i < *pnList; i++) { + assert(aContent[aList[i]] > aContent[aList[i - 1]]); } } #endif @@ -63422,7 +62504,7 @@ static void walMergesort( /* ** Free an iterator allocated by walIteratorInit(). */ -static void walIteratorFree(WalIterator *p){ +static void walIteratorFree(WalIterator* p) { sqlite3_free(p); } @@ -63439,28 +62521,26 @@ static void walIteratorFree(WalIterator *p){ ** 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 */ +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 ); + 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 ){ + 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); @@ -63469,43 +62549,41 @@ static int walIteratorInit(Wal *pWal, u32 nBackfill, WalIterator **pp){ /* 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 ){ + 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]; + aIndex = &((ht_slot*)&p->aSegment[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; + p->aSegment[i].aPgno = (u32*)sLoc.aPgno; } } sqlite3_free(aTmp); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { walIteratorFree(p); p = 0; } @@ -63520,16 +62598,14 @@ static int walIteratorInit(Wal *pWal, u32 nBackfill, WalIterator **pp){ ** with a busy-timeout. Return 1 if blocking locks are successfully enabled, ** or 0 otherwise. */ -static int walEnableBlocking(Wal *pWal){ +static int walEnableBlocking(Wal* pWal) { int res = 0; - if( pWal->db ){ + if (pWal->db) { int tmout = pWal->db->busyTimeout; - if( tmout ){ + if (tmout) { int rc; - rc = sqlite3OsFileControl( - pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout - ); - res = (rc==SQLITE_OK); + rc = sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout); + res = (rc == SQLITE_OK); } } return res; @@ -63538,7 +62614,7 @@ static int walEnableBlocking(Wal *pWal){ /* ** Disable blocking locks. */ -static void walDisableBlocking(Wal *pWal){ +static void walDisableBlocking(Wal* pWal) { int tmout = 0; sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout); } @@ -63552,19 +62628,19 @@ static void walDisableBlocking(Wal *pWal){ ** ** If the bLock parameter is false and the WRITER lock is held, release it. */ -SQLITE_PRIVATE int sqlite3WalWriteLock(Wal *pWal, int bLock){ +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) ){ + 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 ){ + if (rc == SQLITE_OK) { pWal->writeLock = 1; } walDisableBlocking(pWal); } - }else if( pWal->writeLock ){ + } else if (pWal->writeLock) { walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); pWal->writeLock = 0; } @@ -63574,14 +62650,14 @@ SQLITE_PRIVATE int sqlite3WalWriteLock(Wal *pWal, int bLock){ /* ** Set the database handle used to determine if blocking locks are required. */ -SQLITE_PRIVATE void sqlite3WalDb(Wal *pWal, sqlite3 *db){ +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){ +static int walLockWriter(Wal* pWal) { int rc; walEnableBlocking(pWal); rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); @@ -63589,12 +62665,11 @@ static int walLockWriter(Wal *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 */ - +#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 @@ -63602,19 +62677,18 @@ static int walLockWriter(Wal *pWal){ ** 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 */ -){ +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) ); + } while (xBusy && rc == SQLITE_BUSY && xBusy(pBusyArg)); #ifdef SQLITE_ENABLE_SETLK_TIMEOUT - if( rc==SQLITE_BUSY_TIMEOUT ){ + if (rc == SQLITE_BUSY_TIMEOUT) { walDisableBlocking(pWal); rc = SQLITE_BUSY; } @@ -63626,8 +62700,8 @@ static int walBusyLock( ** 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); +static int walPagesize(Wal* pWal) { + return (pWal->hdr.szPage & 0xfe00) + ((pWal->hdr.szPage & 0x0001) << 16); } /* @@ -63647,10 +62721,10 @@ static int walPagesize(Wal *pWal){ ** 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 */ +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])); @@ -63659,8 +62733,9 @@ static void walRestartHdr(Wal *pWal, u32 salt1){ AtomicStore(&pInfo->nBackfill, 0); pInfo->nBackfillAttempted = 0; pInfo->aReadMark[1] = 0; - for(i=2; iaReadMark[i] = READMARK_NOT_USED; - assert( pInfo->aReadMark[0]==0 ); + for (i = 2; i < WAL_NREADER; i++) + pInfo->aReadMark[i] = READMARK_NOT_USED; + assert(pInfo->aReadMark[0] == 0); } /* @@ -63694,34 +62769,33 @@ static void walRestartHdr(Wal *pWal, u32 salt1){ ** 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 */ +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 ); + testcase(szPage <= 32768); + testcase(szPage >= 65536); pInfo = walCkptInfo(pWal); - if( pInfo->nBackfillhdr.mxFrame ){ + if (pInfo->nBackfill < pWal->hdr.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 ); + 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 @@ -63730,33 +62804,31 @@ static int walCheckpoint( */ mxSafeFrame = pWal->hdr.mxFrame; mxPage = pWal->hdr.nPage; - for(i=1; iaReadMark+i); - if( mxSafeFrame>y ){ - assert( y<=pWal->hdr.mxFrame ); + for (i = 1; i < WAL_NREADER; i++) { + u32 y = AtomicLoad(pInfo->aReadMark + 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); + 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 ){ + } else if (rc == SQLITE_BUSY) { mxSafeFrame = y; xBusy = 0; - }else{ + } else { goto walcheckpoint_out; } } } /* Allocate the iterator */ - if( pInfo->nBackfillnBackfill < mxSafeFrame) { rc = walIteratorInit(pWal, pInfo->nBackfill, &pIter); - assert( rc==SQLITE_OK || pIter==0 ); + assert(rc == SQLITE_OK || pIter == 0); } - if( pIter - && (rc = walBusyLock(pWal,xBusy,pBusyArg,WAL_READ_LOCK(0),1))==SQLITE_OK - ){ + if (pIter && (rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(0), 1)) == SQLITE_OK) { u32 nBackfill = pInfo->nBackfill; pInfo->nBackfillAttempted = mxSafeFrame; @@ -63767,58 +62839,59 @@ static int walCheckpoint( /* 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 ){ + if (rc == SQLITE_OK) { i64 nReq = ((i64)mxPage * szPage); - i64 nSize; /* Current size of database file */ + 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)hdr.mxFrame * szPage) < nReq) { /* If the size of the final database is larger than the current ** database plus the amount of data in the wal file, plus the ** maximum size of the pending-byte page (65536 bytes), then ** must be corruption somewhere. */ rc = SQLITE_CORRUPT_BKPT; - }else{ - sqlite3OsFileControlHint(pWal->pDbFd, SQLITE_FCNTL_SIZE_HINT,&nReq); + } else { + sqlite3OsFileControlHint(pWal->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) ){ + while (rc == SQLITE_OK && 0 == walIteratorNext(pIter, &iDbpage, &iFrame)) { i64 iOffset; - assert( walFramePgno(pWal, iFrame)==iDbpage ); - if( AtomicLoad(&db->u1.isInterrupted) ){ + 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 ){ + 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) ); + 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; + 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) ); + 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 ){ + if (rc == SQLITE_OK) { rc = sqlite3OsSync(pWal->pDbFd, CKPT_SYNC_FLAGS(sync_flags)); } } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { AtomicStore(&pInfo->nBackfill, mxSafeFrame); } } @@ -63827,7 +62900,7 @@ static int walCheckpoint( walUnlockExclusive(pWal, WAL_READ_LOCK(0), 1); } - if( rc==SQLITE_BUSY ){ + 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; @@ -63839,17 +62912,17 @@ static int walCheckpoint( ** 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 ){ + if (rc == SQLITE_OK && eMode != SQLITE_CHECKPOINT_PASSIVE) { + assert(pWal->writeLock); + if (pInfo->nBackfill < pWal->hdr.mxFrame) { rc = SQLITE_BUSY; - }else if( eMode>=SQLITE_CHECKPOINT_RESTART ){ + } 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 ){ + 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 @@ -63866,12 +62939,12 @@ static int walCheckpoint( walRestartHdr(pWal, salt1); rc = sqlite3OsTruncate(pWal->pWalFd, 0); } - walUnlockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); + walUnlockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER - 1); } } } - walcheckpoint_out: +walcheckpoint_out: walIteratorFree(pIter); return rc; } @@ -63880,16 +62953,16 @@ static int walCheckpoint( ** 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){ +static void walLimitSize(Wal* pWal, i64 nMax) { i64 sz; int rx; sqlite3BeginBenignMalloc(); rx = sqlite3OsFileSize(pWal->pWalFd, &sz); - if( rx==SQLITE_OK && (sz > nMax ) ){ + if (rx == SQLITE_OK && (sz > nMax)) { rx = sqlite3OsTruncate(pWal->pWalFd, nMax); } sqlite3EndBenignMalloc(); - if( rx ){ + if (rx) { sqlite3_log(rx, "cannot limit WAL size: %s", pWal->zWalName); } } @@ -63897,16 +62970,14 @@ static void walLimitSize(Wal *pWal, i64 nMax){ /* ** 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 */ -){ +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 (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 @@ -63916,26 +62987,20 @@ SQLITE_PRIVATE int sqlite3WalClose( ** ** 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 ){ + 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 ){ + 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 ){ + 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 ){ + } 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 @@ -63949,13 +63014,13 @@ SQLITE_PRIVATE int sqlite3WalClose( walIndexClose(pWal, isDelete); sqlite3OsClose(pWal->pWalFd); - if( isDelete ){ + if (isDelete) { sqlite3BeginBenignMalloc(); sqlite3OsDelete(pWal->pVfs, pWal->zWalName, 0); sqlite3EndBenignMalloc(); } WALTRACE(("WAL%p: closed\n", pWal)); - sqlite3_free((void *)pWal->apWiData); + sqlite3_free((void*)pWal->apWiData); sqlite3_free(pWal); } return rc; @@ -63978,13 +63043,13 @@ SQLITE_PRIVATE int sqlite3WalClose( ** 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 */ +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] ); + 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, @@ -64003,27 +63068,27 @@ static SQLITE_NO_TSAN int walIndexTryHdr(Wal *pWal, int *pChanged){ ** reliably in that environment. */ aHdr = walIndexHdr(pWal); - memcpy(&h1, (void *)&aHdr[0], sizeof(h1)); /* Possible TSAN false-positive */ + memcpy(&h1, (void*)&aHdr[0], sizeof(h1)); /* Possible TSAN false-positive */ walShmBarrier(pWal); - memcpy(&h2, (void *)&aHdr[1], sizeof(h2)); + memcpy(&h2, (void*)&aHdr[1], sizeof(h2)); - if( memcmp(&h1, &h2, sizeof(h1))!=0 ){ - return 1; /* Dirty read */ + if (memcmp(&h1, &h2, sizeof(h1)) != 0) { + return 1; /* Dirty read */ } - if( h1.isInit==0 ){ - return 1; /* Malformed header - probably all zeros */ + 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 */ + 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)) ){ + 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 ); + 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. */ @@ -64034,7 +63099,7 @@ static SQLITE_NO_TSAN int walIndexTryHdr(Wal *pWal, int *pChanged){ ** This is the value that walTryBeginRead returns when it needs to ** be retried. */ -#define WAL_RETRY (-1) +#define WAL_RETRY (-1) /* ** Read the wal-index header from the wal-index and into pWal->hdr. @@ -64048,40 +63113,40 @@ static SQLITE_NO_TSAN int walIndexTryHdr(Wal *pWal, int *pChanged){ ** 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 */ +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 ); + 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 ){ + 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 ); + assert(page0 == 0); + assert(pWal->writeLock == 0); + assert(pWal->readOnly & WAL_SHM_RDONLY); pWal->bShmUnreliable = 1; pWal->exclusiveMode = WAL_HEAPMEMORY_MODE; *pChanged = 1; - }else{ + } else { return rc; /* Any other non-OK return is just an error */ } - }else{ + } 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 ); + testcase(page0 != 0); } - assert( page0!=0 || pWal->writeLock==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 @@ -64093,19 +63158,19 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){ /* 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)) ){ + 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{ + } else { int bWriteLock = pWal->writeLock; - if( bWriteLock || SQLITE_OK==(rc = walLockWriter(pWal)) ){ + if (bWriteLock || SQLITE_OK == (rc = walLockWriter(pWal))) { pWal->writeLock = 1; - if( SQLITE_OK==(rc = walIndexPage(pWal, 0, &page0)) ){ + if (SQLITE_OK == (rc = walIndexPage(pWal, 0, &page0))) { badHdr = walIndexTryHdr(pWal, pChanged); - if( badHdr ){ + 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. @@ -64114,7 +63179,7 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){ *pChanged = 1; } } - if( bWriteLock==0 ){ + if (bWriteLock == 0) { pWal->writeLock = 0; walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); } @@ -64126,18 +63191,19 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){ ** 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 ){ + if (badHdr == 0 && pWal->hdr.iVersion != WALINDEX_MAX_VERSION) { rc = SQLITE_CANTOPEN_BKPT; } - if( pWal->bShmUnreliable ){ - if( rc!=SQLITE_OK ){ + if (pWal->bShmUnreliable) { + if (rc != SQLITE_OK) { walIndexClose(pWal, 0); pWal->bShmUnreliable = 0; - assert( pWal->nWiData>0 && pWal->apWiData[0]==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; + if (rc == SQLITE_IOERR_SHORT_READ) + rc = WAL_RETRY; } pWal->exclusiveMode = WAL_NORMAL_MODE; } @@ -64172,27 +63238,28 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){ ** ** 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] ); +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; + if (rc != SQLITE_OK) { + if (rc == SQLITE_BUSY) + rc = WAL_RETRY; goto begin_unreliable_shm_out; } pWal->readLock = 0; @@ -64218,11 +63285,11 @@ static int walBeginShmUnreliable(Wal *pWal, int *pChanged){ ** 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); + 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; } @@ -64236,10 +63303,10 @@ static int walBeginShmUnreliable(Wal *pWal, int *pChanged){ ** from under us, then disconnected, while we were not looking. */ rc = sqlite3OsFileSize(pWal->pWalFd, &szWal); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { goto begin_unreliable_shm_out; } - if( szWalhdr.mxFrame==0 ? SQLITE_OK : WAL_RETRY); + rc = (pWal->hdr.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 ){ + if (rc != SQLITE_OK) { goto begin_unreliable_shm_out; } - if( memcmp(&pWal->hdr.aSalt, &aBuf[16], 8) ){ + 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. */ @@ -64265,11 +63332,11 @@ static int walBeginShmUnreliable(Wal *pWal, int *pChanged){ } /* Allocate a buffer to read frames into */ - assert( (pWal->szPage & (pWal->szPage-1))==0 ); - assert( pWal->szPage>=512 && pWal->szPage<=65536 ); + 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 ){ + aFrame = (u8*)sqlite3_malloc64(szFrame); + if (aFrame == 0) { rc = SQLITE_NOMEM_BKPT; goto begin_unreliable_shm_out; } @@ -64281,22 +63348,21 @@ static int walBeginShmUnreliable(Wal *pWal, int *pChanged){ ** 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 */ + 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 (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 ){ + if (nTruncate) { rc = WAL_RETRY; break; } @@ -64304,11 +63370,11 @@ static int walBeginShmUnreliable(Wal *pWal, int *pChanged){ pWal->hdr.aFrameCksum[0] = aSaveCksum[0]; pWal->hdr.aFrameCksum[1] = aSaveCksum[1]; - begin_unreliable_shm_out: +begin_unreliable_shm_out: sqlite3_free(aFrame); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { int i; - for(i=0; inWiData; i++){ + for (i = 0; i < pWal->nWiData; i++) { sqlite3_free((void*)pWal->apWiData[i]); pWal->apWiData[i] = 0; } @@ -64369,18 +63435,18 @@ static int walBeginShmUnreliable(Wal *pWal, int *pChanged){ ** 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 */ +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 */ + 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 ); + assert((pWal->readOnly & WAL_SHM_RDONLY) == 0 || useWal == 0); /* Take steps to avoid spinning forever if there is a protocol error. ** @@ -64399,22 +63465,23 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ ** 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; ) + 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; + if (cnt >= 10) + nDelay = (cnt - 9) * (cnt - 9) * 39; sqlite3OsSleep(pWal->pVfs, nDelay); } - if( !useWal ){ - assert( rc==SQLITE_OK ); - if( pWal->bShmUnreliable==0 ){ + if (!useWal) { + assert(rc == SQLITE_OK); + if (pWal->bShmUnreliable == 0) { rc = walIndexReadHdr(pWal, pChanged); } - if( rc==SQLITE_BUSY ){ + 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 @@ -64423,7 +63490,7 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ ** WAL_RETRY this routine will be called again and will probably be ** right on the second iteration. */ - if( pWal->apWiData[0]==0 ){ + 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 @@ -64432,36 +63499,35 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ ** must be zeroed before the requested page is returned. */ rc = WAL_RETRY; - }else if( SQLITE_OK==(rc = walLockShared(pWal, WAL_RECOVER_LOCK)) ){ + } else if (SQLITE_OK == (rc = walLockShared(pWal, WAL_RECOVER_LOCK))) { walUnlockShared(pWal, WAL_RECOVER_LOCK); rc = WAL_RETRY; - }else if( rc==SQLITE_BUSY ){ + } else if (rc == SQLITE_BUSY) { rc = SQLITE_BUSY_RECOVERY; } } - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; - } - else if( pWal->bShmUnreliable ){ + } else if (pWal->bShmUnreliable) { return walBeginShmUnreliable(pWal, pChanged); } } - assert( pWal->nWiData>0 ); - assert( pWal->apWiData[0]!=0 ); + assert(pWal->nWiData > 0); + assert(pWal->apWiData[0] != 0); pInfo = walCkptInfo(pWal); - if( !useWal && AtomicLoad(&pInfo->nBackfill)==pWal->hdr.mxFrame + if (!useWal && AtomicLoad(&pInfo->nBackfill) == pWal->hdr.mxFrame #ifdef SQLITE_ENABLE_SNAPSHOT - && (pWal->pSnapshot==0 || pWal->hdr.mxFrame==0) + && (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)) ){ + 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, @@ -64480,7 +63546,7 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ } pWal->readLock = 0; return SQLITE_OK; - }else if( rc!=SQLITE_BUSY ){ + } else if (rc != SQLITE_BUSY) { return rc; } } @@ -64494,42 +63560,40 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ mxI = 0; mxFrame = pWal->hdr.mxFrame; #ifdef SQLITE_ENABLE_SNAPSHOT - if( pWal->pSnapshot && pWal->pSnapshot->mxFramepSnapshot && pWal->pSnapshot->mxFrame < mxFrame) { mxFrame = pWal->pSnapshot->mxFrame; } #endif - for(i=1; iaReadMark+i); - if( mxReadMark<=thisMark && thisMark<=mxFrame ){ - assert( thisMark!=READMARK_NOT_USED ); + for (i = 1; i < WAL_NREADER; i++) { + u32 thisMark = AtomicLoad(pInfo->aReadMark + i); + if (mxReadMark <= thisMark && thisMark <= mxFrame) { + assert(thisMark != READMARK_NOT_USED); mxReadMark = thisMark; mxI = i; } } - if( (pWal->readOnly & WAL_SHM_RDONLY)==0 - && (mxReadMarkreadOnly & WAL_SHM_RDONLY) == 0 && (mxReadMark < mxFrame || mxI == 0)) { + for (i = 1; i < WAL_NREADER; i++) { rc = walLockExclusive(pWal, WAL_READ_LOCK(i), 1); - if( rc==SQLITE_OK ){ - AtomicStore(pInfo->aReadMark+i,mxFrame); + if (rc == SQLITE_OK) { + AtomicStore(pInfo->aReadMark + i, mxFrame); mxReadMark = mxFrame; mxI = i; walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1); break; - }else if( rc!=SQLITE_BUSY ){ + } 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; + 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; + 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 @@ -64565,15 +63629,13 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ ** 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; + pWal->minFrame = AtomicLoad(&pInfo->nBackfill) + 1; walShmBarrier(pWal); - if( AtomicLoad(pInfo->aReadMark+mxI)!=mxReadMark - || memcmp((void *)walIndexHdr(pWal), &pWal->hdr, sizeof(WalIndexHdr)) - ){ + 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 ); + } else { + assert(mxReadMark <= pWal->hdr.mxFrame); pWal->readLock = (i16)mxI; } return rc; @@ -64599,50 +63661,51 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ ** error occurs. It is not an error if nBackfillAttempted cannot be ** decreased at all. */ -SQLITE_PRIVATE int sqlite3WalSnapshotRecover(Wal *pWal){ +SQLITE_PRIVATE int sqlite3WalSnapshotRecover(Wal* pWal) { int rc; - assert( pWal->readLock>=0 ); + assert(pWal->readLock >= 0); rc = walLockExclusive(pWal, WAL_CKPT_LOCK, 1); - if( rc==SQLITE_OK ){ - volatile WalCkptInfo *pInfo = walCkptInfo(pWal); + if (rc == SQLITE_OK) { + volatile WalCkptInfo* pInfo = walCkptInfo(pWal); int szPage = (int)pWal->szPage; - i64 szDb; /* Size of db file in bytes */ + 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 ){ + if (rc == SQLITE_OK) { + void* pBuf1 = sqlite3_malloc(szPage); + void* pBuf2 = sqlite3_malloc(szPage); + if (pBuf1 == 0 || pBuf2 == 0) { rc = SQLITE_NOMEM; - }else{ + } 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 */ + 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 (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 ){ + if (iDbOff + szPage <= szDb) { iWalOff = walFrameOffset(i, szPage) + WAL_FRAME_HDRSIZE; rc = sqlite3OsRead(pWal->pWalFd, pBuf1, szPage, iWalOff); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = sqlite3OsRead(pWal->pDbFd, pBuf2, szPage, iDbOff); } - if( rc!=SQLITE_OK || 0==memcmp(pBuf1, pBuf2, szPage) ){ + if (rc != SQLITE_OK || 0 == memcmp(pBuf1, pBuf2, szPage)) { break; } } - pInfo->nBackfillAttempted = i-1; + pInfo->nBackfillAttempted = i - 1; } } @@ -64670,19 +63733,19 @@ SQLITE_PRIVATE int sqlite3WalSnapshotRecover(Wal *pWal){ ** 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 */ +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; + WalIndexHdr* pSnapshot = pWal->pSnapshot; #endif - assert( pWal->ckptLock==0 ); + assert(pWal->ckptLock == 0); #ifdef SQLITE_ENABLE_SNAPSHOT - if( pSnapshot ){ - if( memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr))!=0 ){ + if (pSnapshot) { + if (memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr)) != 0) { bChanged = 1; } @@ -64698,24 +63761,24 @@ SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ rc = walLockShared(pWal, WAL_CKPT_LOCK); walDisableBlocking(pWal); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } pWal->ckptLock = 1; } #endif - do{ + 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 ); + } 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 ){ + 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 @@ -64729,10 +63792,10 @@ SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ ** pSnapshot->mxFrame into the database file. Note that the ** checkpoint need not have completed for this to cause problems. */ - volatile WalCkptInfo *pInfo = walCkptInfo(pWal); + volatile WalCkptInfo* pInfo = walCkptInfo(pWal); - assert( pWal->readLock>0 || pWal->hdr.mxFrame==0 ); - assert( pInfo->aReadMark[pWal->readLock]<=pSnapshot->mxFrame ); + 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 @@ -64740,13 +63803,11 @@ SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ ** 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 ); + 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{ + } else { rc = SQLITE_ERROR_SNAPSHOT; } @@ -64758,15 +63819,15 @@ SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ ** is the same database page. */ pWal->minFrame = 1; - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { sqlite3WalEndReadTransaction(pWal); } } } /* Release the shared CKPT lock obtained above. */ - if( pWal->ckptLock ){ - assert( pSnapshot ); + if (pWal->ckptLock) { + assert(pSnapshot); walUnlockShared(pWal, WAL_CKPT_LOCK); pWal->ckptLock = 0; } @@ -64778,9 +63839,9 @@ SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ ** Finish with a read transaction. All this does is release the ** read-lock. */ -SQLITE_PRIVATE void sqlite3WalEndReadTransaction(Wal *pWal){ +SQLITE_PRIVATE void sqlite3WalEndReadTransaction(Wal* pWal) { sqlite3WalEndWriteTransaction(pWal); - if( pWal->readLock>=0 ){ + if (pWal->readLock >= 0) { walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock)); pWal->readLock = -1; } @@ -64794,18 +63855,17 @@ SQLITE_PRIVATE void sqlite3WalEndReadTransaction(Wal *pWal){ ** 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 */ +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 ); + 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 @@ -64813,7 +63873,7 @@ SQLITE_PRIVATE int sqlite3WalFindFrame( ** 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) ){ + if (iLast == 0 || (pWal->readLock == 0 && pWal->bShmUnreliable == 0)) { *piRead = 0; return SQLITE_OK; } @@ -64844,31 +63904,32 @@ SQLITE_PRIVATE int sqlite3WalFindFrame( ** 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 */ + 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 ){ + if (rc != SQLITE_OK) { return rc; } nCollide = HASHTABLE_NSLOT; iKey = walHash(pgno); - while( (iH = AtomicLoad(&sLoc.aHash[iKey]))!=0 ){ + 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 ); + if (iFrame <= iLast && iFrame >= pWal->minFrame && sLoc.aPgno[iH - 1] == pgno) { + assert(iFrame > iRead || CORRUPT_DB); iRead = iFrame; } - if( (nCollide--)==0 ){ + if ((nCollide--) == 0) { return SQLITE_CORRUPT_BKPT; } iKey = walNextHash(iKey); } - if( iRead ) break; + if (iRead) + break; } #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT @@ -64878,14 +63939,14 @@ SQLITE_PRIVATE int sqlite3WalFindFrame( { 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 ){ + 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 ); + assert(iRead == iRead2); } #endif @@ -64898,34 +63959,32 @@ SQLITE_PRIVATE int sqlite3WalFindFrame( ** (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 */ -){ +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 ); + 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 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) ){ +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. ** @@ -64939,25 +63998,25 @@ SQLITE_PRIVATE Pgno sqlite3WalDbsize(Wal *pWal){ ** ** There can only be a single writer active at a time. */ -SQLITE_PRIVATE int sqlite3WalBeginWriteTransaction(Wal *pWal){ +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)) ); + 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 ); + assert(pWal->readLock >= 0); + assert(pWal->writeLock == 0 && pWal->iReCksum == 0); - if( pWal->readOnly ){ + if (pWal->readOnly) { return SQLITE_READONLY; } @@ -64965,7 +64024,7 @@ SQLITE_PRIVATE int sqlite3WalBeginWriteTransaction(Wal *pWal){ ** SQLITE_BUSY if unable. */ rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); - if( rc ){ + if (rc) { return rc; } pWal->writeLock = 1; @@ -64974,7 +64033,7 @@ SQLITE_PRIVATE int sqlite3WalBeginWriteTransaction(Wal *pWal){ ** time the read transaction on this connection was started, then ** the write is disallowed. */ - if( memcmp(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr))!=0 ){ + if (memcmp(&pWal->hdr, (void*)walIndexHdr(pWal), sizeof(WalIndexHdr)) != 0) { walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); pWal->writeLock = 0; rc = SQLITE_BUSY_SNAPSHOT; @@ -64987,8 +64046,8 @@ SQLITE_PRIVATE int sqlite3WalBeginWriteTransaction(Wal *pWal){ ** 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 ){ +SQLITE_PRIVATE int sqlite3WalEndWriteTransaction(Wal* pWal) { + if (pWal->writeLock) { walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); pWal->writeLock = 0; pWal->iReCksum = 0; @@ -65009,21 +64068,18 @@ SQLITE_PRIVATE int sqlite3WalEndWriteTransaction(Wal *pWal){ ** 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){ +SQLITE_PRIVATE int sqlite3WalUndo(Wal* pWal, int (*xUndo)(void*, Pgno), void* pUndoCtx) { int rc = SQLITE_OK; - if( ALWAYS(pWal->writeLock) ){ + 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)); + memcpy(&pWal->hdr, (void*)walIndexHdr(pWal), sizeof(WalIndexHdr)); - for(iFrame=pWal->hdr.mxFrame+1; - ALWAYS(rc==SQLITE_OK) && iFrame<=iMax; - iFrame++ - ){ + 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 @@ -65035,10 +64091,11 @@ SQLITE_PRIVATE int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *p ** 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 ); + assert(walFramePgno(pWal, iFrame) != 1); rc = xUndo(pUndoCtx, walFramePgno(pWal, iFrame)); } - if( iMax!=pWal->hdr.mxFrame ) walCleanupHash(pWal); + if (iMax != pWal->hdr.mxFrame) + walCleanupHash(pWal); } return rc; } @@ -65049,8 +64106,8 @@ SQLITE_PRIVATE int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *p ** "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 ); +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]; @@ -65063,13 +64120,13 @@ SQLITE_PRIVATE void sqlite3WalSavepoint(Wal *pWal, u32 *aWalData){ ** of WAL_SAVEPOINT_NDATA u32 values that has been previously populated ** by a call to WalSavepoint(). */ -SQLITE_PRIVATE int sqlite3WalSavepointUndo(Wal *pWal, u32 *aWalData){ +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 ); + assert(pWal->writeLock); + assert(aWalData[3] != pWal->nCkpt || aWalData[0] <= pWal->hdr.mxFrame); - if( aWalData[3]!=pWal->nCkpt ){ + 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. @@ -65078,7 +64135,7 @@ SQLITE_PRIVATE int sqlite3WalSavepointUndo(Wal *pWal, u32 *aWalData){ aWalData[3] = pWal->nCkpt; } - if( aWalData[0]hdr.mxFrame ){ + if (aWalData[0] < pWal->hdr.mxFrame) { pWal->hdr.mxFrame = aWalData[0]; pWal->hdr.aFrameCksum[0] = aWalData[1]; pWal->hdr.aFrameCksum[1] = aWalData[2]; @@ -65100,18 +64157,18 @@ SQLITE_PRIVATE int sqlite3WalSavepointUndo(Wal *pWal, u32 *aWalData){ ** or not pWal->hdr.mxFrame is modified). An SQLite error code is returned ** if an error occurs. */ -static int walRestartLog(Wal *pWal){ +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 ){ + 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 ){ + 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 @@ -65122,22 +64179,22 @@ static int walRestartLog(Wal *pWal){ ** 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 ){ + 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{ + 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 ); + } 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; } @@ -65148,11 +64205,11 @@ static int walRestartLog(Wal *pWal){ ** 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 */ + 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; /* @@ -65163,23 +64220,24 @@ typedef struct WalWriter { ** 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 */ -){ +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 ){ + if (iOffset < p->iSyncPoint && iOffset + iAmt >= p->iSyncPoint) { int iFirstAmt = (int)(p->iSyncPoint - iOffset); rc = sqlite3OsWrite(p->pFd, pContent, iFirstAmt, iOffset); - if( rc ) return rc; + if (rc) + return rc; iOffset += iFirstAmt; iAmt -= iFirstAmt; pContent = (void*)(iFirstAmt + (char*)pContent); - assert( WAL_SYNC_FLAGS(p->syncFlags)!=0 ); + assert(WAL_SYNC_FLAGS(p->syncFlags) != 0); rc = sqlite3OsSync(p->pFd, WAL_SYNC_FLAGS(p->syncFlags)); - if( iAmt==0 || rc ) return rc; + if (iAmt == 0 || rc) + return rc; } rc = sqlite3OsWrite(p->pFd, pContent, iAmt, iOffset); return rc; @@ -65188,21 +64246,21 @@ static int walWriteToLog( /* ** 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 */ +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 */ pData = pPage->pData; walEncodeFrame(p->pWal, pPage->pgno, nTruncate, pData, aFrame); rc = walWriteToLog(p, aFrame, sizeof(aFrame), iOffset); - if( rc ) return rc; + if (rc) + return rc; /* Write the page data */ - rc = walWriteToLog(p, pData, p->szPage, iOffset+sizeof(aFrame)); + rc = walWriteToLog(p, pData, p->szPage, iOffset + sizeof(aFrame)); return rc; } @@ -65214,38 +64272,39 @@ static int walWriteOneFrame( ** ** 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 */ +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; + 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 ){ + assert(pWal->iReCksum > 0); + if (pWal->iReCksum == 1) { iCksumOff = 24; - }else{ - iCksumOff = walFrameOffset(pWal->iReCksum-1, szPage) + 16; + } else { + iCksumOff = walFrameOffset(pWal->iReCksum - 1, szPage) + 16; } - rc = sqlite3OsRead(pWal->pWalFd, aBuf, sizeof(u32)*2, iCksumOff); + 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++){ + 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 ){ + rc = sqlite3OsRead(pWal->pWalFd, aBuf, szPage + WAL_FRAME_HDRSIZE, iOff); + if (rc == SQLITE_OK) { u32 iPgno, nDbSize; iPgno = sqlite3Get4byte(aBuf); nDbSize = sqlite3Get4byte(&aBuf[4]); @@ -65263,48 +64322,49 @@ static int walRewriteChecksums(Wal *pWal, u32 iLast){ ** 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 ); +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) ); + 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")); + { + 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; + 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)) ){ + if (SQLITE_OK != (rc = walRestartLog(pWal))) { return rc; } @@ -65313,17 +64373,18 @@ SQLITE_PRIVATE int sqlite3WalFrames( ** 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 */ + 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); + 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); + walChecksumBytes(1, aWalHdr, WAL_HDRSIZE - 2 * 4, 0, aCksum); sqlite3Put4byte(&aWalHdr[24], aCksum[0]); sqlite3Put4byte(&aWalHdr[28], aCksum[1]); @@ -65335,7 +64396,7 @@ SQLITE_PRIVATE int sqlite3WalFrames( rc = sqlite3OsWrite(pWal->pWalFd, aWalHdr, sizeof(aWalHdr), 0); WALTRACE(("WAL%p: wal-header write %s\n", pWal, rc ? "failed" : "ok")); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } @@ -65346,12 +64407,13 @@ SQLITE_PRIVATE int sqlite3WalFrames( ** ** https://sqlite.org/src/info/ff5be73dee */ - if( pWal->syncHeader ){ + if (pWal->syncHeader) { rc = sqlite3OsSync(pWal->pWalFd, CKPT_SYNC_FLAGS(sync_flags)); - if( rc ) return rc; + if (rc) + return rc; } } - assert( (int)pWal->szPage==szPage ); + assert((int)pWal->szPage == szPage); /* Setup information needed to write frames into the WAL */ w.pWal = pWal; @@ -65359,49 +64421,52 @@ SQLITE_PRIVATE int sqlite3WalFrames( w.iSyncPoint = 0; w.syncFlags = sync_flags; w.szPage = szPage; - iOffset = walFrameOffset(iFrame+1, 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 */ + 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) ){ + 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 ){ + assert(rc == SQLITE_OK || iWrite == 0); + if (iWrite >= iFirst) { i64 iOff = walFrameOffset(iWrite, szPage) + WAL_FRAME_HDRSIZE; - void *pData; - if( pWal->iReCksum==0 || iWriteiReCksum ){ + void* pData; + if (pWal->iReCksum == 0 || iWrite < pWal->iReCksum) { pWal->iReCksum = iWrite; } pData = p->pData; rc = sqlite3OsWrite(pWal->pWalFd, pData, szPage, iOff); - if( rc ) return rc; + if (rc) + return rc; p->flags &= ~PGHDR_WAL_APPEND; continue; } } iFrame++; - assert( iOffset==walFrameOffset(iFrame, szPage) ); - nDbSize = (isCommit && p->pDirty==0) ? nTruncate : 0; + assert(iOffset == walFrameOffset(iFrame, szPage)); + nDbSize = (isCommit && p->pDirty == 0) ? nTruncate : 0; rc = walWriteOneFrame(&w, p, nDbSize, iOffset); - if( rc ) return rc; + 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 ){ + if (isCommit && pWal->iReCksum) { rc = walRewriteChecksums(pWal, iFrame); - if( rc ) return rc; + if (rc) + return rc; } /* If this is the end of a transaction, then we might need to pad @@ -65418,23 +64483,24 @@ SQLITE_PRIVATE int sqlite3WalFrames( ** 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 ){ + if (isCommit && WAL_SYNC_FLAGS(sync_flags) != 0) { int bSync = 1; - if( pWal->padToSectorBoundary ){ + 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 ){ + if (isCommit && pWal->truncateOnCommit && pWal->mxWalSize >= 0) { i64 sz = pWal->mxWalSize; - if( walFrameOffset(iFrame+nExtra+1, szPage)>pWal->mxWalSize ){ - sz = walFrameOffset(iFrame+nExtra+1, szPage); + if (walFrameOffset(iFrame + nExtra + 1, szPage) > pWal->mxWalSize) { + sz = walFrameOffset(iFrame + nExtra + 1, szPage); } walLimitSize(pWal, sz); pWal->truncateOnCommit = 0; @@ -65458,30 +64524,31 @@ SQLITE_PRIVATE int sqlite3WalFrames( ** 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; + 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 ){ + assert(pLast != 0 || nExtra == 0); + while (rc == SQLITE_OK && nExtra > 0) { iFrame++; nExtra--; rc = walIndexAppend(pWal, iFrame, pLast->pgno); } - if( rc==SQLITE_OK ){ + 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.szPage = (u16)((szPage & 0xff00) | (szPage >> 16)); + testcase(szPage <= 32768); + testcase(szPage >= 65536); pWal->hdr.mxFrame = iFrame; - if( isCommit ){ + if (isCommit) { pWal->hdr.iChange++; pWal->hdr.nPage = nTruncate; } /* If this is a commit, update the wal-index header too. */ - if( isCommit ){ + if (isCommit) { walIndexWriteHdr(pWal); pWal->iCallback = iFrame; } @@ -65501,31 +64568,31 @@ SQLITE_PRIVATE int sqlite3WalFrames( ** 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 */ +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 ); + 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 ); + assert(eMode != SQLITE_CHECKPOINT_PASSIVE || xBusy == 0); - if( pWal->readOnly ) return SQLITE_READONLY; + if (pWal->readOnly) + return SQLITE_READONLY; WALTRACE(("WAL%p: checkpoint begins\n", pWal)); /* Enable blocking locks, if possible. If blocking locks are successfully @@ -65542,9 +64609,9 @@ SQLITE_PRIVATE int sqlite3WalCheckpoint( ** 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 ){ + 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 @@ -65556,11 +64623,11 @@ SQLITE_PRIVATE int sqlite3WalCheckpoint( ** writer lock retried until either the busy-handler returns 0 or the ** lock is successfully obtained. */ - if( eMode!=SQLITE_CHECKPOINT_PASSIVE ){ + if (eMode != SQLITE_CHECKPOINT_PASSIVE) { rc = walBusyLock(pWal, xBusy2, pBusyArg, WAL_WRITE_LOCK, 1); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pWal->writeLock = 1; - }else if( rc==SQLITE_BUSY ){ + } else if (rc == SQLITE_BUSY) { eMode2 = SQLITE_CHECKPOINT_PASSIVE; xBusy2 = 0; rc = SQLITE_OK; @@ -65568,34 +64635,35 @@ SQLITE_PRIVATE int sqlite3WalCheckpoint( } } - /* Read the wal-index header. */ - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { walDisableBlocking(pWal); rc = walIndexReadHdr(pWal, &isChanged); (void)walEnableBlocking(pWal); - if( isChanged && pWal->pDbFd->pMethods->iVersion>=3 ){ + 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 (rc == SQLITE_OK) { - if( pWal->hdr.mxFrame && walPagesize(pWal)!=nBuf ){ + if (pWal->hdr.mxFrame && walPagesize(pWal) != nBuf) { rc = SQLITE_CORRUPT_BKPT; - }else{ + } 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 (rc == SQLITE_OK || rc == SQLITE_BUSY) { + if (pnLog) + *pnLog = (int)pWal->hdr.mxFrame; + if (pnCkpt) + *pnCkpt = (int)(walCkptInfo(pWal)->nBackfill); } } - if( isChanged ){ + 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 @@ -65610,15 +64678,16 @@ SQLITE_PRIVATE int sqlite3WalCheckpoint( /* Release the locks. */ sqlite3WalEndWriteTransaction(pWal); - if( pWal->ckptLock ){ + 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; + if (rc == SQLITE_BUSY_TIMEOUT) + rc = SQLITE_BUSY; #endif - return (rc==SQLITE_OK && eMode!=eMode2 ? SQLITE_BUSY : rc); + return (rc == SQLITE_OK && eMode != eMode2 ? SQLITE_BUSY : rc); } /* Return the value to pass to a sqlite3_wal_hook callback, the @@ -65626,9 +64695,9 @@ SQLITE_PRIVATE int sqlite3WalCheckpoint( ** sqlite3WalCallback() was called. If no commits have occurred since ** the last call, then return 0. */ -SQLITE_PRIVATE int sqlite3WalCallback(Wal *pWal){ +SQLITE_PRIVATE int sqlite3WalCallback(Wal* pWal) { u32 ret = 0; - if( pWal ){ + if (pWal) { ret = pWal->iCallback; pWal->iCallback = 0; } @@ -65659,10 +64728,10 @@ SQLITE_PRIVATE int sqlite3WalCallback(Wal *pWal){ ** should acquire the database exclusive lock prior to invoking ** the op==1 case. */ -SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op){ +SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal* pWal, int op) { int rc; - assert( pWal->writeLock==0 ); - assert( pWal->exclusiveMode!=WAL_HEAPMEMORY_MODE || op==-1 ); + 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 @@ -65670,28 +64739,28 @@ SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op){ ** 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) ); + assert(pWal->readLock >= 0 || pWal->lockError); + assert(pWal->readLock >= 0 || (op <= 0 && pWal->exclusiveMode == 0)); - if( op==0 ){ - if( pWal->exclusiveMode!=WAL_NORMAL_MODE ){ + if (op == 0) { + if (pWal->exclusiveMode != WAL_NORMAL_MODE) { pWal->exclusiveMode = WAL_NORMAL_MODE; - if( walLockShared(pWal, WAL_READ_LOCK(pWal->readLock))!=SQLITE_OK ){ + if (walLockShared(pWal, WAL_READ_LOCK(pWal->readLock)) != SQLITE_OK) { pWal->exclusiveMode = WAL_EXCLUSIVE_MODE; } - rc = pWal->exclusiveMode==WAL_NORMAL_MODE; - }else{ + 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 ); + } 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; + } else { + rc = pWal->exclusiveMode == WAL_NORMAL_MODE; } return rc; } @@ -65701,8 +64770,8 @@ SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op){ ** 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 ); +SQLITE_PRIVATE int sqlite3WalHeapMemory(Wal* pWal) { + return (pWal && pWal->exclusiveMode == WAL_HEAPMEMORY_MODE); } #ifdef SQLITE_ENABLE_SNAPSHOT @@ -65710,21 +64779,21 @@ SQLITE_PRIVATE int sqlite3WalHeapMemory(Wal *pWal){ ** every other subsystem, so the WAL module can put whatever it needs ** in the object. */ -SQLITE_PRIVATE int sqlite3WalSnapshotGet(Wal *pWal, sqlite3_snapshot **ppSnapshot){ +SQLITE_PRIVATE int sqlite3WalSnapshotGet(Wal* pWal, sqlite3_snapshot** ppSnapshot) { int rc = SQLITE_OK; - WalIndexHdr *pRet; - static const u32 aZero[4] = { 0, 0, 0, 0 }; + WalIndexHdr* pRet; + static const u32 aZero[4] = {0, 0, 0, 0}; - assert( pWal->readLock>=0 && pWal->writeLock==0 ); + assert(pWal->readLock >= 0 && pWal->writeLock == 0); - if( memcmp(&pWal->hdr.aFrameCksum[0],aZero,16)==0 ){ + if (memcmp(&pWal->hdr.aFrameCksum[0], aZero, 16) == 0) { *ppSnapshot = 0; return SQLITE_ERROR; } pRet = (WalIndexHdr*)sqlite3_malloc(sizeof(WalIndexHdr)); - if( pRet==0 ){ + if (pRet == 0) { rc = SQLITE_NOMEM_BKPT; - }else{ + } else { memcpy(pRet, &pWal->hdr, sizeof(WalIndexHdr)); *ppSnapshot = (sqlite3_snapshot*)pRet; } @@ -65733,11 +64802,8 @@ SQLITE_PRIVATE int sqlite3WalSnapshotGet(Wal *pWal, sqlite3_snapshot **ppSnapsho } /* Try to open on pSnapshot when the next read-transaction starts -*/ -SQLITE_PRIVATE void sqlite3WalSnapshotOpen( - Wal *pWal, - sqlite3_snapshot *pSnapshot -){ + */ +SQLITE_PRIVATE void sqlite3WalSnapshotOpen(Wal* pWal, sqlite3_snapshot* pSnapshot) { pWal->pSnapshot = (WalIndexHdr*)pSnapshot; } @@ -65745,16 +64811,20 @@ SQLITE_PRIVATE void sqlite3WalSnapshotOpen( ** 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; +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; + if (pHdr1->aSalt[0] < pHdr2->aSalt[0]) + return -1; + if (pHdr1->aSalt[0] > pHdr2->aSalt[0]) + return +1; + if (pHdr1->mxFrame < pHdr2->mxFrame) + return -1; + if (pHdr1->mxFrame > pHdr2->mxFrame) + return +1; return 0; } @@ -65769,14 +64839,12 @@ SQLITE_API int sqlite3_snapshot_cmp(sqlite3_snapshot *p1, sqlite3_snapshot *p2){ ** 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){ +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 - ){ + if (rc == SQLITE_OK) { + WalIndexHdr* pNew = (WalIndexHdr*)pSnapshot; + if (memcmp(pNew->aSalt, pWal->hdr.aSalt, sizeof(pWal->hdr.aSalt)) || pNew->mxFrame < walCkptInfo(pWal)->nBackfillAttempted) { rc = SQLITE_ERROR_SNAPSHOT; walUnlockShared(pWal, WAL_CKPT_LOCK); } @@ -65788,12 +64856,11 @@ SQLITE_PRIVATE int sqlite3WalSnapshotCheck(Wal *pWal, sqlite3_snapshot *pSnapsho ** Release a lock obtained by an earlier successful call to ** sqlite3WalSnapshotCheck(). */ -SQLITE_PRIVATE void sqlite3WalSnapshotUnlock(Wal *pWal){ - assert( pWal ); +SQLITE_PRIVATE void sqlite3WalSnapshotUnlock(Wal* pWal) { + assert(pWal); walUnlockShared(pWal, WAL_CKPT_LOCK); } - #endif /* SQLITE_ENABLE_SNAPSHOT */ #ifdef SQLITE_ENABLE_ZIPVFS @@ -65802,15 +64869,15 @@ SQLITE_PRIVATE void sqlite3WalSnapshotUnlock(Wal *pWal){ ** 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 ); +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){ + */ +SQLITE_PRIVATE sqlite3_file* sqlite3WalFile(Wal* pWal) { return pWal->pWalFd; } @@ -66054,18 +65121,17 @@ SQLITE_PRIVATE sqlite3_file *sqlite3WalFile(Wal *pWal){ */ /* #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)) +#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) +#define MX_CELL(pBt) ((pBt->pageSize - 8) / 6) /* Forward declarations */ typedef struct MemPage MemPage; @@ -66085,17 +65151,17 @@ typedef struct CellInfo CellInfo; ** 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" +#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 +#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 @@ -66110,36 +65176,36 @@ typedef struct CellInfo CellInfo; ** 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 */ + 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 */ + 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 */ }; /* @@ -66150,15 +65216,15 @@ struct MemPage { ** 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 */ + 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 +#define READ_LOCK 1 +#define WRITE_LOCK 2 /* A Btree handle ** @@ -66182,8 +65248,8 @@ struct BtLock { ** 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 */ + 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 */ @@ -66191,13 +65257,13 @@ struct Btree { 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 */ + 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() */ + u64 nSeek; /* Calls to sqlite3BtreeMovetoUnpacked() */ #endif #ifndef SQLITE_OMIT_SHARED_CACHE - BtLock lock; /* Object used to lock page 1 */ + BtLock lock; /* Object used to lock page 1 */ #endif }; @@ -66211,21 +65277,20 @@ struct Btree { ** These values must match SQLITE_TXN_NONE, SQLITE_TXN_READ, and ** SQLITE_TXN_WRITE */ -#define TRANS_NONE 0 -#define TRANS_READ 1 +#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 +#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 +#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 +#if TRANS_WRITE != SQLITE_TXN_WRITE +#error wrong numeric code for write-transaction #endif - /* ** An instance of this object represents a single database file. ** @@ -66262,54 +65327,54 @@ struct Btree { ** 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() */ + 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 */ + 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 */ + 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() */ + 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 */ +#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 @@ -66317,11 +65382,11 @@ struct BtShared { ** 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 */ + 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 */ }; /* @@ -66362,43 +65427,43 @@ struct CellInfo { ** 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 */ + 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 */ +#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 */ +#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. @@ -66430,16 +65495,16 @@ struct BtCursor { ** 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 +#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)) +#define PENDING_BYTE_PAGE(pBt) ((Pgno)((PENDING_BYTE / ((pBt)->pageSize)) + 1)) /* ** These macros define the location of the pointer-map entry for a @@ -66457,8 +65522,8 @@ struct BtCursor { ** 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)) +#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 @@ -66500,10 +65565,9 @@ struct BtCursor { /* 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 ); - +#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 @@ -66518,7 +65582,6 @@ struct BtCursor { #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. @@ -66531,26 +65594,26 @@ struct BtCursor { */ 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) */ + 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 */ + 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 */ + 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 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 @@ -66559,14 +65622,14 @@ struct IntegrityCk { ** 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)) +#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]) +#define get2byteAligned(x) ((x)[0] << 8 | (x)[1]) #endif /************** End of btreeInt.h ********************************************/ @@ -66579,10 +65642,10 @@ struct IntegrityCk { ** 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) ); +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; @@ -66593,19 +65656,19 @@ static void lockBtreeMutex(Btree *p){ ** 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 ); +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); +static void SQLITE_NOINLINE btreeLockCarefully(Btree* p); /* ** Enter a mutex on the given BTree object. @@ -66623,31 +65686,33 @@ static void SQLITE_NOINLINE btreeLockCarefully(Btree *p); ** 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){ +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) ); + assert(p->pNext == 0 || p->pNext->pBt > p->pBt); + assert(p->pPrev == 0 || p->pPrev->pBt < p->pBt); + 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 ); + 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) ); + 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 ); + assert((p->locked == 0 && p->sharable) || p->pBt->db == p->db); - if( !p->sharable ) return; + if (!p->sharable) + return; p->wantToLock++; - if( p->locked ) return; + if (p->locked) + return; btreeLockCarefully(p); } @@ -66657,14 +65722,14 @@ SQLITE_PRIVATE void sqlite3BtreeEnter(Btree *p){ ** and thus help the sqlite3BtreeLock() routine to run much faster ** in the common case. */ -static void SQLITE_NOINLINE btreeLockCarefully(Btree *p){ - Btree *pLater; +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 ){ + if (sqlite3_mutex_try(p->pBt->mutex) == SQLITE_OK) { p->pBt->db = p->db; p->locked = 1; return; @@ -66675,32 +65740,31 @@ static void SQLITE_NOINLINE btreeLockCarefully(Btree *p){ ** 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 ){ + 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 ){ + 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 ); +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 ){ + if (p->wantToLock == 0) { unlockBtreeMutex(p); } } @@ -66713,17 +65777,16 @@ SQLITE_PRIVATE void sqlite3BtreeLeave(Btree *p){ ** ** 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) ); +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); + 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 @@ -66738,34 +65801,37 @@ SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree *p){ ** two or more btrees in common both try to lock all their btrees ** at the same instant. */ -static void SQLITE_NOINLINE btreeEnterAll(sqlite3 *db){ +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++){ + Btree* p; + assert(sqlite3_mutex_held(db->mutex)); + for (i = 0; i < db->nDb; i++) { p = db->aDb[i].pBt; - if( p && p->sharable ){ + if (p && p->sharable) { sqlite3BtreeEnter(p); skipOk = 0; } } db->noSharedCache = skipOk; } -SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){ - if( db->noSharedCache==0 ) btreeEnterAll(db); +SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3* db) { + if (db->noSharedCache == 0) + btreeEnterAll(db); } -static void SQLITE_NOINLINE btreeLeaveAll(sqlite3 *db){ +static void SQLITE_NOINLINE btreeLeaveAll(sqlite3* db) { int i; - Btree *p; - assert( sqlite3_mutex_held(db->mutex) ); - for(i=0; inDb; i++){ + Btree* p; + assert(sqlite3_mutex_held(db->mutex)); + for (i = 0; i < db->nDb; i++) { p = db->aDb[i].pBt; - if( p ) sqlite3BtreeLeave(p); + if (p) + sqlite3BtreeLeave(p); } } -SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3 *db){ - if( db->noSharedCache==0 ) btreeLeaveAll(db); +SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3* db) { + if (db->noSharedCache == 0) + btreeLeaveAll(db); } #ifndef NDEBUG @@ -66775,16 +65841,15 @@ SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3 *db){ ** ** This routine is used inside assert() statements only. */ -SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3 *db){ +SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3* db) { int i; - if( !sqlite3_mutex_held(db->mutex) ){ + if (!sqlite3_mutex_held(db->mutex)) { return 0; } - for(i=0; inDb; i++){ - Btree *p; + for (i = 0; i < db->nDb; i++) { + Btree* p; p = db->aDb[i].pBt; - if( p && p->sharable && - (p->wantToLock==0 || !sqlite3_mutex_held(p->pBt->mutex)) ){ + if (p && p->sharable && (p->wantToLock == 0 || !sqlite3_mutex_held(p->pBt->mutex))) { return 0; } } @@ -66804,20 +65869,23 @@ SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3 *db){ ** 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; +SQLITE_PRIVATE int sqlite3SchemaMutexHeld(sqlite3* db, int iDb, Schema* pSchema) { + Btree* p; + assert(db != 0); + if (pSchema) + iDb = sqlite3SchemaToIndex(db, pSchema); + assert(iDb >= 0 && iDb < db->nDb); + 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; + assert(p != 0); + return p->sharable == 0 || p->locked == 1; } #endif /* NDEBUG */ -#else /* SQLITE_THREADSAFE>0 above. SQLITE_THREADSAFE==0 below */ +#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 @@ -66828,14 +65896,14 @@ SQLITE_PRIVATE int sqlite3SchemaMutexHeld(sqlite3 *db, int iDb, Schema *pSchema) ** the ones below, are no-ops and are null #defines in btree.h. */ -SQLITE_PRIVATE void sqlite3BtreeEnter(Btree *p){ +SQLITE_PRIVATE void sqlite3BtreeEnter(Btree* p) { p->pBt->db = p->db; } -SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){ +SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3* db) { int i; - for(i=0; inDb; i++){ - Btree *p = db->aDb[i].pBt; - if( p ){ + for (i = 0; i < db->nDb; i++) { + Btree* p = db->aDb[i].pBt; + if (p) { p->pBt->db = p->db; } } @@ -66850,14 +65918,14 @@ SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){ ** 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){ +SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor* pCur) { sqlite3BtreeEnter(pCur->pBtree); } -# if SQLITE_THREADSAFE -SQLITE_PRIVATE void sqlite3BtreeLeaveCursor(BtCursor *pCur){ +#if SQLITE_THREADSAFE +SQLITE_PRIVATE void sqlite3BtreeLeaveCursor(BtCursor* pCur) { sqlite3BtreeLeave(pCur->pBtree); } -# endif +#endif #endif /* ifndef SQLITE_OMIT_INCRBLOB */ #endif /* ifndef SQLITE_OMIT_SHARED_CACHE */ @@ -66893,9 +65961,13 @@ static const char zMagicHeader[] = SQLITE_FILE_HEADER; */ #if 0 int sqlite3BtreeTrace=1; /* True to enable tracing */ -# define TRACE(X) if(sqlite3BtreeTrace){printf X;fflush(stdout);} +#define TRACE(X) \ + if (sqlite3BtreeTrace) { \ + printf X; \ + fflush(stdout); \ + } #else -# define TRACE(X) +#define TRACE(X) #endif /* @@ -66907,14 +65979,14 @@ int sqlite3BtreeTrace=1; /* True to enable tracing */ ** 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) +#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 */ +#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 @@ -66938,9 +66010,9 @@ int sqlite3BtreeTrace=1; /* True to enable tracing */ ** Access to this variable is protected by SQLITE_MUTEX_STATIC_MAIN. */ #ifdef SQLITE_TEST -SQLITE_PRIVATE BtShared *SQLITE_WSD sqlite3SharedCacheList = 0; +SQLITE_PRIVATE BtShared* SQLITE_WSD sqlite3SharedCacheList = 0; #else -static BtShared *SQLITE_WSD sqlite3SharedCacheList = 0; +static BtShared* SQLITE_WSD sqlite3SharedCacheList = 0; #endif #endif /* SQLITE_OMIT_SHARED_CACHE */ @@ -66952,38 +66024,36 @@ static BtShared *SQLITE_WSD sqlite3SharedCacheList = 0; ** 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){ +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 +/* +** 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; +SQLITE_PRIVATE sqlite3_uint64 sqlite3BtreeSeekCount(Btree* pBt) { + u64 n = pBt->nSeek; pBt->nSeek = 0; return n; } @@ -66999,22 +66069,20 @@ SQLITE_PRIVATE sqlite3_uint64 sqlite3BtreeSeekCount(Btree *pBt){ ** with the page number and filename associated with the (MemPage*). */ #ifdef SQLITE_DEBUG -int corruptPageError(int lineno, MemPage *p){ - char *zMsg; +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) - ); + zMsg = sqlite3_mprintf("database corruption page %d of %s", (int)p->pgno, sqlite3PagerFilename(p->pBt->pPager, 0)); sqlite3EndBenignMalloc(); - if( zMsg ){ + if (zMsg) { sqlite3ReportError(SQLITE_CORRUPT, lineno, zMsg); } sqlite3_free(zMsg); return SQLITE_CORRUPT_BKPT; } -# define SQLITE_CORRUPT_PAGE(pMemPage) corruptPageError(__LINE__, pMemPage) +#define SQLITE_CORRUPT_PAGE(pMemPage) corruptPageError(__LINE__, pMemPage) #else -# define SQLITE_CORRUPT_PAGE(pMemPage) SQLITE_CORRUPT_PGNO(pMemPage->pgno) +#define SQLITE_CORRUPT_PAGE(pMemPage) SQLITE_CORRUPT_PGNO(pMemPage->pgno) #endif #ifndef SQLITE_OMIT_SHARED_CACHE @@ -67042,23 +66110,20 @@ int corruptPageError(int lineno, MemPage *p){ ** 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; +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; + 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)) - ){ + if ((pBtree->sharable == 0) || (eLockType == READ_LOCK && (pBtree->db->flags & SQLITE_ReadUncommit))) { return 1; } @@ -67067,7 +66132,7 @@ static int hasSharedCacheTableLock( ** 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) ){ + if (isIndex && (!pSchema || (pSchema->schemaFlags & DB_SchemaLoaded) == 0)) { return 1; } @@ -67075,13 +66140,13 @@ static int hasSharedCacheTableLock( ** 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; + 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 ){ + 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. */ @@ -67091,18 +66156,16 @@ static int hasSharedCacheTableLock( bSeen = 1; } } - }else{ + } 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 - ){ + 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; } } @@ -67131,19 +66194,16 @@ static int hasSharedCacheTableLock( ** ** 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) - ){ +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 */ +#endif /* #ifdef SQLITE_DEBUG */ /* ** Query to see if Btree handle p may obtain a lock of type eLock @@ -67151,36 +66211,36 @@ static int hasReadConflicts(Btree *pBtree, Pgno iRoot){ ** 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; +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 ); + 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 ); + 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 ){ + 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 ){ + 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){ + for (pIter = pBt->pLock; pIter; pIter = pIter->pNext) { /* The condition (pIter->eLock!=eLock) in the following if(...) ** statement is a simplification of: ** @@ -67190,12 +66250,12 @@ static int querySharedCacheTableLock(Btree *p, Pgno iTab, u8 eLock){ ** 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 ){ + 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 ); + if (eLock == WRITE_LOCK) { + assert(p == pBt->pWriter); pBt->btsFlags |= BTS_PENDING; } return SQLITE_LOCKED_SHAREDCACHE; @@ -67223,29 +66283,29 @@ static int querySharedCacheTableLock(Btree *p, Pgno iTab, u8 eLock){ ** 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; +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 ); + 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 ); + 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) ); + 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 ){ + for (pIter = pBt->pLock; pIter; pIter = pIter->pNext) { + if (pIter->iTable == iTable && pIter->pBtree == p) { pLock = pIter; break; } @@ -67254,9 +66314,9 @@ static int setSharedCacheTableLock(Btree *p, Pgno iTable, u8 eLock){ /* 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 ){ + if (!pLock) { + pLock = (BtLock*)sqlite3MallocZero(sizeof(BtLock)); + if (!pLock) { return SQLITE_NOMEM_BKPT; } pLock->iTable = iTable; @@ -67269,8 +66329,8 @@ static int setSharedCacheTableLock(Btree *p, Pgno iTable, u8 eLock){ ** 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 ){ + assert(WRITE_LOCK > READ_LOCK); + if (eLock > pLock->eLock) { pLock->eLock = eLock; } @@ -67287,34 +66347,34 @@ static int setSharedCacheTableLock(Btree *p, Pgno iTable, u8 eLock){ ** 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; +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 ); + 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 ){ + 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 ){ + assert(pLock->iTable != 1 || pLock == &p->lock); + if (pLock->iTable != 1) { sqlite3_free(pLock); } - }else{ + } else { ppIter = &pLock->pNext; } } - assert( (pBt->btsFlags & BTS_PENDING)==0 || pBt->pWriter ); - if( pBt->pWriter==p ){ + 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 ){ + 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 @@ -67331,14 +66391,14 @@ static void clearAllSharedCacheTableLocks(Btree *p){ /* ** 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; +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 ); + 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; } } @@ -67346,9 +66406,9 @@ static void downgradeAllSharedCacheTableLocks(Btree *p){ #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 */ +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 **** @@ -67356,7 +66416,7 @@ static void releasePageNotNull(MemPage *pPage); /* Forward reference */ ** Verify that the cursor holds the mutex on its BtShared */ #ifdef SQLITE_DEBUG -static int cursorHoldsMutex(BtCursor *p){ +static int cursorHoldsMutex(BtCursor* p) { return sqlite3_mutex_held(p->pBt->mutex); } @@ -67368,9 +66428,9 @@ static int cursorHoldsMutex(BtCursor *p){ ** 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); +static int cursorOwnsBtShared(BtCursor* p) { + assert(cursorHoldsMutex(p)); + return (p->pBtree->db == p->pBt->db); } #endif @@ -67384,10 +66444,10 @@ static int cursorOwnsBtShared(BtCursor *p){ ** 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){ +static void invalidateAllOverflowCache(BtShared* pBt) { + BtCursor* p; + assert(sqlite3_mutex_held(pBt->mutex)); + for (p = pBt->pCursor; p; p = p->pNext) { invalidateOverflowCache(p); } } @@ -67406,20 +66466,19 @@ static void invalidateAllOverflowCache(BtShared *pBt){ ** 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) ); +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 ){ + 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) ){ + if (p->pgnoRoot == pgnoRoot && (isClearTable || p->info.nKey == iRow)) { p->eState = CURSOR_INVALID; } } @@ -67427,8 +66486,8 @@ static void invalidateIncrblobCursors( } #else - /* Stub function when INCRBLOB is omitted */ - #define invalidateIncrblobCursors(w,x,y,z) +/* Stub function when INCRBLOB is omitted */ +#define invalidateIncrblobCursors(w, x, y, z) #endif /* SQLITE_OMIT_INCRBLOB */ /* @@ -67466,16 +66525,16 @@ static void invalidateIncrblobCursors( ** set in BtShared.pHasContent. The contents of the bitvec are cleared ** at the end of every transaction. */ -static int btreeSetHasContent(BtShared *pBt, Pgno pgno){ +static int btreeSetHasContent(BtShared* pBt, Pgno pgno) { int rc = SQLITE_OK; - if( !pBt->pHasContent ){ - assert( pgno<=pBt->nPage ); + if (!pBt->pHasContent) { + assert(pgno <= pBt->nPage); pBt->pHasContent = sqlite3BitvecCreate(pBt->nPage); - if( !pBt->pHasContent ){ + if (!pBt->pHasContent) { rc = SQLITE_NOMEM_BKPT; } } - if( rc==SQLITE_OK && pgno<=sqlite3BitvecSize(pBt->pHasContent) ){ + if (rc == SQLITE_OK && pgno <= sqlite3BitvecSize(pBt->pHasContent)) { rc = sqlite3BitvecSet(pBt->pHasContent, pgno); } return rc; @@ -67488,16 +66547,16 @@ static int btreeSetHasContent(BtShared *pBt, Pgno pgno){ ** 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)); +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){ +static void btreeClearHasContent(BtShared* pBt) { sqlite3BitvecDestroy(pBt->pHasContent); pBt->pHasContent = 0; } @@ -67505,10 +66564,10 @@ static void btreeClearHasContent(BtShared *pBt){ /* ** Release all of the apPage[] pages for a cursor. */ -static void btreeReleaseAllCursorPages(BtCursor *pCur){ +static void btreeReleaseAllCursorPages(BtCursor* pCur) { int i; - if( pCur->iPage>=0 ){ - for(i=0; iiPage; i++){ + if (pCur->iPage >= 0) { + for (i = 0; i < pCur->iPage; i++) { releasePageNotNull(pCur->apPage[i]); } releasePageNotNull(pCur->pPage); @@ -67529,38 +66588,38 @@ static void btreeReleaseAllCursorPages(BtCursor *pCur){ ** set to point to a malloced buffer pCur->nKey bytes in size containing ** the key. */ -static int saveCursorKey(BtCursor *pCur){ +static int saveCursorKey(BtCursor* pCur) { int rc = SQLITE_OK; - assert( CURSOR_VALID==pCur->eState ); - assert( 0==pCur->pKey ); - assert( cursorHoldsMutex(pCur) ); + assert(CURSOR_VALID == pCur->eState); + assert(0 == pCur->pKey); + assert(cursorHoldsMutex(pCur)); - if( pCur->curIntKey ){ + if (pCur->curIntKey) { /* Only the rowid is required for a table btree */ pCur->nKey = sqlite3BtreeIntegerKey(pCur); - }else{ + } 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; + void* pKey; pCur->nKey = sqlite3BtreePayloadSize(pCur); - pKey = sqlite3Malloc( pCur->nKey + 9 + 8 ); - if( pKey ){ + 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); + if (rc == SQLITE_OK) { + memset(((u8*)pKey) + pCur->nKey, 0, 9 + 8); pCur->pKey = pKey; - }else{ + } else { sqlite3_free(pKey); } - }else{ + } else { rc = SQLITE_NOMEM_BKPT; } } - assert( !pCur->curIntKey || !pCur->pKey ); + assert(!pCur->curIntKey || !pCur->pKey); return rc; } @@ -67571,34 +66630,34 @@ static int saveCursorKey(BtCursor *pCur){ ** The caller must ensure that the cursor is valid (has eState==CURSOR_VALID) ** prior to calling this routine. */ -static int saveCursorPosition(BtCursor *pCur){ +static int saveCursorPosition(BtCursor* pCur) { int rc; - assert( CURSOR_VALID==pCur->eState || CURSOR_SKIPNEXT==pCur->eState ); - assert( 0==pCur->pKey ); - assert( cursorHoldsMutex(pCur) ); + assert(CURSOR_VALID == pCur->eState || CURSOR_SKIPNEXT == pCur->eState); + assert(0 == pCur->pKey); + assert(cursorHoldsMutex(pCur)); - if( pCur->curFlags & BTCF_Pinned ){ + if (pCur->curFlags & BTCF_Pinned) { return SQLITE_CONSTRAINT_PINNED; } - if( pCur->eState==CURSOR_SKIPNEXT ){ + if (pCur->eState == CURSOR_SKIPNEXT) { pCur->eState = CURSOR_VALID; - }else{ + } else { pCur->skipNext = 0; } rc = saveCursorKey(pCur); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { btreeReleaseAllCursorPages(pCur); pCur->eState = CURSOR_REQUIRESEEK; } - pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl|BTCF_AtLast); + pCur->curFlags &= ~(BTCF_ValidNKey | BTCF_ValidOvfl | BTCF_AtLast); return rc; } /* Forward reference */ -static int SQLITE_NOINLINE saveCursorsOnList(BtCursor*,Pgno,BtCursor*); +static int SQLITE_NOINLINE saveCursorsOnList(BtCursor*, Pgno, BtCursor*); /* ** Save the positions of all cursors (except pExcept) that are open on @@ -67621,15 +66680,18 @@ static int SQLITE_NOINLINE saveCursorsOnList(BtCursor*,Pgno,BtCursor*); ** 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; +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; + if (p) + return saveCursorsOnList(p, iRoot, pExcept); + if (pExcept) + pExcept->curFlags &= ~BTCF_Multiple; return SQLITE_OK; } @@ -67638,33 +66700,32 @@ static int saveAllCursors(BtShared *pBt, Pgno iRoot, BtCursor *pExcept){ ** 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 ){ +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 ){ + if (SQLITE_OK != rc) { return rc; } - }else{ - testcase( p->iPage>=0 ); + } else { + testcase(p->iPage >= 0); btreeReleaseAllCursorPages(p); } } p = p->pNext; - }while( p ); + } while (p); return SQLITE_OK; } /* ** Clear the current cursor position. */ -SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *pCur){ - assert( cursorHoldsMutex(pCur) ); +SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor* pCur) { + assert(cursorHoldsMutex(pCur)); sqlite3_free(pCur->pKey); pCur->pKey = 0; pCur->eState = CURSOR_INVALID; @@ -67675,29 +66736,29 @@ SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *pCur){ ** 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 */ +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 ); + if (pKey) { + KeyInfo* pKeyInfo = pCur->pKeyInfo; + assert(nKey == (i64)(int)nKey); pIdxKey = sqlite3VdbeAllocUnpackedRecord(pKeyInfo); - if( pIdxKey==0 ) return SQLITE_NOMEM_BKPT; + if (pIdxKey == 0) + return SQLITE_NOMEM_BKPT; sqlite3VdbeRecordUnpack(pKeyInfo, (int)nKey, pKey, pIdxKey); - if( pIdxKey->nField==0 || pIdxKey->nField>pKeyInfo->nAllField ){ + if (pIdxKey->nField == 0 || pIdxKey->nField > pKeyInfo->nAllField) { rc = SQLITE_CORRUPT_BKPT; - }else{ + } else { rc = sqlite3BtreeIndexMoveto(pCur, pIdxKey, pRes); } sqlite3DbFree(pCur->pKeyInfo->db, pIdxKey); - }else{ + } else { pIdxKey = 0; rc = sqlite3BtreeTableMoveto(pCur, nKey, bias, pRes); } @@ -67711,36 +66772,34 @@ static int btreeMoveto( ** at most one effective restoreCursorPosition() call after each ** saveCursorPosition(). */ -static int btreeRestoreCursorPosition(BtCursor *pCur){ +static int btreeRestoreCursorPosition(BtCursor* pCur) { int rc; int skipNext = 0; - assert( cursorOwnsBtShared(pCur) ); - assert( pCur->eState>=CURSOR_REQUIRESEEK ); - if( pCur->eState==CURSOR_FAULT ){ + assert(cursorOwnsBtShared(pCur)); + assert(pCur->eState >= CURSOR_REQUIRESEEK); + if (pCur->eState == CURSOR_FAULT) { return pCur->skipNext; } pCur->eState = CURSOR_INVALID; - if( sqlite3FaultSim(410) ){ + if (sqlite3FaultSim(410)) { rc = SQLITE_IOERR; - }else{ + } else { rc = btreeMoveto(pCur, pCur->pKey, pCur->nKey, 0, &skipNext); } - if( rc==SQLITE_OK ){ + 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 ){ + 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) +#define restoreCursorPosition(p) (p->eState >= CURSOR_REQUIRESEEK ? btreeRestoreCursorPosition(p) : SQLITE_OK) /* ** Determine whether or not a cursor has moved from the position where @@ -67754,11 +66813,10 @@ static int btreeRestoreCursorPosition(BtCursor *pCur){ ** 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 ); +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; } @@ -67767,9 +66825,9 @@ SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor *pCur){ ** false to the sqlite3BtreeCursorHasMoved() routine above. The fake ** cursor returned must not be used with any other Btree interface. */ -SQLITE_PRIVATE BtCursor *sqlite3BtreeFakeValidCursor(void){ +SQLITE_PRIVATE BtCursor* sqlite3BtreeFakeValidCursor(void) { static u8 fakeCursor = CURSOR_VALID; - assert( offsetof(BtCursor, eState)==0 ); + assert(offsetof(BtCursor, eState) == 0); return (BtCursor*)&fakeCursor; } @@ -67786,19 +66844,19 @@ SQLITE_PRIVATE BtCursor *sqlite3BtreeFakeValidCursor(void){ ** This routine should only be called for a cursor that just returned ** TRUE from sqlite3BtreeCursorHasMoved(). */ -SQLITE_PRIVATE int sqlite3BtreeCursorRestore(BtCursor *pCur, int *pDifferentRow){ +SQLITE_PRIVATE int sqlite3BtreeCursorRestore(BtCursor* pCur, int* pDifferentRow) { int rc; - assert( pCur!=0 ); - assert( pCur->eState!=CURSOR_VALID ); + assert(pCur != 0); + assert(pCur->eState != CURSOR_VALID); rc = restoreCursorPosition(pCur); - if( rc ){ + if (rc) { *pDifferentRow = 1; return rc; } - if( pCur->eState!=CURSOR_VALID ){ + if (pCur->eState != CURSOR_VALID) { *pDifferentRow = 1; - }else{ + } else { *pDifferentRow = 0; } return SQLITE_OK; @@ -67810,7 +66868,7 @@ SQLITE_PRIVATE int sqlite3BtreeCursorRestore(BtCursor *pCur, int *pDifferentRow) ** 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, ...){ +SQLITE_PRIVATE void sqlite3BtreeCursorHint(BtCursor* pCur, int eHintType, ...) { /* Used only by system that substitute their own storage engine */ } #endif @@ -67818,12 +66876,11 @@ SQLITE_PRIVATE void sqlite3BtreeCursorHint(BtCursor *pCur, int eHintType, ...){ /* ** Provide flag hints to the cursor. */ -SQLITE_PRIVATE void sqlite3BtreeCursorHintFlags(BtCursor *pCur, unsigned x){ - assert( x==BTREE_SEEK_EQ || x==BTREE_BULKLOAD || x==0 ); +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 @@ -67834,15 +66891,16 @@ SQLITE_PRIVATE void sqlite3BtreeCursorHintFlags(BtCursor *pCur, unsigned x){ ** no pointer map associated with page 1. The integrity_check logic ** requires that ptrmapPageno(*,1)!=1. */ -static Pgno ptrmapPageno(BtShared *pBt, Pgno pgno){ +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) ){ + 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; @@ -67858,31 +66916,32 @@ static Pgno ptrmapPageno(BtShared *pBt, Pgno pgno){ ** 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 */ +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; + if (*pRC) + return; - assert( sqlite3_mutex_held(pBt->mutex) ); + 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(0 == PTRMAP_ISPAGE(pBt, PENDING_BYTE_PAGE(pBt))); - assert( pBt->autoVacuum ); - if( key==0 ){ + 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 ){ + if (rc != SQLITE_OK) { *pRC = rc; return; } - if( ((char*)sqlite3PagerGetExtra(pDbPage))[0]!=0 ){ + 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. */ @@ -67890,19 +66949,19 @@ static void ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent, int *pRC){ goto ptrmap_exit; } offset = PTRMAP_PTROFFSET(iPtrmap, key); - if( offset<0 ){ + if (offset < 0) { *pRC = SQLITE_CORRUPT_BKPT; goto ptrmap_exit; } - assert( offset <= (int)pBt->usableSize-5 ); - pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage); + assert(offset <= (int)pBt->usableSize - 5); + pPtrmap = (u8*)sqlite3PagerGetData(pDbPage); - if( eType!=pPtrmap[offset] || get4byte(&pPtrmap[offset+1])!=parent ){ + 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 ){ + *pRC = rc = sqlite3PagerWrite(pDbPage); + if (rc == SQLITE_OK) { pPtrmap[offset] = eType; - put4byte(&pPtrmap[offset+1], parent); + put4byte(&pPtrmap[offset + 1], parent); } } @@ -67917,41 +66976,43 @@ static void ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent, int *pRC){ ** 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 */ +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) ); + assert(sqlite3_mutex_held(pBt->mutex)); iPtrmap = PTRMAP_PAGENO(pBt, key); rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage, 0); - if( rc!=0 ){ + if (rc != 0) { return rc; } - pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage); + pPtrmap = (u8*)sqlite3PagerGetData(pDbPage); offset = PTRMAP_PTROFFSET(iPtrmap, key); - if( offset<0 ){ + if (offset < 0) { sqlite3PagerUnref(pDbPage); return SQLITE_CORRUPT_BKPT; } - assert( offset <= (int)pBt->usableSize-5 ); - assert( pEType!=0 ); + assert(offset <= (int)pBt->usableSize - 5); + assert(pEType != 0); *pEType = pPtrmap[offset]; - if( pPgno ) *pPgno = get4byte(&pPtrmap[offset+1]); + if (pPgno) + *pPgno = get4byte(&pPtrmap[offset + 1]); sqlite3PagerUnref(pDbPage); - if( *pEType<1 || *pEType>5 ) return SQLITE_CORRUPT_PGNO(iPtrmap); + 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) +#define ptrmapPut(w, x, y, z, rc) +#define ptrmapGet(w, x, y, z) SQLITE_OK +#define ptrmapPutOvflPtr(x, y, z, rc) #endif /* @@ -67964,11 +67025,8 @@ static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){ ** ** 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)]))) - +#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 @@ -67976,11 +67034,10 @@ static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){ ** 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 */ -){ +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 @@ -67990,18 +67047,18 @@ static SQLITE_NOINLINE void btreeParseCellAdjustSizeForOverflow( ** 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 */ + 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 ){ + surplus = minLocal + (pInfo->nPayload - minLocal) % (pPage->pBt->usableSize - 4); + testcase(surplus == maxLocal); + testcase(surplus == maxLocal + 1); + if (surplus <= maxLocal) { pInfo->nLocal = (u16)surplus; - }else{ + } else { pInfo->nLocal = (u16)minLocal; } pInfo->nSize = (u16)(&pInfo->pPayload[pInfo->nLocal] - pCell) + 4; @@ -68011,17 +67068,17 @@ static SQLITE_NOINLINE void btreeParseCellAdjustSizeForOverflow( ** 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 */ +static int btreePayloadToLocal(MemPage* pPage, i64 nPayload) { + int maxLocal; /* Maximum amount of payload held locally */ maxLocal = pPage->maxLocal; - if( nPayload<=maxLocal ){ + if (nPayload <= maxLocal) { return nPayload; - }else{ - int minLocal; /* Minimum amount of payload held locally */ - int surplus; /* Overflow payload available for local storage */ + } 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; + surplus = minLocal + (nPayload - minLocal) % (pPage->pBt->usableSize - 4); + return (surplus <= maxLocal) ? surplus : minLocal; } } @@ -68039,14 +67096,13 @@ static int btreePayloadToLocal(MemPage *pPage, i64 nPayload){ ** 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 ); +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 @@ -68056,19 +67112,18 @@ static void btreeParseCellPtrNoPayload( 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 ); +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: @@ -68078,12 +67133,12 @@ static void btreeParseCellPtr( ** The code is inlined to avoid a function call. */ nPayload = *pIter; - if( nPayload>=0x80 ){ - u8 *pEnd = &pIter[8]; + if (nPayload >= 0x80) { + u8* pEnd = &pIter[8]; nPayload &= 0x7f; - do{ - nPayload = (nPayload<<7) | (*++pIter & 0x7f); - }while( (*pIter)>=0x80 && pIter= 0x80 && pIter < pEnd); } pIter++; @@ -68095,23 +67150,23 @@ static void btreeParseCellPtr( ** This routine is a high-runner. */ iKey = *pIter; - if( iKey>=0x80 ){ + 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); + 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); } } } @@ -68125,61 +67180,61 @@ static void btreeParseCellPtr( pInfo->nKey = *(i64*)&iKey; pInfo->nPayload = nPayload; pInfo->pPayload = pIter; - testcase( nPayload==pPage->maxLocal ); - testcase( nPayload==(u32)pPage->maxLocal+1 ); - if( nPayload<=pPage->maxLocal ){ + 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; + if (pInfo->nSize < 4) + pInfo->nSize = 4; pInfo->nLocal = (u16)nPayload; - }else{ + } 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 */ +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 ); + 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]; + if (nPayload >= 0x80) { + u8* pEnd = &pIter[8]; nPayload &= 0x7f; - do{ - nPayload = (nPayload<<7) | (*++pIter & 0x7f); - }while( *(pIter)>=0x80 && pIter= 0x80 && pIter < pEnd); } pIter++; pInfo->nKey = nPayload; pInfo->nPayload = nPayload; pInfo->pPayload = pIter; - testcase( nPayload==pPage->maxLocal ); - testcase( nPayload==(u32)pPage->maxLocal+1 ); - if( nPayload<=pPage->maxLocal ){ + 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; + if (pInfo->nSize < 4) + pInfo->nSize = 4; pInfo->nLocal = (u16)nPayload; - }else{ + } 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 */ -){ +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); } @@ -68196,9 +67251,9 @@ static void btreeParseCell( ** 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 */ +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 @@ -68211,35 +67266,36 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ #endif nSize = *pIter; - if( nSize>=0x80 ){ + if (nSize >= 0x80) { pEnd = &pIter[8]; nSize &= 0x7f; - do{ - nSize = (nSize<<7) | (*++pIter & 0x7f); - }while( *(pIter)>=0x80 && pIter= 0x80 && pIter < pEnd); } pIter++; - testcase( nSize==pPage->maxLocal ); - testcase( nSize==(u32)pPage->maxLocal+1 ); - if( nSize<=pPage->maxLocal ){ + testcase(nSize == pPage->maxLocal); + testcase(nSize == (u32)pPage->maxLocal + 1); + if (nSize <= pPage->maxLocal) { nSize += (u32)(pIter - pCell); - if( nSize<4 ) nSize = 4; - }else{ + 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 ){ + 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 ); + 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 */ +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 @@ -68252,16 +67308,17 @@ static u16 cellSizePtrNoPayload(MemPage *pPage, u8 *pCell){ UNUSED_PARAMETER(pPage); #endif - assert( pPage->childPtrSize==4 ); + assert(pPage->childPtrSize == 4); pEnd = pIter + 9; - while( (*pIter++)&0x80 && pIter=0x80 ){ + if (nSize >= 0x80) { pEnd = &pIter[8]; nSize &= 0x7f; - do{ - nSize = (nSize<<7) | (*++pIter & 0x7f); - }while( *(pIter)>=0x80 && pIter= 0x80 && pIter < pEnd); } pIter++; /* pIter now points at the 64-bit integer key value, a variable length ** integer. The following block moves pIter to point at the first byte ** past the end of the key value. */ - if( (*pIter++)&0x80 - && (*pIter++)&0x80 - && (*pIter++)&0x80 - && (*pIter++)&0x80 - && (*pIter++)&0x80 - && (*pIter++)&0x80 - && (*pIter++)&0x80 - && (*pIter++)&0x80 ){ pIter++; } - testcase( nSize==pPage->maxLocal ); - testcase( nSize==(u32)pPage->maxLocal+1 ); - if( nSize<=pPage->maxLocal ){ + if ((*pIter++) & 0x80 && (*pIter++) & 0x80 && (*pIter++) & 0x80 && (*pIter++) & 0x80 && (*pIter++) & 0x80 && (*pIter++) & 0x80 && + (*pIter++) & 0x80 && (*pIter++) & 0x80) { + pIter++; + } + testcase(nSize == pPage->maxLocal); + testcase(nSize == (u32)pPage->maxLocal + 1); + if (nSize <= pPage->maxLocal) { nSize += (u32)(pIter - pCell); - if( nSize<4 ) nSize = 4; - }else{ + 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 ){ + 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 ); + 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){ +static u16 cellSize(MemPage* pPage, int iCell) { return pPage->xCellSize(pPage, findCell(pPage, iCell)); } #endif @@ -68327,25 +67380,25 @@ static u16 cellSize(MemPage *pPage, int iCell){ ** 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){ +static void ptrmapPutOvflPtr(MemPage* pPage, MemPage* pSrc, u8* pCell, int* pRC) { CellInfo info; - if( *pRC ) return; - assert( pCell!=0 ); + if (*pRC) + return; + assert(pCell != 0); pPage->xParseCell(pPage, pCell, &info); - if( info.nLocalaDataEnd, pCell, pCell+info.nLocal) ){ - testcase( pSrc!=pPage ); + if (SQLITE_WITHIN(pSrc->aDataEnd, pCell, pCell + info.nLocal)) { + testcase(pSrc != pPage); *pRC = SQLITE_CORRUPT_BKPT; return; } - ovfl = get4byte(&pCell[info.nSize-4]); + 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. @@ -68358,34 +67411,34 @@ static void ptrmapPutOvflPtr(MemPage *pPage, MemPage *pSrc, u8 *pCell,int *pRC){ ** 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) ); +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; + 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 @@ -68393,38 +67446,45 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ ** 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 ){ + 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; + 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 ){ + 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)); + 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( iFree+sz>usableSize ){ + } else if (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 ){ + if (pc < iCellStart || pc > iCellLast) { return SQLITE_CORRUPT_PAGE(pPage); } - assert( pc>=iCellStart && pc<=iCellLast ); + assert(pc >= iCellStart && pc <= iCellLast); size = pPage->xCellSize(pPage, &src[pc]); cbrk -= size; - if( cbrkusableSize ){ + if (cbrk < iCellStart || pc + size > usableSize) { return SQLITE_CORRUPT_PAGE(pPage); } - assert( cbrk+size<=usableSize && cbrk>=iCellStart ); - testcase( cbrk+size==usableSize ); - testcase( pc+size==usableSize ); + assert(cbrk + size <= usableSize && cbrk >= iCellStart); + testcase(cbrk + size == usableSize); + testcase(pc + size == usableSize); put2byte(pAddr, cbrk); - if( temp==0 ){ - if( cbrk==pc ) continue; + 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; + data[hdr + 7] = 0; - defragment_out: - assert( pPage->nFree>=0 ); - if( data[hdr+7]+cbrk-iCellFirst!=pPage->nFree ){ +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) ); + 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; } @@ -68494,60 +67555,61 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ ** 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 ){ +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]; + pTmp = &aData[pc + 2]; size = get2byte(pTmp); - if( (x = size - nByte)>=0 ){ - testcase( x==4 ); - testcase( x==3 ); - if( x<4 ){ + 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; + 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 ); + aData[hdr + 7] += (u8)x; + testcase(pc + x > maxPC); return &aData[pc]; - }else if( x+pc > maxPC ){ + } 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{ + } 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); + put2byte(&aData[pc + 2], x); } return &aData[pc + x]; } iAddr = pc; pTmp = &aData[pc]; pc = get2byte(pTmp); - if( pc<=iAddr+size ){ - if( pc ){ + 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 ){ + if (pc > maxPC + nByte - 4) { /* The free slot chain extends off the end of the page */ *pRc = SQLITE_CORRUPT_PAGE(pPg); } @@ -68567,37 +67629,37 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){ ** 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 ); +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]; + 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 ){ + assert(top <= (int)pPage->pBt->usableSize); /* by btreeComputeFreeSpace() */ + if (gap > top) { + if (top == 0 && pPage->pBt->usableSize == 65536) { top = 65536; - }else{ + } else { return SQLITE_CORRUPT_PAGE(pPage); } } @@ -68606,21 +67668,21 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ ** 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 ){ + 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 ){ + assert(pSpace + nByte <= data + pPage->pBt->usableSize); + *pIdx = g2 = (int)(pSpace - data); + if (g2 <= gap) { return SQLITE_CORRUPT_PAGE(pPage); - }else{ + } else { return SQLITE_OK; } - }else if( rc ){ + } else if (rc) { return rc; } } @@ -68628,17 +67690,17 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ /* 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 ); + 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 @@ -68646,8 +67708,8 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ ** The assert() below verifies the previous sentence. */ top -= nByte; - put2byte(&data[hdr+5], top); - assert( top+nByte <= (int)pPage->pBt->usableSize ); + put2byte(&data[hdr + 5], top); + assert(top + nByte <= (int)pPage->pBt->usableSize); *pIdx = top; return SQLITE_OK; } @@ -68665,44 +67727,45 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ ** 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 ); +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 */ + if (iFreeBlk > pPage->pBt->usableSize - 4) { /* TH3: corrupt081.100 */ return SQLITE_CORRUPT_PAGE(pPage); } - assert( iFreeBlk>iPtr || iFreeBlk==0 || CORRUPT_DB ); + assert(iFreeBlk > iPtr || iFreeBlk == 0 || CORRUPT_DB); /* At this point: ** iFreeBlk: First freeblock after iStart, or zero if none @@ -68710,11 +67773,12 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ ** ** Check to see if iFreeBlk should be coalesced onto the end of iStart. */ - if( iFreeBlk && iEnd+3>=iFreeBlk ){ + 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 ){ + 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; @@ -68725,39 +67789,43 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ ** 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); + 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; + if (nFrag > data[hdr + 7]) + return SQLITE_CORRUPT_PAGE(pPage); + data[hdr + 7] -= nFrag; } - pTmp = &data[hdr+5]; + pTmp = &data[hdr + 5]; x = get2byte(pTmp); - if( iStart<=x ){ + 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 ){ + if (pPage->pBt->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); + put2byte(&data[iStart + 2], iSize); pPage->nFree += iOrigSize; return SQLITE_OK; } @@ -68774,48 +67842,49 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ ** PTF_LEAFDATA | PTF_INTKEY ** PTF_LEAFDATA | PTF_INTKEY | PTF_LEAF */ -static int decodeFlags(MemPage *pPage, int flagByte){ - BtShared *pBt; /* A copy of pPage->pBt */ +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 ); + 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; + pPage->childPtrSize = 4 - 4 * pPage->leaf; pBt = pPage->pBt; - if( flagByte==(PTF_LEAFDATA | PTF_INTKEY) ){ + 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 ); + 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 ); + assert((PTF_LEAFDATA | PTF_INTKEY | PTF_LEAF) == 13); pPage->intKey = 1; - if( pPage->leaf ){ + if (pPage->leaf) { pPage->intKeyLeaf = 1; pPage->xCellSize = cellSizePtrTableLeaf; pPage->xParseCell = btreeParseCellPtr; - }else{ + } else { pPage->intKeyLeaf = 0; pPage->xCellSize = cellSizePtrNoPayload; pPage->xParseCell = btreeParseCellPtrNoPayload; } pPage->maxLocal = pBt->maxLeaf; pPage->minLocal = pBt->minLeaf; - }else if( flagByte==PTF_ZERODATA ){ + } 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 ); + 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 ); + 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{ + } else { /* EVIDENCE-OF: R-47608-56469 Any other value for the b-tree page type is ** an error. */ pPage->intKey = 0; @@ -68832,24 +67901,24 @@ static int decodeFlags(MemPage *pPage, int flagByte){ ** 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 ); +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; @@ -68857,40 +67926,41 @@ static int btreeComputeFreeSpace(MemPage *pPage){ /* 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; + 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 ){ + 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 ){ + while (1) { + if (pc > iCellLast) { /* Freeblock off the end of the page */ return SQLITE_CORRUPT_PAGE(pPage); } next = get2byte(&data[pc]); - size = get2byte(&data[pc+2]); + size = get2byte(&data[pc + 2]); nFree = nFree + size; - if( next<=pc+size+3 ) break; + if (next <= pc + size + 3) + break; pc = next; } - if( next>0 ){ + if (next > 0) { /* Freeblock not in ascending order */ return SQLITE_CORRUPT_PAGE(pPage); } - if( pc+size>(unsigned int)usableSize ){ + if (pc + size > (unsigned int)usableSize) { /* Last freeblock extends past page end */ return SQLITE_CORRUPT_PAGE(pPage); } @@ -68903,7 +67973,7 @@ static int btreeComputeFreeSpace(MemPage *pPage){ ** 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 || nFree usableSize || nFree < iCellFirst) { return SQLITE_CORRUPT_PAGE(pPage); } pPage->nFree = (u16)(nFree - iCellFirst); @@ -68914,32 +67984,33 @@ static int btreeComputeFreeSpace(MemPage *pPage){ ** 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; +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 ){ + if (!pPage->leaf) + iCellLast--; + for (i = 0; i < pPage->nCell; i++) { + pc = get2byteAligned(&data[cellOffset + i * 2]); + testcase(pc == iCellFirst); + testcase(pc == iCellLast); + if (pc < iCellFirst || pc > iCellLast) { return SQLITE_CORRUPT_PAGE(pPage); } sz = pPage->xCellSize(pPage, &data[pc]); - testcase( pc+sz==usableSize ); - if( pc+sz>usableSize ){ + testcase(pc + sz == usableSize); + if (pc + sz > usableSize) { return SQLITE_CORRUPT_PAGE(pPage); } } @@ -68955,26 +68026,26 @@ static SQLITE_NOINLINE int btreeCellSizeCheck(MemPage *pPage){ ** 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 */ +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 ); + 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]) ){ + if (decodeFlags(pPage, data[0])) { return SQLITE_CORRUPT_PAGE(pPage); } - assert( pBt->pageSize>=512 && pBt->pageSize<=65536 ); + assert(pBt->pageSize >= 512 && pBt->pageSize <= 65536); pPage->maskPage = (u16)(pBt->pageSize - 1); pPage->nOverflow = 0; pPage->cellOffset = pPage->hdrOffset + 8 + pPage->childPtrSize; @@ -68984,21 +68055,19 @@ static int btreeInitPage(MemPage *pPage){ /* 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) ){ + 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) ); + 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 */ + 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 ){ + if (pBt->db->flags & SQLITE_CellSizeCk) { return btreeCellSizeCheck(pPage); } return SQLITE_OK; @@ -69008,25 +68077,25 @@ static int btreeInitPage(MemPage *pPage){ ** 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; +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 ){ + 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); + 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; @@ -69034,27 +68103,26 @@ static void zeroPage(MemPage *pPage, int flags){ pPage->aCellIdx = &data[first]; pPage->aDataOfst = &data[pPage->childPtrSize]; pPage->nOverflow = 0; - assert( pBt->pageSize>=512 && pBt->pageSize<=65536 ); + 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 ){ +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; + pPage->hdrOffset = pgno == 1 ? 100 : 0; } - assert( pPage->aData==sqlite3PagerGetData(pDbPage) ); + assert(pPage->aData == sqlite3PagerGetData(pDbPage)); return pPage; } @@ -69069,19 +68137,19 @@ static MemPage *btreePageFromDbPage(DbPage *pDbPage, Pgno pgno, BtShared *pBt){ ** 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 */ -){ +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; + DbPage* pDbPage; - assert( flags==0 || flags==PAGER_GET_NOCONTENT || flags==PAGER_GET_READONLY ); - assert( sqlite3_mutex_held(pBt->mutex) ); + 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; + if (rc) + return rc; *ppPage = btreePageFromDbPage(pDbPage, pgno, pBt); return SQLITE_OK; } @@ -69091,11 +68159,11 @@ static int btreeGetPage( ** 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) ); +static MemPage* btreePageLookup(BtShared* pBt, Pgno pgno) { + DbPage* pDbPage; + assert(sqlite3_mutex_held(pBt->mutex)); pDbPage = sqlite3PagerLookup(pBt->pPager, pgno); - if( pDbPage ){ + if (pDbPage) { return btreePageFromDbPage(pDbPage, pgno, pBt); } return 0; @@ -69105,11 +68173,11 @@ static MemPage *btreePageLookup(BtShared *pBt, Pgno pgno){ ** 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){ +static Pgno btreePagecount(BtShared* pBt) { return pBt->nPage; } -SQLITE_PRIVATE Pgno sqlite3BtreeLastPage(Btree *p){ - assert( sqlite3BtreeHoldsMutex(p) ); +SQLITE_PRIVATE Pgno sqlite3BtreeLastPage(Btree* p) { + assert(sqlite3BtreeHoldsMutex(p)); return btreePagecount(p->pBt); } @@ -69126,42 +68194,41 @@ SQLITE_PRIVATE Pgno sqlite3BtreeLastPage(Btree *p){ ** 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 */ -){ +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 ); + 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) ){ + if (pgno > btreePagecount(pBt)) { rc = SQLITE_CORRUPT_BKPT; goto getAndInitPage_error1; } rc = sqlite3PagerGet(pBt->pPager, pgno, (DbPage**)&pDbPage, bReadOnly); - if( rc ){ + if (rc) { goto getAndInitPage_error1; } *ppPage = (MemPage*)sqlite3PagerGetExtra(pDbPage); - if( (*ppPage)->isInit==0 ){ + if ((*ppPage)->isInit == 0) { btreePageFromDbPage(pDbPage, pgno, pBt); rc = btreeInitPage(*ppPage); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { goto getAndInitPage_error2; } } - assert( (*ppPage)->pgno==pgno || CORRUPT_DB ); - assert( (*ppPage)->aData==sqlite3PagerGetData(pDbPage) ); + 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) ){ + if (pCur && ((*ppPage)->nCell < 1 || (*ppPage)->intKey != pCur->curIntKey)) { rc = SQLITE_CORRUPT_PGNO(pgno); goto getAndInitPage_error2; } @@ -69170,14 +68237,12 @@ static int getAndInitPage( getAndInitPage_error2: releasePage(*ppPage); getAndInitPage_error1: - if( pCur ){ + 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 ); + testcase(pgno == 0); + assert(pgno != 0 || rc == SQLITE_CORRUPT || rc == SQLITE_IOERR_NOMEM || rc == SQLITE_NOMEM); return rc; } @@ -69187,26 +68252,27 @@ static int getAndInitPage( ** ** 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) ); +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) ); +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); } @@ -69219,27 +68285,25 @@ static void releasePageOne(MemPage *pPage){ ** 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 */ -){ +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 ){ + if (rc == SQLITE_OK) { + if (sqlite3PagerPageRefcount((*ppPage)->pDbPage) > 1) { releasePage(*ppPage); *ppPage = 0; return SQLITE_CORRUPT_BKPT; } (*ppPage)->isInit = 0; - }else{ + } 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 @@ -69248,14 +68312,14 @@ static int btreeGetUnusedPage( ** 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) ); +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 ){ + 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. @@ -69270,10 +68334,10 @@ static void pageReinit(DbPage *pData){ /* ** 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) ); +static int btreeInvokeBusyHandler(void* pArg) { + BtShared* pBt = (BtShared*)pArg; + assert(pBt->db); + assert(sqlite3_mutex_held(pBt->db->mutex)); return sqlite3InvokeBusyHandler(&pBt->db->busyHandler); } @@ -69298,23 +68362,22 @@ static int btreeInvokeBusyHandler(void *pArg){ ** 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 */ +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; + 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. @@ -69322,30 +68385,29 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( #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; + 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 */ + 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 ); + 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 ); + assert((flags & BTREE_SINGLE) == 0 || isTempDb); - if( isMemdb ){ + if (isMemdb) { flags |= BTREE_MEMORY; } - if( (vfsFlags & SQLITE_OPEN_MAIN_DB)!=0 && (isMemdb || isTempDb) ){ + 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 ){ + if (!p) { return SQLITE_NOMEM_BKPT; } p->inTrans = TRANS_NONE; @@ -69360,27 +68422,26 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( ** 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; ) + 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 ){ + if (!zFullPathname) { sqlite3_free(p); return SQLITE_NOMEM_BKPT; } - if( isMemdb ){ + if (isMemdb) { memcpy(zFullPathname, zFilename, nFilename); - }else{ - rc = sqlite3OsFullPathname(pVfs, zFilename, - nFullPathname, zFullPathname); - if( rc ){ - if( rc==SQLITE_OK_SYMLINK ){ + } else { + rc = sqlite3OsFullPathname(pVfs, zFilename, nFullPathname, zFullPathname); + if (rc) { + if (rc == SQLITE_OK_SYMLINK) { rc = SQLITE_OK; - }else{ + } else { sqlite3_free(zFullPathname); sqlite3_free(p); return rc; @@ -69393,14 +68454,13 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( 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 ){ + 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 ){ + 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); @@ -69417,7 +68477,7 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( sqlite3_free(zFullPathname); } #ifdef SQLITE_DEBUG - else{ + 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()) @@ -69428,30 +68488,29 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( #endif } #endif - if( pBt==0 ){ + 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 ){ + 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 ){ + 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); + rc = sqlite3PagerReadFileheader(pBt->pPager, sizeof(zDbHeader), zDbHeader); } - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { goto btree_open_out; } pBt->openFlags = (u8)flags; @@ -69461,7 +68520,8 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( pBt->pCursor = 0; pBt->pPage1 = 0; - if( sqlite3PagerIsreadonly(pBt->pPager) ) pBt->btsFlags |= BTS_READ_ONLY; + 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) @@ -69470,9 +68530,8 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( /* 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 = (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 @@ -69481,45 +68540,46 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( ** 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 ){ + if (zFilename && !isMemdb) { pBt->autoVacuum = (SQLITE_DEFAULT_AUTOVACUUM ? 1 : 0); - pBt->incrVacuum = (SQLITE_DEFAULT_AUTOVACUUM==2 ? 1 : 0); + pBt->incrVacuum = (SQLITE_DEFAULT_AUTOVACUUM == 2 ? 1 : 0); } #endif nReserve = 0; - }else{ + } 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); + 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; + if (rc) + goto btree_open_out; pBt->usableSize = pBt->pageSize - nReserve; - assert( (pBt->pageSize & 7)==0 ); /* 8-byte alignment of pageSize */ + 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 ){ + 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 ){ + 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; + pBt->pNext = GLOBAL(BtShared*, sqlite3SharedCacheList); + GLOBAL(BtShared*, sqlite3SharedCacheList) = pBt; sqlite3_mutex_leave(mutexShared); } #endif @@ -69530,23 +68590,25 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( ** 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 ){ + 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 ){ + Btree* pSib; + for (i = 0; i < db->nDb; 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 ){ + } else { + while (pSib->pNext && (uptr)pSib->pNext->pBt < (uptr)p->pBt) { pSib = pSib->pNext; } p->pNext = pSib->pNext; p->pPrev = pSib; - if( p->pNext ){ + if (p->pNext) { p->pNext->pPrev = p; } pSib->pNext = p; @@ -69559,34 +68621,34 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( *ppBtree = p; btree_open_out: - if( rc!=SQLITE_OK ){ - if( pBt && pBt->pPager ){ + if (rc != SQLITE_OK) { + if (pBt && pBt->pPager) { sqlite3PagerClose(pBt->pPager, 0); } sqlite3_free(pBt); sqlite3_free(p); *ppBtree = 0; - }else{ - sqlite3_file *pFile; + } 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 ){ + if (sqlite3BtreeSchema(p, 0, 0) == 0) { sqlite3BtreeSetCacheSize(p, SQLITE_DEFAULT_CACHE_SIZE); } pFile = sqlite3PagerFile(pBt->pPager); - if( pFile->pMethods ){ + if (pFile->pMethods) { sqlite3OsFileControlHint(pFile, SQLITE_FCNTL_PDB, (void*)&pBt->db); } } - if( mutexOpen ){ - assert( sqlite3_mutex_held(mutexOpen) ); + if (mutexOpen) { + assert(sqlite3_mutex_held(mutexOpen)); sqlite3_mutex_leave(mutexOpen); } - assert( rc!=SQLITE_OK || sqlite3BtreeConnectionCount(*ppBtree)>0 ); + assert(rc != SQLITE_OK || sqlite3BtreeConnectionCount(*ppBtree) > 0); return rc; } @@ -69596,29 +68658,29 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( ** true if the BtShared.nRef counter reaches zero and return ** false if it is still positive. */ -static int removeFromSharingList(BtShared *pBt){ +static int removeFromSharingList(BtShared* pBt) { #ifndef SQLITE_OMIT_SHARED_CACHE - MUTEX_LOGIC( sqlite3_mutex *pMainMtx; ) - BtShared *pList; + MUTEX_LOGIC(sqlite3_mutex * pMainMtx;) + BtShared* pList; int removed = 0; - assert( sqlite3_mutex_notheld(pBt->mutex) ); - MUTEX_LOGIC( pMainMtx = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); ) + 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 (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) ){ + if (ALWAYS(pList)) { pList->pNext = pBt->pNext; } } - if( SQLITE_THREADSAFE ){ + if (SQLITE_THREADSAFE) { sqlite3_mutex_free(pBt->mutex); } removed = 1; @@ -69635,16 +68697,16 @@ static int removeFromSharingList(BtShared *pBt){ ** 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 ); +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 */ + 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; } @@ -69672,8 +68734,8 @@ static SQLITE_NOINLINE int allocateTempSpace(BtShared *pBt){ /* ** Free the pBt->pTmpSpace allocation */ -static void freeTempSpace(BtShared *pBt){ - if( pBt->pTmpSpace ){ +static void freeTempSpace(BtShared* pBt) { + if (pBt->pTmpSpace) { pBt->pTmpSpace -= 4; sqlite3PageFree(pBt->pTmpSpace); pBt->pTmpSpace = 0; @@ -69683,22 +68745,21 @@ static void freeTempSpace(BtShared *pBt){ /* ** Close an open database and invalidate all cursors. */ -SQLITE_PRIVATE int sqlite3BtreeClose(Btree *p){ - BtShared *pBt = p->pBt; +SQLITE_PRIVATE int sqlite3BtreeClose(Btree* p) { + BtShared* pBt = p->pBt; /* Close all cursors opened via this handle. */ - assert( sqlite3_mutex_held(p->db->mutex) ); + 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; + BtCursor* pCur = pBt->pCursor; + while (pCur) { + BtCursor* pTmp = pCur; pCur = pCur->pNext; - assert( pTmp->pBtree!=p ); - + assert(pTmp->pBtree != p); } } #endif @@ -69714,16 +68775,16 @@ SQLITE_PRIVATE int sqlite3BtreeClose(Btree *p){ ** 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) ){ + 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 ); + assert(!pBt->pCursor); sqlite3PagerClose(pBt->pPager, p->db); - if( pBt->xFreeSchema && pBt->pSchema ){ + if (pBt->xFreeSchema && pBt->pSchema) { pBt->xFreeSchema(pBt->pSchema); } sqlite3DbFree(0, pBt->pSchema); @@ -69732,10 +68793,12 @@ SQLITE_PRIVATE int sqlite3BtreeClose(Btree *p){ } #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; + 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); @@ -69749,9 +68812,9 @@ SQLITE_PRIVATE int sqlite3BtreeClose(Btree *p){ ** 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) ); +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); @@ -69768,24 +68831,24 @@ SQLITE_PRIVATE int sqlite3BtreeSetCacheSize(Btree *p, int mxPage){ ** 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; +SQLITE_PRIVATE int sqlite3BtreeSetSpillSize(Btree* p, int mxPage) { + BtShared* pBt = p->pBt; int res; - assert( sqlite3_mutex_held(p->db->mutex) ); + assert(sqlite3_mutex_held(p->db->mutex)); sqlite3BtreeEnter(p); res = sqlite3PagerSetSpillsize(pBt->pPager, mxPage); sqlite3BtreeLeave(p); return res; } -#if SQLITE_MAX_MMAP_SIZE>0 +#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) ); +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); @@ -69802,12 +68865,11 @@ SQLITE_PRIVATE int sqlite3BtreeSetMmapLimit(Btree *p, sqlite3_int64 szMmap){ ** 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) ); +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); @@ -69835,31 +68897,33 @@ SQLITE_PRIVATE int sqlite3BtreeSetPagerFlags( ** 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){ +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 ); + BtShared* pBt = p->pBt; + assert(nReserve >= 0 && nReserve <= 255); sqlite3BtreeEnter(p); pBt->nReserveWanted = nReserve; x = pBt->pageSize - pBt->usableSize; - if( nReservebtsFlags & BTS_PAGESIZE_FIXED ){ + if (nReserve < x) + nReserve = x; + if (pBt->btsFlags & 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; + 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; + if (iFix) + pBt->btsFlags |= BTS_PAGESIZE_FIXED; sqlite3BtreeLeave(p); return rc; } @@ -69867,7 +68931,7 @@ SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve, /* ** Return the currently defined page size */ -SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree *p){ +SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree* p) { return p->pBt->pageSize; } @@ -69882,9 +68946,9 @@ SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree *p){ ** 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){ +SQLITE_PRIVATE int sqlite3BtreeGetReserveNoMutex(Btree* p) { int n; - assert( sqlite3_mutex_held(p->pBt->mutex) ); + assert(sqlite3_mutex_held(p->pBt->mutex)); n = p->pBt->pageSize - p->pBt->usableSize; return n; } @@ -69898,22 +68962,21 @@ SQLITE_PRIVATE int sqlite3BtreeGetReserveNoMutex(Btree *p){ ** 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){ +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; + 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){ +SQLITE_PRIVATE Pgno sqlite3BtreeMaxPageCount(Btree* p, Pgno mxPage) { Pgno n; sqlite3BtreeEnter(p); n = sqlite3PagerMaxPageCount(p->pBt->pPager, mxPage); @@ -69939,17 +69002,18 @@ SQLITE_PRIVATE Pgno sqlite3BtreeMaxPageCount(Btree *p, Pgno mxPage){ ** 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){ +SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree* p, int newFlag) { int b; - if( p==0 ) return 0; + 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 ){ + 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; + p->pBt->btsFlags |= BTS_SECURE_DELETE * newFlag; } - b = (p->pBt->btsFlags & BTS_FAST_SECURE)/BTS_SECURE_DELETE; + b = (p->pBt->btsFlags & BTS_FAST_SECURE) / BTS_SECURE_DELETE; sqlite3BtreeLeave(p); return b; } @@ -69960,20 +69024,20 @@ SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree *p, int newFlag){ ** 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){ +SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree* p, int autoVacuum) { #ifdef SQLITE_OMIT_AUTOVACUUM return SQLITE_READONLY; #else - BtShared *pBt = p->pBt; + 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 ){ + 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; + } else { + pBt->autoVacuum = av ? 1 : 0; + pBt->incrVacuum = av == 2 ? 1 : 0; } sqlite3BtreeLeave(p); return rc; @@ -69984,17 +69048,13 @@ SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *p, int autoVacuum){ ** Return the value of the 'auto-vacuum' property. If auto-vacuum is ** enabled 1 is returned. Otherwise 0. */ -SQLITE_PRIVATE int sqlite3BtreeGetAutoVacuum(Btree *p){ +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 - ); + rc = ((!p->pBt->autoVacuum) ? BTREE_AUTOVACUUM_NONE : (!p->pBt->incrVacuum) ? BTREE_AUTOVACUUM_FULL : BTREE_AUTOVACUUM_INCR); sqlite3BtreeLeave(p); return rc; #endif @@ -70006,31 +69066,27 @@ SQLITE_PRIVATE int sqlite3BtreeGetAutoVacuum(Btree *p){ ** 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] - ){ +#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)); + sqlite3PagerSetFlags(pBt->pPager, pDb->safety_level | (db->flags & PAGER_FLAGS_MASK)); } } } #else -# define setDefaultSyncFlag(pBt,safety_level) +#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. @@ -70040,54 +69096,56 @@ static int newDatabase(BtShared*); ** 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 */ +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 ); + assert(sqlite3_mutex_held(pBt->mutex)); + assert(pBt->pPage1 == 0); rc = sqlite3PagerSharedLock(pBt->pPager); - if( rc!=SQLITE_OK ) return rc; + if (rc != SQLITE_OK) + return rc; rc = btreeGetPage(pBt, 1, &pPage1, 0); - if( rc!=SQLITE_OK ) return rc; + 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); + 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 ){ + if (nPage == 0 || memcmp(24 + (u8*)pPage1->aData, 92 + (u8*)pPage1->aData, 4) != 0) { nPage = nPageFile; } - if( (pBt->db->flags & SQLITE_ResetDatabase)!=0 ){ + if ((pBt->db->flags & SQLITE_ResetDatabase) != 0) { nPage = 0; } - if( nPage>0 ){ + if (nPage > 0) { u32 pageSize; u32 usableSize; - u8 *page1 = pPage1->aData; + 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 ){ + if (memcmp(page1, zMagicHeader, 16) != 0) { goto page1_init_failed; } #ifdef SQLITE_OMIT_WAL - if( page1[18]>1 ){ + if (page1[18] > 1) { pBt->btsFlags |= BTS_READ_ONLY; } - if( page1[19]>1 ){ + if (page1[19] > 1) { goto page1_init_failed; } #else - if( page1[18]>2 ){ + if (page1[18] > 2) { pBt->btsFlags |= BTS_READ_ONLY; } - if( page1[19]>2 ){ + if (page1[19] > 2) { goto page1_init_failed; } @@ -70099,21 +69157,21 @@ static int lockBtree(BtShared *pBt){ ** 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 ){ + if (page1[19] == 2 && (pBt->btsFlags & BTS_NO_WAL) == 0) { int isOpen = 0; rc = sqlite3PagerOpenWal(pBt->pPager, &isOpen); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { goto page1_init_failed; - }else{ - setDefaultSyncFlag(pBt, SQLITE_DEFAULT_WAL_SYNCHRONOUS+1); - if( isOpen==0 ){ + } 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); + } else { + setDefaultSyncFlag(pBt, SQLITE_DEFAULT_SYNCHRONOUS + 1); } #endif @@ -70123,23 +69181,20 @@ static int lockBtree(BtShared *pBt){ ** 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 ){ + 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); + 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 - ){ + 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 ); + 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. @@ -70148,7 +69203,7 @@ static int lockBtree(BtShared *pBt){ ** 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 ){ + 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 @@ -70159,29 +69214,28 @@ static int lockBtree(BtShared *pBt){ pBt->usableSize = usableSize; pBt->pageSize = pageSize; freeTempSpace(pBt); - rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize, - pageSize-usableSize); + rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize, pageSize - usableSize); return rc; } - if( nPage>nPageFile ){ - if( sqlite3WritableSchema(pBt->db)==0 ){ + if (nPage > nPageFile) { + if (sqlite3WritableSchema(pBt->db) == 0) { rc = SQLITE_CORRUPT_BKPT; goto page1_init_failed; - }else{ + } 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 ){ + 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); + pBt->autoVacuum = (get4byte(&page1[36 + 4 * 4]) ? 1 : 0); + pBt->incrVacuum = (get4byte(&page1[36 + 7 * 4]) ? 1 : 0); #endif } @@ -70198,16 +69252,16 @@ static int lockBtree(BtShared *pBt){ ** 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->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->minLeaf = (u16)((pBt->usableSize - 12) * 32 / 255 - 23); + if (pBt->maxLocal > 127) { pBt->max1bytePayload = 127; - }else{ + } else { pBt->max1bytePayload = (u8)pBt->maxLocal; } - assert( pBt->maxLeaf + 23 <= MX_CELL_SIZE(pBt) ); + assert(pBt->maxLeaf + 23 <= MX_CELL_SIZE(pBt)); pBt->pPage1 = pPage1; pBt->nPage = nPage; return SQLITE_OK; @@ -70231,12 +69285,12 @@ static int lockBtree(BtShared *pBt){ ** 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; +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++; + for (pCur = pBt->pCursor; pCur; pCur = pCur->pNext) { + if ((wrOnly == 0 || (pCur->curFlags & BTCF_WriteFlag) != 0) && pCur->eState != CURSOR_FAULT) + r++; } return r; } @@ -70250,13 +69304,13 @@ static int countValidCursors(BtShared *pBt, int wrOnly){ ** ** 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 ); +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); } @@ -70267,39 +69321,40 @@ static void unlockBtreeIfUnused(BtShared *pBt){ ** into a new empty database by initializing the first page of ** the database. */ -static int newDatabase(BtShared *pBt){ - MemPage *pP1; - unsigned char *data; +static int newDatabase(BtShared* pBt) { + MemPage* pP1; + unsigned char* data; int rc; - assert( sqlite3_mutex_held(pBt->mutex) ); - if( pBt->nPage>0 ){ + assert(sqlite3_mutex_held(pBt->mutex)); + if (pBt->nPage > 0) { return SQLITE_OK; } pP1 = pBt->pPage1; - assert( pP1!=0 ); + assert(pP1 != 0); data = pP1->aData; rc = sqlite3PagerWrite(pP1->pDbPage); - if( rc ) return rc; + 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); + 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); + 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 ); + 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); + 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; @@ -70311,7 +69366,7 @@ static int newDatabase(BtShared *pBt){ ** 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){ +SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree* p) { int rc; sqlite3BtreeEnter(p); p->pBt->nPage = 0; @@ -70355,9 +69410,9 @@ SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p){ ** 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; +SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree* p, int wrflag, int* pSchemaVersion) { + BtShared* pBt = p->pBt; + Pager* pPager = pBt->pPager; int rc = SQLITE_OK; sqlite3BtreeEnter(p); @@ -70367,44 +69422,40 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVers ** 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) ){ + if (p->inTrans == TRANS_WRITE || (p->inTrans == TRANS_READ && !wrflag)) { goto trans_begun; } - assert( pBt->inTransaction==TRANS_WRITE || IfNotOmitAV(pBt->bDoTruncate)==0 ); + assert(pBt->inTransaction == TRANS_WRITE || IfNotOmitAV(pBt->bDoTruncate) == 0); - if( (p->db->flags & SQLITE_ResetDatabase) - && sqlite3PagerIsreadonly(pPager)==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 ){ + if ((pBt->btsFlags & BTS_READ_ONLY) != 0 && wrflag) { rc = SQLITE_READONLY; goto trans_begun; } #ifndef SQLITE_OMIT_SHARED_CACHE { - sqlite3 *pBlock = 0; + 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 - ){ + 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 ){ + } 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 ){ + if (pBlock) { sqlite3ConnectionBlocked(p->db, pBlock); rc = SQLITE_LOCKED_SHAREDCACHE; goto trans_begun; @@ -70416,20 +69467,23 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVers ** 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; + if (SQLITE_OK != rc) + goto trans_begun; pBt->btsFlags &= ~BTS_INITIALLY_EMPTY; - if( pBt->nPage==0 ) 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 ); + if (pBt->pPage1 == 0 && wrflag) { + assert(pBt->inTransaction == TRANS_NONE); rc = sqlite3PagerWalWriteLock(pPager, 1); - if( rc!=SQLITE_BUSY && rc!=SQLITE_OK ) break; + if (rc != SQLITE_BUSY && rc != SQLITE_OK) + break; } #endif @@ -70440,16 +69494,17 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVers ** 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)) ); + while (pBt->pPage1 == 0 && SQLITE_OK == (rc = lockBtree(pBt))) + ; - if( rc==SQLITE_OK && wrflag ){ - if( (pBt->btsFlags & BTS_READ_ONLY)!=0 ){ + 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 ){ + } 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 ){ + } 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. */ @@ -70458,40 +69513,41 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVers } } - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { (void)sqlite3PagerWalWriteLock(pPager, 0); unlockBtreeIfUnused(pBt); } - }while( (rc&0xFF)==SQLITE_BUSY && pBt->inTransaction==TRANS_NONE && - btreeInvokeBusyHandler(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; + if (rc == SQLITE_BUSY_TIMEOUT) + rc = SQLITE_BUSY; #endif - if( rc==SQLITE_OK ){ - if( p->inTrans==TRANS_NONE ){ + 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 ); + 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 ){ + p->inTrans = (wrflag ? TRANS_WRITE : TRANS_READ); + if (p->inTrans > pBt->inTransaction) { pBt->inTransaction = p->inTrans; } - if( wrflag ){ - MemPage *pPage1 = pBt->pPage1; + if (wrflag) { + MemPage* pPage1 = pBt->pPage1; #ifndef SQLITE_OMIT_SHARED_CACHE - assert( !pBt->pWriter ); + assert(!pBt->pWriter); pBt->pWriter = p; pBt->btsFlags &= ~BTS_EXCLUSIVE; - if( wrflag>1 ) 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 @@ -70500,9 +69556,9 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVers ** 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]) ){ + if (pBt->nPage != get4byte(&pPage1->aData[28])) { rc = sqlite3PagerWrite(pPage1->pDbPage); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { put4byte(&pPage1->aData[28], pBt->nPage); } } @@ -70510,11 +69566,11 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVers } trans_begun: - if( rc==SQLITE_OK ){ - if( pSchemaVersion ){ + if (rc == SQLITE_OK) { + if (pSchemaVersion) { *pSchemaVersion = get4byte(&pBt->pPage1->aData[40]); } - if( wrflag ){ + 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. @@ -70535,31 +69591,32 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVers ** 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; +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) ); + assert(sqlite3_mutex_held(pPage->pBt->mutex)); rc = pPage->isInit ? SQLITE_OK : btreeInitPage(pPage); - if( rc!=SQLITE_OK ) return rc; + if (rc != SQLITE_OK) + return rc; nCell = pPage->nCell; - for(i=0; ileaf ){ + if (!pPage->leaf) { Pgno childPgno = get4byte(pCell); ptrmapPut(pBt, childPgno, PTRMAP_BTREE, pgno, &rc); } } - if( !pPage->leaf ){ - Pgno childPgno = get4byte(&pPage->aData[pPage->hdrOffset+8]); + if (!pPage->leaf) { + Pgno childPgno = get4byte(&pPage->aData[pPage->hdrOffset + 8]); ptrmapPut(pBt, childPgno, PTRMAP_BTREE, pgno, &rc); } @@ -70580,58 +69637,57 @@ static int setChildPtrmaps(MemPage *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 ){ +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 ){ + if (get4byte(pPage->aData) != iFrom) { return SQLITE_CORRUPT_PAGE(pPage); } put4byte(pPage->aData, iTo); - }else{ + } else { int i; int nCell; int rc; rc = pPage->isInit ? SQLITE_OK : btreeInitPage(pPage); - if( rc ) return rc; + if (rc) + return rc; nCell = pPage->nCell; - for(i=0; ixParseCell(pPage, pCell, &info); - if( info.nLocal pPage->aData+pPage->pBt->usableSize ){ + if (info.nLocal < info.nPayload) { + if (pCell + info.nSize > pPage->aData + pPage->pBt->usableSize) { return SQLITE_CORRUPT_PAGE(pPage); } - if( iFrom==get4byte(pCell+info.nSize-4) ){ - put4byte(pCell+info.nSize-4, iTo); + if (iFrom == get4byte(pCell + info.nSize - 4)) { + put4byte(pCell + info.nSize - 4, iTo); break; } } - }else{ - if( get4byte(pCell)==iFrom ){ + } else { + if (get4byte(pCell) == iFrom) { put4byte(pCell, iTo); break; } } } - if( i==nCell ){ - if( eType!=PTRMAP_BTREE || - get4byte(&pPage->aData[pPage->hdrOffset+8])!=iFrom ){ + 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); + 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. @@ -70641,30 +69697,28 @@ static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){ ** 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 */ +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; + 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; + 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)); + 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 ){ + if (rc != SQLITE_OK) { return rc; } pDbPage->pgno = iFreePage; @@ -70677,16 +69731,16 @@ static int relocatePage( ** 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 ){ + if (eType == PTRMAP_BTREE || eType == PTRMAP_ROOTPAGE) { rc = setChildPtrmaps(pDbPage); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } - }else{ + } else { Pgno nextOvfl = get4byte(pDbPage->aData); - if( nextOvfl!=0 ){ + if (nextOvfl != 0) { ptrmapPut(pBt, nextOvfl, PTRMAP_OVERFLOW2, iFreePage, &rc); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } } @@ -70696,19 +69750,19 @@ static int relocatePage( ** that it points at iFreePage. Also fix the pointer map entry for ** iPtrPage. */ - if( eType!=PTRMAP_ROOTPAGE ){ + if (eType != PTRMAP_ROOTPAGE) { rc = btreeGetPage(pBt, iPtrPage, &pPtrPage, 0); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } rc = sqlite3PagerWrite(pPtrPage->pDbPage); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { releasePage(pPtrPage); return rc; } rc = modifyPagePointer(pPtrPage, iDbPage, iFreePage, eType); releasePage(pPtrPage); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { ptrmapPut(pBt, iFreePage, eType, iPtrPage, &rc); } } @@ -70716,7 +69770,7 @@ static int relocatePage( } /* Forward declaration required by incrVacuumStep(). */ -static int allocateBtreePage(BtShared *, MemPage **, Pgno *, Pgno, u8); +static int allocateBtreePage(BtShared*, MemPage**, Pgno*, Pgno, u8); /* ** Perform a single step of an incremental-vacuum. If successful, return @@ -70735,54 +69789,54 @@ static int allocateBtreePage(BtShared *, MemPage **, Pgno *, Pgno, u8); ** 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 */ +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 ); + assert(sqlite3_mutex_held(pBt->mutex)); + assert(iLastPg > nFin); - if( !PTRMAP_ISPAGE(pBt, iLastPg) && iLastPg!=PENDING_BYTE_PAGE(pBt) ){ + if (!PTRMAP_ISPAGE(pBt, iLastPg) && iLastPg != PENDING_BYTE_PAGE(pBt)) { u8 eType; Pgno iPtrPage; nFreeList = get4byte(&pBt->pPage1->aData[36]); - if( nFreeList==0 ){ + if (nFreeList == 0) { return SQLITE_DONE; } rc = ptrmapGet(pBt, iLastPg, &eType, &iPtrPage); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } - if( eType==PTRMAP_ROOTPAGE ){ + if (eType == PTRMAP_ROOTPAGE) { return SQLITE_CORRUPT_BKPT; } - if( eType==PTRMAP_FREEPAGE ){ - if( bCommit==0 ){ + 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; + MemPage* pFreePg; rc = allocateBtreePage(pBt, &pFreePg, &iFreePg, iLastPg, BTALLOC_EXACT); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } - assert( iFreePg==iLastPg ); + 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() */ + 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 ){ + if (rc != SQLITE_OK) { return rc; } @@ -70793,38 +69847,38 @@ static int incrVacuumStep(BtShared *pBt, Pgno nFin, Pgno iLastPg, int bCommit){ ** looping until a free-page located within the first nFin pages ** of the file is found. */ - if( bCommit==0 ){ + if (bCommit == 0) { eMode = BTALLOC_LE; iNear = nFin; } do { - MemPage *pFreePg; + MemPage* pFreePg; Pgno dbSize = btreePagecount(pBt); rc = allocateBtreePage(pBt, &pFreePg, &iFreePg, iNear, eMode); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { releasePage(pLastPg); return rc; } releasePage(pFreePg); - if( iFreePg>dbSize ){ + if (iFreePg > dbSize) { releasePage(pLastPg); return SQLITE_CORRUPT_BKPT; } - }while( bCommit && iFreePg>nFin ); - assert( iFreePg nFin); + assert(iFreePg < iLastPg); rc = relocatePage(pBt, pLastPg, eType, iPtrPage, iFreePg, bCommit); releasePage(pLastPg); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } } } - if( bCommit==0 ){ + if (bCommit == 0) { do { iLastPg--; - }while( iLastPg==PENDING_BYTE_PAGE(pBt) || PTRMAP_ISPAGE(pBt, iLastPg) ); + } while (iLastPg == PENDING_BYTE_PAGE(pBt) || PTRMAP_ISPAGE(pBt, iLastPg)); pBt->bDoTruncate = 1; pBt->nPage = iLastPg; } @@ -70836,18 +69890,18 @@ static int incrVacuumStep(BtShared *pBt, Pgno nFin, Pgno iLastPg, int bCommit){ ** 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 */ +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; + nEntry = pBt->usableSize / 5; + nPtrmap = (nFree - nOrig + PTRMAP_PAGENO(pBt, nOrig) + nEntry) / nEntry; nFin = nOrig - nFree - nPtrmap; - if( nOrig>PENDING_BYTE_PAGE(pBt) && nFin PENDING_BYTE_PAGE(pBt) && nFin < PENDING_BYTE_PAGE(pBt)) { nFin--; } - while( PTRMAP_ISPAGE(pBt, nFin) || nFin==PENDING_BYTE_PAGE(pBt) ){ + while (PTRMAP_ISPAGE(pBt, nFin) || nFin == PENDING_BYTE_PAGE(pBt)) { nFin--; } @@ -70862,32 +69916,32 @@ static Pgno finalDbSize(BtShared *pBt, Pgno nOrig, Pgno nFree){ ** SQLITE_DONE is returned. If it is not finished, but no error occurred, ** SQLITE_OK is returned. Otherwise an SQLite error code. */ -SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *p){ +SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree* p) { int rc; - BtShared *pBt = p->pBt; + BtShared* pBt = p->pBt; sqlite3BtreeEnter(p); - assert( pBt->inTransaction==TRANS_WRITE && p->inTrans==TRANS_WRITE ); - if( !pBt->autoVacuum ){ + assert(pBt->inTransaction == TRANS_WRITE && p->inTrans == TRANS_WRITE); + if (!pBt->autoVacuum) { rc = SQLITE_DONE; - }else{ + } else { Pgno nOrig = btreePagecount(pBt); Pgno nFree = get4byte(&pBt->pPage1->aData[36]); Pgno nFin = finalDbSize(pBt, nOrig, nFree); - if( nOrig=nOrig ){ + if (nOrig < nFin || nFree >= nOrig) { rc = SQLITE_CORRUPT_BKPT; - }else if( nFree>0 ){ + } else if (nFree > 0) { rc = saveAllCursors(pBt, 0, 0); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { invalidateAllOverflowCache(pBt); rc = incrVacuumStep(pBt, nFin, nOrig, 0); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); put4byte(&pBt->pPage1->aData[28], pBt->nPage); } - }else{ + } else { rc = SQLITE_DONE; } } @@ -70899,30 +69953,30 @@ SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *p){ ** This routine is called prior to sqlite3PagerCommit when a transaction ** is committed for an auto-vacuum database. */ -static int autoVacuumCommit(Btree *p){ +static int autoVacuumCommit(Btree* p) { int rc = SQLITE_OK; - Pager *pPager; - BtShared *pBt; - sqlite3 *db; - VVA_ONLY( int nRef ); + Pager* pPager; + BtShared* pBt; + sqlite3* db; + VVA_ONLY(int nRef); - assert( p!=0 ); + assert(p != 0); pBt = p->pBt; pPager = pBt->pPager; - VVA_ONLY( nRef = sqlite3PagerRefcount(pPager); ) + VVA_ONLY(nRef = sqlite3PagerRefcount(pPager);) - assert( sqlite3_mutex_held(pBt->mutex) ); + 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 */ + 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) ){ + 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. @@ -70932,38 +69986,34 @@ static int autoVacuumCommit(Btree *p){ nFree = get4byte(&pBt->pPage1->aData[36]); db = p->db; - if( db->xAutovacPages ){ + 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 ){ + for (iDb = 0; ALWAYS(iDb < db->nDb); 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 ){ + if (nVac == 0) { return SQLITE_OK; } - }else{ + } else { nVac = nFree; } nFin = finalDbSize(pBt, nOrig, nVac); - if( nFin>nOrig ) return SQLITE_CORRUPT_BKPT; - if( nFin nOrig) + return SQLITE_CORRUPT_BKPT; + if (nFin < nOrig) { rc = saveAllCursors(pBt, 0, 0); } - for(iFree=nOrig; iFree>nFin && rc==SQLITE_OK; iFree--){ - rc = incrVacuumStep(pBt, nFin, iFree, nVac==nFree); + for (iFree = nOrig; iFree > nFin && rc == SQLITE_OK; iFree--) { + rc = incrVacuumStep(pBt, nFin, iFree, nVac == nFree); } - if( (rc==SQLITE_DONE || rc==SQLITE_OK) && nFree>0 ){ + if ((rc == SQLITE_DONE || rc == SQLITE_OK) && nFree > 0) { rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); - if( nVac==nFree ){ + if (nVac == nFree) { put4byte(&pBt->pPage1->aData[32], 0); put4byte(&pBt->pPage1->aData[36], 0); } @@ -70971,17 +70021,17 @@ static int autoVacuumCommit(Btree *p){ pBt->bDoTruncate = 1; pBt->nPage = nFin; } - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { sqlite3PagerRollback(pPager); } } - assert( nRef>=sqlite3PagerRefcount(pPager) ); + assert(nRef >= sqlite3PagerRefcount(pPager)); return rc; } #else /* ifndef SQLITE_OMIT_AUTOVACUUM */ -# define setChildPtrmaps(x) SQLITE_OK +#define setChildPtrmaps(x) SQLITE_OK #endif /* @@ -71010,20 +70060,20 @@ static int autoVacuumCommit(Btree *p){ ** 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){ +SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree* p, const char* zSuperJrnl) { int rc = SQLITE_OK; - if( p->inTrans==TRANS_WRITE ){ - BtShared *pBt = p->pBt; + if (p->inTrans == TRANS_WRITE) { + BtShared* pBt = p->pBt; sqlite3BtreeEnter(p); #ifndef SQLITE_OMIT_AUTOVACUUM - if( pBt->autoVacuum ){ + if (pBt->autoVacuum) { rc = autoVacuumCommit(p); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { sqlite3BtreeLeave(p); return rc; } } - if( pBt->bDoTruncate ){ + if (pBt->bDoTruncate) { sqlite3PagerTruncateImage(pBt->pPager, pBt->nPage); } #endif @@ -71037,29 +70087,29 @@ SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zSuperJrnl){ ** 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) ); +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 (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{ + } 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 ){ + if (p->inTrans != TRANS_NONE) { clearAllSharedCacheTableLocks(p); pBt->nTransaction--; - if( 0==pBt->nTransaction ){ + if (0 == pBt->nTransaction) { pBt->inTransaction = TRANS_NONE; } } @@ -71099,26 +70149,27 @@ static void btreeEndTransaction(Btree *p){ ** 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){ +SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree* p, int bCleanup) { - if( p->inTrans==TRANS_NONE ) return SQLITE_OK; + 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 ){ + if (p->inTrans == TRANS_WRITE) { int rc; - BtShared *pBt = p->pBt; - assert( pBt->inTransaction==TRANS_WRITE ); - assert( pBt->nTransaction>0 ); + BtShared* pBt = p->pBt; + assert(pBt->inTransaction == TRANS_WRITE); + assert(pBt->nTransaction > 0); rc = sqlite3PagerCommitPhaseTwo(pBt->pPager); - if( rc!=SQLITE_OK && bCleanup==0 ){ + if (rc != SQLITE_OK && bCleanup == 0) { sqlite3BtreeLeave(p); return rc; } - p->iBDataVersion--; /* Compensate for pPager->iDataVersion++; */ + p->iBDataVersion--; /* Compensate for pPager->iDataVersion++; */ pBt->inTransaction = TRANS_READ; btreeClearHasContent(pBt); } @@ -71131,11 +70182,11 @@ SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree *p, int bCleanup){ /* ** Do both phases of a commit. */ -SQLITE_PRIVATE int sqlite3BtreeCommit(Btree *p){ +SQLITE_PRIVATE int sqlite3BtreeCommit(Btree* p) { int rc; sqlite3BtreeEnter(p); rc = sqlite3BtreeCommitPhaseOne(p, 0); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = sqlite3BtreeCommitPhaseTwo(p, 0); } sqlite3BtreeLeave(p); @@ -71168,23 +70219,23 @@ SQLITE_PRIVATE int sqlite3BtreeCommit(Btree *p){ ** 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; +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 ){ + 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 ){ + 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 ){ + if (rc != SQLITE_OK) { (void)sqlite3BtreeTripAllCursors(pBtree, rc, 0); break; } } - }else{ + } else { sqlite3BtreeClearCursor(p); p->eState = CURSOR_FAULT; p->skipNext = errCode; @@ -71200,11 +70251,12 @@ SQLITE_PRIVATE int sqlite3BtreeTripAllCursors(Btree *pBtree, int errCode, int wr ** 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){ +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 ); + testcase(nPage == 0); + if (nPage == 0) + sqlite3PagerPagecount(pBt->pPager, &nPage); + testcase(pBt->nPage != (u32)nPage); pBt->nPage = nPage; } @@ -71219,44 +70271,46 @@ static void btreeSetNPage(BtShared *pBt, MemPage *pPage1){ ** 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){ +SQLITE_PRIVATE int sqlite3BtreeRollback(Btree* p, int tripCode, int writeOnly) { int rc; - BtShared *pBt = p->pBt; - MemPage *pPage1; + BtShared* pBt = p->pBt; + MemPage* pPage1; - assert( writeOnly==1 || writeOnly==0 ); - assert( tripCode==SQLITE_ABORT_ROLLBACK || tripCode==SQLITE_OK ); + assert(writeOnly == 1 || writeOnly == 0); + assert(tripCode == SQLITE_ABORT_ROLLBACK || tripCode == SQLITE_OK); sqlite3BtreeEnter(p); - if( tripCode==SQLITE_OK ){ + if (tripCode == SQLITE_OK) { rc = tripCode = saveAllCursors(pBt, 0, 0); - if( rc ) writeOnly = 0; - }else{ + if (rc) + writeOnly = 0; + } else { rc = SQLITE_OK; } - if( tripCode ){ + if (tripCode) { int rc2 = sqlite3BtreeTripAllCursors(p, tripCode, writeOnly); - assert( rc==SQLITE_OK || (writeOnly==0 && rc2==SQLITE_OK) ); - if( rc2!=SQLITE_OK ) rc = rc2; + assert(rc == SQLITE_OK || (writeOnly == 0 && rc2 == SQLITE_OK)); + if (rc2 != SQLITE_OK) + rc = rc2; } btreeIntegrity(p); - if( p->inTrans==TRANS_WRITE ){ + if (p->inTrans == TRANS_WRITE) { int rc2; - assert( TRANS_WRITE==pBt->inTransaction ); + assert(TRANS_WRITE == pBt->inTransaction); rc2 = sqlite3PagerRollback(pBt->pPager); - if( rc2!=SQLITE_OK ){ + 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 ){ + if (btreeGetPage(pBt, 1, &pPage1, 0) == SQLITE_OK) { btreeSetNPage(pBt, pPage1); releasePageOne(pPage1); } - assert( countValidCursors(pBt, 1)==0 ); + assert(countValidCursors(pBt, 1) == 0); pBt->inTransaction = TRANS_READ; btreeClearHasContent(pBt); } @@ -71284,15 +70338,15 @@ SQLITE_PRIVATE int sqlite3BtreeRollback(Btree *p, int tripCode, int writeOnly){ ** iStatement is 1. This anonymous savepoint can be released or rolled back ** using the sqlite3BtreeSavepoint() function. */ -SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree *p, int iStatement){ +SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree* p, int iStatement) { int rc; - BtShared *pBt = p->pBt; + 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 ); + 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 @@ -71315,21 +70369,21 @@ SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree *p, int iStatement){ ** 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){ +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) ); + 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 ){ + if (op == SAVEPOINT_ROLLBACK) { rc = saveAllCursors(pBt, 0, 0); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = sqlite3PagerSavepoint(pBt->pPager, op, iSavepoint); } - if( rc==SQLITE_OK ){ - if( iSavepoint<0 && (pBt->btsFlags & BTS_INITIALLY_EMPTY)!=0 ){ + if (rc == SQLITE_OK) { + if (iSavepoint < 0 && (pBt->btsFlags & BTS_INITIALLY_EMPTY) != 0) { pBt->nPage = 0; } rc = newDatabase(pBt); @@ -71337,7 +70391,7 @@ SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *p, int op, int iSavepoint){ /* 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 ); + assert(CORRUPT_DB || pBt->nPage > 0); } sqlite3BtreeLeave(p); } @@ -71386,41 +70440,36 @@ SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *p, int op, int iSavepoint){ ** 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 */ +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) - ); + 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(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 ); + 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 ){ + if (iTable <= 1) { + if (iTable < 1) { return SQLITE_CORRUPT_BKPT; - }else if( btreePagecount(pBt)==0 ){ - assert( wrFlag==0 ); + } else if (btreePagecount(pBt) == 0) { + assert(wrFlag == 0); iTable = 0; } } @@ -71435,8 +70484,8 @@ static int btreeCursor( 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 ){ + for (pX = pBt->pCursor; pX; pX = pX->pNext) { + if (pX->pgnoRoot == iTable) { pX->curFlags |= BTCF_Multiple; pCur->curFlags = BTCF_Multiple; } @@ -71444,38 +70493,37 @@ static int btreeCursor( pCur->eState = CURSOR_INVALID; pCur->pNext = pBt->pCursor; pBt->pCursor = pCur; - if( wrFlag ){ + if (wrFlag) { pCur->curFlags |= BTCF_WriteFlag; pCur->curPagerFlags = 0; - if( pBt->pTmpSpace==0 ) return allocateTempSpace(pBt); - }else{ + 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 */ -){ +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 ){ +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{ + } else { return btreeCursor(p, iTable, wrFlag, pKeyInfo, pCur); } } @@ -71488,7 +70536,7 @@ SQLITE_PRIVATE int sqlite3BtreeCursor( ** to users so they cannot do the sizeof() themselves - they must call ** this routine. */ -SQLITE_PRIVATE int sqlite3BtreeCursorSize(void){ +SQLITE_PRIVATE int sqlite3BtreeCursorSize(void) { return ROUND8(sizeof(BtCursor)); } @@ -71500,7 +70548,7 @@ SQLITE_PRIVATE int sqlite3BtreeCursorSize(void){ ** 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){ +SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor* p) { memset(p, 0, offsetof(BtCursor, BTCURSOR_FIRST_UNINIT)); } @@ -71508,34 +70556,34 @@ SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor *p){ ** 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; +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 ){ + assert(pBt->pCursor != 0); + if (pBt->pCursor == pCur) { pBt->pCursor = pCur->pNext; - }else{ - BtCursor *pPrev = pBt->pCursor; - do{ - if( pPrev->pNext==pCur ){ + } else { + BtCursor* pPrev = pBt->pCursor; + do { + if (pPrev->pNext == pCur) { pPrev->pNext = pCur->pNext; break; } pPrev = pPrev->pNext; - }while( ALWAYS(pPrev) ); + } while (ALWAYS(pPrev)); } btreeReleaseAllCursorPages(pCur); unlockBtreeIfUnused(pBt); sqlite3_free(pCur->aOverflow); sqlite3_free(pCur->pKey); - if( (pBt->openFlags & BTREE_SINGLE) && pBt->pCursor==0 ){ + 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 ); + assert(pBtree->sharable == 0); sqlite3BtreeClose(pBtree); - }else{ + } else { sqlite3BtreeLeave(pBtree); } pCur->pBtree = 0; @@ -71552,45 +70600,50 @@ SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor *pCur){ ** 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) ); - } +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) +#define assertCellInfo(x) #endif -static SQLITE_NOINLINE void getCellInfo(BtCursor *pCur){ - if( pCur->info.nSize==0 ){ +static SQLITE_NOINLINE void getCellInfo(BtCursor* pCur) { + if (pCur->info.nSize == 0) { pCur->curFlags |= BTCF_ValidNKey; - btreeParseCell(pCur->pPage,pCur->ix,&pCur->info); - }else{ + btreeParseCell(pCur->pPage, pCur->ix, &pCur->info); + } else { assertCellInfo(pCur); } } -#ifndef NDEBUG /* The next routine used only within assert() statements */ +#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; +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; +SQLITE_PRIVATE int sqlite3BtreeCursorIsValidNN(BtCursor* pCur) { + assert(pCur != 0); + return pCur->eState == CURSOR_VALID; } /* @@ -71599,10 +70652,10 @@ SQLITE_PRIVATE int sqlite3BtreeCursorIsValidNN(BtCursor *pCur){ ** 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 ); +SQLITE_PRIVATE i64 sqlite3BtreeIntegerKey(BtCursor* pCur) { + assert(cursorHoldsMutex(pCur)); + assert(pCur->eState == CURSOR_VALID); + assert(pCur->curIntKey); getCellInfo(pCur); return pCur->info.nKey; } @@ -71610,12 +70663,12 @@ SQLITE_PRIVATE i64 sqlite3BtreeIntegerKey(BtCursor *pCur){ /* ** Pin or unpin a cursor. */ -SQLITE_PRIVATE void sqlite3BtreeCursorPin(BtCursor *pCur){ - assert( (pCur->curFlags & BTCF_Pinned)==0 ); +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 ); +SQLITE_PRIVATE void sqlite3BtreeCursorUnpin(BtCursor* pCur) { + assert((pCur->curFlags & BTCF_Pinned) != 0); pCur->curFlags &= ~BTCF_Pinned; } @@ -71624,12 +70677,11 @@ SQLITE_PRIVATE void sqlite3BtreeCursorUnpin(BtCursor *pCur){ ** 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 ); +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); + return (i64)pCur->pBt->pageSize * ((i64)pCur->pPage->pgno - 1) + (i64)(pCur->info.pPayload - pCur->pPage->aData); } #endif /* SQLITE_ENABLE_OFFSET_SQL_FUNC */ @@ -71642,9 +70694,9 @@ SQLITE_PRIVATE i64 sqlite3BtreeOffset(BtCursor *pCur){ ** 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 ); +SQLITE_PRIVATE u32 sqlite3BtreePayloadSize(BtCursor* pCur) { + assert(cursorHoldsMutex(pCur)); + assert(pCur->eState == CURSOR_VALID); getCellInfo(pCur); return pCur->info.nPayload; } @@ -71662,9 +70714,9 @@ SQLITE_PRIVATE u32 sqlite3BtreePayloadSize(BtCursor *pCur){ ** 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 ); +SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeMaxRecordSize(BtCursor* pCur) { + assert(cursorHoldsMutex(pCur)); + assert(pCur->eState == CURSOR_VALID); return pCur->pBt->pageSize * (sqlite3_int64)pCur->pBt->nPage; } @@ -71687,17 +70739,16 @@ SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeMaxRecordSize(BtCursor *pCur){ ** 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 */ -){ +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; + MemPage* pPage = 0; int rc = SQLITE_OK; - assert( sqlite3_mutex_held(pBt->mutex) ); + assert(sqlite3_mutex_held(pBt->mutex)); assert(pPgnoNext); #ifndef SQLITE_OMIT_AUTOVACUUM @@ -71707,18 +70758,18 @@ static int getOverflowPage( ** out to be wrong, fall back to loading the data of page ** number ovfl to determine the next page number. */ - if( pBt->autoVacuum ){ + if (pBt->autoVacuum) { Pgno pgno; - Pgno iGuess = ovfl+1; + Pgno iGuess = ovfl + 1; u8 eType; - while( PTRMAP_ISPAGE(pBt, iGuess) || iGuess==PENDING_BYTE_PAGE(pBt) ){ + while (PTRMAP_ISPAGE(pBt, iGuess) || iGuess == PENDING_BYTE_PAGE(pBt)) { iGuess++; } - if( iGuess<=btreePagecount(pBt) ){ + if (iGuess <= btreePagecount(pBt)) { rc = ptrmapGet(pBt, iGuess, &eType, &pgno); - if( rc==SQLITE_OK && eType==PTRMAP_OVERFLOW2 && pgno==ovfl ){ + if (rc == SQLITE_OK && eType == PTRMAP_OVERFLOW2 && pgno == ovfl) { next = iGuess; rc = SQLITE_DONE; } @@ -71726,22 +70777,22 @@ static int getOverflowPage( } #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 ){ + 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 ){ + if (ppPage) { *ppPage = pPage; - }else{ + } else { releasePage(pPage); } - return (rc==SQLITE_DONE ? SQLITE_OK : rc); + return (rc == SQLITE_DONE ? SQLITE_OK : rc); } /* @@ -71755,21 +70806,20 @@ static int getOverflowPage( ** ** 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 ){ +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 ){ + if (rc != SQLITE_OK) { return rc; } memcpy(pPayload, pBuf, nByte); - }else{ + } else { /* Copy data from page to buffer (a read operation) */ memcpy(pBuf, pPayload, nByte); } @@ -71805,36 +70855,35 @@ static int copyPayload( ** * 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; +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 */ + 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 */ + 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 ){ + 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) ); + assert(cursorHoldsMutex(pCur)); getCellInfo(pCur); aPayload = pCur->info.pPayload; - assert( offset+amt <= pCur->info.nPayload ); + assert(offset + amt <= pCur->info.nPayload); - assert( aPayload > pPage->aData ); - if( (uptr)(aPayload - pPage->aData) > (pBt->usableSize - pCur->info.nLocal) ){ + 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] @@ -71844,22 +70893,21 @@ static int accessPayload( } /* Check if data must be read/written to/from the btree page itself. */ - if( offsetinfo.nLocal ){ + if (offset < pCur->info.nLocal) { int a = amt; - if( a+offset>pCur->info.nLocal ){ + 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{ + } else { offset -= pCur->info.nLocal; } - - if( rc==SQLITE_OK && amt>0 ){ - const u32 ovflSize = pBt->usableSize - 4; /* Bytes content per ovfl page */ + 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]); @@ -71871,64 +70919,59 @@ static int accessPayload( ** 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 ){ + 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{ + } else { pCur->aOverflow = aNew; } } - memset(pCur->aOverflow, 0, nOvfl*sizeof(Pgno)); + memset(pCur->aOverflow, 0, nOvfl * sizeof(Pgno)); pCur->curFlags |= BTCF_ValidOvfl; - }else{ + } 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); + if (pCur->aOverflow[offset / ovflSize]) { + iIdx = (offset / ovflSize); nextPage = pCur->aOverflow[iIdx]; - offset = (offset%ovflSize); + offset = (offset % ovflSize); } } - assert( rc==SQLITE_OK && amt>0 ); - while( nextPage ){ + 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 ); + 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 ){ + 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{ + 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{ + } 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 ){ + if (a + offset > ovflSize) { a = ovflSize - offset; } @@ -71946,46 +70989,47 @@ static int accessPayload( ** 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); + 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) */ + 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; + 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 + } else #endif { - DbPage *pDbPage; - rc = sqlite3PagerGet(pBt->pPager, nextPage, &pDbPage, - (eOp==0 ? PAGER_GET_READONLY : 0) - ); - if( rc==SQLITE_OK ){ + 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); + rc = copyPayload(&aPayload[offset + 4], pBuf, a, eOp, pDbPage); sqlite3PagerUnref(pDbPage); offset = 0; } } amt -= a; - if( amt==0 ) return rc; + if (amt == 0) + return rc; pBuf += a; } - if( rc ) break; + if (rc) + break; iIdx++; } } - if( rc==SQLITE_OK && amt>0 ){ + if (rc == SQLITE_OK && amt > 0) { /* Overflow chain ends prematurely */ return SQLITE_CORRUPT_PAGE(pPage); } @@ -72009,10 +71053,10 @@ static int accessPayload( ** 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 ); +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); } @@ -72022,25 +71066,20 @@ SQLITE_PRIVATE int sqlite3BtreePayload(BtCursor *pCur, u32 offset, u32 amt, void ** interface. */ #ifndef SQLITE_OMIT_INCRBLOB -static SQLITE_NOINLINE int accessPayloadChecked( - BtCursor *pCur, - u32 offset, - u32 amt, - void *pBuf -){ +static SQLITE_NOINLINE int accessPayloadChecked(BtCursor* pCur, u32 offset, u32 amt, void* pBuf) { int rc; - if ( pCur->eState==CURSOR_INVALID ){ + if (pCur->eState == CURSOR_INVALID) { return SQLITE_ABORT; } - assert( cursorOwnsBtShared(pCur) ); + 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) ); +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{ + } else { return accessPayloadChecked(pCur, offset, amt, pBuf); } } @@ -72065,31 +71104,29 @@ SQLITE_PRIVATE int sqlite3BtreePayloadChecked(BtCursor *pCur, u32 offset, u32 am ** 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 */ -){ +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); + 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->ix < pCur->pPage->nCell || CORRUPT_DB); + assert(pCur->info.nSize > 0); + assert(pCur->info.pPayload > pCur->pPage->aData || CORRUPT_DB); + assert(pCur->info.pPayload < pCur->pPage->aDataEnd || CORRUPT_DB); amt = pCur->info.nLocal; - if( amt>(int)(pCur->pPage->aDataEnd - pCur->info.pPayload) ){ + 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 ); + 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 @@ -72104,11 +71141,10 @@ static const void *fetchPayload( ** 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){ +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. @@ -72118,18 +71154,18 @@ SQLITE_PRIVATE const void *sqlite3BtreePayloadFetch(BtCursor *pCur, u32 *pAmt){ ** 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; +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) ){ + assert(cursorOwnsBtShared(pCur)); + assert(pCur->eState == CURSOR_VALID); + assert(pCur->iPage < BTCURSOR_MAX_DEPTH); + assert(pCur->iPage >= 0); + if (pCur->iPage >= (BTCURSOR_MAX_DEPTH - 1)) { return SQLITE_CORRUPT_BKPT; } pCur->info.nSize = 0; - pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); + pCur->curFlags &= ~(BTCF_ValidNKey | BTCF_ValidOvfl); pCur->aiIdx[pCur->iPage] = pCur->ix; pCur->apPage[pCur->iPage] = pCur->pPage; pCur->ix = 0; @@ -72145,18 +71181,19 @@ static int moveToChild(BtCursor *pCur, u32 newPgno){ ** 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 ); +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) +#define assertParentIndex(x, y, z) #endif /* @@ -72167,21 +71204,17 @@ static void assertParentIndex(MemPage *pParent, int iIdx, Pgno iChild){ ** 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 ); +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]; + pCur->curFlags &= ~(BTCF_ValidNKey | BTCF_ValidOvfl); + pCur->ix = pCur->aiIdx[pCur->iPage - 1]; pLeaf = pCur->pPage; pCur->pPage = pCur->apPage[--pCur->iPage]; releasePageNotNull(pLeaf); @@ -72208,41 +71241,40 @@ static void moveToParent(BtCursor *pCur){ ** structure the flags byte is set to 0x02 or 0x0A, indicating an index ** b-tree). */ -static int moveToRoot(BtCursor *pCur){ - MemPage *pRoot; +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 ); + 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 ){ + if (pCur->iPage >= 0) { + if (pCur->iPage) { releasePageNotNull(pCur->pPage); - while( --pCur->iPage ){ + while (--pCur->iPage) { releasePageNotNull(pCur->apPage[pCur->iPage]); } pRoot = pCur->pPage = pCur->apPage[0]; goto skip_init; } - }else if( pCur->pgnoRoot==0 ){ + } 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 ); + } 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 ){ + rc = getAndInitPage(pCur->pBtree->pBt, pCur->pgnoRoot, &pCur->pPage, 0, pCur->curPagerFlags); + if (rc != SQLITE_OK) { pCur->eState = CURSOR_INVALID; return rc; } @@ -72250,7 +71282,7 @@ static int moveToRoot(BtCursor *pCur){ pCur->curIntKey = pCur->pPage->intKey; } pRoot = pCur->pPage; - assert( pRoot->pgno==pCur->pgnoRoot || CORRUPT_DB ); + 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 @@ -72262,25 +71294,26 @@ static int moveToRoot(BtCursor *pCur){ ** 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 ){ + 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); + pCur->curFlags &= ~(BTCF_AtLast | BTCF_ValidNKey | BTCF_ValidOvfl); - if( pRoot->nCell>0 ){ + if (pRoot->nCell > 0) { pCur->eState = CURSOR_VALID; - }else if( !pRoot->leaf ){ + } else if (!pRoot->leaf) { Pgno subpage; - if( pRoot->pgno!=1 ) return SQLITE_CORRUPT_BKPT; - subpage = get4byte(&pRoot->aData[pRoot->hdrOffset+8]); + if (pRoot->pgno != 1) + return SQLITE_CORRUPT_BKPT; + subpage = get4byte(&pRoot->aData[pRoot->hdrOffset + 8]); pCur->eState = CURSOR_VALID; rc = moveToChild(pCur, subpage); - }else{ + } else { pCur->eState = CURSOR_INVALID; rc = SQLITE_EMPTY; } @@ -72294,15 +71327,15 @@ static int moveToRoot(BtCursor *pCur){ ** The left-most leaf is the one with the smallest key - the first ** in ascending order. */ -static int moveToLeftmost(BtCursor *pCur){ +static int moveToLeftmost(BtCursor* pCur) { Pgno pgno; int rc = SQLITE_OK; - MemPage *pPage; + MemPage* pPage; - assert( cursorOwnsBtShared(pCur) ); - assert( pCur->eState==CURSOR_VALID ); - while( rc==SQLITE_OK && !(pPage = pCur->pPage)->leaf ){ - assert( pCur->ixnCell ); + assert(cursorOwnsBtShared(pCur)); + assert(pCur->eState == CURSOR_VALID); + while (rc == SQLITE_OK && !(pPage = pCur->pPage)->leaf) { + assert(pCur->ix < pPage->nCell); pgno = get4byte(findCell(pPage, pCur->ix)); rc = moveToChild(pCur, pgno); } @@ -72319,22 +71352,23 @@ static int moveToLeftmost(BtCursor *pCur){ ** The right-most entry is the one with the largest key - the last ** key in ascending order. */ -static int moveToRightmost(BtCursor *pCur){ +static int moveToRightmost(BtCursor* pCur) { Pgno pgno; int rc = SQLITE_OK; - MemPage *pPage = 0; + MemPage* pPage = 0; - assert( cursorOwnsBtShared(pCur) ); - assert( pCur->eState==CURSOR_VALID ); - while( !(pPage = pCur->pPage)->leaf ){ - pgno = get4byte(&pPage->aData[pPage->hdrOffset+8]); + 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; + if (rc) + return rc; } - pCur->ix = pPage->nCell-1; - assert( pCur->info.nSize==0 ); - assert( (pCur->curFlags & BTCF_ValidNKey)==0 ); + pCur->ix = pPage->nCell - 1; + assert(pCur->info.nSize == 0); + assert((pCur->curFlags & BTCF_ValidNKey) == 0); return SQLITE_OK; } @@ -72342,18 +71376,18 @@ static int moveToRightmost(BtCursor *pCur){ ** 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){ +SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor* pCur, int* pRes) { int rc; - assert( cursorOwnsBtShared(pCur) ); - assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + assert(cursorOwnsBtShared(pCur)); + assert(sqlite3_mutex_held(pCur->pBtree->db->mutex)); rc = moveToRoot(pCur); - if( rc==SQLITE_OK ){ - assert( pCur->pPage->nCell>0 ); + 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 ); + } else if (rc == SQLITE_EMPTY) { + assert(pCur->pgnoRoot == 0 || pCur->pPage->nCell == 0); *pRes = 1; rc = SQLITE_OK; } @@ -72364,42 +71398,42 @@ SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor *pCur, int *pRes){ ** 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){ +SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor* pCur, int* pRes) { int rc; - assert( cursorOwnsBtShared(pCur) ); - assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + 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 ){ + 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 ); + for (ii = 0; ii < pCur->iPage; 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 ); + assert(pCur->ix == pCur->pPage->nCell - 1 || CORRUPT_DB); + testcase(pCur->ix != pCur->pPage->nCell - 1); /* ^-- dbsqlfuzz b92b72e4de80b5140c30ab71372ca719b8feb618 */ - assert( pCur->pPage->leaf ); + assert(pCur->pPage->leaf); #endif *pRes = 0; return SQLITE_OK; } rc = moveToRoot(pCur); - if( rc==SQLITE_OK ){ - assert( pCur->eState==CURSOR_VALID ); + if (rc == SQLITE_OK) { + assert(pCur->eState == CURSOR_VALID); *pRes = 0; rc = moveToRightmost(pCur); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pCur->curFlags |= BTCF_AtLast; - }else{ + } else { pCur->curFlags &= ~BTCF_AtLast; } - }else if( rc==SQLITE_EMPTY ){ - assert( pCur->pgnoRoot==0 || pCur->pPage->nCell==0 ); + } else if (rc == SQLITE_EMPTY) { + assert(pCur->pgnoRoot == 0 || pCur->pPage->nCell == 0); *pRes = 1; rc = SQLITE_OK; } @@ -72429,29 +71463,28 @@ SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor *pCur, int *pRes){ ** *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 */ -){ +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 ); + 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 ){ + 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 ){ + if (pCur->info.nKey < intKey) { + if ((pCur->curFlags & BTCF_AtLast) != 0) { *pRes = -1; return SQLITE_OK; } @@ -72459,15 +71492,15 @@ SQLITE_PRIVATE int sqlite3BtreeTableMoveto( ** 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 ){ + if (pCur->info.nKey + 1 == intKey) { *pRes = 0; rc = sqlite3BtreeNext(pCur, 0); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { getCellInfo(pCur); - if( pCur->info.nKey==intKey ){ + if (pCur->info.nKey == intKey) { return SQLITE_OK; } - }else if( rc!=SQLITE_DONE ){ + } else if (rc != SQLITE_DONE) { return rc; } } @@ -72475,30 +71508,30 @@ SQLITE_PRIVATE int sqlite3BtreeTableMoveto( } #ifdef SQLITE_DEBUG - pCur->pBtree->nSeek++; /* Performance measurement during testing */ + 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 ); + 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 ); + 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(;;){ + for (;;) { int lwr, upr, idx, c; Pgno chldPg; - MemPage *pPage = pCur->pPage; - u8 *pCell; /* Pointer to current cell in pPage */ + 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 @@ -72506,36 +71539,42 @@ SQLITE_PRIVATE int sqlite3BtreeTableMoveto( ** 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 ); + 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(;;){ + 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 ){ + 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 ); + if (nCellKey < intKey) { + lwr = idx + 1; + if (lwr > upr) { + 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 ){ + if (!pPage->leaf) { lwr = idx; goto moveto_table_next_layer; - }else{ + } else { pCur->curFlags |= BTCF_ValidNKey; pCur->info.nKey = nCellKey; pCur->info.nSize = 0; @@ -72543,31 +71582,32 @@ SQLITE_PRIVATE int sqlite3BtreeTableMoveto( return SQLITE_OK; } } - assert( lwr+upr>=0 ); - idx = (lwr+upr)>>1; /* idx = (lwr+upr)/2; */ + 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 ); + assert(lwr == upr + 1 || !pPage->leaf); + assert(pPage->isInit); + if (pPage->leaf) { + assert(pCur->ix < pCur->pPage->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{ + 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; + if (rc) + break; } moveto_table_finish: pCur->info.nSize = 0; - assert( (pCur->curFlags & BTCF_ValidOvfl)==0 ); + assert((pCur->curFlags & BTCF_ValidOvfl) == 0); return rc; } @@ -72587,32 +71627,25 @@ SQLITE_PRIVATE int sqlite3BtreeTableMoveto( ** 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; +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); + int nCell; /* Size of the pCell cell in bytes */ + u8* pCell = findCellPastPtr(pPage, idx); nCell = pCell[0]; - if( nCell<=pPage->max1bytePayload ){ + 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 ); + 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 - ){ + } 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 ); + testcase(pCell + nCell + 2 == pPage->aDataEnd); c = xRecordCompare(nCell, (void*)&pCell[2], pIdxKey); - }else{ + } else { /* If the record extends into overflow pages, do not attempt ** the optimization. */ c = 99; @@ -72624,12 +71657,13 @@ static int indexCellCompare( ** Return true (non-zero) if pCur is current pointing to the last ** page of a table. */ -static int cursorOnLastPage(BtCursor *pCur){ +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; + assert(pCur->eState == CURSOR_VALID); + for (i = 0; i < pCur->iPage; i++) { + MemPage* pPage = pCur->apPage[i]; + if (pCur->aiIdx[i] < pPage->nCell) + return 0; } return 1; } @@ -72660,30 +71694,25 @@ static int cursorOnLastPage(BtCursor *pCur){ ** 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 */ -){ +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 ); + 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 */ + 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 - ); - + 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: ** @@ -72696,35 +71725,27 @@ SQLITE_PRIVATE int sqlite3BtreeIndexMoveto( ** 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) - ){ + 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 - ){ + 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 */ + return SQLITE_OK; /* Cursor already pointing at the correct spot */ } - if( pCur->iPage>0 - && indexCellCompare(pCur, 0, pIdxKey, xRecordCompare)<=0 - && pIdxKey->errCode==SQLITE_OK - ){ + if (pCur->iPage > 0 && indexCellCompare(pCur, 0, pIdxKey, xRecordCompare) <= 0 && pIdxKey->errCode == SQLITE_OK) { pCur->curFlags &= ~BTCF_ValidOvfl; - if( !pCur->pPage->isInit ){ + if (!pCur->pPage->isInit) { return SQLITE_CORRUPT_BKPT; } - goto bypass_moveto_root; /* Start search on the current page */ + 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 ); + if (rc) { + if (rc == SQLITE_EMPTY) { + assert(pCur->pgnoRoot == 0 || pCur->pPage->nCell == 0); *pRes = -1; return SQLITE_OK; } @@ -72732,17 +71753,17 @@ SQLITE_PRIVATE int sqlite3BtreeIndexMoveto( } 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(;;){ + 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 */ + 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 @@ -72750,13 +71771,13 @@ SQLITE_PRIVATE int sqlite3BtreeIndexMoveto( ** 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 ); + 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 */ + 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 @@ -72768,20 +71789,18 @@ SQLITE_PRIVATE int sqlite3BtreeIndexMoveto( ** 2 bytes of the cell. */ nCell = pCell[0]; - if( nCell<=pPage->max1bytePayload ){ + 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 ); + 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 - ){ + } 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 ); + testcase(pCell + nCell + 2 == pPage->aDataEnd); c = xRecordCompare(nCell, (void*)&pCell[2], pIdxKey); - }else{ + } 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 @@ -72791,80 +71810,79 @@ SQLITE_PRIVATE int sqlite3BtreeIndexMoveto( ** 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 */ + 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 ){ + 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 ){ + 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 */ + memset(((u8*)pCellKey) + nCell, 0, nOverrun); /* Fix uninit warnings */ pCur->curFlags &= ~BTCF_ValidOvfl; - if( rc ){ + 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 ); + 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; + 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 */ + 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 ); + assert(lwr == upr + 1 || (pPage->intKey && !pPage->leaf)); + assert(pPage->isInit); + if (pPage->leaf) { + assert(pCur->ix < pCur->pPage->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{ + 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; + if (rc) + break; } moveto_index_finish: pCur->info.nSize = 0; - assert( (pCur->curFlags & BTCF_ValidOvfl)==0 ); + assert((pCur->curFlags & BTCF_ValidOvfl) == 0); return rc; } - /* ** Return TRUE if the cursor is not pointing at an entry of the table. ** @@ -72872,12 +71890,12 @@ SQLITE_PRIVATE int sqlite3BtreeIndexMoveto( ** 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){ +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 (CURSOR_VALID != pCur->eState); } /* @@ -72885,21 +71903,23 @@ SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor *pCur){ ** pointing to. Return a negative number if no estimate is currently ** available. */ -SQLITE_PRIVATE i64 sqlite3BtreeRowCountEst(BtCursor *pCur){ +SQLITE_PRIVATE i64 sqlite3BtreeRowCountEst(BtCursor* pCur) { i64 n; u8 i; - assert( cursorOwnsBtShared(pCur) ); - assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + 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; + 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++){ + for (i = 0; i < pCur->iPage; i++) { n *= pCur->apPage[i]->nCell; } return n; @@ -72925,30 +71945,31 @@ SQLITE_PRIVATE i64 sqlite3BtreeRowCountEst(BtCursor *pCur){ ** is a hint to the implement. SQLite btree implementation does not use ** this hint, but COMDB2 does. */ -static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){ +static SQLITE_NOINLINE int btreeNext(BtCursor* pCur) { int rc; int idx; - MemPage *pPage; + MemPage* pPage; - assert( cursorOwnsBtShared(pCur) ); - if( pCur->eState!=CURSOR_VALID ){ - assert( (pCur->curFlags & BTCF_ValidOvfl)==0 ); + assert(cursorOwnsBtShared(pCur)); + if (pCur->eState != CURSOR_VALID) { + assert((pCur->curFlags & BTCF_ValidOvfl) == 0); rc = restoreCursorPosition(pCur); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } - if( CURSOR_INVALID==pCur->eState ){ + if (CURSOR_INVALID == pCur->eState) { return SQLITE_DONE; } - if( pCur->eState==CURSOR_SKIPNEXT ){ + if (pCur->eState == CURSOR_SKIPNEXT) { pCur->eState = CURSOR_VALID; - if( pCur->skipNext>0 ) return SQLITE_OK; + if (pCur->skipNext > 0) + return SQLITE_OK; } } pPage = pCur->pPage; idx = ++pCur->ix; - if( !pPage->isInit || sqlite3FaultSim(412) ){ + 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 @@ -72959,48 +71980,50 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){ return SQLITE_CORRUPT_BKPT; } - if( idx>=pPage->nCell ){ - if( !pPage->leaf ){ - rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8])); - if( rc ) return rc; + 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 ){ + 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 ){ + } while (pCur->ix >= pPage->nCell); + if (pPage->intKey) { return sqlite3BtreeNext(pCur, 0); - }else{ + } else { return SQLITE_OK; } } - if( pPage->leaf ){ + if (pPage->leaf) { return SQLITE_OK; - }else{ + } 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 ); +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); + pCur->curFlags &= ~(BTCF_ValidNKey | BTCF_ValidOvfl); + if (pCur->eState != CURSOR_VALID) + return btreeNext(pCur); pPage = pCur->pPage; - if( (++pCur->ix)>=pPage->nCell ){ + if ((++pCur->ix) >= pPage->nCell) { pCur->ix--; return btreeNext(pCur); } - if( pPage->leaf ){ + if (pPage->leaf) { return SQLITE_OK; - }else{ + } else { return moveToLeftmost(pCur); } } @@ -73025,65 +72048,64 @@ SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor *pCur, int flags){ ** hint to the implement. The native SQLite btree implementation does not ** use this hint, but COMDB2 does. */ -static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur){ +static SQLITE_NOINLINE int btreePrevious(BtCursor* pCur) { int rc; - MemPage *pPage; + 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 ){ + 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 ){ + if (rc != SQLITE_OK) { return rc; } - if( CURSOR_INVALID==pCur->eState ){ + if (CURSOR_INVALID == pCur->eState) { return SQLITE_DONE; } - if( CURSOR_SKIPNEXT==pCur->eState ){ + if (CURSOR_SKIPNEXT == pCur->eState) { pCur->eState = CURSOR_VALID; - if( pCur->skipNext<0 ) return SQLITE_OK; + if (pCur->skipNext < 0) + return SQLITE_OK; } } pPage = pCur->pPage; - assert( pPage->isInit ); - if( !pPage->leaf ){ + assert(pPage->isInit); + if (!pPage->leaf) { int idx = pCur->ix; rc = moveToChild(pCur, get4byte(findCell(pPage, idx))); - if( rc ) return rc; + if (rc) + return rc; rc = moveToRightmost(pCur); - }else{ - while( pCur->ix==0 ){ - if( pCur->iPage==0 ){ + } 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 ); + assert(pCur->info.nSize == 0); + assert((pCur->curFlags & (BTCF_ValidOvfl)) == 0); pCur->ix--; pPage = pCur->pPage; - if( pPage->intKey && !pPage->leaf ){ + if (pPage->intKey && !pPage->leaf) { rc = sqlite3BtreePrevious(pCur, 0); - }else{ + } 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); +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 - ){ + if (pCur->eState != CURSOR_VALID || pCur->ix == 0 || pCur->pPage->leaf == 0) { return btreePrevious(pCur); } pCur->ix--; @@ -73112,33 +72134,32 @@ SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor *pCur, int flags){ ** 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; +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)) ); + 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 ){ + testcase(n == mxPage - 1); + if (n >= mxPage) { return SQLITE_CORRUPT_BKPT; } - if( n>0 ){ + 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' */ @@ -73149,18 +72170,19 @@ static int allocateBtreePage( ** the entire-list will be searched for that page. */ #ifndef SQLITE_OMIT_AUTOVACUUM - if( eMode==BTALLOC_EXACT ){ - if( nearby<=mxPage ){ + if (eMode == BTALLOC_EXACT) { + if (nearby <= mxPage) { u8 eType; - assert( nearby>0 ); - assert( pBt->autoVacuum ); + assert(nearby > 0); + assert(pBt->autoVacuum); rc = ptrmapGet(pBt, nearby, &eType, 0); - if( rc ) return rc; - if( eType==PTRMAP_FREEPAGE ){ + if (rc) + return rc; + if (eType == PTRMAP_FREEPAGE) { searchList = 1; } } - }else if( eMode==BTALLOC_LE ){ + } else if (eMode == BTALLOC_LE) { searchList = 1; } #endif @@ -73169,8 +72191,9 @@ static int allocateBtreePage( ** first free-list trunk page. iPrevTrunk is initially 1. */ rc = sqlite3PagerWrite(pPage1->pDbPage); - if( rc ) return rc; - put4byte(&pPage1->aData[36], n-1); + 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 @@ -73179,54 +72202,52 @@ static int allocateBtreePage( */ do { pPrevTrunk = pTrunk; - if( pPrevTrunk ){ + 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{ + } 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 ){ + testcase(iTrunk == mxPage); + if (iTrunk > mxPage || nSearch++ > n) { rc = SQLITE_CORRUPT_PGNO(pPrevTrunk ? pPrevTrunk->pgno : 1); - }else{ + } else { rc = btreeGetUnusedPage(pBt, iTrunk, &pTrunk, 0); } - if( rc ){ + if (rc) { pTrunk = 0; goto end_allocate_page; } - assert( pTrunk!=0 ); - assert( pTrunk->aData!=0 ); + 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 ){ + 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 ); + assert(pPrevTrunk == 0); rc = sqlite3PagerWrite(pTrunk->pDbPage); - if( rc ){ + 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) ){ + 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 ){ + if (rc) { goto end_allocate_page; } - if( k==0 ){ - if( !pPrevTrunk ){ + if (k == 0) { + if (!pPrevTrunk) { memcpy(&pPage1->aData[32], &pTrunk->aData[0], 4); - }else{ + } else { rc = sqlite3PagerWrite(pPrevTrunk->pDbPage); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { goto end_allocate_page; } memcpy(&pPrevTrunk->aData[0], &pTrunk->aData[0], 4); } - }else{ + } 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; + MemPage* pNewTrunk; Pgno iNewTrunk = get4byte(&pTrunk->aData[8]); - if( iNewTrunk>mxPage ){ + if (iNewTrunk > mxPage) { rc = SQLITE_CORRUPT_PGNO(iTrunk); goto end_allocate_page; } - testcase( iNewTrunk==mxPage ); + testcase(iNewTrunk == mxPage); rc = btreeGetUnusedPage(pBt, iNewTrunk, &pNewTrunk, 0); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { goto end_allocate_page; } rc = sqlite3PagerWrite(pNewTrunk->pDbPage); - if( rc!=SQLITE_OK ){ + 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); + put4byte(&pNewTrunk->aData[4], k - 1); + memcpy(&pNewTrunk->aData[8], &pTrunk->aData[12], (k - 1) * 4); releasePage(pNewTrunk); - if( !pPrevTrunk ){ - assert( sqlite3PagerIswriteable(pPage1->pDbPage) ); + if (!pPrevTrunk) { + assert(sqlite3PagerIswriteable(pPage1->pDbPage)); put4byte(&pPage1->aData[32], iNewTrunk); - }else{ + } else { rc = sqlite3PagerWrite(pPrevTrunk->pDbPage); - if( rc ){ + 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)); + TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n - 1)); #endif - }else if( k>0 ){ + } else if (k > 0) { /* Extract a leaf from the trunk */ u32 closest; Pgno iPage; - unsigned char *aData = pTrunk->aData; - if( nearby>0 ){ + unsigned char* aData = pTrunk->aData; + if (nearby > 0) { u32 i; closest = 0; - if( eMode==BTALLOC_LE ){ - for(i=0; imxPage || iPage<2 ){ + iPage = get4byte(&aData[8 + closest * 4]); + testcase(iPage == mxPage); + if (iPage > mxPage || iPage < 2) { rc = SQLITE_CORRUPT_PGNO(iTrunk); goto end_allocate_page; } - testcase( iPage==mxPage ); - if( !searchList - || (iPage==nearby || (iPagepgno, n-1)); + *pPgno, closest + 1, k, pTrunk->pgno, n - 1)); rc = sqlite3PagerWrite(pTrunk->pDbPage); - if( rc ) goto end_allocate_page; - if( closestpDbPage); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { releasePage(*ppPage); *ppPage = 0; } @@ -73352,8 +72372,8 @@ static int allocateBtreePage( } releasePage(pPrevTrunk); pPrevTrunk = 0; - }while( searchList ); - }else{ + } while (searchList); + } else { /* There are no pages on the freelist, so append a new page to the ** database image. ** @@ -73372,53 +72392,59 @@ static int allocateBtreePage( ** 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; + int bNoContent = (0 == IfNotOmitAV(pBt->bDoTruncate)) ? PAGER_GET_NOCONTENT : 0; rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); - if( rc ) return rc; + if (rc) + return rc; pBt->nPage++; - if( pBt->nPage==PENDING_BYTE_PAGE(pBt) ) pBt->nPage++; + if (pBt->nPage == PENDING_BYTE_PAGE(pBt)) + pBt->nPage++; #ifndef SQLITE_OMIT_AUTOVACUUM - if( pBt->autoVacuum && PTRMAP_ISPAGE(pBt, pBt->nPage) ){ + 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; + MemPage* pPg = 0; TRACE(("ALLOCATE: %d from end of file (pointer-map page)\n", pBt->nPage)); - assert( pBt->nPage!=PENDING_BYTE_PAGE(pBt) ); + assert(pBt->nPage != PENDING_BYTE_PAGE(pBt)); rc = btreeGetUnusedPage(pBt, pBt->nPage, &pPg, bNoContent); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = sqlite3PagerWrite(pPg->pDbPage); releasePage(pPg); } - if( rc ) return rc; + if (rc) + return rc; pBt->nPage++; - if( pBt->nPage==PENDING_BYTE_PAGE(pBt) ){ 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) ); + assert(*pPgno != PENDING_BYTE_PAGE(pBt)); rc = btreeGetUnusedPage(pBt, *pPgno, ppPage, bNoContent); - if( rc ) return rc; + if (rc) + return rc; rc = sqlite3PagerWrite((*ppPage)->pDbPage); - if( rc!=SQLITE_OK ){ + 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) ); + 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 ); + assert(rc != SQLITE_OK || sqlite3PagerPageRefcount((*ppPage)->pDbPage) <= 1); + assert(rc != SQLITE_OK || (*ppPage)->isInit == 0); return rc; } @@ -73434,41 +72460,40 @@ static int allocateBtreePage( ** 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 */ +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 ); + assert(sqlite3_mutex_held(pBt->mutex)); + assert(CORRUPT_DB || iPage > 1); + assert(!pMemPage || pMemPage->pgno == iPage); - if( iPage<2 || iPage>pBt->nPage ){ + if (iPage < 2 || iPage > pBt->nPage) { return SQLITE_CORRUPT_BKPT; } - if( pMemPage ){ + if (pMemPage) { pPage = pMemPage; sqlite3PagerRef(pPage->pDbPage); - }else{ + } else { pPage = btreePageLookup(pBt, iPage); } /* Increment the free page count on pPage1 */ rc = sqlite3PagerWrite(pPage1->pDbPage); - if( rc ) goto freepage_out; + if (rc) + goto freepage_out; nFree = get4byte(&pPage1->aData[36]); - put4byte(&pPage1->aData[36], nFree+1); + put4byte(&pPage1->aData[36], nFree + 1); - if( pBt->btsFlags & BTS_SECURE_DELETE ){ + 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) - ){ + if ((!pPage && ((rc = btreeGetPage(pBt, iPage, &pPage, 0)) != 0)) || ((rc = sqlite3PagerWrite(pPage->pDbPage)) != 0)) { goto freepage_out; } memset(pPage->aData, 0, pPage->pBt->pageSize); @@ -73477,9 +72502,10 @@ static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){ /* If the database supports auto-vacuum, write an entry in the pointer-map ** to indicate that the page is free. */ - if( ISAUTOVACUUM ){ + if (ISAUTOVACUUM) { ptrmapPut(pBt, iPage, PTRMAP_FREEPAGE, 0, &rc); - if( rc ) goto freepage_out; + if (rc) + goto freepage_out; } /* Now manipulate the actual database free-list structure. There are two @@ -73489,26 +72515,26 @@ static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){ ** 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 */ + if (nFree != 0) { + u32 nLeaf; /* Initial number of leaf cells on trunk page */ iTrunk = get4byte(&pPage1->aData[32]); - if( iTrunk>btreePagecount(pBt) ){ + if (iTrunk > btreePagecount(pBt)) { rc = SQLITE_CORRUPT_BKPT; goto freepage_out; } rc = btreeGetPage(pBt, iTrunk, &pTrunk, 0); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { goto freepage_out; } nLeaf = get4byte(&pTrunk->aData[4]); - assert( pBt->usableSize>32 ); - if( nLeaf > (u32)pBt->usableSize/4 - 2 ){ + 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 ){ + 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. ** @@ -73529,15 +72555,15 @@ static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){ ** 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 ){ + 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)); + TRACE(("FREE-PAGE: %d leaf on trunk page %d\n", pPage->pgno, pTrunk->pgno)); goto freepage_out; } } @@ -73548,11 +72574,11 @@ static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){ ** 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)) ){ + if (pPage == 0 && SQLITE_OK != (rc = btreeGetPage(pBt, iPage, &pPage, 0))) { goto freepage_out; } rc = sqlite3PagerWrite(pPage->pDbPage); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { goto freepage_out; } put4byte(pPage->aData, iTrunk); @@ -73561,15 +72587,15 @@ static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){ TRACE(("FREE-PAGE: %d new trunk page replacing %d\n", pPage->pgno, iTrunk)); freepage_out: - if( pPage ){ + if (pPage) { pPage->isInit = 0; } releasePage(pPage); releasePage(pTrunk); return rc; } -static void freePage(MemPage *pPage, int *pRC){ - if( (*pRC)==SQLITE_OK ){ +static void freePage(MemPage* pPage, int* pRC) { + if ((*pRC) == SQLITE_OK) { *pRC = freePage2(pPage->pBt, pPage, pPage->pgno); } } @@ -73577,50 +72603,46 @@ static void freePage(MemPage *pPage, int *pRC){ /* ** 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; +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 ){ + 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 ); + assert(pBt->usableSize > 4); ovflPageSize = pBt->usableSize - 4; - nOvfl = (pInfo->nPayload - pInfo->nLocal + ovflPageSize - 1)/ovflPageSize; - assert( nOvfl>0 || - (CORRUPT_DB && (pInfo->nPayload + ovflPageSize)nPayload - pInfo->nLocal + ovflPageSize - 1) / ovflPageSize; + assert(nOvfl > 0 || (CORRUPT_DB && (pInfo->nPayload + ovflPageSize) < ovflPageSize)); + while (nOvfl--) { Pgno iNext = 0; - MemPage *pOvfl = 0; - if( ovflPgno<2 || ovflPgno>btreePagecount(pBt) ){ + MemPage* pOvfl = 0; + if (ovflPgno < 2 || ovflPgno > 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 ){ + if (nOvfl) { rc = getOverflowPage(pBt, ovflPgno, &pOvfl, &iNext); - if( rc ) return rc; + if (rc) + return rc; } - if( ( pOvfl || ((pOvfl = btreePageLookup(pBt, ovflPgno))!=0) ) - && sqlite3PagerPageRefcount(pOvfl->pDbPage)!=1 - ){ + 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 @@ -73632,14 +72654,15 @@ static SQLITE_NOINLINE int clearCellOverflow( ** can be problematic. */ rc = SQLITE_CORRUPT_BKPT; - }else{ + } else { rc = freePage2(pBt, pOvfl, ovflPgno); } - if( pOvfl ){ + if (pOvfl) { sqlite3PagerUnref(pOvfl->pDbPage); } - if( rc ) return rc; + if (rc) + return rc; ovflPgno = iNext; } return SQLITE_OK; @@ -73651,15 +72674,14 @@ static SQLITE_NOINLINE int clearCellOverflow( ** ** 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; \ +#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 @@ -73672,41 +72694,39 @@ static SQLITE_NOINLINE int clearCellOverflow( ** 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 */ -){ +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; + const u8* pSrc; int nSrc, n, rc, mn; int spaceLeft; - MemPage *pToRelease; - unsigned char *pPrior; - unsigned char *pPayload; - BtShared *pBt; + MemPage* pToRelease; + unsigned char* pPrior; + unsigned char* pPayload; + BtShared* pBt; Pgno pgnoOvfl; int nHeader; - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + 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) ); + assert(pCell < pPage->aData || pCell >= &pPage->aData[pPage->pBt->pageSize] || sqlite3PagerIswriteable(pPage->pDbPage)); /* Fill in the header. */ nHeader = pPage->childPtrSize; - if( pPage->intKey ){ + if (pPage->intKey) { nPayload = pX->nData + pX->nZero; pSrc = pX->pData; nSrc = pX->nData; - assert( pPage->intKeyLeaf ); /* fillInCell() only called for leaves */ + 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 ); + } else { + assert(pX->nKey <= 0x7fffffff && pX->pKey != 0); nSrc = nPayload = (int)pX->nKey; pSrc = pX->pKey; nHeader += putVarint32(&pCell[nHeader], nPayload); @@ -73714,18 +72734,19 @@ static int fillInCell( /* Fill in the payload */ pPayload = &pCell[nHeader]; - if( nPayload<=pPage->maxLocal ){ + 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; + 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; + 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]; + pPrior = &pCell[nHeader + n]; pToRelease = 0; pgnoOvfl = 0; pBt = pPage->pBt; @@ -73760,51 +72782,50 @@ static int fillInCell( { 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 ); + 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 ){ + while (1) { n = nPayload; - if( n>spaceLeft ) n = spaceLeft; + 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) ); + 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) ); + assert(pPayload < pPage->aData || pPayload >= &pPage->aData[pBt->pageSize] || sqlite3PagerIswriteable(pPage->pDbPage)); - if( nSrc>=n ){ + if (nSrc >= n) { memcpy(pPayload, pSrc, n); - }else if( nSrc>0 ){ + } else if (nSrc > 0) { n = nSrc; memcpy(pPayload, pSrc, n); - }else{ + } else { memset(pPayload, 0, n); } nPayload -= n; - if( nPayload<=0 ) break; + if (nPayload <= 0) + break; pPayload += n; pSrc += n; nSrc -= n; spaceLeft -= n; - if( spaceLeft==0 ){ - MemPage *pOvfl = 0; + if (spaceLeft == 0) { + MemPage* pOvfl = 0; #ifndef SQLITE_OMIT_AUTOVACUUM Pgno pgnoPtrmap = pgnoOvfl; /* Overflow page pointer-map entry page */ - if( pBt->autoVacuum ){ - do{ + if (pBt->autoVacuum) { + do { pgnoOvfl++; - } while( - PTRMAP_ISPAGE(pBt, pgnoOvfl) || pgnoOvfl==PENDING_BYTE_PAGE(pBt) - ); + } while (PTRMAP_ISPAGE(pBt, pgnoOvfl) || pgnoOvfl == PENDING_BYTE_PAGE(pBt)); } #endif rc = allocateBtreePage(pBt, &pOvfl, &pgnoOvfl, pgnoOvfl, 0); @@ -73819,27 +72840,26 @@ static int fillInCell( ** 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); + if (pBt->autoVacuum && rc == SQLITE_OK) { + u8 eType = (pgnoPtrmap ? PTRMAP_OVERFLOW2 : PTRMAP_OVERFLOW1); ptrmapPut(pBt, pgnoOvfl, eType, pgnoPtrmap, &rc); - if( rc ){ + if (rc) { releasePage(pOvfl); } } #endif - if( rc ){ + 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) ); + 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) ); + assert(pPrior < pPage->aData || pPrior >= &pPage->aData[pBt->pageSize] || sqlite3PagerIswriteable(pPage->pDbPage)); put4byte(pPrior, pgnoOvfl); releasePage(pToRelease); @@ -73862,52 +72882,52 @@ static int fillInCell( ** ** "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 ); +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(idx < pPage->nCell); + 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) ); + 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 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 ){ + 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 ){ + 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); + 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; } } @@ -73926,42 +72946,41 @@ static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){ ** ** *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 ){ +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 ){ + 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 ); + assert(j < ArraySize(pPage->apOvfl) - 1); pPage->apOvfl[j] = pCell; pPage->aiOvfl[j] = (u16)i; @@ -73970,45 +72989,49 @@ static void insertCell( ** 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{ + 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 ){ + if (rc != SQLITE_OK) { *pRC = rc; return; } - assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + assert(sqlite3PagerIswriteable(pPage->pDbPage)); data = pPage->aData; - assert( &data[pPage->cellOffset]==pPage->aCellIdx ); + assert(&data[pPage->cellOffset] == pPage->aCellIdx); rc = allocateSpace(pPage, sz, &idx); - if( rc ){ *pRC = rc; return; } + 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 ); + 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 ){ + 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); + memcpy(&data[idx + 4], pCell + 4, sz - 4); put4byte(&data[idx], iChild); - }else{ + } else { memcpy(&data[idx], pCell, sz); } - pIns = pPage->aCellIdx + i*2; - memmove(pIns+2, pIns, 2*(pPage->nCell - i)); + 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 ); + 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 ){ + 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. */ @@ -74035,8 +73058,8 @@ static void insertCell( ** 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 */ +#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 @@ -74103,27 +73126,26 @@ static void insertCell( */ 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[] */ + 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 ){ +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]) ); + } else { + assert(CORRUPT_DB || p->szCell[idx] == p->pRef->xCellSize(p->pRef, p->apCell[idx])); } idx++; N--; @@ -74133,15 +73155,16 @@ static void populateCellCache(CellArray *p, int idx, int 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 ); +static SQLITE_NOINLINE u16 computeCellSize(CellArray* p, int N) { + assert(N >= 0 && N < p->nCell); + 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]; +static u16 cachedCellSize(CellArray* p, int N) { + assert(N >= 0 && N < p->nCell); + if (p->szCell[N]) + return p->szCell[N]; return computeCellSize(p, N); } @@ -74158,56 +73181,59 @@ static u16 cachedCellSize(CellArray *p, int N){ ** 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 */ +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; } + 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 < iEnd); + j = get2byte(&aData[hdr + 5]); + if (j > (u32)usableSize) { + j = 0; + } memcpy(&pTmp[j], &aData[j], usableSize - j); - for(k=0; pCArray->ixNx[k]<=i && ALWAYS(kixNx[k] <= i && ALWAYS(k < NB * 2); k++) { + } pSrcEnd = pCArray->apEnd[k]; pData = pEnd; - while( 1/*exit by break*/ ){ - u8 *pCell = pCArray->apCell[i]; + 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; + 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 - ){ + } 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; + if (pData < pCellptr) + return SQLITE_CORRUPT_BKPT; memmove(pData, pCell, sz); - assert( sz==pPg->xCellSize(pPg, pCell) || CORRUPT_DB ); + assert(sz == pPg->xCellSize(pPg, pCell) || CORRUPT_DB); i++; - if( i>=iEnd ) break; - if( pCArray->ixNx[k]<=i ){ + if (i >= iEnd) + break; + if (pCArray->ixNx[k] <= i) { k++; pSrcEnd = pCArray->apEnd[k]; } @@ -74217,10 +73243,10 @@ static int rebuildPage( 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; + put2byte(&aData[hdr + 1], 0); + put2byte(&aData[hdr + 3], pPg->nCell); + put2byte(&aData[hdr + 5], pData - aData); + aData[hdr + 7] = 0x00; return SQLITE_OK; } @@ -74248,45 +73274,43 @@ static int rebuildPage( ** 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(kaData; /* 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(k < NB * 2); k++) { + } pEnd = pCArray->apEnd[k]; - while( 1 /*Exit by break*/ ){ + while (1 /*Exit by break*/) { int sz, rc; - u8 *pSlot; - assert( pCArray->szCell[i]!=0 ); + 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 ); + 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; } @@ -74294,8 +73318,9 @@ static int pageInsertArray( put2byte(pCellptr, (pSlot - aData)); pCellptr += 2; i++; - if( i>=iEnd ) break; - if( pCArray->ixNx[k]<=i ){ + if (i >= iEnd) + break; + if (pCArray->ixNx[k] <= i) { k++; pEnd = pCArray->apEnd[k]; } @@ -74313,48 +73338,48 @@ static int pageInsertArray( ** ** 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]; +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; + u8* pFree = 0; int szFree = 0; - for(i=iFirst; iapCell[i]; - if( SQLITE_WITHIN(pCell, pStart, pEnd) ){ + for (i = iFirst; i < iEnd; i++) { + u8* pCell = pCArray->apCell[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 ); + 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 ){ + if (pFree + sz > pEnd) { return 0; } - }else{ + } else { pFree = pCell; szFree += sz; } nRet++; } } - if( pFree ){ - assert( pFree>aData && (pFree - aData)<65536 ); + if (pFree) { + assert(pFree > aData && (pFree - aData) < 65536); freeSpace(pPg, (u16)(pFree - aData), szFree); } return nRet; @@ -74372,111 +73397,105 @@ static int pageFreeArray( ** 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; +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; + 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); + 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); + assert(nCell >= 0); + if (iOld < iNew) { + int nShift = pageFreeArray(pPg, iOld, iNew - iOld, pCArray); + if (NEVER(nShift > nCell)) + return SQLITE_CORRUPT_BKPT; + memmove(pPg->aCellIdx, &pPg->aCellIdx[nShift * 2], nCell * 2); nCell -= nShift; } - if( iNewEnd < iOldEnd ){ + if (iNewEnd < iOldEnd) { int nTail = pageFreeArray(pPg, iNewEnd, iOldEnd - iNewEnd, pCArray); - assert( nCell>=nTail ); + assert(nCell >= nTail); nCell -= nTail; } - pData = &aData[get2byteNotZero(&aData[hdr+5])]; - if( pDatapPg->aDataEnd ) goto editpage_fail; + pData = &aData[get2byteNotZero(&aData[hdr + 5])]; + if (pData < pBegin) + goto editpage_fail; + if (pData > pPg->aDataEnd) + goto editpage_fail; /* Add cells to the start of the page */ - if( iNew=0 ); + if (iNew < iOld) { + int nAdd = MIN(nNew, iOld - iNew); + assert((iOld - iNew) < nNew || nCell == 0 || CORRUPT_DB); + assert(nAdd >= 0); pCellptr = pPg->aCellIdx; - memmove(&pCellptr[nAdd*2], pCellptr, nCell*2); - if( pageInsertArray( - pPg, pBegin, &pData, pCellptr, - iNew, nAdd, pCArray - ) ) goto editpage_fail; + 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++){ + for (i = 0; i < pPg->nOverflow; i++) { int iCell = (iOld + pPg->aiOvfl[i]) - iNew; - if( iCell>=0 && iCell= 0 && iCell < nNew) { pCellptr = &pPg->aCellIdx[iCell * 2]; - if( nCell>iCell ){ + 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; + 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; + 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); + 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]) ){ + for (i = 0; i < nNew && !CORRUPT_DB; i++) { + u8* pCell = pCArray->apCell[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])) ); + assert(0 == memcmp(pCell, &aData[iOff], pCArray->pRef->xCellSize(pCArray->pRef, pCArray->apCell[i + iNew]))); } #endif return SQLITE_OK; - editpage_fail: +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 @@ -74501,19 +73520,20 @@ static int editPage( ** 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 */ +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 ); + 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 ); + 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 @@ -74521,17 +73541,17 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ */ rc = allocateBtreePage(pBt, &pNew, &pgnoNew, 0, 0); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { - u8 *pOut = &pSpace[4]; - u8 *pCell = pPage->apOvfl[0]; + u8* pOut = &pSpace[4]; + u8* pCell = pPage->apOvfl[0]; u16 szCell = pPage->xCellSize(pPage, pCell); - u8 *pStop; + 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); + 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; @@ -74539,7 +73559,7 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ b.apEnd[0] = pPage->aDataEnd; b.ixNx[0] = 2; rc = rebuildPage(&b, 0, 1, pNew); - if( NEVER(rc) ){ + if (NEVER(rc)) { releasePage(pNew); return rc; } @@ -74554,9 +73574,9 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ ** be marked as dirty. Returning an error code will cause a ** rollback, undoing any changes made to the parent page. */ - if( ISAUTOVACUUM ){ + if (ISAUTOVACUUM) { ptrmapPut(pBt, pgnoNew, PTRMAP_BTREE, pParent->pgno, &rc); - if( szCell>pNew->minLocal ){ + if (szCell > pNew->minLocal) { ptrmapPutOvflPtr(pNew, pNew, pCell, &rc); } } @@ -74574,20 +73594,21 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ ** field. The second while(...) loop copies the key value from the ** cell on pPage into the pSpace buffer. */ - pCell = findCell(pPage, pPage->nCell-1); + pCell = findCell(pPage, pPage->nCell - 1); pStop = &pCell[9]; - while( (*(pCell++)&0x80) && pCellnCell, pSpace, (int)(pOut-pSpace), - 0, pPage->pgno, &rc); + if (rc == SQLITE_OK) { + insertCell(pParent, pParent->nCell, 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); + put4byte(&pParent->aData[pParent->hdrOffset + 8], pgnoNew); /* Release the reference to the new page. */ releasePage(pNew); @@ -74656,25 +73677,24 @@ static int ptrmapCheckPages(MemPage **apPage, int nPage){ ** 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; +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 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 ); + 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); + 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 @@ -74683,8 +73703,9 @@ static void copyNodeContent(MemPage *pFrom, MemPage *pTo, int *pRC){ */ pTo->isInit = 0; rc = btreeInitPage(pTo); - if( rc==SQLITE_OK ) rc = btreeComputeFreeSpace(pTo); - if( rc!=SQLITE_OK ){ + if (rc == SQLITE_OK) + rc = btreeComputeFreeSpace(pTo); + if (rc != SQLITE_OK) { *pRC = rc; return; } @@ -74692,7 +73713,7 @@ static void copyNodeContent(MemPage *pFrom, MemPage *pTo, int *pRC){ /* 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 ){ + if (ISAUTOVACUUM) { *pRC = setChildPtrmaps(pTo); } } @@ -74738,58 +73759,57 @@ static void copyNodeContent(MemPage *pFrom, MemPage *pTo, int *pRC){ ** 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 */ - CellArray b; /* Parsed information on cells being balanced */ +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 */ + 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) ); + 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 ); + assert(pParent->nOverflow == 0 || pParent->nOverflow == 1); + assert(pParent->nOverflow == 0 || pParent->aiOvfl[0] == iParentIdx); - if( !aOvflSpace ){ + if (!aOvflSpace) { return SQLITE_NOMEM_BKPT; } - assert( pParent->nFree>=0 ); + 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 @@ -74803,51 +73823,52 @@ static int balance_nonroot( ** have already been removed. */ i = pParent->nOverflow + pParent->nCell; - if( i<2 ){ + if (i < 2) { nxDiv = 0; - }else{ - assert( bBulk==0 || bBulk==1 ); - if( iParentIdx==0 ){ + } else { + assert(bBulk == 0 || bBulk == 1); + if (iParentIdx == 0) { nxDiv = 0; - }else if( iParentIdx==i ){ - nxDiv = i-2+bBulk; - }else{ - nxDiv = iParentIdx-1; + } else if (iParentIdx == i) { + nxDiv = i - 2 + bBulk; + } else { + nxDiv = iParentIdx - 1; } - i = 2-bBulk; + 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); + 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 ){ + while (1) { + if (rc == SQLITE_OK) { rc = getAndInitPage(pBt, pgno, &apOld[i], 0, 0); } - if( rc ){ - memset(apOld, 0, (i+1)*sizeof(MemPage*)); + if (rc) { + memset(apOld, 0, (i + 1) * sizeof(MemPage*)); goto balance_cleanup; } - if( apOld[i]->nFree<0 ){ + if (apOld[i]->nFree < 0) { rc = btreeComputeFreeSpace(apOld[i]); - if( rc ){ - memset(apOld, 0, (i)*sizeof(MemPage*)); + if (rc) { + memset(apOld, 0, (i) * sizeof(MemPage*)); goto balance_cleanup; } } nMaxCells += apOld[i]->nCell + ArraySize(pParent->apOvfl); - if( (i--)==0 ) break; + if ((i--) == 0) + break; - if( pParent->nOverflow && i+nxDiv==pParent->aiOvfl[0] ){ + 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); + } else { + apDiv[i] = findCell(pParent, i + nxDiv - pParent->nOverflow); pgno = get4byte(apDiv[i]); szNew[i] = pParent->xCellSize(pParent, apDiv[i]); @@ -74863,42 +73884,41 @@ static int balance_nonroot( ** 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 ){ + 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 ){ + if ((iOff + szNew[i]) <= (int)pBt->usableSize) { memcpy(&aOvflSpace[iOff], apDiv[i], szNew[i]); - apDiv[i] = &aOvflSpace[apDiv[i]-pParent->aData]; + apDiv[i] = &aOvflSpace[apDiv[i] - pParent->aData]; } } - dropCell(pParent, i+nxDiv-pParent->nOverflow, szNew[i], &rc); + 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; + nMaxCells = (nMaxCells + 3) & ~3; /* ** Allocate space for memory structures */ - szScratch = - nMaxCells*sizeof(u8*) /* b.apCell */ - + nMaxCells*sizeof(u16) /* b.szCell */ - + pBt->pageSize; /* aSpace1 */ + 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 ){ + 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) ); + assert(EIGHT_BYTE_ALIGNMENT(aSpace1)); /* ** Load pointers to all cells on sibling pages and the divider cells @@ -74917,21 +73937,21 @@ static int balance_nonroot( ** leafData: 1 if pPage holds key+data and pParent holds only keys. */ b.pRef = apOld[0]; - leafCorrection = b.pRef->leaf*4; + leafCorrection = b.pRef->leaf * 4; leafData = b.pRef->intKeyLeaf; - for(i=0; inCell; - u8 *aData = pOld->aData; + u8* aData = pOld->aData; u16 maskPage = pOld->maskPage; - u8 *piCell = aData + pOld->cellOffset; - u8 *piEnd; - VVA_ONLY( int nCellAtStart = b.nCell; ) + 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] ){ + if (pOld->aData[0] != apOld[0]->aData[0]) { rc = SQLITE_CORRUPT_BKPT; goto balance_cleanup; } @@ -74953,60 +73973,60 @@ static int balance_nonroot( ** 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]) ){ + memset(&b.szCell[b.nCell], 0, sizeof(b.szCell[0]) * (limit + pOld->nOverflow)); + if (pOld->nOverflow > 0) { + if (NEVER(limit < pOld->aiOvfl[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 */ + for (k = 0; k < pOld->nOverflow; 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( piCellcellOffset + 2 * pOld->nCell; + while (piCell < piEnd) { + assert(b.nCell < nMaxCells); b.apCell[b.nCell] = aData + (maskPage & get2byteAligned(piCell)); piCell += 2; b.nCell++; } - assert( (b.nCell-nCellAtStart)==(pOld->nCell+pOld->nOverflow) ); + assert((b.nCell - nCellAtStart) == (pOld->nCell + pOld->nOverflow)); cntOld[i] = b.nCell; - if( imaxLocal+23 ); - assert( iSpace1 <= (int)pBt->pageSize ); + assert(sz <= pBt->maxLocal + 23); + assert(iSpace1 <= (int)pBt->pageSize); memcpy(pTemp, apDiv[i], sz); - b.apCell[b.nCell] = pTemp+leafCorrection; - assert( leafCorrection==0 || leafCorrection==4 ); + 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 ); + 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 ){ + } 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 ); + 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]++; } @@ -75032,64 +74052,68 @@ static int balance_nonroot( ** */ 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 (k && b.ixNx[k] == b.ixNx[k - 1]) { + k--; /* Omit b.ixNx[] entry for child pages with no cells */ } - if( !leafData ){ + if (!leafData) { k++; b.apEnd[k] = pParent->aDataEnd; - b.ixNx[k] = cntOld[i]+1; + b.ixNx[k] = cntOld[i] + 1; } - assert( p->nFree>=0 ); + assert(p->nFree >= 0); szNew[i] = usableSpace - p->nFree; - for(j=0; jnOverflow; j++){ + for (j = 0; j < p->nOverflow; 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); + while (szNew[i] > usableSpace) { + 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; + if (szNew[i] + sz > 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) ){ + 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; } @@ -75106,32 +74130,31 @@ static int balance_nonroot( ** 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 */ + 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; + 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)))){ + if (szRight != 0 && (bBulk || szRight + b.szCell[d] + 2 > szLeft - (b.szCell[r] + (i == k - 1 ? 0 : 2)))) { break; } szRight += b.szCell[d] + 2; szLeft -= b.szCell[r] + 2; - cntNew[i-1] = r; + cntNew[i - 1] = r; r--; d--; - }while( r>=0 ); + } while (r >= 0); szNew[i] = szRight; - szNew[i-1] = szLeft; - if( cntNew[i-1] <= (i>1 ? cntNew[i-2] : 0) ){ + szNew[i - 1] = szLeft; + if (cntNew[i - 1] <= (i > 1 ? cntNew[i - 2] : 0)) { rc = SQLITE_CORRUPT_BKPT; goto balance_cleanup; } @@ -75144,43 +74167,40 @@ static int balance_nonroot( ** 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 - )); + 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 - ){ + if (sqlite3PagerPageRefcount(pNew->pDbPage) != 1 + (i == (iParentIdx - nxDiv)) && rc == SQLITE_OK) { rc = SQLITE_CORRUPT_BKPT; } - if( rc ) goto balance_cleanup; - }else{ - assert( i>0 ); + if (rc) + goto balance_cleanup; + } else { + assert(i > 0); rc = allocateBtreePage(pBt, &pNew, &pgno, (bBulk ? 1 : pgno), 0); - if( rc ) goto balance_cleanup; + 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 ){ + if (ISAUTOVACUUM) { ptrmapPut(pBt, pNew->pgno, PTRMAP_BTREE, pParent->pgno, &rc); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { goto balance_cleanup; } } @@ -75199,15 +74219,16 @@ static int balance_nonroot( ** When NB==3, this one optimization makes the database about 25% faster ** for large insertions and deletions. */ - for(i=0; ipgno; - assert( apNew[i]->pDbPage->flags & PGHDR_WRITEABLE ); - assert( apNew[i]->pDbPage->flags & PGHDR_DIRTY ); + assert(apNew[i]->pDbPage->flags & PGHDR_WRITEABLE); + assert(apNew[i]->pDbPage->flags & PGHDR_DIRTY); } - for(i=0; ipgno < apNew[iB]->pgno ) iB = j; + for (j = i + 1; j < nNew; j++) { + if (apNew[j]->pgno < apNew[iB]->pgno) + iB = j; } /* If apNew[i] has a page number that is bigger than any of the @@ -75215,10 +74236,10 @@ static int balance_nonroot( ** entry that has the smallest page number (which we know to be ** entry apNew[iB]). */ - if( iB!=i ){ + if (iB != i) { Pgno pgnoA = apNew[i]->pgno; Pgno pgnoB = apNew[iB]->pgno; - Pgno pgnoTemp = (PENDING_BYTE/pBt->pageSize)+1; + Pgno pgnoTemp = (PENDING_BYTE / pBt->pageSize) + 1; u16 fgA = apNew[i]->pDbPage->flags; u16 fgB = apNew[iB]->pDbPage->flags; sqlite3PagerRekey(apNew[i]->pDbPage, pgnoTemp, fgB); @@ -75231,28 +74252,23 @@ static int balance_nonroot( 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); + 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); + 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 @@ -75271,25 +74287,26 @@ static int balance_nonroot( ** updated. This happens below, after the sibling pages have been ** populated, not here. */ - if( ISAUTOVACUUM ){ - MemPage *pOld; - MemPage *pNew = pOld = apNew[0]; + 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 && iOld= 0 && iOld < NB); + pOld = iOld < nNew ? apNew[iOld] : apOld[iOld]; cntOldNext += pOld->nCell + pOld->nOverflow + !leafData; } - if( i==cntNew[iNew] ){ + if (i == cntNew[iNew]) { pNew = apNew[++iNew]; - if( !leafData ) continue; + if (!leafData) + continue; } /* Cell pCell is destined for new sibling page pNew. Originally, it @@ -75298,38 +74315,36 @@ static int balance_nonroot( ** 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 ){ + 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 ){ + if (cachedCellSize(&b, i) > pNew->minLocal) { ptrmapPutOvflPtr(pNew, pOld, pCell, &rc); } - if( rc ) goto balance_cleanup; + if (rc) + goto balance_cleanup; } } } /* Insert new divider cells into pParent. */ - for(i=0; ileaf ){ + if (!pNew->leaf) { memcpy(&pNew->aData[8], pCell, 4); - }else if( leafData ){ + } 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 @@ -75341,7 +74356,7 @@ static int balance_nonroot( pCell = pTemp; sz = 4 + putVarint(&pCell[4], info.nKey); pTemp = 0; - }else{ + } 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 @@ -75354,23 +74369,25 @@ static int balance_nonroot( ** and WITHOUT ROWID tables with exactly one column which is the ** primary key. */ - if( b.szCell[j]==4 ){ - assert(leafCorrection==4); + 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(kmaxLocal + 23); + assert(iOvflSpace <= (int)pBt->pageSize); + for (k = 0; b.ixNx[k] <= j && ALWAYS(k < NB * 2); k++) { + } pSrcEnd = b.apEnd[k]; - if( SQLITE_WITHIN(pSrcEnd, pCell, pCell+sz) ){ + if (SQLITE_WITHIN(pSrcEnd, pCell, pCell + sz)) { rc = SQLITE_CORRUPT_BKPT; goto balance_cleanup; } - insertCell(pParent, nxDiv+i, pCell, sz, pTemp, pNew->pgno, &rc); - if( rc!=SQLITE_OK ) goto balance_cleanup; - assert( sqlite3PagerIswriteable(pParent->pDbPage) ); + insertCell(pParent, nxDiv + i, pCell, sz, pTemp, pNew->pgno, &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 @@ -75395,50 +74412,52 @@ static int balance_nonroot( ** 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 */ - ){ + for (i = 1 - nNew; i < nNew; i++) { + int iPg = i < 0 ? -i : i; + assert(iPg >= 0 && iPg < nNew); + if (abDone[iPg]) + continue; /* Skip pages already processed */ + if (i >= 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] ); + 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] ); + assert(cntNew[iPg] >= cntOld[iPg] || abDone[iPg + 1]); - if( iPg==0 ){ + 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 ); + apNew[iPg]->nFree = 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(memcmp(abDone, "\01\01\01\01\01", nNew) == 0); - assert( nOld>0 ); - assert( nNew>0 ); + assert(nOld > 0); + assert(nNew > 0); - if( isRoot && pParent->nCell==0 && pParent->hdrOffset<=apNew[0]->nFree ){ + 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 @@ -75454,33 +74473,28 @@ static int balance_nonroot( ** 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 ); + 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 - ); + 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 ){ + } 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)); + 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; ipBt; /* The BTree */ +static int balance_deeper(MemPage* pRoot, MemPage** ppChild) { + int rc; /* Return value from subprocedures */ + MemPage* pChild = 0; /* Pointer to a new child page */ + Pgno pgnoChild = 0; /* Page number of the new child page */ + BtShared* pBt = pRoot->pBt; /* The BTree */ - assert( pRoot->nOverflow>0 ); - assert( sqlite3_mutex_held(pBt->mutex) ); + 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); + if (rc == SQLITE_OK) { + rc = allocateBtreePage(pBt, &pChild, &pgnoChild, pRoot->pgno, 0); copyNodeContent(pRoot, pChild, &rc); - if( ISAUTOVACUUM ){ + if (ISAUTOVACUUM) { ptrmapPut(pBt, pgnoChild, PTRMAP_BTREE, pRoot->pgno, &rc); } } - if( rc ){ + if (rc) { *ppChild = 0; releasePage(pChild); return rc; } - assert( sqlite3PagerIswriteable(pChild->pDbPage) ); - assert( sqlite3PagerIswriteable(pRoot->pDbPage) ); - assert( pChild->nCell==pRoot->nCell || CORRUPT_DB ); + 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])); + 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); + put4byte(&pRoot->aData[pRoot->hdrOffset + 8], pgnoChild); *ppChild = pChild; return SQLITE_OK; @@ -75588,13 +74599,10 @@ static int balance_deeper(MemPage *pRoot, MemPage **ppChild){ ** 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 - ){ +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; } } @@ -75611,62 +74619,59 @@ static int anotherValidCursor(BtCursor *pCur){ ** balance_deeper() ** balance_nonroot() */ -static int balance(BtCursor *pCur){ +static int balance(BtCursor* pCur) { int rc = SQLITE_OK; u8 aBalanceQuickSpace[13]; - u8 *pFree = 0; + u8* pFree = 0; - VVA_ONLY( int balance_quick_called = 0 ); - VVA_ONLY( int balance_deeper_called = 0 ); + VVA_ONLY(int balance_quick_called = 0); + VVA_ONLY(int balance_deeper_called = 0); do { int iPage; - MemPage *pPage = pCur->pPage; + MemPage* pPage = pCur->pPage; - if( NEVER(pPage->nFree<0) && btreeComputeFreeSpace(pPage) ) break; - if( pPage->nOverflow==0 && pPage->nFree*3<=(int)pCur->pBt->usableSize*2 ){ + 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 ){ + } 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++ ); + assert(balance_deeper_called == 0); + VVA_ONLY(balance_deeper_called++); rc = balance_deeper(pPage, &pCur->apPage[1]); - if( rc==SQLITE_OK ){ + 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 ); + assert(pCur->pPage->nOverflow); } - }else{ + } else { break; } - }else{ - MemPage * const pParent = pCur->apPage[iPage-1]; - int const iIdx = pCur->aiIdx[iPage-1]; + } 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 ){ + if (rc == SQLITE_OK && pParent->nFree < 0) { rc = btreeComputeFreeSpace(pParent); } - if( rc==SQLITE_OK ){ + 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 - ){ + 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 @@ -75680,10 +74685,10 @@ static int balance(BtCursor *pCur){ ** 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++ ); + assert(balance_quick_called == 0); + VVA_ONLY(balance_quick_called++); rc = balance_quick(pParent, pPage, aBalanceQuickSpace); - }else + } else #endif { /* In this case, call balance_nonroot() to redistribute cells @@ -75703,10 +74708,9 @@ static int balance(BtCursor *pCur){ ** 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 ){ + 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 @@ -75726,12 +74730,12 @@ static int balance(BtCursor *pCur){ /* The next iteration of the do-loop balances the parent page. */ releasePage(pPage); pCur->iPage--; - assert( pCur->iPage>=0 ); + assert(pCur->iPage >= 0); pCur->pPage = pCur->apPage[pCur->iPage]; } - }while( rc==SQLITE_OK ); + } while (rc == SQLITE_OK); - if( pFree ){ + if (pFree) { sqlite3PageFree(pFree); } return rc; @@ -75740,35 +74744,37 @@ static int balance(BtCursor *pCur){ /* 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 */ -){ +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 ){ + if (nData <= 0) { /* Overwritting with zeros */ int i; - for(i=0; ipDbPage); - if( rc ) return rc; + if (rc) + return rc; memset(pDest + i, 0, iAmt - i); } - }else{ - if( nDatapData) + iOffset, iAmt)!=0 ){ + if (memcmp(pDest, ((u8*)pX->pData) + iOffset, iAmt) != 0) { int rc = sqlite3PagerWrite(pPage->pDbPage); - if( rc ) return rc; + 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 @@ -75783,55 +74789,54 @@ static int btreeOverwriteContent( ** Overwrite the cell that cursor pCur is pointing to with fresh content ** contained in pX. */ -static int btreeOverwriteCell(BtCursor *pCur, const BtreePayload *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 */ + 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 - ){ + 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; + 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 ); + assert(nTotal >= 0); + assert(iOffset >= 0); ovflPgno = get4byte(pCur->info.pPayload + iOffset); pBt = pPage->pBt; ovflPageSize = pBt->usableSize - 4; - do{ + do { rc = btreeGetPage(pBt, ovflPgno, &pPage, 0); - if( rc ) return rc; - if( sqlite3PagerPageRefcount(pPage->pDbPage)!=1 || pPage->isInit ){ + if (rc) + return rc; + if (sqlite3PagerPageRefcount(pPage->pDbPage) != 1 || pPage->isInit) { rc = SQLITE_CORRUPT_BKPT; - }else{ - if( iOffset+ovflPageSize<(u32)nTotal ){ + } else { + if (iOffset + ovflPageSize < (u32)nTotal) { ovflPgno = get4byte(pPage->aData); - }else{ + } else { ovflPageSize = nTotal - iOffset; } - rc = btreeOverwriteContent(pPage, pPage->aData+4, pX, - iOffset, ovflPageSize); + rc = btreeOverwriteContent(pPage, pPage->aData + 4, pX, iOffset, ovflPageSize); } sqlite3PagerUnref(pPage->pDbPage); - if( rc ) return rc; + if (rc) + return rc; iOffset += ovflPageSize; - }while( iOffsetaMem 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 */ -){ +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 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; + 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 ); + 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. ** @@ -75892,10 +74896,11 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( ** doing any work. To avoid thwarting these optimizations, it is important ** not to clear the cursor here. */ - if( pCur->curFlags & BTCF_Multiple ){ + if (pCur->curFlags & BTCF_Multiple) { rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur); - if( rc ) return rc; - if( loc && pCur->iPage<0 ){ + 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 @@ -75908,31 +74913,30 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( /* 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 ); + 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; + 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(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) ); + assert((flags & BTREE_PREFORMAT) || (pX->pKey == 0) == (pCur->pKeyInfo == 0)); - if( pCur->pKeyInfo==0 ){ - assert( pX->pKey==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 ){ + if (p->hasIncrblobCur) { invalidateIncrblobCursors(p, pCur->pgnoRoot, pX->nKey, 0); } @@ -75940,10 +74944,10 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( ** 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 ); + if (flags & BTREE_SAVEPOSITION) { + assert(pCur->curFlags & BTCF_ValidNKey); + assert(pX->nKey == pCur->info.nKey); + assert(loc == 0); } #endif @@ -75951,41 +74955,39 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( ** 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 ){ + 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 - ){ + 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 ){ + 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; + rc = sqlite3BtreeTableMoveto(pCur, pX->nKey, (flags & BTREE_APPEND) != 0, &loc); + if (rc) + return rc; } - }else{ + } 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 ); + 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 ){ + if (loc == 0 && (flags & BTREE_SAVEPOSITION) == 0) { + if (pX->nMem) { UnpackedRecord r; r.pKeyInfo = pCur->pKeyInfo; r.aMem = pX->aMem; @@ -75993,20 +74995,20 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( 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); + } else { + rc = btreeMoveto(pCur, pX->pKey, pX->nKey, (flags & BTREE_APPEND) != 0, &loc); } - if( rc ) return rc; + 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 ){ + if (loc == 0) { getCellInfo(pCur); - if( pCur->info.nKey==pX->nKey ){ + if (pCur->info.nKey == pX->nKey) { BtreePayload x2; x2.pData = pX->pKey; x2.nData = pX->nKey; @@ -76015,67 +75017,66 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( } } } - assert( pCur->eState==CURSOR_VALID - || (pCur->eState==CURSOR_INVALID && loc) ); + 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 */ + 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{ + } else { rc = btreeComputeFreeSpace(pPage); } - if( rc ) return rc; + 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 ); + 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 ){ + assert(newCell != 0); + if (flags & BTREE_PREFORMAT) { rc = SQLITE_OK; szNew = pBt->nPreformatSize; - if( szNew<4 ) szNew = 4; - if( ISAUTOVACUUM && szNew>pPage->maxLocal ){ + 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]); + if (info.nPayload != info.nLocal) { + Pgno ovfl = get4byte(&newCell[szNew - 4]); ptrmapPut(pBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno, &rc); } } - }else{ + } else { rc = fillInCell(pPage, newCell, pX, &szNew); } - if( rc ) goto end_insert; - assert( szNew==pPage->xCellSize(pPage, newCell) ); - assert( szNew <= MX_CELL_SIZE(pBt) ); + if (rc) + goto end_insert; + assert(szNew == pPage->xCellSize(pPage, newCell)); + assert(szNew <= MX_CELL_SIZE(pBt)); idx = pCur->ix; - if( loc==0 ){ + if (loc == 0) { CellInfo info; - assert( idx>=0 ); - if( idx>=pPage->nCell ){ + assert(idx >= 0); + if (idx >= pPage->nCell) { return SQLITE_CORRUPT_BKPT; } rc = sqlite3PagerWrite(pPage->pDbPage); - if( rc ){ + if (rc) { goto end_insert; } oldCell = findCell(pPage, idx); - if( !pPage->leaf ){ + if (!pPage->leaf) { memcpy(newCell, oldCell, 4); } BTREE_CLEAR_CELL(rc, pPage, oldCell, info); - testcase( pCur->curFlags & BTCF_ValidOvfl ); + testcase(pCur->curFlags & BTCF_ValidOvfl); invalidateOverflowCache(pCur); - if( info.nSize==szNew && info.nLocal==info.nPayload - && (!ISAUTOVACUUM || szNewminLocal) - ){ + if (info.nSize == szNew && info.nLocal == info.nPayload && (!ISAUTOVACUUM || szNew < pPage->minLocal)) { /* 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 @@ -76085,28 +75086,29 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( ** 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 ){ + 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 ){ + 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 ); + 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 ); + } 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 ); + 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 @@ -76129,8 +75131,8 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( ** row without seeking the cursor. This can be a big performance boost. */ pCur->info.nSize = 0; - if( pPage->nOverflow ){ - assert( rc==SQLITE_OK ); + if (pPage->nOverflow) { + assert(rc == SQLITE_OK); pCur->curFlags &= ~(BTCF_ValidNKey); rc = balance(pCur); @@ -76140,14 +75142,14 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( ** 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 ){ + 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 ){ + if (pCur->pKeyInfo) { + assert(pCur->pKey == 0); + pCur->pKey = sqlite3Malloc(pX->nKey); + if (pCur->pKey == 0) { rc = SQLITE_NOMEM; - }else{ + } else { memcpy(pCur->pKey, pX->pKey, pX->nKey); } } @@ -76155,7 +75157,7 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( pCur->nKey = pX->nKey; } } - assert( pCur->iPage<0 || pCur->pPage->nOverflow==0 ); + assert(pCur->iPage < 0 || pCur->pPage->nOverflow == 0); end_insert: return rc; @@ -76176,47 +75178,48 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( ** ** SQLITE_OK is returned if successful, or an SQLite error code otherwise. */ -SQLITE_PRIVATE int sqlite3BtreeTransferRow(BtCursor *pDest, BtCursor *pSrc, i64 iKey){ +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 */ + 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 ){ + if (pSrc->info.nPayload < 0x80) { *(aOut++) = pSrc->info.nPayload; - }else{ + } else { aOut += sqlite3PutVarint(aOut, pSrc->info.nPayload); } - if( pDest->pKeyInfo==0 ) aOut += putVarint(aOut, iKey); + if (pDest->pKeyInfo == 0) + aOut += putVarint(aOut, iKey); nIn = pSrc->info.nLocal; aIn = pSrc->info.pPayload; - if( aIn+nIn>pSrc->pPage->aDataEnd ){ + if (aIn + nIn > pSrc->pPage->aDataEnd) { return SQLITE_CORRUPT_BKPT; } nRem = pSrc->info.nPayload; - if( nIn==nRem && nInpPage->maxLocal ){ + if (nIn == nRem && nIn < pDest->pPage->maxLocal) { memcpy(aOut, aIn, nIn); pBt->nPreformatSize = nIn + (aOut - pBt->pTmpSpace); - }else{ - Pager *pSrcPager = pSrc->pBt->pPager; - u8 *pPgnoOut = 0; + } 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[] */ + 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 ){ + if (nOut < pSrc->info.nPayload) { pPgnoOut = &aOut[nOut]; pBt->nPreformatSize += 4; } - if( nRem>nIn ){ - if( aIn+nIn+4>pSrc->pPage->aDataEnd ){ + if (nRem > nIn) { + if (aIn + nIn + 4 > pSrc->pPage->aDataEnd) { return SQLITE_CORRUPT_BKPT; } ovflIn = get4byte(&pSrc->info.pPayload[nIn]); @@ -76224,9 +75227,9 @@ SQLITE_PRIVATE int sqlite3BtreeTransferRow(BtCursor *pDest, BtCursor *pSrc, i64 do { nRem -= nOut; - do{ - assert( nOut>0 ); - if( nIn>0 ){ + do { + assert(nOut > 0); + if (nIn > 0) { int nCopy = MIN(nOut, nIn); memcpy(aOut, aIn, nCopy); nOut -= nCopy; @@ -76234,37 +75237,37 @@ SQLITE_PRIVATE int sqlite3BtreeTransferRow(BtCursor *pDest, BtCursor *pSrc, i64 aOut += nCopy; aIn += nCopy; } - if( nOut>0 ){ + if (nOut > 0) { sqlite3PagerUnref(pPageIn); pPageIn = 0; rc = sqlite3PagerGet(pSrcPager, ovflIn, &pPageIn, PAGER_GET_READONLY); - if( rc==SQLITE_OK ){ + 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 ); + } while (rc == SQLITE_OK && nOut > 0); - if( rc==SQLITE_OK && nRem>0 && ALWAYS(pPgnoOut) ){ + if (rc == SQLITE_OK && nRem > 0 && ALWAYS(pPgnoOut)) { Pgno pgnoNew; - MemPage *pNew = 0; + MemPage* pNew = 0; rc = allocateBtreePage(pBt, &pNew, &pgnoNew, 0, 0); put4byte(pPgnoOut, pgnoNew); - if( ISAUTOVACUUM && pPageOut ){ + if (ISAUTOVACUUM && pPageOut) { ptrmapPut(pBt, pgnoNew, PTRMAP_OVERFLOW2, pPageOut->pgno, &rc); } releasePage(pPageOut); pPageOut = pNew; - if( pPageOut ){ + if (pPageOut) { pPgnoOut = pPageOut->aData; put4byte(pPgnoOut, 0); aOut = &pPgnoOut[4]; nOut = MIN(pBt->usableSize - 4, nRem); } } - }while( nRem>0 && rc==SQLITE_OK ); + } while (nRem > 0 && rc == SQLITE_OK); releasePage(pPageOut); sqlite3PagerUnref(pPageIn); @@ -76290,43 +75293,44 @@ SQLITE_PRIVATE int sqlite3BtreeTransferRow(BtCursor *pDest, BtCursor *pSrc, i64 ** 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 ){ +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{ + 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 ); + assert(pCur->eState == CURSOR_VALID); iCellDepth = pCur->iPage; iCellIdx = pCur->ix; pPage = pCur->pPage; - if( pPage->nCell<=iCellIdx ){ + if (pPage->nCell <= iCellIdx) { return SQLITE_CORRUPT_BKPT; } pCell = findCell(pPage, iCellIdx); - if( pPage->nFree<0 && btreeComputeFreeSpace(pPage) ){ + if (pPage->nFree < 0 && btreeComputeFreeSpace(pPage)) { return SQLITE_CORRUPT_BKPT; } @@ -76346,18 +75350,17 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ ** 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 */ - ){ + 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{ + if (rc) + return rc; + } else { bPreserve = 2; } } @@ -76369,22 +75372,24 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ ** 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 ){ + if (!pPage->leaf) { rc = sqlite3BtreePrevious(pCur, 0); - assert( rc!=SQLITE_DONE ); - if( rc ) return rc; + 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 ){ + if (pCur->curFlags & BTCF_Multiple) { rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur); - if( rc ) return rc; + 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 ){ + if (pCur->pKeyInfo == 0 && p->hasIncrblobCur) { invalidateIncrblobCursors(p, pCur->pgnoRoot, pCur->info.nKey, 0); } @@ -76392,43 +75397,48 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ ** overflow pages associated with the entry and finally remove the cell ** itself from within the page. */ rc = sqlite3PagerWrite(pPage->pDbPage); - if( rc ) return rc; + if (rc) + return rc; BTREE_CLEAR_CELL(rc, pPage, pCell, info); dropCell(pPage, iCellIdx, info.nSize, &rc); - if( rc ) return 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; + if (!pPage->leaf) { + MemPage* pLeaf = pCur->pPage; int nCell; Pgno n; - unsigned char *pTmp; + unsigned char* pTmp; - if( pLeaf->nFree<0 ){ + if (pLeaf->nFree < 0) { rc = btreeComputeFreeSpace(pLeaf); - if( rc ) return rc; + if (rc) + return rc; } - if( iCellDepthiPage-1 ){ - n = pCur->apPage[iCellDepth+1]->pgno; - }else{ + if (iCellDepth < pCur->iPage - 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; + 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 ); + assert(MX_CELL_SIZE(pBt) >= nCell); pTmp = pBt->pTmpSpace; - assert( pTmp!=0 ); + assert(pTmp != 0); rc = sqlite3PagerWrite(pLeaf->pDbPage); - if( rc==SQLITE_OK ){ - insertCell(pPage, iCellIdx, pCell-4, nCell+4, pTmp, n, &rc); + 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; + dropCell(pLeaf, pLeaf->nCell - 1, nCell, &rc); + if (rc) + return rc; } /* Balance the tree. If the entry deleted was located on a leaf page, @@ -76446,44 +75456,45 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ ** 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 ){ + 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{ + } else { rc = balance(pCur); } - if( rc==SQLITE_OK && pCur->iPage>iCellDepth ){ + if (rc == SQLITE_OK && pCur->iPage > iCellDepth) { releasePageNotNull(pCur->pPage); pCur->iPage--; - while( pCur->iPage>iCellDepth ){ + 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 ); + 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 ){ + if (iCellIdx >= pPage->nCell) { pCur->skipNext = -1; - pCur->ix = pPage->nCell-1; - }else{ + pCur->ix = pPage->nCell - 1; + } else { pCur->skipNext = 1; } - }else{ + } else { rc = moveToRoot(pCur); - if( bPreserve ){ + if (bPreserve) { btreeReleaseAllCursorPages(pCur); pCur->eState = CURSOR_REQUIRESEEK; } - if( rc==SQLITE_EMPTY ) rc = SQLITE_OK; + if (rc == SQLITE_EMPTY) + rc = SQLITE_OK; } } return rc; @@ -76500,26 +75511,26 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ ** 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; +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 */ + 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 ); + 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 ){ + if (rc) { return rc; } #else - if( pBt->autoVacuum ){ + if (pBt->autoVacuum) { Pgno pgnoMove; /* Move a page here to make room for the root-page */ - MemPage *pPageMove; /* The page to move to. */ + 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 @@ -76533,7 +75544,7 @@ static int btreeCreateTable(Btree *p, Pgno *piTable, int createTabFlags){ ** created so far, so the new root-page is (meta[3]+1). */ sqlite3BtreeGetMeta(p, BTREE_LARGEST_ROOT_PAGE, &pgnoRoot); - if( pgnoRoot>btreePagecount(pBt) ){ + if (pgnoRoot > btreePagecount(pBt)) { return SQLITE_CORRUPT_BKPT; } pgnoRoot++; @@ -76541,22 +75552,21 @@ static int btreeCreateTable(Btree *p, Pgno *piTable, int createTabFlags){ /* 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) ){ + while (pgnoRoot == PTRMAP_PAGENO(pBt, pgnoRoot) || pgnoRoot == PENDING_BYTE_PAGE(pBt)) { pgnoRoot++; } - assert( pgnoRoot>=3 ); + 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 ){ + if (rc != SQLITE_OK) { return rc; } - if( pgnoMove!=pgnoRoot ){ + 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 @@ -76571,48 +75581,48 @@ static int btreeCreateTable(Btree *p, Pgno *piTable, int createTabFlags){ ** corresponding to page pgnoRoot. */ rc = saveAllCursors(pBt, 0, 0); releasePage(pPageMove); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } /* Move the page currently at pgnoRoot to pgnoMove. */ rc = btreeGetPage(pBt, pgnoRoot, &pRoot, 0); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } rc = ptrmapGet(pBt, pgnoRoot, &eType, &iPtrPage); - if( eType==PTRMAP_ROOTPAGE || eType==PTRMAP_FREEPAGE ){ + if (eType == PTRMAP_ROOTPAGE || eType == PTRMAP_FREEPAGE) { rc = SQLITE_CORRUPT_BKPT; } - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { releasePage(pRoot); return rc; } - assert( eType!=PTRMAP_ROOTPAGE ); - assert( eType!=PTRMAP_FREEPAGE ); + 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 ){ + if (rc != SQLITE_OK) { return rc; } rc = btreeGetPage(pBt, pgnoRoot, &pRoot, 0); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } rc = sqlite3PagerWrite(pRoot->pDbPage); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { releasePage(pRoot); return rc; } - }else{ + } 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 ){ + if (rc) { releasePage(pRoot); return rc; } @@ -76621,31 +75631,32 @@ static int btreeCreateTable(Btree *p, Pgno *piTable, int createTabFlags){ ** order either to increase the database filesize, or to decrement the ** freelist count. Hence, the sqlite3BtreeUpdateMeta() call cannot fail. */ - assert( sqlite3PagerIswriteable(pBt->pPage1->pDbPage) ); + assert(sqlite3PagerIswriteable(pBt->pPage1->pDbPage)); rc = sqlite3BtreeUpdateMeta(p, 4, pgnoRoot); - if( NEVER(rc) ){ + if (NEVER(rc)) { releasePage(pRoot); return rc; } - }else{ + } else { rc = allocateBtreePage(pBt, &pRoot, &pgnoRoot, 1, 0); - if( rc ) return rc; + if (rc) + return rc; } #endif - assert( sqlite3PagerIswriteable(pRoot->pDbPage) ); - if( createTabFlags & BTREE_INTKEY ){ + assert(sqlite3PagerIswriteable(pRoot->pDbPage)); + if (createTabFlags & BTREE_INTKEY) { ptfFlags = PTF_INTKEY | PTF_LEAFDATA | PTF_LEAF; - }else{ + } else { ptfFlags = PTF_ZERODATA | PTF_LEAF; } zeroPage(pRoot, ptfFlags); sqlite3PagerUnref(pRoot->pDbPage); - assert( (pBt->openFlags & BTREE_SINGLE)==0 || pgnoRoot==2 ); + assert((pBt->openFlags & BTREE_SINGLE) == 0 || pgnoRoot == 2); *piTable = pgnoRoot; return SQLITE_OK; } -SQLITE_PRIVATE int sqlite3BtreeCreateTable(Btree *p, Pgno *piTable, int flags){ +SQLITE_PRIVATE int sqlite3BtreeCreateTable(Btree* p, Pgno* piTable, int flags) { int rc; sqlite3BtreeEnter(p); rc = btreeCreateTable(p, piTable, flags); @@ -76657,53 +75668,55 @@ SQLITE_PRIVATE int sqlite3BtreeCreateTable(Btree *p, Pgno *piTable, int flags){ ** 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; +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; + unsigned char* pCell; int i; int hdr; CellInfo info; - assert( sqlite3_mutex_held(pBt->mutex) ); - if( pgno>btreePagecount(pBt) ){ + 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)) - ){ + 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++){ + for (i = 0; i < pPage->nCell; i++) { pCell = findCell(pPage, i); - if( !pPage->leaf ){ + if (!pPage->leaf) { rc = clearDatabasePage(pBt, get4byte(pCell), 1, pnChange); - if( rc ) goto cleardatabasepage_out; + 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 ); + 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 ){ + if (freePageFlag) { freePage(pPage, &rc); - }else if( (rc = sqlite3PagerWrite(pPage->pDbPage))==0 ){ + } else if ((rc = sqlite3PagerWrite(pPage->pDbPage)) == 0) { zeroPage(pPage, pPage->aData[hdr] | PTF_LEAF); } @@ -76724,19 +75737,19 @@ static int clearDatabasePage( ** 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){ +SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree* p, int iTable, i64* pnChange) { int rc; - BtShared *pBt = p->pBt; + BtShared* pBt = p->pBt; sqlite3BtreeEnter(p); - assert( p->inTrans==TRANS_WRITE ); + assert(p->inTrans == TRANS_WRITE); rc = saveAllCursors(pBt, (Pgno)iTable, 0); - if( SQLITE_OK==rc ){ + 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 ){ + if (p->hasIncrblobCur) { invalidateIncrblobCursors(p, (Pgno)iTable, 0, 1); } rc = clearDatabasePage(pBt, (Pgno)iTable, 0, pnChange); @@ -76750,7 +75763,7 @@ SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree *p, int iTable, i64 *pnChange){ ** ** This routine only work for pCur on an ephemeral table. */ -SQLITE_PRIVATE int sqlite3BtreeClearTableOfCursor(BtCursor *pCur){ +SQLITE_PRIVATE int sqlite3BtreeClearTableOfCursor(BtCursor* pCur) { return sqlite3BtreeClearTable(pCur->pBtree, pCur->pgnoRoot, 0); } @@ -76774,22 +75787,23 @@ SQLITE_PRIVATE int sqlite3BtreeClearTableOfCursor(BtCursor *pCur){ ** 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){ +static int btreeDropTable(Btree* p, Pgno iTable, int* piMoved) { int rc; - MemPage *pPage = 0; - BtShared *pBt = p->pBt; + MemPage* pPage = 0; + BtShared* pBt = p->pBt; - assert( sqlite3BtreeHoldsMutex(p) ); - assert( p->inTrans==TRANS_WRITE ); - assert( iTable>=2 ); - if( iTable>btreePagecount(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; + if (rc) + return rc; rc = btreeGetPage(pBt, (Pgno)iTable, &pPage, 0); - if( NEVER(rc) ){ + if (NEVER(rc)) { releasePage(pPage); return rc; } @@ -76800,40 +75814,40 @@ static int btreeDropTable(Btree *p, Pgno iTable, int *piMoved){ freePage(pPage, &rc); releasePage(pPage); #else - if( pBt->autoVacuum ){ + if (pBt->autoVacuum) { Pgno maxRootPgno; sqlite3BtreeGetMeta(p, BTREE_LARGEST_ROOT_PAGE, &maxRootPgno); - if( iTable==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 ){ + if (rc != SQLITE_OK) { return rc; } - }else{ + } 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; + MemPage* pMove; releasePage(pPage); rc = btreeGetPage(pBt, maxRootPgno, &pMove, 0); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } rc = relocatePage(pBt, pMove, PTRMAP_ROOTPAGE, 0, iTable, 0); releasePage(pMove); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } pMove = 0; rc = btreeGetPage(pBt, maxRootPgno, &pMove, 0); freePage(pMove, &rc); releasePage(pMove); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } *piMoved = maxRootPgno; @@ -76845,21 +75859,20 @@ static int btreeDropTable(Btree *p, Pgno iTable, int *piMoved){ ** PENDING_BYTE_PAGE. */ maxRootPgno--; - while( maxRootPgno==PENDING_BYTE_PAGE(pBt) - || PTRMAP_ISPAGE(pBt, maxRootPgno) ){ + while (maxRootPgno == PENDING_BYTE_PAGE(pBt) || PTRMAP_ISPAGE(pBt, maxRootPgno)) { maxRootPgno--; } - assert( maxRootPgno!=PENDING_BYTE_PAGE(pBt) ); + assert(maxRootPgno != PENDING_BYTE_PAGE(pBt)); rc = sqlite3BtreeUpdateMeta(p, 4, maxRootPgno); - }else{ + } else { freePage(pPage, &rc); releasePage(pPage); } #endif return rc; } -SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree *p, int iTable, int *piMoved){ +SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree* p, int iTable, int* piMoved) { int rc; sqlite3BtreeEnter(p); rc = btreeDropTable(p, iTable, piMoved); @@ -76867,7 +75880,6 @@ SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree *p, int iTable, int *piMoved){ return rc; } - /* ** This function may only be called if the b-tree connection already ** has a read or write transaction open on the database. @@ -76888,25 +75900,25 @@ SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree *p, int iTable, int *piMoved){ ** 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; +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 ); + 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 ){ + if (idx == BTREE_DATA_VERSION) { *pMeta = sqlite3PagerDataVersion(pBt->pPager) + p->iBDataVersion; - }else{ - *pMeta = get4byte(&pBt->pPage1->aData[36 + idx*4]); + } 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 ){ + if (idx == BTREE_LARGEST_ROOT_PAGE && *pMeta > 0) { pBt->btsFlags |= BTS_READ_ONLY; } #endif @@ -76918,22 +75930,22 @@ SQLITE_PRIVATE void sqlite3BtreeGetMeta(Btree *p, int idx, u32 *pMeta){ ** 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; +SQLITE_PRIVATE int sqlite3BtreeUpdateMeta(Btree* p, int idx, u32 iMeta) { + BtShared* pBt = p->pBt; + unsigned char* pP1; int rc; - assert( idx>=1 && idx<=15 ); + assert(idx >= 1 && idx <= 15); sqlite3BtreeEnter(p); - assert( p->inTrans==TRANS_WRITE ); - assert( pBt->pPage1!=0 ); + 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); + 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 ); + if (idx == BTREE_INCR_VACUUM) { + assert(pBt->autoVacuum || iMeta == 0); + assert(iMeta == 0 || iMeta == 1); pBt->incrVacuum = (u8)iMeta; } #endif @@ -76950,12 +75962,12 @@ SQLITE_PRIVATE int sqlite3BtreeUpdateMeta(Btree *p, int idx, u32 iMeta){ ** 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 */ +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 ){ + if (rc == SQLITE_EMPTY) { *pnEntry = 0; return SQLITE_OK; } @@ -76963,16 +75975,16 @@ SQLITE_PRIVATE int sqlite3BtreeCount(sqlite3 *db, BtCursor *pCur, i64 *pnEntry){ /* 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 */ + 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 ){ + if (pPage->leaf || !pPage->intKey) { nEntry += pPage->nCell; } @@ -76986,15 +75998,15 @@ SQLITE_PRIVATE int sqlite3BtreeCount(sqlite3 *db, BtCursor *pCur, i64 *pnEntry){ ** If all pages in the tree have been visited, return SQLITE_OK to the ** caller. */ - if( pPage->leaf ){ + if (pPage->leaf) { do { - if( pCur->iPage==0 ){ + 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 ); + } while (pCur->ix >= pCur->pPage->nCell); pCur->ix++; pPage = pCur->pPage; @@ -77004,9 +76016,9 @@ SQLITE_PRIVATE int sqlite3BtreeCount(sqlite3 *db, BtCursor *pCur, i64 *pnEntry){ ** 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{ + if (iIdx == pPage->nCell) { + rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset + 8])); + } else { rc = moveToChild(pCur, get4byte(findCell(pPage, iIdx))); } } @@ -77019,7 +76031,7 @@ SQLITE_PRIVATE int sqlite3BtreeCount(sqlite3 *db, BtCursor *pCur, i64 *pnEntry){ ** Return the pager associated with a BTree. This routine is used for ** testing and debugging only. */ -SQLITE_PRIVATE Pager *sqlite3BtreePager(Btree *p){ +SQLITE_PRIVATE Pager* sqlite3BtreePager(Btree* p) { return p->pBt->pPager; } @@ -77027,25 +76039,22 @@ SQLITE_PRIVATE Pager *sqlite3BtreePager(Btree *p){ /* ** Append a message to the error message string. */ -static void checkAppendMsg( - IntegrityCk *pCheck, - const char *zFormat, - ... -){ +static void checkAppendMsg(IntegrityCk* pCheck, const char* zFormat, ...) { va_list ap; - if( !pCheck->mxErr ) return; + if (!pCheck->mxErr) + return; pCheck->mxErr--; pCheck->nErr++; va_start(ap, zFormat); - if( pCheck->errMsg.nChar ){ + if (pCheck->errMsg.nChar) { sqlite3_str_append(&pCheck->errMsg, "\n", 1); } - if( pCheck->zPfx ){ + 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 ){ + if (pCheck->errMsg.accError == SQLITE_NOMEM) { pCheck->bOomFault = 1; } } @@ -77057,20 +76066,19 @@ static void checkAppendMsg( ** 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))); +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)); +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. @@ -77079,16 +76087,17 @@ static void setPageReferenced(IntegrityCk *pCheck, Pgno iPg){ ** ** Also check that the page number is in bounds. */ -static int checkRef(IntegrityCk *pCheck, Pgno iPage){ - if( iPage>pCheck->nPage || iPage==0 ){ +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) ){ + if (getPageReferenced(pCheck, iPage)) { checkAppendMsg(pCheck, "2nd reference to page %d", iPage); return 1; } - if( AtomicLoad(&pCheck->db->u1.isInterrupted) ) return 1; + if (AtomicLoad(&pCheck->db->u1.isInterrupted)) + return 1; setPageReferenced(pCheck, iPage); return 0; } @@ -77099,27 +76108,25 @@ static int checkRef(IntegrityCk *pCheck, Pgno iPage){ ** 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 */ -){ +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; + 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); + 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 @@ -77128,41 +76135,40 @@ static void checkPtrmap( ** 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 */ -){ +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; + while (iPage != 0 && pCheck->mxErr) { + DbPage* pOvflPage; + unsigned char* pOvflData; + if (checkRef(pCheck, iPage)) + break; N--; - if( sqlite3PagerGet(pCheck->pPager, (Pgno)iPage, &pOvflPage, 0) ){ + if (sqlite3PagerGet(pCheck->pPager, (Pgno)iPage, &pOvflPage, 0)) { checkAppendMsg(pCheck, "failed to get page %d", iPage); break; } - pOvflData = (unsigned char *)sqlite3PagerGetData(pOvflPage); - if( isFreeList ){ + pOvflData = (unsigned char*)sqlite3PagerGetData(pOvflPage); + if (isFreeList) { u32 n = (u32)get4byte(&pOvflData[4]); #ifndef SQLITE_OMIT_AUTOVACUUM - if( pCheck->pBt->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); + 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]); + } else { + for (i = 0; i < (int)n; i++) { + Pgno iFreePage = get4byte(&pOvflData[8 + i * 4]); #ifndef SQLITE_OMIT_AUTOVACUUM - if( pCheck->pBt->autoVacuum ){ + if (pCheck->pBt->autoVacuum) { checkPtrmap(pCheck, iFreePage, PTRMAP_FREEPAGE, 0); } #endif @@ -77172,12 +76178,12 @@ static void checkList( } } #ifndef SQLITE_OMIT_AUTOVACUUM - else{ + 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 ){ + if (pCheck->pBt->autoVacuum && N > 0) { i = get4byte(pOvflData); checkPtrmap(pCheck, i, PTRMAP_OVERFLOW2, iPage); } @@ -77186,11 +76192,8 @@ static void checkList( 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); + 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 */ @@ -77217,27 +76220,30 @@ static void checkList( ** 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){ +static void btreeHeapInsert(u32* aHeap, u32 x) { u32 j, i = ++aHeap[0]; aHeap[i] = x; - while( (j = i/2)>0 && aHeap[j]>aHeap[i] ){ + 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){ +static int btreeHeapPull(u32* aHeap, u32* pOut) { u32 j, i, x; - if( (x = aHeap[0])==0 ) return 0; + 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] aHeap[j + 1]) + j++; + if (aHeap[i] < aHeap[j]) + break; x = aHeap[i]; aHeap[i] = aHeap[j]; aHeap[j] = x; @@ -77261,13 +76267,12 @@ static int btreeHeapPull(u32 *aHeap, u32 *pOut){ ** 4. Recursively call checkTreePage on all children. ** 5. Verify that the depth of all children is the same. */ -static int checkTreePage( - IntegrityCk *pCheck, /* Context for the sanity check */ - Pgno iPage, /* Page number of the page to check */ - i64 *piMinKey, /* Write minimum integer primary key here */ - i64 maxKey /* Error if integer primary key greater than this */ -){ - MemPage *pPage = 0; /* The page being analyzed */ +static int checkTreePage(IntegrityCk* pCheck, /* Context for the sanity check */ + Pgno iPage, /* Page number of the page to check */ + i64* piMinKey, /* Write minimum integer primary key here */ + i64 maxKey /* Error if integer primary key greater than this */ +) { + MemPage* pPage = 0; /* The page being analyzed */ int i; /* Loop counter */ int rc; /* Result code from subroutine call */ int depth = -1, d2; /* Depth of a subtree */ @@ -77279,31 +76284,32 @@ static int checkTreePage( int doCoverageCheck = 1; /* True if cell coverage checking should be done */ int keyCanBeEqual = 1; /* True if IPK can be equal to maxKey ** False if IPK must be strictly less than maxKey */ - u8 *data; /* Page content */ - u8 *pCell; /* Cell content */ - u8 *pCellIdx; /* Next element of the cell pointer array */ - BtShared *pBt; /* The BtShared object that owns pPage */ + u8* data; /* Page content */ + u8* pCell; /* Cell content */ + u8* pCellIdx; /* Next element of the cell pointer array */ + BtShared* pBt; /* The BtShared object that owns pPage */ u32 pc; /* Address of a cell */ u32 usableSize; /* Usable size of the page */ u32 contentOffset; /* Offset to the start of the cell content area */ - u32 *heap = 0; /* Min-heap used for checking cell coverage */ + u32* heap = 0; /* Min-heap used for checking cell coverage */ u32 x, prev = 0; /* Next and previous entry on the min-heap */ - const char *saved_zPfx = pCheck->zPfx; + const char* saved_zPfx = pCheck->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; + 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); + if ((rc = btreeGetPage(pBt, iPage, &pPage, 0)) != 0) { + checkAppendMsg(pCheck, "unable to get the page. error code=%d", rc); goto end_of_check; } @@ -77311,14 +76317,13 @@ static int checkTreePage( ** 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); + 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 ); + if ((rc = btreeComputeFreeSpace(pPage)) != 0) { + assert(rc == SQLITE_CORRUPT); checkAppendMsg(pCheck, "free space corruption", rc); goto end_of_check; } @@ -77327,32 +76332,32 @@ static int checkTreePage( /* Set up for cell analysis */ pCheck->zPfx = "On tree page %u cell %d: "; - contentOffset = get2byteNotZero(&data[hdr+5]); - assert( contentOffset<=usableSize ); /* Enforced by btreeInitPage() */ + 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 ); + 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)]; + cellStart = hdr + 12 - 4 * pPage->leaf; + assert(pPage->aCellIdx == &data[cellStart]); + pCellIdx = &data[cellStart + 2 * (nCell - 1)]; - if( !pPage->leaf ){ + if (!pPage->leaf) { /* Analyze the right-child page of internal pages */ - pgno = get4byte(&data[hdr+8]); + pgno = get4byte(&data[hdr + 8]); #ifndef SQLITE_OMIT_AUTOVACUUM - if( pBt->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{ + } 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; @@ -77361,88 +76366,87 @@ static int checkTreePage( /* 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--){ + for (i = nCell - 1; i >= 0 && pCheck->mxErr; i--) { CellInfo info; /* Check cell size */ pCheck->v2 = i; - assert( pCellIdx==&data[cellStart + i*2] ); + 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); + if (pc < contentOffset || pc > usableSize - 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 ){ + 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) ){ + 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 */ + 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); + 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 ){ + if (pBt->autoVacuum) { checkPtrmap(pCheck, pgnoOvfl, PTRMAP_OVERFLOW1, iPage); } #endif checkList(pCheck, 0, pgnoOvfl, nPage); } - if( !pPage->leaf ){ + if (!pPage->leaf) { /* Check sanity of left child page for internal pages */ pgno = get4byte(pCell); #ifndef SQLITE_OMIT_AUTOVACUUM - if( pBt->autoVacuum ){ + if (pBt->autoVacuum) { checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage); } #endif d2 = checkTreePage(pCheck, pgno, &maxKey, maxKey); keyCanBeEqual = 0; - if( d2!=depth ){ + if (d2 != depth) { checkAppendMsg(pCheck, "Child page depth differs"); depth = d2; } - }else{ + } else { /* Populate the coverage-checking heap for leaf pages */ - btreeHeapInsert(heap, (pc<<16)|(pc+info.nSize-1)); + 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 ){ + 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 ){ + if (!pPage->leaf) { heap = pCheck->heap; heap[0] = 0; - for(i=nCell-1; i>=0; i--){ + for (i = nCell - 1; i >= 0; i--) { u32 size; - pc = get2byteAligned(&data[cellStart+i*2]); + pc = get2byteAligned(&data[cellStart + i * 2]); size = pPage->xCellSize(pPage, &data[pc]); - btreeHeapInsert(heap, (pc<<16)|(pc+size-1)); + btreeHeapInsert(heap, (pc << 16) | (pc + size - 1)); } } /* Add the freeblocks to the min-heap @@ -77451,13 +76455,13 @@ static int checkTreePage( ** 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 ){ + 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)); + 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 @@ -77465,8 +76469,8 @@ static int checkTreePage( 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() */ + 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 @@ -77483,37 +76487,35 @@ static int checkTreePage( ** 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); + 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; + } else { + nFrag += (x >> 16) - (prev & 0xffff) - 1; prev = x; } } - nFrag += usableSize - (prev&0xffff) - 1; + 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); + 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; + if (!doCoverageCheck) + pPage->isInit = savedIsInit; releasePage(pPage); pCheck->zPfx = saved_zPfx; pCheck->v1 = saved_v1; pCheck->v2 = saved_v2; - return depth+1; + return depth + 1; } #endif /* SQLITE_OMIT_INTEGRITY_CHECK */ @@ -77540,35 +76542,35 @@ static int checkTreePage( ** 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 */ -){ +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; + 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 ); + 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 ); + if (aRoot[0] == 0) { + assert(nRoot > 1); bPartial = 1; - if( aRoot[1]!=1 ) bCkFreelist = 0; + 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 ); + 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; @@ -77583,62 +76585,60 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck( sCheck.heap = 0; sqlite3StrAccumInit(&sCheck.errMsg, 0, zErr, sizeof(zErr), SQLITE_MAX_LENGTH); sCheck.errMsg.printfFlags = SQLITE_PRINTF_INTERNAL; - if( sCheck.nPage==0 ){ + if (sCheck.nPage == 0) { goto integrity_ck_cleanup; } - sCheck.aPgRef = sqlite3MallocZero((sCheck.nPage / 8)+ 1); - if( !sCheck.aPgRef ){ + 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.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); + if (i <= sCheck.nPage) + setPageReferenced(&sCheck, i); /* Check the integrity of the freelist - */ - if( bCkFreelist ){ + */ + if (bCkFreelist) { sCheck.zPfx = "Main freelist: "; - checkList(&sCheck, 1, get4byte(&pBt->pPage1->aData[32]), - get4byte(&pBt->pPage1->aData[36])); + 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 ){ + 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 - ); + 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" - ); + } 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 ); + testcase(pBt->db->flags & SQLITE_CellSizeCk); pBt->db->flags &= ~(u64)SQLITE_CellSizeCk; - for(i=0; (int)iautoVacuum && aRoot[i]>1 && !bPartial ){ + if (pBt->autoVacuum && aRoot[i] > 1 && !bPartial) { checkPtrmap(&sCheck, aRoot[i], PTRMAP_ROOTPAGE, 0); } #endif @@ -77647,23 +76647,21 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck( pBt->db->flags = savedDbFlags; /* Make sure every page in the file is referenced - */ - if( !bPartial ){ - for(i=1; i<=sCheck.nPage && sCheck.mxErr; i++){ + */ + if (!bPartial) { + for (i = 1; i <= sCheck.nPage && sCheck.mxErr; i++) { #ifdef SQLITE_OMIT_AUTOVACUUM - if( getPageReferenced(&sCheck, i)==0 ){ + 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) ){ + 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) ){ + if (getPageReferenced(&sCheck, i) != 0 && (PTRMAP_PAGENO(pBt, i) == i && pBt->autoVacuum)) { checkAppendMsg(&sCheck, "Pointer map page %d is referenced", i); } #endif @@ -77671,18 +76669,19 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck( } /* Clean up and report errors. - */ + */ integrity_ck_cleanup: sqlite3PageFree(sCheck.heap); sqlite3_free(sCheck.aPgRef); - if( sCheck.bOomFault ){ + if (sCheck.bOomFault) { sqlite3_str_reset(&sCheck.errMsg); sCheck.nErr++; } *pnErr = sCheck.nErr; - if( sCheck.nErr==0 ) sqlite3_str_reset(&sCheck.errMsg); + if (sCheck.nErr == 0) + sqlite3_str_reset(&sCheck.errMsg); /* Make sure this analysis did not leave any unref() pages. */ - assert( nRef==sqlite3PagerRefcount(pBt->pPager) ); + assert(nRef == sqlite3PagerRefcount(pBt->pPager)); sqlite3BtreeLeave(p); return sqlite3StrAccumFinish(&sCheck.errMsg); } @@ -77695,8 +76694,8 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck( ** 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 ); +SQLITE_PRIVATE const char* sqlite3BtreeGetFilename(Btree* p) { + assert(p->pBt->pPager != 0); return sqlite3PagerFilename(p->pBt->pPager, 1); } @@ -77708,8 +76707,8 @@ SQLITE_PRIVATE const char *sqlite3BtreeGetFilename(Btree *p){ ** 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 ); +SQLITE_PRIVATE const char* sqlite3BtreeGetJournalname(Btree* p) { + assert(p->pBt->pPager != 0); return sqlite3PagerJournalname(p->pBt->pPager); } @@ -77717,8 +76716,8 @@ SQLITE_PRIVATE const char *sqlite3BtreeGetJournalname(Btree *p){ ** 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) ); +SQLITE_PRIVATE int sqlite3BtreeTxnState(Btree* p) { + assert(p == 0 || sqlite3_mutex_held(p->db->mutex)); return p ? p->inTrans : 0; } @@ -77731,14 +76730,14 @@ SQLITE_PRIVATE int sqlite3BtreeTxnState(Btree *p){ ** ** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART. */ -SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree *p, int eMode, int *pnLog, int *pnCkpt){ +SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree* p, int eMode, int* pnLog, int* pnCkpt) { int rc = SQLITE_OK; - if( p ){ - BtShared *pBt = p->pBt; + if (p) { + BtShared* pBt = p->pBt; sqlite3BtreeEnter(p); - if( pBt->inTransaction!=TRANS_NONE ){ + if (pBt->inTransaction != TRANS_NONE) { rc = SQLITE_LOCKED; - }else{ + } else { rc = sqlite3PagerCheckpoint(pBt->pPager, p->db, eMode, pnLog, pnCkpt); } sqlite3BtreeLeave(p); @@ -77750,10 +76749,10 @@ SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree *p, int eMode, int *pnLog, int * /* ** 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; +SQLITE_PRIVATE int sqlite3BtreeIsInBackup(Btree* p) { + assert(p); + assert(sqlite3_mutex_held(p->db->mutex)); + return p->nBackup != 0; } /* @@ -77776,10 +76775,10 @@ SQLITE_PRIVATE int sqlite3BtreeIsInBackup(Btree *p){ ** 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; +SQLITE_PRIVATE void* sqlite3BtreeSchema(Btree* p, int nBytes, void (*xFree)(void*)) { + BtShared* pBt = p->pBt; sqlite3BtreeEnter(p); - if( !pBt->pSchema && nBytes ){ + if (!pBt->pSchema && nBytes) { pBt->pSchema = sqlite3DbMallocZero(0, nBytes); pBt->xFreeSchema = xFree; } @@ -77792,34 +76791,33 @@ SQLITE_PRIVATE void *sqlite3BtreeSchema(Btree *p, int nBytes, void(*xFree)(void ** btree as the argument handle holds an exclusive lock on the ** sqlite_schema table. Otherwise SQLITE_OK. */ -SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree *p){ +SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree* p) { int rc; - assert( sqlite3_mutex_held(p->db->mutex) ); + assert(sqlite3_mutex_held(p->db->mutex)); sqlite3BtreeEnter(p); rc = querySharedCacheTableLock(p, SCHEMA_ROOT, READ_LOCK); - assert( rc==SQLITE_OK || rc==SQLITE_LOCKED_SHAREDCACHE ); + 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){ +SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree* p, int iTab, u8 isWriteLock) { int rc = SQLITE_OK; - assert( p->inTrans!=TRANS_NONE ); - if( p->sharable ){ + assert(p->inTrans != TRANS_NONE); + if (p->sharable) { u8 lockType = READ_LOCK + isWriteLock; - assert( READ_LOCK+1==WRITE_LOCK ); - assert( isWriteLock==0 || isWriteLock==1 ); + assert(READ_LOCK + 1 == WRITE_LOCK); + assert(isWriteLock == 0 || isWriteLock == 1); sqlite3BtreeEnter(p); rc = querySharedCacheTableLock(p, iTab, lockType); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = setSharedCacheTableLock(p, iTab, lockType); } sqlite3BtreeLeave(p); @@ -77839,18 +76837,18 @@ SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree *p, int iTab, u8 isWriteLock){ ** 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){ +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 ); + assert(cursorOwnsBtShared(pCsr)); + assert(sqlite3_mutex_held(pCsr->pBtree->db->mutex)); + assert(pCsr->curFlags & BTCF_Incrblob); rc = restoreCursorPosition(pCsr); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } - assert( pCsr->eState!=CURSOR_REQUIRESEEK ); - if( pCsr->eState!=CURSOR_VALID ){ + assert(pCsr->eState != CURSOR_REQUIRESEEK); + if (pCsr->eState != CURSOR_VALID) { return SQLITE_ABORT; } @@ -77863,7 +76861,7 @@ SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor *pCsr, u32 offset, u32 amt, void ** saveAllCursors can only return SQLITE_OK. */ VVA_ONLY(rc =) saveAllCursors(pCsr->pBt, pCsr->pgnoRoot, pCsr); - assert( rc==SQLITE_OK ); + assert(rc == SQLITE_OK); /* Check some assumptions: ** (a) the cursor is open for writing, @@ -77872,22 +76870,21 @@ SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor *pCsr, u32 offset, u32 amt, void ** (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 ){ + 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 ); + 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); + return accessPayload(pCsr, offset, amt, (unsigned char*)z, 1); } /* ** Mark this cursor as an incremental blob cursor. */ -SQLITE_PRIVATE void sqlite3BtreeIncrblobCursor(BtCursor *pCur){ +SQLITE_PRIVATE void sqlite3BtreeIncrblobCursor(BtCursor* pCur) { pCur->curFlags |= BTCF_Incrblob; pCur->pBtree->hasIncrblobCur = 1; } @@ -77898,26 +76895,27 @@ SQLITE_PRIVATE void sqlite3BtreeIncrblobCursor(BtCursor *pCur){ ** "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 */ +SQLITE_PRIVATE int sqlite3BtreeSetVersion(Btree* pBtree, int iVersion) { + BtShared* pBt = pBtree->pBt; + int rc; /* Return code */ - assert( iVersion==1 || iVersion==2 ); + 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; + 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 ){ + 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 ){ + if (rc == SQLITE_OK) { rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { aData[18] = (u8)iVersion; aData[19] = (u8)iVersion; } @@ -77933,27 +76931,29 @@ SQLITE_PRIVATE int sqlite3BtreeSetVersion(Btree *pBtree, int iVersion){ ** 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; +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; +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)); } +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){ +SQLITE_PRIVATE int sqlite3BtreeSharable(Btree* p) { return p->sharable; } @@ -77962,8 +76962,8 @@ SQLITE_PRIVATE int sqlite3BtreeSharable(Btree *p){ ** 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 ); +SQLITE_PRIVATE int sqlite3BtreeConnectionCount(Btree* p) { + testcase(p->sharable); return p->pBt->nRef; } #endif @@ -77991,25 +76991,25 @@ SQLITE_PRIVATE int sqlite3BtreeConnectionCount(Btree *p){ ** 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 */ + 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 */ + 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 */ + 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 */ + 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 */ + int isAttached; /* True once backup has been registered with pager */ + sqlite3_backup* pNext; /* Next backup associated with source pager */ }; /* @@ -78051,25 +77051,25 @@ struct sqlite3_backup { ** 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){ +static Btree* findBtree(sqlite3* pErrorDb, sqlite3* pDb, const char* zDb) { int i = sqlite3FindDbName(pDb, zDb); - if( i==1 ){ + if (i == 1) { Parse sParse; int rc = 0; - sqlite3ParseObjectInit(&sParse,pDb); - if( sqlite3OpenTempDatabase(&sParse) ){ + sqlite3ParseObjectInit(&sParse, pDb); + if (sqlite3OpenTempDatabase(&sParse)) { sqlite3ErrorWithMsg(pErrorDb, sParse.rc, "%s", sParse.zErrMsg); rc = SQLITE_ERROR; } sqlite3DbFree(pErrorDb, sParse.zErrMsg); sqlite3ParseObjectReset(&sParse); - if( rc ){ + if (rc) { return 0; } } - if( i<0 ){ + if (i < 0) { sqlite3ErrorWithMsg(pErrorDb, SQLITE_ERROR, "unknown database %s", zDb); return 0; } @@ -78081,9 +77081,9 @@ static Btree *findBtree(sqlite3 *pErrorDb, sqlite3 *pDb, const char *zDb){ ** Attempt to set the page size of the destination to match the page size ** of the source. */ -static int setDestPgsz(sqlite3_backup *p){ +static int setDestPgsz(sqlite3_backup* p) { int rc; - rc = sqlite3BtreeSetPageSize(p->pDest,sqlite3BtreeGetPageSize(p->pSrc),0,0); + rc = sqlite3BtreeSetPageSize(p->pDest, sqlite3BtreeGetPageSize(p->pSrc), 0, 0); return rc; } @@ -78093,8 +77093,8 @@ static int setDestPgsz(sqlite3_backup *p){ ** 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 ){ +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; } @@ -78109,16 +77109,15 @@ static int checkReadTransaction(sqlite3 *db, Btree *p){ ** 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 */ +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) ){ + if (!sqlite3SafetyCheckOk(pSrcDb) || !sqlite3SafetyCheckOk(pDestDb)) { (void)SQLITE_MISUSE_BKPT; return 0; } @@ -78135,24 +77134,22 @@ SQLITE_API sqlite3_backup *sqlite3_backup_init( sqlite3_mutex_enter(pSrcDb->mutex); sqlite3_mutex_enter(pDestDb->mutex); - if( pSrcDb==pDestDb ){ - sqlite3ErrorWithMsg( - pDestDb, SQLITE_ERROR, "source and destination must be distinct" - ); + if (pSrcDb == pDestDb) { + sqlite3ErrorWithMsg(pDestDb, SQLITE_ERROR, "source and destination must be distinct"); p = 0; - }else { + } 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 ){ + p = (sqlite3_backup*)sqlite3MallocZero(sizeof(sqlite3_backup)); + if (!p) { sqlite3Error(pDestDb, SQLITE_NOMEM_BKPT); } } /* If the allocation succeeded, populate the new object. */ - if( p ){ + if (p) { p->pSrc = findBtree(pDestDb, pSrcDb, zSrcDb); p->pDest = findBtree(pDestDb, pDestDb, zDestDb); p->pDestDb = pDestDb; @@ -78160,9 +77157,7 @@ SQLITE_API sqlite3_backup *sqlite3_backup_init( p->iNext = 1; p->isAttached = 0; - if( 0==p->pSrc || 0==p->pDest - || checkReadTransaction(pDestDb, p->pDest)!=SQLITE_OK - ){ + 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 @@ -78172,7 +77167,7 @@ SQLITE_API sqlite3_backup *sqlite3_backup_init( p = 0; } } - if( p ){ + if (p) { p->pSrc->nBackup++; } @@ -78186,8 +77181,8 @@ SQLITE_API sqlite3_backup *sqlite3_backup_init( ** 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)); +static int isFatalError(int rc) { + return (rc != SQLITE_OK && rc != SQLITE_BUSY && ALWAYS(rc != SQLITE_LOCKED)); } /* @@ -78195,30 +77190,29 @@ static int isFatalError(int rc){ ** 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); +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; + const i64 iEnd = (i64)iSrcPg * (i64)nSrcPgsz; 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 ); + 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) ){ + if (nSrcPgsz != nDestPgsz && sqlite3PagerIsMemdb(pDestPager)) { rc = SQLITE_READONLY; } @@ -78226,16 +77220,15 @@ static int backupOnePage( ** 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]; + for (iOff = iEnd - (i64)nSrcPgsz; rc == SQLITE_OK && iOff < iEnd; iOff += nDestPgsz) { + DbPage* pDestPg = 0; + Pgno iDest = (Pgno)(iOff / nDestPgsz) + 1; + if (iDest == PENDING_BYTE_PAGE(p->pDest->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 @@ -78245,8 +77238,8 @@ static int backupOnePage( ** "MUST BE FIRST" for this purpose. */ memcpy(zOut, zIn, nCopy); - ((u8 *)sqlite3PagerGetExtra(pDestPg))[0] = 0; - if( iOff==0 && bUpdate==0 ){ + ((u8*)sqlite3PagerGetExtra(pDestPg))[0] = 0; + if (iOff == 0 && bUpdate == 0) { sqlite3Put4byte(&zOut[28], sqlite3BtreeLastPage(p->pSrc)); } } @@ -78264,10 +77257,10 @@ static int backupOnePage( ** Return SQLITE_OK if everything is successful, or an SQLite error ** code if an error occurs. */ -static int backupTruncateFile(sqlite3_file *pFile, i64 iSize){ +static int backupTruncateFile(sqlite3_file* pFile, i64 iSize) { i64 iCurrent; int rc = sqlite3OsFileSize(pFile, &iCurrent); - if( rc==SQLITE_OK && iCurrent>iSize ){ + if (rc == SQLITE_OK && iCurrent > iSize) { rc = sqlite3OsTruncate(pFile, iSize); } return rc; @@ -78277,9 +77270,9 @@ static int backupTruncateFile(sqlite3_file *pFile, i64 iSize){ ** 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) ); +static void attachBackupObject(sqlite3_backup* p) { + sqlite3_backup** pp; + assert(sqlite3BtreeHoldsMutex(p->pSrc)); pp = sqlite3PagerBackupPtr(sqlite3BtreePager(p->pSrc)); p->pNext = *pp; *pp = p; @@ -78289,35 +77282,36 @@ static void attachBackupObject(sqlite3_backup *p){ /* ** Copy nPage pages from the source b-tree to the destination. */ -SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ +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 */ + 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; + if (p == 0) + return SQLITE_MISUSE_BKPT; #endif sqlite3_mutex_enter(p->pSrcDb->mutex); sqlite3BtreeEnter(p->pSrc); - if( p->pDestDb ){ + 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 (!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 ){ + if (p->pDestDb && p->pSrc->pBt->inTransaction == TRANS_WRITE) { rc = SQLITE_BUSY; - }else{ + } else { rc = SQLITE_OK; } @@ -78325,7 +77319,7 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ ** 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) ){ + if (rc == SQLITE_OK && SQLITE_TXN_NONE == sqlite3BtreeTxnState(p->pSrc)) { rc = sqlite3BtreeBeginTrans(p->pSrc, 0, 0); bCloseTrans = 1; } @@ -78336,15 +77330,12 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ ** 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 ){ + 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)) - ){ + if (SQLITE_OK == rc && p->bDestLocked == 0 && SQLITE_OK == (rc = sqlite3BtreeBeginTrans(p->pDest, 2, (int*)&p->iDestSchema))) { p->bDestLocked = 1; } @@ -78353,7 +77344,7 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ pgszSrc = sqlite3BtreeGetPageSize(p->pSrc); pgszDest = sqlite3BtreeGetPageSize(p->pDest); destMode = sqlite3PagerGetJournalMode(sqlite3BtreePager(p->pDest)); - if( SQLITE_OK==rc && destMode==PAGER_JOURNALMODE_WAL && pgszSrc!=pgszDest ){ + if (SQLITE_OK == rc && destMode == PAGER_JOURNALMODE_WAL && pgszSrc != pgszDest) { rc = SQLITE_READONLY; } @@ -78361,25 +77352,25 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ ** 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 ){ + assert(nSrcPage >= 0); + for (ii = 0; (nPage < 0 || ii < nPage) && p->iNext <= (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 ){ + if (rc == SQLITE_OK) { p->nPagecount = nSrcPage; - p->nRemaining = nSrcPage+1-p->iNext; - if( p->iNext>(Pgno)nSrcPage ){ + p->nRemaining = nSrcPage + 1 - p->iNext; + if (p->iNext > (Pgno)nSrcPage) { rc = SQLITE_DONE; - }else if( !p->isAttached ){ + } else if (!p->isAttached) { attachBackupObject(p); } } @@ -78389,23 +77380,23 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ ** the case where the source and destination databases have the ** same schema version. */ - if( rc==SQLITE_DONE ){ - if( nSrcPage==0 ){ + 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 || rc == SQLITE_DONE) { + rc = sqlite3BtreeUpdateMeta(p->pDest, 1, p->iDestSchema + 1); } - if( rc==SQLITE_OK ){ - if( p->pDestDb ){ + if (rc == SQLITE_OK) { + if (p->pDestDb) { sqlite3ResetAllSchemasOfConnection(p->pDestDb); } - if( destMode==PAGER_JOURNALMODE_WAL ){ + if (destMode == PAGER_JOURNALMODE_WAL) { rc = sqlite3BtreeSetVersion(p->pDest, 2); } } - if( rc==SQLITE_OK ){ + 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 @@ -78419,20 +77410,20 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ ** journalled by PagerCommitPhaseOne() before they are destroyed ** by the file truncation. */ - assert( pgszSrc==sqlite3BtreeGetPageSize(p->pSrc) ); - assert( pgszDest==sqlite3BtreeGetPageSize(p->pDest) ); - if( pgszSrcpDest->pBt) ){ + assert(pgszSrc == sqlite3BtreeGetPageSize(p->pSrc)); + assert(pgszDest == sqlite3BtreeGetPageSize(p->pDest)); + if (pgszSrc < pgszDest) { + int ratio = pgszDest / pgszSrc; + nDestTruncate = (nSrcPage + ratio - 1) / ratio; + if (nDestTruncate == (int)PENDING_BYTE_PAGE(p->pDest->pBt)) { nDestTruncate--; } - }else{ - nDestTruncate = nSrcPage * (pgszSrc/pgszDest); + } else { + nDestTruncate = nSrcPage * (pgszSrc / pgszDest); } - assert( nDestTruncate>0 ); + assert(nDestTruncate > 0); - if( pgszSrc= iSize || ( - nDestTruncate==(int)(PENDING_BYTE_PAGE(p->pDest->pBt)-1) - && iSize>=PENDING_BYTE && iSize<=PENDING_BYTE+pgszDest - )); + assert(pFile); + assert( + nDestTruncate == 0 || (i64)nDestTruncate * (i64)pgszDest >= 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 @@ -78463,53 +77452,47 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ ** 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; + 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 ){ + if (rc == SQLITE_OK) { rc = sqlite3PagerWrite(pPg); sqlite3PagerUnref(pPg); } } } - if( rc==SQLITE_OK ){ + 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)) - ){ + if (SQLITE_OK == rc && SQLITE_OK == (rc = sqlite3BtreeCommitPhaseTwo(p->pDest, 0))) { rc = SQLITE_DONE; } } @@ -78520,19 +77503,19 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ ** 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 (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 ){ + if (rc == SQLITE_IOERR_NOMEM) { rc = SQLITE_NOMEM_BKPT; } p->rc = rc; } - if( p->pDestDb ){ + if (p->pDestDb) { sqlite3_mutex_leave(p->pDestDb->mutex); } sqlite3BtreeLeave(p->pSrc); @@ -78543,30 +77526,31 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ /* ** 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 */ +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; + if (p == 0) + return SQLITE_OK; pSrcDb = p->pSrcDb; sqlite3_mutex_enter(pSrcDb->mutex); sqlite3BtreeEnter(p->pSrc); - if( p->pDestDb ){ + if (p->pDestDb) { sqlite3_mutex_enter(p->pDestDb->mutex); } /* Detach this backup from the source pager. */ - if( p->pDestDb ){ + if (p->pDestDb) { p->pSrc->nBackup--; } - if( p->isAttached ){ + if (p->isAttached) { pp = sqlite3PagerBackupPtr(sqlite3BtreePager(p->pSrc)); - assert( pp!=0 ); - while( *pp!=p ){ + assert(pp != 0); + while (*pp != p) { pp = &(*pp)->pNext; - assert( pp!=0 ); + assert(pp != 0); } *pp = p->pNext; } @@ -78575,15 +77559,15 @@ SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p){ 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 ){ + 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 ){ + 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(). */ @@ -78597,9 +77581,9 @@ SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p){ ** 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){ +SQLITE_API int sqlite3_backup_remaining(sqlite3_backup* p) { #ifdef SQLITE_ENABLE_API_ARMOR - if( p==0 ){ + if (p == 0) { (void)SQLITE_MISUSE_BKPT; return 0; } @@ -78611,9 +77595,9 @@ SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p){ ** 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){ +SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup* p) { #ifdef SQLITE_ENABLE_API_ARMOR - if( p==0 ){ + if (p == 0) { (void)SQLITE_MISUSE_BKPT; return 0; } @@ -78633,33 +77617,30 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p){ ** 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 ){ +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) && iPage < p->iNext) { /* 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 ); + 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 ){ + assert(rc != SQLITE_BUSY && rc != SQLITE_LOCKED); + if (rc != SQLITE_OK) { p->rc = rc; } } - }while( (p = p->pNext)!=0 ); + } while ((p = p->pNext) != 0); } -SQLITE_PRIVATE void sqlite3BackupUpdate(sqlite3_backup *pBackup, Pgno iPage, const u8 *aData){ - if( pBackup ) backupUpdate(pBackup, iPage, aData); +SQLITE_PRIVATE void sqlite3BackupUpdate(sqlite3_backup* pBackup, Pgno iPage, const u8* aData) { + if (pBackup) + backupUpdate(pBackup, iPage, aData); } /* @@ -78673,10 +77654,10 @@ SQLITE_PRIVATE void sqlite3BackupUpdate(sqlite3_backup *pBackup, Pgno iPage, con ** 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) ); +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; } } @@ -78690,20 +77671,22 @@ SQLITE_PRIVATE void sqlite3BackupRestart(sqlite3_backup *pBackup){ ** 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){ +SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree* pTo, Btree* pFrom) { int rc; - sqlite3_file *pFd; /* File descriptor for database pTo */ + sqlite3_file* pFd; /* File descriptor for database pTo */ sqlite3_backup b; sqlite3BtreeEnter(pTo); sqlite3BtreeEnter(pFrom); - assert( sqlite3BtreeTxnState(pTo)==SQLITE_TXN_WRITE ); + assert(sqlite3BtreeTxnState(pTo) == SQLITE_TXN_WRITE); pFd = sqlite3PagerFile(sqlite3BtreePager(pTo)); - if( pFd->pMethods ){ - i64 nByte = sqlite3BtreeGetPageSize(pFrom)*(i64)sqlite3BtreeLastPage(pFrom); + 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; + if (rc == SQLITE_NOTFOUND) + rc = SQLITE_OK; + if (rc) + goto copy_finished; } /* Set up an sqlite3_backup object. sqlite3_backup.pDestDb must be set @@ -78724,16 +77707,16 @@ SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *pTo, Btree *pFrom){ ** 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 ); + assert(b.rc != SQLITE_OK); rc = sqlite3_backup_finish(&b); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pTo->pBt->btsFlags &= ~BTS_PAGESIZE_FIXED; - }else{ + } else { sqlite3PagerClearCache(sqlite3BtreePager(b.pDest)); } - assert( sqlite3BtreeTxnState(pTo)!=SQLITE_TXN_WRITE ); + assert(sqlite3BtreeTxnState(pTo) != SQLITE_TXN_WRITE); copy_finished: sqlite3BtreeLeave(pFrom); sqlite3BtreeLeave(pTo); @@ -78766,7 +77749,7 @@ SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *pTo, Btree *pFrom){ /* 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) +#define ISPOWEROF2(X) (((X) & ((X) - 1)) == 0) #ifdef SQLITE_DEBUG /* @@ -78775,54 +77758,49 @@ SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *pTo, Btree *pFrom){ ** This routine is intended for use inside of assert() statements, like ** this: assert( sqlite3VdbeCheckMemInvariants(pMem) ); */ -SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem *p){ +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 ); + 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 ); + 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)) ); + assert(ISPOWEROF2(p->flags & (MEM_Int | MEM_Real | MEM_IntReal))); - if( p->flags & MEM_Null ){ + 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 ); + 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) ){ + 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 ); + 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{ + 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{ + } else { /* The MEM_Cleared bit is only allowed on NULLs */ - assert( (p->flags & MEM_Cleared)==0 ); + 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)); + 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: @@ -78832,13 +77810,10 @@ SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem *p){ ** (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 - ); + 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; } @@ -78848,26 +77823,25 @@ SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem *p){ ** 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){ +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 + 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); + 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{ + } 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 ); + 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) */ } } @@ -78895,33 +77869,37 @@ static void vdbeMemRenderNum(int sz, char *zBuf, Mem *p){ ** ** This routine is for use inside of assert() statements only. */ -SQLITE_PRIVATE int sqlite3VdbeMemValidStrRep(Mem *p){ +SQLITE_PRIVATE int sqlite3VdbeMemValidStrRep(Mem* p) { char zBuf[100]; - char *z; + char* z; int i, j, incr; - if( (p->flags & MEM_Str)==0 ) return 1; - if( p->flags & MEM_Term ){ + 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 ); + 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 ); + 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; + 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 ){ + if (p->enc != SQLITE_UTF8) { incr = 2; - if( p->enc==SQLITE_UTF16BE ) z++; + if (p->enc == SQLITE_UTF16BE) + z++; } - while( zBuf[j] ){ - if( zBuf[j++]!=z[i] ) return 0; + while (zBuf[j]) { + if (zBuf[j++] != z[i]) + return 0; i += incr; } return 1; @@ -78941,22 +77919,21 @@ SQLITE_PRIVATE int sqlite3VdbeMemValidStrRep(Mem *p){ ** SQLITE_NOMEM may be returned if a malloc() fails during conversion ** between formats. */ -SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){ +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) ){ + 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 ){ + if (pMem->enc == desiredEnc) { return SQLITE_OK; } - assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert(pMem->db == 0 || sqlite3_mutex_held(pMem->db->mutex)); #ifdef SQLITE_OMIT_UTF16 return SQLITE_ERROR; #else @@ -78965,9 +77942,9 @@ SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){ ** 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); + assert(rc == SQLITE_OK || rc == SQLITE_NOMEM); + assert(rc == SQLITE_OK || pMem->enc != desiredEnc); + assert(rc == SQLITE_NOMEM || pMem->enc == desiredEnc); return rc; #endif } @@ -78980,53 +77957,53 @@ SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){ ** 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 ); +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 ){ + 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{ + } else { pMem->zMalloc = sqlite3Realloc(pMem->z, n); - if( pMem->zMalloc==0 ) sqlite3_free(pMem->z); + if (pMem->zMalloc == 0) + sqlite3_free(pMem->z); pMem->z = pMem->zMalloc; } bPreserve = 0; - }else{ - if( pMem->szMalloc>0 ) sqlite3DbFreeNN(pMem->db, pMem->zMalloc); + } else { + if (pMem->szMalloc > 0) + sqlite3DbFreeNN(pMem->db, pMem->zMalloc); pMem->zMalloc = sqlite3DbMallocRaw(pMem->db, n); } - if( pMem->zMalloc==0 ){ + if (pMem->zMalloc == 0) { sqlite3VdbeMemSetNull(pMem); pMem->z = 0; pMem->szMalloc = 0; return SQLITE_NOMEM_BKPT; - }else{ + } else { pMem->szMalloc = sqlite3DbMallocSize(pMem->db, pMem->zMalloc); } - if( bPreserve && pMem->z ){ - assert( pMem->z!=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)); + 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); + pMem->flags &= ~(MEM_Dyn | MEM_Ephem | MEM_Static); return SQLITE_OK; } @@ -79043,15 +78020,15 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPre ** 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->szMalloc 0); + assert((pMem->flags & MEM_Dyn) == 0 || pMem->szMalloc == 0); + if (pMem->szMalloc < szNew) { return sqlite3VdbeMemGrow(pMem, szNew, 0); } - assert( (pMem->flags & MEM_Dyn)==0 ); + assert((pMem->flags & MEM_Dyn) == 0); pMem->z = pMem->zMalloc; - pMem->flags &= (MEM_Null|MEM_Int|MEM_Real|MEM_IntReal); + pMem->flags &= (MEM_Null | MEM_Int | MEM_Real | MEM_IntReal); return SQLITE_OK; } @@ -79064,13 +78041,13 @@ SQLITE_PRIVATE int sqlite3VdbeMemClearAndResize(Mem *pMem, int szNew){ ** 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) ){ +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->z[pMem->n + 1] = 0; + pMem->z[pMem->n + 2] = 0; pMem->flags |= MEM_Term; return SQLITE_OK; } @@ -79081,15 +78058,17 @@ static SQLITE_NOINLINE int vdbeMemAddTerminator(Mem *pMem){ ** ** 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 ){ +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; + if (rc) + return rc; } } pMem->flags &= ~MEM_Ephem; @@ -79105,30 +78084,31 @@ SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem *pMem){ ** blob stored in dynamically allocated space. */ #ifndef SQLITE_OMIT_INCRBLOB -SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *pMem){ +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) ); + 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; + if (nByte <= 0) { + if ((pMem->flags & MEM_Blob) == 0) + return SQLITE_OK; nByte = 1; } - if( sqlite3VdbeMemGrow(pMem, nByte, 1) ){ + if (sqlite3VdbeMemGrow(pMem, nByte, 1)) { return SQLITE_NOMEM_BKPT; } - assert( pMem->z!=0 ); - assert( sqlite3DbMallocSize(pMem->db,pMem->z) >= nByte ); + 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); + pMem->flags &= ~(MEM_Zero | MEM_Term); return SQLITE_OK; } #endif @@ -79136,14 +78116,14 @@ SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *pMem){ /* ** 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{ +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); } } @@ -79162,29 +78142,29 @@ SQLITE_PRIVATE int sqlite3VdbeMemNulTerminate(Mem *pMem){ ** 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){ +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) ); + 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) ){ + if (sqlite3VdbeMemClearAndResize(pMem, nByte)) { pMem->enc = 0; return SQLITE_NOMEM_BKPT; } vdbeMemRenderNum(nByte, pMem->z, pMem); - assert( pMem->z!=0 ); + 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); + pMem->flags |= MEM_Str | MEM_Term; + if (bForce) + pMem->flags &= ~(MEM_Int | MEM_Real | MEM_IntReal); sqlite3VdbeChangeEncoding(pMem, enc); return SQLITE_OK; } @@ -79197,15 +78177,15 @@ SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem *pMem, u8 enc, u8 bForce){ ** Return SQLITE_ERROR if the finalizer reports an error. SQLITE_OK ** otherwise. */ -SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){ +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) ); + 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; @@ -79215,8 +78195,9 @@ SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){ 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); + assert((pMem->flags & MEM_Dyn) == 0); + if (pMem->szMalloc > 0) + sqlite3DbFreeNN(pMem->db, pMem->zMalloc); memcpy(pMem, &t, sizeof(t)); return ctx.isError; } @@ -79230,13 +78211,13 @@ SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){ ** otherwise. */ #ifndef SQLITE_OMIT_WINDOWFUNC -SQLITE_PRIVATE int sqlite3VdbeMemAggValue(Mem *pAccum, Mem *pOut, FuncDef *pFunc){ +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) ); + 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; @@ -79257,17 +78238,17 @@ SQLITE_PRIVATE int sqlite3VdbeMemAggValue(Mem *pAccum, Mem *pOut, FuncDef *pFunc ** 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 ){ +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 ); + 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); + if (p->flags & MEM_Dyn) { + assert(p->xDel != SQLITE_DYNAMIC && p->xDel != 0); + p->xDel((void*)p->z); } p->flags = MEM_Null; } @@ -79280,11 +78261,11 @@ static SQLITE_NOINLINE void vdbeMemClearExternAndSetNull(Mem *p){ ** 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) ){ +static SQLITE_NOINLINE void vdbeMemClear(Mem* p) { + if (VdbeMemDynamic(p)) { vdbeMemClearExternAndSetNull(p); } - if( p->szMalloc ){ + if (p->szMalloc) { sqlite3DbFreeNN(p->db, p->zMalloc); p->szMalloc = 0; } @@ -79301,9 +78282,9 @@ static SQLITE_NOINLINE void vdbeMemClear(Mem *p){ ** 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 ){ +SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem* p) { + assert(sqlite3VdbeCheckMemInvariants(p)); + if (VdbeMemDynamic(p) || p->szMalloc) { vdbeMemClear(p); } } @@ -79311,9 +78292,10 @@ SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *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); +SQLITE_PRIVATE void sqlite3VdbeMemReleaseMalloc(Mem* p) { + assert(!VdbeMemDynamic(p)); + if (p->szMalloc) + vdbeMemClear(p); } /* @@ -79321,7 +78303,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemReleaseMalloc(Mem *p){ ** 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){ +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; @@ -79336,11 +78318,11 @@ static SQLITE_NOINLINE i64 doubleToInt64(double r){ static const i64 maxInt = LARGEST_INT64; static const i64 minInt = SMALLEST_INT64; - if( r<=(double)minInt ){ + if (r <= (double)minInt) { return minInt; - }else if( r>=(double)maxInt ){ + } else if (r >= (double)maxInt) { return maxInt; - }else{ + } else { return (i64)r; } #endif @@ -79357,25 +78339,25 @@ static SQLITE_NOINLINE i64 doubleToInt64(double r){ ** ** If pMem represents a string value, its encoding might be changed. */ -static SQLITE_NOINLINE i64 memIntValue(const Mem *pMem){ +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){ +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) ); + 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 ); + if (flags & (MEM_Int | MEM_IntReal)) { + testcase(flags & MEM_IntReal); return pMem->u.i; - }else if( flags & MEM_Real ){ + } else if (flags & MEM_Real) { return doubleToInt64(pMem->u.r); - }else if( (flags & (MEM_Str|MEM_Blob))!=0 && pMem->z!=0 ){ + } else if ((flags & (MEM_Str | MEM_Blob)) != 0 && pMem->z != 0) { return memIntValue(pMem); - }else{ + } else { return 0; } } @@ -79386,24 +78368,24 @@ SQLITE_PRIVATE i64 sqlite3VdbeIntValue(const Mem *pMem){ ** 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){ +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 ){ +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 ); + } 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) ){ + } else if (pMem->flags & (MEM_Str | MEM_Blob)) { return memRealValue(pMem); - }else{ + } else { /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */ return (double)0; } @@ -79413,24 +78395,26 @@ SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem *pMem){ ** 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; +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){ +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) ); + 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); @@ -79444,7 +78428,7 @@ SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem *pMem){ ** the second condition under the assumption that addition overflow causes ** values to wrap around. */ - if( pMem->u.r==ix && ix>SMALLEST_INT64 && ixu.r == ix && ix > SMALLEST_INT64 && ix < LARGEST_INT64) { pMem->u.i = ix; MemSetTypeFlag(pMem, MEM_Int); } @@ -79453,11 +78437,11 @@ SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem *pMem){ /* ** 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) ); +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); @@ -79468,10 +78452,10 @@ SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem *pMem){ ** 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) ); +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); @@ -79487,11 +78471,9 @@ SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem *pMem){ ** 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){ +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); + return r1 == 0.0 || (memcmp(&r1, &r2, sizeof(r1)) == 0 && i >= -2251799813685248LL && i < 2251799813685248LL); } /* @@ -79502,29 +78484,28 @@ SQLITE_PRIVATE int sqlite3RealSameAsInt(double r1, sqlite3_int64 i){ ** 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 ){ +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) ); + 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)) - ){ + 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{ + } 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); + assert((pMem->flags & (MEM_Int | MEM_Real | MEM_IntReal | MEM_Null)) != 0); + pMem->flags &= ~(MEM_Str | MEM_Blob | MEM_Zero); return SQLITE_OK; } @@ -79535,16 +78516,18 @@ SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem *pMem){ ** 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 ){ +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); + 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; } @@ -79561,12 +78544,12 @@ SQLITE_PRIVATE int sqlite3VdbeMemCast(Mem *pMem, u8 aff, u8 encoding){ break; } default: { - assert( aff==SQLITE_AFF_TEXT ); - assert( MEM_Str==(MEM_Blob>>3) ); - pMem->flags |= (pMem->flags&MEM_Blob)>>3; + 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); + assert(pMem->flags & MEM_Str || pMem->db->mallocFailed); + pMem->flags &= ~(MEM_Int | MEM_Real | MEM_IntReal | MEM_Blob | MEM_Zero); return sqlite3VdbeChangeEncoding(pMem, encoding); } } @@ -79578,14 +78561,13 @@ SQLITE_PRIVATE int sqlite3VdbeMemCast(Mem *pMem, u8 aff, u8 encoding){ ** ** The minimum amount of initialization feasible is performed. */ -SQLITE_PRIVATE void sqlite3VdbeMemInit(Mem *pMem, sqlite3 *db, u16 flags){ - assert( (flags & ~MEM_TypeMask)==0 ); +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. ** @@ -79598,14 +78580,14 @@ SQLITE_PRIVATE void sqlite3VdbeMemInit(Mem *pMem, sqlite3 *db, u16 flags){ ** ** Use sqlite3VdbeMemRelease() to complete erase the Mem prior to abandoning it. */ -SQLITE_PRIVATE void sqlite3VdbeMemSetNull(Mem *pMem){ - if( VdbeMemDynamic(pMem) ){ +SQLITE_PRIVATE void sqlite3VdbeMemSetNull(Mem* pMem) { + if (VdbeMemDynamic(pMem)) { vdbeMemClearExternAndSetNull(pMem); - }else{ + } else { pMem->flags = MEM_Null; } } -SQLITE_PRIVATE void sqlite3ValueSetNull(sqlite3_value *p){ +SQLITE_PRIVATE void sqlite3ValueSetNull(sqlite3_value* p) { sqlite3VdbeMemSetNull((Mem*)p); } @@ -79614,25 +78596,26 @@ SQLITE_PRIVATE void sqlite3ValueSetNull(sqlite3_value *p){ ** n containing all zeros. */ #ifndef SQLITE_OMIT_INCRBLOB -SQLITE_PRIVATE void sqlite3VdbeMemSetZeroBlob(Mem *pMem, int n){ +SQLITE_PRIVATE void sqlite3VdbeMemSetZeroBlob(Mem* pMem, int n) { sqlite3VdbeMemRelease(pMem); - pMem->flags = MEM_Blob|MEM_Zero; + pMem->flags = MEM_Blob | MEM_Zero; pMem->n = 0; - if( n<0 ) 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) ){ +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 ); + assert(pMem->z != 0); + assert(sqlite3DbMallocSize(pMem->db, pMem->z) >= nByte); memset(pMem->z, 0, nByte); - pMem->n = n>0?n:0; + pMem->n = n > 0 ? n : 0; pMem->flags = MEM_Blob; pMem->enc = SQLITE_UTF8; return SQLITE_OK; @@ -79644,7 +78627,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetZeroBlob(Mem *pMem, int n){ ** 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){ +static SQLITE_NOINLINE void vdbeReleaseAndSetInt64(Mem* pMem, i64 val) { sqlite3VdbeMemSetNull(pMem); pMem->u.i = val; pMem->flags = MEM_Int; @@ -79654,33 +78637,30 @@ static SQLITE_NOINLINE void vdbeReleaseAndSetInt64(Mem *pMem, i64 val){ ** 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) ){ +SQLITE_PRIVATE void sqlite3VdbeMemSetInt64(Mem* pMem, i64 val) { + if (VdbeMemDynamic(pMem)) { vdbeReleaseAndSetInt64(pMem, val); - }else{ + } else { pMem->u.i = val; pMem->flags = MEM_Int; } } /* A no-op destructor */ -SQLITE_PRIVATE void sqlite3NoopDestructor(void *p){ UNUSED_PARAMETER(p); } +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 ); +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->flags = MEM_Null | MEM_Dyn | MEM_Subtype | MEM_Term; pMem->eSubtype = 'p'; pMem->xDel = xDestructor ? xDestructor : sqlite3NoopDestructor; } @@ -79690,9 +78670,9 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetPointer( ** Delete any previous value and set the value stored in *pMem to val, ** manifest type REAL. */ -SQLITE_PRIVATE void sqlite3VdbeMemSetDouble(Mem *pMem, double val){ +SQLITE_PRIVATE void sqlite3VdbeMemSetDouble(Mem* pMem, double val) { sqlite3VdbeMemSetNull(pMem); - if( !sqlite3IsNaN(val) ){ + if (!sqlite3IsNaN(val)) { pMem->u.r = val; pMem->flags = MEM_Real; } @@ -79704,9 +78684,8 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetDouble(Mem *pMem, double val){ ** 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; +SQLITE_PRIVATE int sqlite3VdbeMemIsRowSet(const Mem* pMem) { + return (pMem->flags & (MEM_Blob | MEM_Dyn)) == (MEM_Blob | MEM_Dyn) && pMem->xDel == sqlite3RowSetDelete; } #endif @@ -79717,16 +78696,17 @@ SQLITE_PRIVATE int sqlite3VdbeMemIsRowSet(const Mem *pMem){ ** 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) ); +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; + if (p == 0) + return SQLITE_NOMEM; pMem->z = (char*)p; - pMem->flags = MEM_Blob|MEM_Dyn; + pMem->flags = MEM_Blob | MEM_Dyn; pMem->xDel = sqlite3RowSetDelete; return SQLITE_OK; } @@ -79735,14 +78715,14 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetRowSet(Mem *pMem){ ** 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) ){ +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 ){ + if (p->flags & MEM_Zero) { n += p->u.nZero; } - return n>p->db->aLimit[SQLITE_LIMIT_LENGTH]; + return n > p->db->aLimit[SQLITE_LIMIT_LENGTH]; } return 0; } @@ -79756,15 +78736,14 @@ SQLITE_PRIVATE int sqlite3VdbeMemTooBig(Mem *p){ ** 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){ +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 ){ + Mem* pX; + for (i = 1, pX = pVdbe->aMem + 1; i < pVdbe->nMem; 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 (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. @@ -79773,7 +78752,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ ** 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 ); + 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 */ @@ -79791,19 +78770,22 @@ SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ ** 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){ +static SQLITE_NOINLINE void vdbeClrCopy(Mem* pTo, const Mem* pFrom, int eType) { vdbeMemClearExternAndSetNull(pTo); - assert( !VdbeMemDynamic(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; } +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 ); + if ((pFrom->flags & MEM_Static) == 0) { + pTo->flags &= ~(MEM_Dyn | MEM_Static | MEM_Ephem); + assert(srcType == MEM_Ephem || srcType == MEM_Static); pTo->flags |= srcType; } } @@ -79812,15 +78794,16 @@ SQLITE_PRIVATE void sqlite3VdbeMemShallowCopy(Mem *pTo, const Mem *pFrom, int sr ** 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){ +SQLITE_PRIVATE int sqlite3VdbeMemCopy(Mem* pTo, const Mem* pFrom) { int rc = SQLITE_OK; - assert( !sqlite3VdbeMemIsRowSet(pFrom) ); - if( VdbeMemDynamic(pTo) ) vdbeMemClearExternAndSetNull(pTo); + 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) ){ + if (pTo->flags & (MEM_Str | MEM_Blob)) { + if (0 == (pFrom->flags & MEM_Static)) { pTo->flags |= MEM_Ephem; rc = sqlite3VdbeMemMakeWriteable(pTo); } @@ -79835,10 +78818,10 @@ SQLITE_PRIVATE int sqlite3VdbeMemCopy(Mem *pTo, const Mem *pFrom){ ** ** 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 ); +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)); @@ -79868,52 +78851,52 @@ SQLITE_PRIVATE void sqlite3VdbeMemMove(Mem *pTo, Mem *pFrom){ ** 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 */ +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 ); + 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 ){ + if (!z) { sqlite3VdbeMemSetNull(pMem); return SQLITE_OK; } - if( pMem->db ){ + if (pMem->db) { iLimit = pMem->db->aLimit[SQLITE_LIMIT_LENGTH]; - }else{ + } else { iLimit = SQLITE_MAX_LENGTH; } - if( nByte<0 ){ - assert( enc!=0 ); - if( enc==SQLITE_UTF8 ){ + 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){} + } else { + for (nByte = 0; nByte <= iLimit && (z[nByte] | z[nByte + 1]); nByte += 2) { + } } - flags= MEM_Str|MEM_Term; - }else if( enc==0 ){ + flags = MEM_Str | MEM_Term; + } else if (enc == 0) { flags = MEM_Blob; enc = SQLITE_UTF8; - }else{ + } else { flags = MEM_Str; } - if( nByte>iLimit ){ - if( xDel && xDel!=SQLITE_TRANSIENT ){ - if( xDel==SQLITE_DYNAMIC ){ + if (nByte > iLimit) { + if (xDel && xDel != SQLITE_TRANSIENT) { + if (xDel == SQLITE_DYNAMIC) { sqlite3DbFree(pMem->db, (void*)z); - }else{ + } else { xDel((void*)z); } } @@ -79925,27 +78908,27 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( ** also sets a flag in local variable "flags" to indicate the memory ** management (one of MEM_Dyn or MEM_Static). */ - if( xDel==SQLITE_TRANSIENT ){ + if (xDel == SQLITE_TRANSIENT) { i64 nAlloc = nByte; - if( flags&MEM_Term ){ - nAlloc += (enc==SQLITE_UTF8?1:2); + 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)) ){ + 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{ + } else { sqlite3VdbeMemRelease(pMem); - pMem->z = (char *)z; - if( xDel==SQLITE_DYNAMIC ){ + pMem->z = (char*)z; + if (xDel == SQLITE_DYNAMIC) { pMem->zMalloc = pMem->z; pMem->szMalloc = sqlite3DbMallocSize(pMem->db, pMem->zMalloc); - }else{ + } else { pMem->xDel = xDel; - flags |= ((xDel==SQLITE_STATIC)?MEM_Static:MEM_Dyn); + flags |= ((xDel == SQLITE_STATIC) ? MEM_Static : MEM_Dyn); } } @@ -79954,12 +78937,11 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( pMem->enc = enc; #ifndef SQLITE_OMIT_UTF16 - if( enc>SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem) ){ + if (enc > SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem)) { return SQLITE_NOMEM_BKPT; } #endif - return SQLITE_OK; } @@ -79978,50 +78960,48 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( ** 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. */ -){ +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 */ + if (rc == SQLITE_OK) { + pMem->z[amt] = 0; /* Overrun area used when reading malformed records */ pMem->flags = MEM_Blob; pMem->n = (int)amt; - }else{ + } 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. */ -){ +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) ); + 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 ); + assert(!sqlite3VdbeMemIsRowSet(pMem)); + pMem->z = (char*)sqlite3BtreePayloadFetch(pCur, &available); + assert(pMem->z != 0); - if( amt<=available ){ - pMem->flags = MEM_Blob|MEM_Ephem; + if (amt <= available) { + pMem->flags = MEM_Blob | MEM_Ephem; pMem->n = (int)amt; - }else{ + } else { rc = sqlite3VdbeMemFromBtree(pCur, 0, amt, pMem); } @@ -80033,35 +79013,35 @@ SQLITE_PRIVATE int sqlite3VdbeMemFromBtreeZeroOffset( ** 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; +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) ){ + 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 ){ + 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{ + } else { sqlite3VdbeMemStringify(pVal, enc, 0); - assert( 0==(1&SQLITE_PTR_TO_INT(pVal->z)) ); + 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) ); + 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{ + } else { return 0; } } @@ -80076,16 +79056,17 @@ static SQLITE_NOINLINE const void *valueToText(sqlite3_value* pVal, u8 enc){ ** 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) ); +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 ){ + if (pVal->flags & MEM_Null) { return 0; } return valueToText(pVal, enc); @@ -80094,9 +79075,9 @@ SQLITE_PRIVATE const void *sqlite3ValueText(sqlite3_value* pVal, u8 enc){ /* ** Create a new sqlite3_value object. */ -SQLITE_PRIVATE sqlite3_value *sqlite3ValueNew(sqlite3 *db){ - Mem *p = sqlite3DbMallocZero(db, sizeof(*p)); - if( p ){ +SQLITE_PRIVATE sqlite3_value* sqlite3ValueNew(sqlite3* db) { + Mem* p = sqlite3DbMallocZero(db, sizeof(*p)); + if (p) { p->flags = MEM_Null; p->db = db; } @@ -80108,9 +79089,9 @@ SQLITE_PRIVATE sqlite3_value *sqlite3ValueNew(sqlite3 *db){ ** valueNew(). See comments above valueNew() for details. */ struct ValueNewStat4Ctx { - Parse *pParse; - Index *pIdx; - UnpackedRecord **ppRec; + Parse* pParse; + Index* pIdx; + UnpackedRecord** ppRec; int iVal; }; @@ -80125,39 +79106,40 @@ struct ValueNewStat4Ctx { ** 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){ +static sqlite3_value* valueNew(sqlite3* db, struct ValueNewStat4Ctx* p) { #ifdef SQLITE_ENABLE_STAT4 - if( p ){ - UnpackedRecord *pRec = p->ppRec[0]; + 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 */ + 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 ){ + 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; ipKeyInfo) { + assert(pRec->pKeyInfo->nAllField == nCol); + assert(pRec->pKeyInfo->enc == ENC(db)); + pRec->aMem = (Mem*)((u8*)pRec + ROUND8(sizeof(UnpackedRecord))); + for (i = 0; i < nCol; i++) { pRec->aMem[i].flags = MEM_Null; pRec->aMem[i].db = db; } - }else{ + } else { sqlite3DbFreeNN(db, pRec); pRec = 0; } } - if( pRec==0 ) return 0; + if (pRec == 0) + return 0; p->ppRec[0] = pRec; } - pRec->nField = p->iVal+1; + pRec->nField = p->iVal + 1; return &pRec->aMem[p->iVal]; } #else @@ -80187,82 +79169,81 @@ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ ** 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) ); +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) ); + 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) - ){ + assert(pFunc); + if ((pFunc->funcFlags & (SQLITE_FUNC_CONSTANT | SQLITE_FUNC_SLOCHNG)) == 0 || (pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL)) { return SQLITE_OK; } - if( pList ){ + if (pList) { apVal = (sqlite3_value**)sqlite3DbMallocZero(db, sizeof(apVal[0]) * nVal); - if( apVal==0 ){ + 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; + if (apVal[i] == 0 || rc != SQLITE_OK) + goto value_from_function_out; } } pVal = valueNew(db, pCtx); - if( pVal==0 ){ + if (pVal == 0) { rc = SQLITE_NOMEM_BKPT; goto value_from_function_out; } - testcase( pCtx->pParse->rc==SQLITE_ERROR ); - testcase( pCtx->pParse->rc==SQLITE_OK ); + 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 ){ + if (ctx.isError) { rc = ctx.isError; sqlite3ErrorMsg(pCtx->pParse, "%s", sqlite3_value_text(pVal)); - }else{ + } else { sqlite3ValueApplyAffinity(pVal, aff, SQLITE_UTF8); - assert( rc==SQLITE_OK ); + assert(rc == SQLITE_OK); rc = sqlite3VdbeChangeEncoding(pVal, enc); - if( rc==SQLITE_OK && sqlite3VdbeMemTooBig(pVal) ){ + if (rc == SQLITE_OK && sqlite3VdbeMemTooBig(pVal)) { rc = SQLITE_TOOBIG; pCtx->pParse->nErr++; } } pCtx->pParse->rc = rc; - value_from_function_out: - if( rc!=SQLITE_OK ){ +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; + assert(pExpr != 0); + while ((op = pExpr->op) == 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 ); + assert((pExpr->flags & EP_TokenOnly) == 0 || pCtx == 0); - if( op==TK_CAST ){ + if (op == TK_CAST) { u8 aff; - assert( !ExprHasProperty(pExpr, EP_IntValue) ); - aff = sqlite3AffinityType(pExpr->u.zToken,0); + 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 ){ + testcase(rc != SQLITE_OK); + if (*ppVal) { sqlite3VdbeMemCast(*ppVal, aff, enc); sqlite3ValueApplyAffinity(*ppVal, affinity, enc); } @@ -80326,89 +79308,89 @@ static int valueFromExpr( /* 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) ){ + 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 ){ + 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{ + 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; + 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 ){ + if ((op == TK_INTEGER || op == TK_FLOAT) && affinity == SQLITE_AFF_BLOB) { sqlite3ValueApplyAffinity(pVal, SQLITE_AFF_NUMERIC, SQLITE_UTF8); - }else{ + } 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 ); + 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 ){ + if (enc != SQLITE_UTF8) { rc = sqlite3VdbeChangeEncoding(pVal, enc); } - }else if( op==TK_UMINUS ) { + } 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 - ){ + if (SQLITE_OK == valueFromExpr(db, pExpr->pLeft, enc, affinity, &pVal, pCtx) && pVal != 0) { sqlite3VdbeMemNumerify(pVal); - if( pVal->flags & MEM_Real ){ + if (pVal->flags & MEM_Real) { pVal->u.r = -pVal->u.r; - }else if( pVal->u.i==SMALLEST_INT64 ){ + } 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{ + } else { pVal->u.i = -pVal->u.i; } sqlite3ValueApplyAffinity(pVal, affinity, enc); } - }else if( op==TK_NULL ){ + } else if (op == TK_NULL) { pVal = valueNew(db, pCtx); - if( pVal==0 ) goto no_mem; + if (pVal == 0) + goto no_mem; sqlite3VdbeMemSetNull(pVal); } #ifndef SQLITE_OMIT_BLOB_LITERAL - else if( op==TK_BLOB ){ + 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]=='\'' ); + 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; + 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); + 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 ){ + 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) ); + else if (op == TK_TRUEFALSE) { + assert(!ExprHasProperty(pExpr, EP_IntValue)); pVal = valueNew(db, pCtx); - if( pVal ){ + if (pVal) { pVal->flags = MEM_Int; - pVal->u.i = pExpr->u.zToken[4]==0; + pVal->u.i = pExpr->u.zToken[4] == 0; } } @@ -80417,15 +79399,17 @@ static int valueFromExpr( no_mem: #ifdef SQLITE_ENABLE_STAT4 - if( pCtx==0 || NEVER(pCtx->pParse->nErr==0) ) + if (pCtx == 0 || NEVER(pCtx->pParse->nErr == 0)) #endif sqlite3OomFault(db); sqlite3DbFree(db, zVal); - assert( *ppVal==0 ); + assert(*ppVal == 0); #ifdef SQLITE_ENABLE_STAT4 - if( pCtx==0 ) sqlite3ValueFree(pVal); + if (pCtx == 0) + sqlite3ValueFree(pVal); #else - assert( pCtx==0 ); sqlite3ValueFree(pVal); + assert(pCtx == 0); + sqlite3ValueFree(pVal); #endif return SQLITE_NOMEM_BKPT; } @@ -80440,13 +79424,12 @@ static int valueFromExpr( ** 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 */ -){ +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; } @@ -80469,43 +79452,42 @@ SQLITE_PRIVATE int sqlite3ValueFromExpr( ** 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) */ -){ +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; + 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 ){ + assert(pExpr == 0 || pExpr->op != TK_REGISTER || pExpr->op2 != TK_VARIABLE); + if (!pExpr) { pVal = valueNew(db, pAlloc); - if( pVal ){ + if (pVal) { sqlite3VdbeMemSetNull((Mem*)pVal); } - }else if( pExpr->op==TK_VARIABLE && (db->flags & SQLITE_EnableQPSG)==0 ){ - Vdbe *v; + } 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 ){ + if ((v = pParse->pReprepare) != 0) { pVal = valueNew(db, pAlloc); - if( pVal ){ - rc = sqlite3VdbeMemCopy((Mem*)pVal, &v->aVar[iBindVar-1]); + if (pVal) { + rc = sqlite3VdbeMemCopy((Mem*)pVal, &v->aVar[iBindVar - 1]); sqlite3ValueApplyAffinity(pVal, affinity, ENC(db)); pVal->db = pParse->db; } } - }else{ + } else { rc = valueFromExpr(db, pExpr, ENC(db), affinity, &pVal, pAlloc); } - assert( pVal==0 || pVal->db==db ); + assert(pVal == 0 || pVal->db == db); *ppVal = pVal; return rc; } @@ -80544,19 +79526,18 @@ static int stat4ValueFromExpr( ** 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 */ -){ +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 ){ + if (pExpr == 0 || pExpr->op != TK_SELECT) { int i; struct ValueNewStat4Ctx alloc; @@ -80564,13 +79545,14 @@ SQLITE_PRIVATE int sqlite3Stat4ProbeSetValue( alloc.pIdx = pIdx; alloc.ppRec = ppRec; - for(i=0; idb, pIdx, iVal+i); - alloc.iVal = iVal+i; + for (i = 0; i < nElem; i++) { + sqlite3_value* pVal = 0; + Expr* pElem = (pExpr ? sqlite3VectorFieldSubexpr(pExpr, i) : 0); + u8 aff = sqlite3IndexColumnAffinity(pParse->db, pIdx, iVal + i); + alloc.iVal = iVal + i; rc = stat4ValueFromExpr(pParse, pElem, aff, &alloc, &pVal); - if( !pVal ) break; + if (!pVal) + break; nExtract++; } } @@ -80589,12 +79571,11 @@ SQLITE_PRIVATE int sqlite3Stat4ProbeSetValue( ** 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) */ -){ +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); } @@ -80606,42 +79587,45 @@ SQLITE_PRIVATE int sqlite3Stat4ValueFromExpr( ** 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 ); +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; + if (nHdr > nRec || iHdr >= nHdr) + return SQLITE_CORRUPT_BKPT; iField = nHdr; - for(i=0; i<=iCol; i++){ + 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; + 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 ){ + 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; + if (pMem == 0) + return SQLITE_NOMEM_BKPT; } - sqlite3VdbeSerialGet(&a[iField-szField], t, pMem); + sqlite3VdbeSerialGet(&a[iField - szField], t, pMem); pMem->enc = ENC(db); return SQLITE_OK; } @@ -80651,13 +79635,13 @@ SQLITE_PRIVATE int sqlite3Stat4Column( ** by an earlier call to sqlite3Stat4ProbeSetValue(). This call deletes ** the object. */ -SQLITE_PRIVATE void sqlite3Stat4ProbeFree(UnpackedRecord *pRec){ - if( pRec ){ +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; iaMem; + sqlite3* db = aMem[0].db; + for (i = 0; i < nCol; i++) { sqlite3VdbeMemRelease(&aMem[i]); } sqlite3KeyInfoUnref(pRec->pKeyInfo); @@ -80669,22 +79653,23 @@ SQLITE_PRIVATE void sqlite3Stat4ProbeFree(UnpackedRecord *pRec){ /* ** 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); +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); +SQLITE_PRIVATE void sqlite3ValueFree(sqlite3_value* v) { + if (!v) + return; + sqlite3VdbeMemRelease((Mem*)v); sqlite3DbFreeNN(((Mem*)v)->db, v); } @@ -80693,23 +79678,24 @@ SQLITE_PRIVATE void sqlite3ValueFree(sqlite3_value *v){ ** 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; +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 ){ +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 ){ + if ((p->flags & MEM_Blob) != 0) { + if (p->flags & MEM_Zero) { return p->n + p->u.nZero; - }else{ + } else { return p->n; } } - if( p->flags & MEM_Null ) return 0; + if (p->flags & MEM_Null) + return 0; return valueBytes(pVal, enc); } @@ -80733,32 +79719,33 @@ SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value *pVal, u8 enc){ /* #include "vdbeInt.h" */ /* Forward references */ -static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef); -static void vdbeFreeOpArray(sqlite3 *, Op *, int); +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)); +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 ){ + if (db->pVdbe) { db->pVdbe->pPrev = p; } p->pNext = db->pVdbe; p->pPrev = 0; db->pVdbe = p; - assert( p->eVdbeState==VDBE_INIT_STATE ); + 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 ); + assert(pParse->aLabel == 0); + assert(pParse->nLabel == 0); + assert(p->nOpAlloc == 0); + assert(pParse->szOpAlloc == 0); sqlite3VdbeAddOp2(p, OP_Init, 0, 1); return p; } @@ -80766,14 +79753,14 @@ SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(Parse *pParse){ /* ** Return the Parse object that owns a Vdbe object. */ -SQLITE_PRIVATE Parse *sqlite3VdbeParser(Vdbe *p){ +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, ...){ +SQLITE_PRIVATE void sqlite3VdbeError(Vdbe* p, const char* zFormat, ...) { va_list ap; sqlite3DbFree(p->db, p->zErrMsg); va_start(ap, zFormat); @@ -80784,13 +79771,14 @@ SQLITE_PRIVATE void sqlite3VdbeError(Vdbe *p, const char *zFormat, ...){ /* ** 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; +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 ){ + if ((prepFlags & SQLITE_PREPARE_SAVESQL) == 0) { p->expmask = 0; } - assert( p->zSql==0 ); + assert(p->zSql == 0); p->zSql = sqlite3DbStrNDup(p->db, z, n); } @@ -80798,15 +79786,14 @@ SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe *p, const char *z, int n, u8 prepFlag /* ** Add a new element to the Vdbe->pDblStr list. */ -SQLITE_PRIVATE void sqlite3VdbeAddDblquoteStr(sqlite3 *db, Vdbe *p, const char *z){ - if( p ){ +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 ){ + 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); + memcpy(pStr->z, z, n + 1); } } } @@ -80817,15 +79804,16 @@ SQLITE_PRIVATE void sqlite3VdbeAddDblquoteStr(sqlite3 *db, Vdbe *p, const char * ** 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; +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; } @@ -80834,10 +79822,10 @@ SQLITE_PRIVATE int sqlite3VdbeUsesDoubleQuotedString( /* ** Swap all content between two VDBE structures. */ -SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){ +SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe* pA, Vdbe* pB) { Vdbe tmp, *pTmp; - char *zTmp; - assert( pA->db==pB->db ); + char* zTmp; + assert(pA->db == pB->db); tmp = *pA; *pA = *pB; *pB = tmp; @@ -80871,9 +79859,9 @@ SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){ ** 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; +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 @@ -80883,26 +79871,24 @@ static int growOpArray(Vdbe *v, int nOp){ ** 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); + 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))); + 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] ){ + 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 ){ + 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->nOpAlloc = p->szOpAlloc / sizeof(Op); v->aOp = pNew; } return (pNew ? SQLITE_OK : SQLITE_NOMEM_BKPT); @@ -80920,7 +79906,7 @@ static int growOpArray(Vdbe *v, int nOp){ ** sqlite3MisuseError(lineno) ** sqlite3CantopenError(lineno) */ -static void test_addop_breakpoint(int pc, Op *pOp){ +static void test_addop_breakpoint(int pc, Op* pOp) { static int n = 0; n++; } @@ -80942,26 +79928,27 @@ static void test_addop_breakpoint(int pc, Op *pOp){ ** 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 ); +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){ +SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe* p, int op, int p1, int p2, int p3) { int i; - VdbeOp *pOp; + VdbeOp* pOp; i = p->nOp; - assert( p->eVdbeState==VDBE_INIT_STATE ); - assert( op>=0 && op<0xff ); - if( p->nOpAlloc<=i ){ + 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 ); + assert(p->aOp != 0); p->nOp++; pOp = &p->aOp[i]; - assert( pOp!=0 ); + assert(pOp != 0); pOp->opcode = (u8)op; pOp->p5 = 0; pOp->p1 = p1; @@ -80973,7 +79960,7 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ pOp->zComment = 0; #endif #ifdef SQLITE_DEBUG - if( p->db->flags & SQLITE_VdbeAddopTrace ){ + if (p->db->flags & SQLITE_VdbeAddopTrace) { sqlite3VdbePrintOp(0, i, &p->aOp[i]); test_addop_breakpoint(i, &p->aOp[i]); } @@ -80987,26 +79974,26 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ #endif return i; } -SQLITE_PRIVATE int sqlite3VdbeAddOp0(Vdbe *p, int op){ +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){ +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){ +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){ + */ +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){ +SQLITE_PRIVATE int sqlite3VdbeLoadString(Vdbe* p, int iDest, const char* zStr) { return sqlite3VdbeAddOp4(p, OP_String8, 0, iDest, 0, zStr, 0); } @@ -81021,18 +80008,18 @@ SQLITE_PRIVATE int sqlite3VdbeLoadString(Vdbe *p, int iDest, const char *zStr){ ** 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, ...){ +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{ + 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; } } @@ -81044,15 +80031,14 @@ SQLITE_PRIVATE void sqlite3VdbeMultiLoad(Vdbe *p, int iDest, const char *zTypes, /* ** 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 */ -){ +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; @@ -81068,24 +80054,23 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp4( ** 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; +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*); + 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 ); + if (pCtx == 0) { + assert(pParse->db->mallocFailed); freeEphemeralFunction(pParse->db, (FuncDef*)pFunc); return 0; } @@ -81095,8 +80080,7 @@ SQLITE_PRIVATE int sqlite3VdbeAddFunctionCall( 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); + addr = sqlite3VdbeAddOp4(v, eCallCtx ? OP_PureFunc : OP_Function, p1, p2, p3, (char*)pCtx, P4_FUNCCTX); sqlite3VdbeChangeP5(v, eCallCtx & NC_SelfRef); sqlite3MayAbort(pParse); return addr; @@ -81106,17 +80090,17 @@ SQLITE_PRIVATE int sqlite3VdbeAddFunctionCall( ** 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); +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); } @@ -81125,9 +80109,10 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp4Dup8( ** 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; +SQLITE_PRIVATE int sqlite3VdbeExplainParent(Parse* pParse) { + VdbeOp* pOp; + if (pParse->addrExplain == 0) + return 0; pOp = sqlite3VdbeGetOp(pParse->pVdbe, pParse->addrExplain); return pOp->p2; } @@ -81137,7 +80122,7 @@ SQLITE_PRIVATE int sqlite3VdbeExplainParent(Parse *pParse){ ** monitor the EXPLAIN QUERY PLAN code generation. */ #if defined(SQLITE_DEBUG) -SQLITE_PRIVATE void sqlite3ExplainBreakpoint(const char *z1, const char *z2){ +SQLITE_PRIVATE void sqlite3ExplainBreakpoint(const char* z1, const char* z2) { (void)z1; (void)z2; } @@ -81149,15 +80134,15 @@ SQLITE_PRIVATE void sqlite3ExplainBreakpoint(const char *z1, const char *z2){ ** 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, ...){ +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 ) + if (pParse->explain == 2) #endif { - char *zMsg; - Vdbe *v; + char* zMsg; + Vdbe* v; va_list ap; int iThis; va_start(ap, zFmt); @@ -81165,10 +80150,9 @@ SQLITE_PRIVATE void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt 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){ + sqlite3VdbeAddOp4(v, OP_Explain, iThis, pParse->addrExplain, 0, zMsg, P4_DYNAMIC); + sqlite3ExplainBreakpoint(bPush ? "PUSH" : "", sqlite3VdbeGetOp(v, -1)->p4.z); + if (bPush) { pParse->addrExplain = iThis; } } @@ -81177,7 +80161,7 @@ SQLITE_PRIVATE void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt /* ** Pop the EXPLAIN QUERY PLAN stack one level. */ -SQLITE_PRIVATE void sqlite3VdbeExplainPop(Parse *pParse){ +SQLITE_PRIVATE void sqlite3VdbeExplainPop(Parse* pParse) { sqlite3ExplainBreakpoint("POP", 0); pParse->addrExplain = sqlite3VdbeExplainParent(pParse); } @@ -81191,28 +80175,28 @@ SQLITE_PRIVATE void sqlite3VdbeExplainPop(Parse *pParse){ ** 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){ +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); + for (j = 0; j < p->db->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 */ -){ +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]; + if (p->db->mallocFailed == 0) { + VdbeOp* pOp = &p->aOp[addr]; pOp->p4type = P4_INT32; pOp->p4.i = p4; } @@ -81220,8 +80204,8 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp4Int( } /* Insert the end of a co-routine -*/ -SQLITE_PRIVATE void sqlite3VdbeEndCoroutine(Vdbe *v, int regYield){ + */ +SQLITE_PRIVATE void sqlite3VdbeEndCoroutine(Vdbe* v, int regYield) { sqlite3VdbeAddOp1(v, OP_EndCoroutine, regYield); /* Clear the temporary register cache, thereby ensuring that each @@ -81259,7 +80243,7 @@ SQLITE_PRIVATE void sqlite3VdbeEndCoroutine(Vdbe *v, int regYield){ ** that gives a performance improvement over storing ** the equivalent positive value. */ -SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Parse *pParse){ +SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Parse* pParse) { return --pParse->nLabel; } @@ -81268,36 +80252,36 @@ SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Parse *pParse){ ** 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){ +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->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel, nNewSize * sizeof(p->aLabel[0])); + if (p->aLabel == 0) { p->nLabelAlloc = 0; - }else{ + } else { #ifdef SQLITE_DEBUG int i; - for(i=p->nLabelAlloc; iaLabel[i] = -1; + for (i = p->nLabelAlloc; i < nNewSize; i++) + p->aLabel[i] = -1; #endif p->nLabelAlloc = nNewSize; p->aLabel[j] = v->nOp; } } -SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe *v, int x){ - Parse *p = v->pParse; +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 ); + assert(v->eVdbeState == VDBE_INIT_STATE); + assert(j < -p->nLabel); + assert(j >= 0); #ifdef SQLITE_DEBUG - if( p->db->flags & SQLITE_VdbeAddopTrace ){ + 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 */ + 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; } } @@ -81305,17 +80289,17 @@ SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe *v, int x){ /* ** Mark the VDBE as one that can only be run one time. */ -SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe *p){ +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){ +SQLITE_PRIVATE void sqlite3VdbeReusable(Vdbe* p) { int i; - for(i=1; ALWAYS(inOp); i++){ - if( ALWAYS(p->aOp[i].opcode==OP_Expire) ){ + for (i = 1; ALWAYS(i < p->nOp); i++) { + if (ALWAYS(p->aOp[i].opcode == OP_Expire)) { p->aOp[1].opcode = OP_Noop; break; } @@ -81342,47 +80326,48 @@ SQLITE_PRIVATE void sqlite3VdbeReusable(Vdbe *p){ */ 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. */ + 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; +static Op* opIterNext(VdbeOpIter* p) { + Vdbe* v = p->v; + Op* pRet = 0; + Op* aOp; int nOp; - if( p->iSub<=p->nSub ){ + if (p->iSub <= p->nSub) { - if( p->iSub==0 ){ + 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; + } else { + aOp = p->apSub[p->iSub - 1]->aOp; + nOp = p->apSub[p->iSub - 1]->nOp; } - assert( p->iAddriAddr < nOp); pRet = &aOp[p->iAddr]; p->iAddr++; - if( p->iAddr==nOp ){ + if (p->iAddr == nOp) { p->iSub++; p->iAddr = 0; } - if( pRet->p4type==P4_SUBPROGRAM ){ - int nByte = (p->nSub+1)*sizeof(SubProgram*); + 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; + for (j = 0; j < p->nSub; j++) { + if (p->apSub[j] == pRet->p4.pProgram) + break; } - if( j==p->nSub ){ + if (j == p->nSub) { p->apSub = sqlite3DbReallocOrFree(v->db, p->apSub, nByte); - if( !p->apSub ){ + if (!p->apSub) { pRet = 0; - }else{ + } else { p->apSub[p->nSub++] = pRet->p4.pProgram; } } @@ -81415,44 +80400,44 @@ static Op *opIterNext(VdbeOpIter *p){ ** ** assert( sqlite3VdbeAssertMayAbort(pParse->pVdbe, pParse->mayAbort) ); */ -SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int 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; + Op* pOp; VdbeOpIter sIter; - if( v==0 ) return 0; + if (v == 0) + return 0; memset(&sIter, 0, sizeof(sIter)); sIter.v = v; - while( (pOp = opIterNext(&sIter))!=0 ){ + 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_Function || opcode==OP_PureFunc - || ((opcode==OP_Halt || opcode==OP_HaltIfNull) - && ((pOp->p1)!=SQLITE_OK && pOp->p2==OE_Abort)) - ){ + if (opcode == OP_Destroy || opcode == OP_VUpdate || opcode == OP_VRename || opcode == OP_VDestroy || opcode == OP_VCreate || + opcode == OP_ParseSchema || opcode == OP_Function || opcode == OP_PureFunc || + ((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 ){ + 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_CreateBtree && pOp->p3 == BTREE_BLOBKEY) + hasCreateIndex = 1; + if (opcode == OP_Clear) + hasCreateIndex = 1; } - if( opcode==OP_InitCoroutine ) hasInitCoroutine = 1; + if (opcode == OP_InitCoroutine) + hasInitCoroutine = 1; #ifndef SQLITE_OMIT_FOREIGN_KEY - if( opcode==OP_FkCounter && pOp->p1==0 && pOp->p2==1 ){ + if (opcode == OP_FkCounter && pOp->p1 == 0 && pOp->p2 == 1) { hasFkCounter = 1; } #endif @@ -81464,9 +80449,7 @@ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ ** 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 - ); + return (v->db->mallocFailed || hasAbort == mayAbort || hasFkCounter || (hasCreateTable && hasInitCoroutine) || hasCreateIndex); } #endif /* SQLITE_DEBUG - the sqlite3AssertMayAbort() function */ @@ -81475,12 +80458,8 @@ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ ** 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) - ){ +SQLITE_PRIVATE void sqlite3VdbeIncrWriteCounter(Vdbe* p, VdbeCursor* pC) { + if (pC == 0 || (pC->eCurType != CURTYPE_SORTER && pC->eCurType != CURTYPE_PSEUDO && !pC->isEphemeral)) { p->nWrite++; } } @@ -81491,8 +80470,8 @@ SQLITE_PRIVATE void sqlite3VdbeIncrWriteCounter(Vdbe *p, VdbeCursor *pC){ ** 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 ); +SQLITE_PRIVATE void sqlite3VdbeAssertAbortable(Vdbe* p) { + assert(p->nWrite == 0 || p->usesStmtJournal); } #endif @@ -81517,15 +80496,15 @@ SQLITE_PRIVATE void sqlite3VdbeAssertAbortable(Vdbe *p){ ** script numbers the opcodes correctly. Changes to this routine must be ** coordinated with changes to mkopcodeh.tcl. */ -static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ +static void resolveP2Values(Vdbe* p, int* pMaxFuncArgs) { int nMaxArgs = *pMaxFuncArgs; - Op *pOp; - Parse *pParse = p->pParse; - int *aLabel = pParse->aLabel; + Op* pOp; + Parse* pParse = p->pParse; + int* aLabel = pParse->aLabel; p->readOnly = 1; p->bIsReader = 0; - pOp = &p->aOp[p->nOp-1]; - while(1){ + 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 @@ -81533,12 +80512,13 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ ** 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 ){ + 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 ){ + switch (pOp->opcode) { case OP_Transaction: { - if( pOp->p2!=0 ) p->readOnly = 0; + if (pOp->p2 != 0) + p->readOnly = 0; /* no break */ deliberate_fall_through } case OP_AutoCommit: @@ -81557,26 +80537,28 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ } #ifndef SQLITE_OMIT_VIRTUALTABLE case OP_VUpdate: { - if( pOp->p2>nMaxArgs ) nMaxArgs = pOp->p2; + if (pOp->p2 > nMaxArgs) + nMaxArgs = pOp->p2; break; } case OP_VFilter: { int n; - assert( (pOp - p->aOp) >= 3 ); - assert( pOp[-1].opcode==OP_Integer ); + assert((pOp - p->aOp) >= 3); + assert(pOp[-1].opcode == OP_Integer); n = pOp[-1].p1; - if( n>nMaxArgs ) nMaxArgs = n; + if (n > nMaxArgs) + nMaxArgs = n; /* Fall through into the default case */ /* no break */ deliberate_fall_through } #endif default: { - if( pOp->p2<0 ){ + 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 ); + assert((sqlite3OpcodeProperty[pOp->opcode] & OPFLG_JUMP) != 0); + assert(ADDR(pOp->p2) < -pParse->nLabel); pOp->p2 = aLabel[ADDR(pOp->p2)]; } break; @@ -81585,18 +80567,19 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ /* 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); + assert((sqlite3OpcodeProperty[pOp->opcode] & OPFLG_JUMP) == 0 || pOp->p2 >= 0); } - if( pOp==p->aOp ) break; + if (pOp == p->aOp) + break; pOp--; } - if( aLabel ){ + if (aLabel) { sqlite3DbFreeNN(p->db, pParse->aLabel); pParse->aLabel = 0; } pParse->nLabel = 0; *pMaxFuncArgs = nMaxArgs; - assert( p->bIsReader!=0 || DbMaskAllZero(p->btreeMask) ); + assert(p->bIsReader != 0 || DbMaskAllZero(p->btreeMask)); } #ifdef SQLITE_DEBUG @@ -81620,62 +80603,67 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ ** 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; +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 ); + sqlite3_str* pErr = 0; + assert(v != 0); pParse = v->pParse; - assert( pParse!=0 ); - if( pParse->nErr ) return; - assert( iLast>=iFirst ); - assert( iLastnOp ); + assert(pParse != 0); + if (pParse->nErr) + return; + assert(iLast >= iFirst); + assert(iLast < v->nOp); 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 ){ + 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 ){ + assert(j >= 0); + if (j >= -pParse->nLabel || pParse->aLabel[j] < 0) { continue; } iDest = pParse->aLabel[j]; } - if( iDestiLast ){ + if (iDest < iFirst || iDest > iLast) { int j = iDest; - for(; jnOp; j++){ - VdbeOp *pX = &v->aOp[j]; - if( pX->opcode==OP_Return ){ - if( pX->p1==iRetReg ) break; + for (; j < v->nOp; 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 ){ + if (pX->opcode == OP_Noop) + continue; + if (pX->opcode == OP_Explain) + continue; + if (pErr == 0) { pErr = sqlite3_str_new(0); - }else{ + } 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); + "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); + if (pErr) { + char* zErr = sqlite3_str_finish(pErr); sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_INTERNAL, OE_Abort, 0, zErr, 0); sqlite3_free(zErr); sqlite3MayAbort(pParse); @@ -81686,8 +80674,8 @@ SQLITE_PRIVATE void sqlite3VdbeNoJumpsOutsideSubrtn( /* ** Return the address of the next instruction to be inserted. */ -SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe *p){ - assert( p->eVdbeState==VDBE_INIT_STATE ); +SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe* p) { + assert(p->eVdbeState == VDBE_INIT_STATE); return p->nOp; } @@ -81700,8 +80688,8 @@ SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe *p){ ** 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 ); +SQLITE_PRIVATE void sqlite3VdbeVerifyNoMallocRequired(Vdbe* p, int N) { + assert(p->nOp + N <= p->nOpAlloc); } #endif @@ -81713,10 +80701,10 @@ SQLITE_PRIVATE void sqlite3VdbeVerifyNoMallocRequired(Vdbe *p, int N){ ** script. */ #if defined(SQLITE_DEBUG) && !defined(SQLITE_TEST_REALLOC_STRESS) -SQLITE_PRIVATE void sqlite3VdbeVerifyNoResultRow(Vdbe *p){ +SQLITE_PRIVATE void sqlite3VdbeVerifyNoResultRow(Vdbe* p) { int i; - for(i=0; inOp; i++){ - assert( p->aOp[i].opcode!=OP_ResultRow ); + for (i = 0; i < p->nOp; i++) { + assert(p->aOp[i].opcode != OP_ResultRow); } } #endif @@ -81727,8 +80715,9 @@ SQLITE_PRIVATE void sqlite3VdbeVerifyNoResultRow(Vdbe *p){ ** context. */ #if defined(SQLITE_DEBUG) -SQLITE_PRIVATE void sqlite3VdbeVerifyAbortable(Vdbe *p, int onError){ - if( onError==OE_Abort ) sqlite3VdbeAddOp0(p, OP_Abortable); +SQLITE_PRIVATE void sqlite3VdbeVerifyAbortable(Vdbe* p, int onError) { + if (onError == OE_Abort) + sqlite3VdbeAddOp0(p, OP_Abortable); } #endif @@ -81743,12 +80732,12 @@ SQLITE_PRIVATE void sqlite3VdbeVerifyAbortable(Vdbe *p, int onError){ ** 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 ); +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) ); + assert(DbMaskAllZero(p->btreeMask)); resolveP2Values(p, pnMaxArg); *pnOp = p->nOp; @@ -81763,26 +80752,25 @@ SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe *p, int *pnOp, int *pnMaxArg) ** 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 */ -){ +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) ){ + 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 ){ + assert(aOp->p2 >= 0); + if ((sqlite3OpcodeProperty[aOp->opcode] & OPFLG_JUMP) != 0 && aOp->p2 > 0) { pOut->p2 += p->nOp; } pOut->p3 = aOp->p3; @@ -81793,13 +80781,13 @@ SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList( pOut->zComment = 0; #endif #ifdef SQLITE_VDBE_COVERAGE - pOut->iSrcLine = iLineno+i; + 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]); + if (p->db->flags & SQLITE_VdbeAddopTrace) { + sqlite3VdbePrintOp(0, i + p->nOp, &p->aOp[i + p->nOp]); } #endif } @@ -81811,19 +80799,18 @@ SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList( /* ** 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; +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++]; + if (aNew) { + ScanStatus* pNew = &aNew[p->nScan++]; pNew->addrExplain = addrExplain; pNew->addrLoop = addrLoop; pNew->addrVisit = addrVisit; @@ -81834,33 +80821,33 @@ SQLITE_PRIVATE void sqlite3VdbeScanStatus( } #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 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 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 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 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; +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){ +SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe* p, int addr) { sqlite3VdbeChangeP2(p, addr, p->nOp); } @@ -81877,28 +80864,25 @@ SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe *p, int addr){ ** 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 ); +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 */ + sqlite3VdbeGetOp(p, -1)->iSrcLine = 0; /* Erase VdbeCoverage() macros */ #endif p->nOp--; - }else{ + } 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 ){ +static void freeEphemeralFunction(sqlite3* db, FuncDef* pDef) { + if ((pDef->funcFlags & SQLITE_FUNC_EPHEM) != 0) { sqlite3DbFreeNN(db, pDef); } } @@ -81906,17 +80890,18 @@ static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef){ /* ** Delete a P4 value if necessary. */ -static SQLITE_NOINLINE void freeP4Mem(sqlite3 *db, Mem *p){ - if( p->szMalloc ) sqlite3DbFree(db, p->zMalloc); +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){ +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 ){ +static void freeP4(sqlite3* db, int p4type, void* p4) { + assert(db); + switch (p4type) { case P4_FUNCCTX: { freeP4FuncCtx(db, (sqlite3_context*)p4); break; @@ -81929,7 +80914,8 @@ static void freeP4(sqlite3 *db, int p4type, void *p4){ break; } case P4_KEYINFO: { - if( db->pnBytesFreed==0 ) sqlite3KeyInfoUnref((KeyInfo*)p4); + if (db->pnBytesFreed == 0) + sqlite3KeyInfoUnref((KeyInfo*)p4); break; } #ifdef SQLITE_ENABLE_CURSOR_HINTS @@ -81943,15 +80929,16 @@ static void freeP4(sqlite3 *db, int p4type, void *p4){ break; } case P4_MEM: { - if( db->pnBytesFreed==0 ){ + if (db->pnBytesFreed == 0) { sqlite3ValueFree((sqlite3_value*)p4); - }else{ + } else { freeP4Mem(db, (Mem*)p4); } break; } - case P4_VTAB : { - if( db->pnBytesFreed==0 ) sqlite3VtabUnlock((VTable *)p4); + case P4_VTAB: { + if (db->pnBytesFreed == 0) + sqlite3VtabUnlock((VTable*)p4); break; } } @@ -81962,16 +80949,18 @@ static void freeP4(sqlite3 *db, int p4type, void *p4){ ** 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); +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; + if (pOp == aOp) + break; pOp--; } sqlite3DbFreeNN(db, aOp); @@ -81983,7 +80972,7 @@ static void vdbeFreeOpArray(sqlite3 *db, Op *aOp, int nOp){ ** 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){ +SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe* pVdbe, SubProgram* p) { p->pNext = pVdbe->pProgram; pVdbe->pProgram = p; } @@ -81991,17 +80980,18 @@ SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *pVdbe, SubProgram *p){ /* ** Return true if the given Vdbe has any SubPrograms. */ -SQLITE_PRIVATE int sqlite3VdbeHasSubProgram(Vdbe *pVdbe){ - return pVdbe->pProgram!=0; +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 ); +SQLITE_PRIVATE int sqlite3VdbeChangeToNoop(Vdbe* p, int addr) { + VdbeOp* pOp; + if (p->db->mallocFailed) + return 0; + assert(addr >= 0 && addr < p->nOp); pOp = &p->aOp[addr]; freeP4(p->db, pOp->p4type, pOp->p4.p); pOp->p4type = P4_NOTUSED; @@ -82014,10 +81004,10 @@ SQLITE_PRIVATE int sqlite3VdbeChangeToNoop(Vdbe *p, int addr){ ** 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{ +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; } } @@ -82027,36 +81017,36 @@ SQLITE_PRIVATE int sqlite3VdbeDeletePriorOpcode(Vdbe *p, u8 op){ ** 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 ){ +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); + while (N > 0 && N <= 32 && (mask & MASKBIT32(N - 1)) != 0) { + mask &= ~MASKBIT32(N - 1); N--; } } - if( N>0 ){ + if (N > 0) { sqlite3VdbeAddOp3(pParse->pVdbe, OP_ReleaseReg, iFirst, N, *(int*)&mask); - if( bUndefine ) sqlite3VdbeChangeP5(pParse->pVdbe, 1); + 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 @@ -82074,56 +81064,54 @@ SQLITE_PRIVATE void sqlite3VdbeReleaseRegisters( ** ** 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 ){ +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 ){ + if (n < 0) { sqlite3VdbeChangeP4(p, (int)(pOp - p->aOp), zP4, n); - }else{ - if( n==0 ) n = sqlite3Strlen30(zP4); + } 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 ); +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); + 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 ){ + assert(p->nOp > 0); + assert(addr < p->nOp); + if (addr < 0) { addr = p->nOp - 1; } pOp = &p->aOp[addr]; - if( n>=0 || pOp->p4type ){ + if (n >= 0 || pOp->p4type) { vdbeChangeP4Full(p, pOp, zP4, n); return; } - if( n==P4_INT32 ){ + 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 ); + } else if (zP4 != 0) { + assert(n < 0); pOp->p4.p = (void*)zP4; pOp->p4type = (signed char)n; - if( n==P4_VTAB ) sqlite3VtabLock((VTable*)zP4); + if (n == P4_VTAB) + sqlite3VtabLock((VTable*)zP4); } } @@ -82136,17 +81124,17 @@ SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe *p, int addr, const char *zP4, int ** 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 ){ +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 ); + } 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; } @@ -82156,13 +81144,14 @@ SQLITE_PRIVATE void sqlite3VdbeAppendP4(Vdbe *p, void *pP4, int n){ ** 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 ); +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); + if (pKeyInfo) + sqlite3VdbeAppendP4(v, pKeyInfo, P4_KEYINFO); } #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS @@ -82172,40 +81161,40 @@ SQLITE_PRIVATE void sqlite3VdbeSetP4KeyInfo(Parse *pParse, Index *pIdx){ ** 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); +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, ...){ +SQLITE_PRIVATE void sqlite3VdbeComment(Vdbe* p, const char* zFormat, ...) { va_list ap; - if( p ){ + if (p) { va_start(ap, zFormat); vdbeVComment(p, zFormat, ap); va_end(ap); } } -SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe *p, const char *zFormat, ...){ +SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe* p, const char* zFormat, ...) { va_list ap; - if( p ){ + if (p) { sqlite3VdbeAddOp0(p, OP_Noop); va_start(ap, zFormat); vdbeVComment(p, zFormat, ap); va_end(ap); } } -#endif /* NDEBUG */ +#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; +SQLITE_PRIVATE void sqlite3VdbeSetLineNumber(Vdbe* v, int iLine) { + sqlite3VdbeGetOp(v, -1)->iSrcLine = iLine; } #endif /* SQLITE_VDBE_COVERAGE */ @@ -82222,18 +81211,18 @@ SQLITE_PRIVATE void sqlite3VdbeSetLineNumber(Vdbe *v, int iLine){ ** 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){ +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 ){ + 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 ){ + assert((addr >= 0 && addr < p->nOp) || p->db->mallocFailed); + if (p->db->mallocFailed) { return (VdbeOp*)&dummy; - }else{ + } else { return &p->aOp[addr]; } } @@ -82243,11 +81232,15 @@ SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe *p, int addr){ ** 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; +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; } @@ -82264,13 +81257,12 @@ static int translateP(char c, const Op *pOp){ ** "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; +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]; @@ -82279,70 +81271,70 @@ SQLITE_PRIVATE char *sqlite3VdbeDisplayComment( sqlite3StrAccumInit(&x, 0, 0, 0, SQLITE_MAX_LENGTH); zOpName = sqlite3OpcodeName(pOp->opcode); nOpName = sqlite3Strlen30(zOpName); - if( zOpName[nOpName+1] ){ + 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); + 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' ){ + for (ii = 0; (c = zSynopsis[ii]) != 0; ii++) { + if (c == 'P') { c = zSynopsis[++ii]; - if( c=='4' ){ + if (c == '4') { sqlite3_str_appendall(&x, zP4); - }else if( c=='X' ){ - if( pOp->zComment && pOp->zComment[0] ){ + } else if (c == 'X') { + if (pOp->zComment && pOp->zComment[0]) { sqlite3_str_appendall(&x, pOp->zComment); seenCom = 1; break; } - }else{ + } else { int v1 = translateP(c, pOp); int v2; - if( strncmp(zSynopsis+ii+1, "@P", 2)==0 ){ + if (strncmp(zSynopsis + ii + 1, "@P", 2) == 0) { ii += 3; v2 = translateP(zSynopsis[ii], pOp); - if( strncmp(zSynopsis+ii+1,"+1",2)==0 ){ + if (strncmp(zSynopsis + ii + 1, "+1", 2) == 0) { ii += 2; v2++; } - if( v2<2 ){ + if (v2 < 2) { sqlite3_str_appendf(&x, "%d", v1); - }else{ - sqlite3_str_appendf(&x, "%d..%d", v1, v1+v2-1); + } 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 ){ + } 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 ); + } 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{ + } else { sqlite3_str_appendf(&x, "%d", v1); - if( strncmp(zSynopsis+ii+1, "..P3", 4)==0 && pOp->p3==0 ){ + if (strncmp(zSynopsis + ii + 1, "..P3", 4) == 0 && pOp->p3 == 0) { ii += 4; } } } - }else{ + } else { sqlite3_str_appendchar(&x, 1, c); } } - if( !seenCom && pOp->zComment ){ + if (!seenCom && pOp->zComment) { sqlite3_str_appendf(&x, "; %s", pOp->zComment); } - }else if( pOp->zComment ){ + } else if (pOp->zComment) { sqlite3_str_appendall(&x, pOp->zComment); } - if( (x.accError & SQLITE_NOMEM)!=0 && db!=0 ){ + if ((x.accError & SQLITE_NOMEM) != 0 && db != 0) { sqlite3OomFault(db); } return sqlite3StrAccumFinish(&x); @@ -82354,11 +81346,11 @@ SQLITE_PRIVATE char *sqlite3VdbeDisplayComment( ** 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 ){ +static void displayP4Expr(StrAccum* p, Expr* pExpr) { + const char* zOp = 0; + switch (pExpr->op) { case TK_STRING: - assert( !ExprHasProperty(pExpr, EP_IntValue) ); + assert(!ExprHasProperty(pExpr, EP_IntValue)); sqlite3_str_appendf(p, "%Q", pExpr->u.zToken); break; case TK_INTEGER: @@ -82372,49 +81364,101 @@ static void displayP4Expr(StrAccum *p, Expr *pExpr){ break; } case TK_COLUMN: { - if( pExpr->iColumn<0 ){ + if (pExpr->iColumn < 0) { sqlite3_str_appendf(p, "rowid"); - }else{ + } 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; + 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 ){ + if (zOp) { sqlite3_str_appendf(p, "%s(", zOp); displayP4Expr(p, pExpr->pLeft); - if( pExpr->pRight ){ + if (pExpr->pRight) { sqlite3_str_append(p, ",", 1); displayP4Expr(p, pExpr->pRight); } @@ -82423,31 +81467,29 @@ static void displayP4Expr(StrAccum *p, Expr *pExpr){ } #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; +SQLITE_PRIVATE char* sqlite3VdbeDisplayP4(sqlite3* db, Op* pOp) { + char* zP4 = 0; StrAccum x; sqlite3StrAccumInit(&x, 0, 0, 0, SQLITE_MAX_LENGTH); - switch( pOp->p4type ){ + switch (pOp->p4type) { case P4_KEYINFO: { int j; - KeyInfo *pKeyInfo = pOp->p4.pKeyInfo; - assert( pKeyInfo->aSortFlags!=0 ); + 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); + for (j = 0; j < pKeyInfo->nKeyField; 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; @@ -82459,20 +81501,19 @@ SQLITE_PRIVATE char *sqlite3VdbeDisplayP4(sqlite3 *db, Op *pOp){ } #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]); + 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; + 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; + FuncDef* pDef = pOp->p4.pCtx->pFunc; sqlite3_str_appendf(&x, "%s(%d)", pDef->zName, pDef->nArg); break; } @@ -82489,35 +81530,35 @@ SQLITE_PRIVATE char *sqlite3VdbeDisplayP4(sqlite3 *db, Op *pOp){ break; } case P4_MEM: { - Mem *pMem = pOp->p4.pMem; - if( pMem->flags & MEM_Str ){ + Mem* pMem = pOp->p4.pMem; + if (pMem->flags & MEM_Str) { zP4 = pMem->z; - }else if( pMem->flags & (MEM_Int|MEM_IntReal) ){ + } else if (pMem->flags & (MEM_Int | MEM_IntReal)) { sqlite3_str_appendf(&x, "%lld", pMem->u.i); - }else if( pMem->flags & MEM_Real ){ + } else if (pMem->flags & MEM_Real) { sqlite3_str_appendf(&x, "%.16g", pMem->u.r); - }else if( pMem->flags & MEM_Null ){ + } else if (pMem->flags & MEM_Null) { zP4 = "NULL"; - }else{ - assert( pMem->flags & MEM_Blob ); + } else { + assert(pMem->flags & MEM_Blob); zP4 = "(blob)"; } break; } #ifndef SQLITE_OMIT_VIRTUALTABLE case P4_VTAB: { - sqlite3_vtab *pVtab = pOp->p4.pVtab->pVtab; + 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]); + 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; @@ -82534,8 +81575,9 @@ SQLITE_PRIVATE char *sqlite3VdbeDisplayP4(sqlite3 *db, Op *pOp){ zP4 = pOp->p4.z; } } - if( zP4 ) sqlite3_str_appendall(&x, zP4); - if( (x.accError & SQLITE_NOMEM)!=0 ){ + if (zP4) + sqlite3_str_appendall(&x, zP4); + if ((x.accError & SQLITE_NOMEM) != 0) { sqlite3OomFault(db); } return sqlite3StrAccumFinish(&x); @@ -82550,11 +81592,11 @@ SQLITE_PRIVATE char *sqlite3VdbeDisplayP4(sqlite3 *db, Op *pOp){ ** 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 ); +SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe* p, int i) { + assert(i >= 0 && i < p->db->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) ){ + if (i != 1 && sqlite3BtreeSharable(p->db->aDb[i].pBt)) { DbMaskSet(p->lockMask, i); } } @@ -82581,43 +81623,45 @@ SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe *p, int i){ ** 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){ +SQLITE_PRIVATE void sqlite3VdbeEnter(Vdbe* p) { int i; - sqlite3 *db; - Db *aDb; + sqlite3* db; + Db* aDb; int nDb; - if( DbMaskAllZero(p->lockMask) ) return; /* The common case */ + 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) ){ + for (i = 0; i < nDb; i++) { + if (i != 1 && DbMaskTest(p->lockMask, i) && ALWAYS(aDb[i].pBt != 0)) { sqlite3BtreeEnter(aDb[i].pBt); } } } #endif -#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE>0 +#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){ +static SQLITE_NOINLINE void vdbeLeave(Vdbe* p) { int i; - sqlite3 *db; - Db *aDb; + 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) ){ + for (i = 0; i < nDb; i++) { + if (i != 1 && DbMaskTest(p->lockMask, i) && ALWAYS(aDb[i].pBt != 0)) { sqlite3BtreeLeave(aDb[i].pBt); } } } -SQLITE_PRIVATE void sqlite3VdbeLeave(Vdbe *p){ - if( DbMaskAllZero(p->lockMask) ) return; /* The common case */ +SQLITE_PRIVATE void sqlite3VdbeLeave(Vdbe* p) { + if (DbMaskAllZero(p->lockMask)) + return; /* The common case */ vdbeLeave(p); } #endif @@ -82626,12 +81670,13 @@ SQLITE_PRIVATE void sqlite3VdbeLeave(Vdbe *p){ /* ** 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; +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; + 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); @@ -82643,11 +81688,7 @@ SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE *pOut, int pc, VdbeOp *pOp){ /* 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 : "" - ); + 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); @@ -82670,9 +81711,9 @@ SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE *pOut, int pc, VdbeOp *pOp){ ** 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{ +static void initMemArray(Mem* p, int N, sqlite3* db, u16 flags) { + if (N > 0) { + do { p->flags = flags; p->db = db; p->szMalloc = 0; @@ -82680,7 +81721,7 @@ static void initMemArray(Mem *p, int N, sqlite3 *db, u16 flags){ p->pScopyFrom = 0; #endif p++; - }while( (--N)>0 ); + } while ((--N) > 0); } } @@ -82692,19 +81733,20 @@ static void initMemArray(Mem *p, int N, sqlite3 *db, u16 flags){ ** 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)db; + if (db->pnBytesFreed) { + do { + if (p->szMalloc) + sqlite3DbFree(db, p->zMalloc); + } while ((++p) < pEnd); return; } - do{ - assert( (&p[1])==pEnd || p[0].db==p[1].db ); - assert( sqlite3VdbeCheckMemInvariants(p) ); + do { + assert((&p[1]) == pEnd || p[0].db == p[1].db); + assert(sqlite3VdbeCheckMemInvariants(p)); /* This block is really an inlined version of sqlite3VdbeMemRelease() ** that takes advantage of the fact that the memory cell value is @@ -82718,23 +81760,23 @@ static void releaseMemArray(Mem *p, int N){ ** with no indexes using a single prepared INSERT statement, bind() ** and reset(). Inserts are grouped into a transaction. */ - testcase( 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 ); + testcase(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 ){ + } else if (p->szMalloc) { sqlite3DbFreeNN(db, p->zMalloc); p->szMalloc = 0; p->flags = MEM_Undefined; } #ifdef SQLITE_DEBUG - else{ + else { p->flags = MEM_Undefined; } #endif - }while( (++p)iFrameMagic!=SQLITE_FRAME_MAGIC ) return 0; +SQLITE_PRIVATE int sqlite3VdbeFrameIsValid(VdbeFrame* pFrame) { + if (pFrame->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. @@ -82759,9 +81801,9 @@ SQLITE_PRIVATE int sqlite3VdbeFrameIsValid(VdbeFrame *pFrame){ ** 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) ); +SQLITE_PRIVATE void sqlite3VdbeFrameMemDel(void* pArg) { + VdbeFrame* pFrame = (VdbeFrame*)pArg; + assert(sqlite3VdbeFrameIsValid(pFrame)); pFrame->pParent = pFrame->v->pDelFrame; pFrame->v->pDelFrame = pFrame; } @@ -82774,21 +81816,20 @@ SQLITE_PRIVATE void sqlite3VdbeFrameMemDel(void *pArg){ ** 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 */ +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. @@ -82798,39 +81839,39 @@ SQLITE_PRIVATE int sqlite3VdbeNextOpcode( ** encountered, but p->pc will eventually catch up to nRow. */ nRow = p->nOp; - if( pSub!=0 ){ - if( pSub->flags&MEM_Blob ){ + 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; + nSub = pSub->n / sizeof(Vdbe*); + apSub = (SubProgram**)pSub->z; } - for(i=0; inOp; } } iPc = *piPc; - while(1){ /* Loop exits via break */ + while (1) { /* Loop exits via break */ i = iPc++; - if( i>=nRow ){ + if (i >= nRow) { p->rc = SQLITE_OK; rc = SQLITE_DONE; break; } - if( inOp ){ + if (i < p->nOp) { /* The rowid is small enough that we are still in the ** main program. */ aOp = p->aOp; - }else{ + } 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++){ + assert(apSub != 0); + assert(nSub > 0); + for (j = 0; i >= apSub[j]->nOp; j++) { i -= apSub[j]->nOp; - assert( inOp || j+1nOp || j + 1 < nSub); } aOp = apSub[j]->aOp; } @@ -82840,38 +81881,45 @@ SQLITE_PRIVATE int sqlite3VdbeNextOpcode( ** 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*); + 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 ){ + if (j == nSub) { + p->rc = sqlite3VdbeMemGrow(pSub, nByte, nSub != 0); + if (p->rc != SQLITE_OK) { rc = SQLITE_ERROR; break; } - apSub = (SubProgram **)pSub->z; + apSub = (SubProgram**)pSub->z; apSub[nSub++] = aOp[i].p4.pProgram; MemSetTypeFlag(pSub, MEM_Blob); - pSub->n = nSub*sizeof(SubProgram*); + pSub->n = nSub * sizeof(SubProgram*); nRow += aOp[i].p4.pProgram->nOp; } } - if( eMode==0 ) break; + 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 + 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; + assert(eMode == 1); + if (aOp[i].opcode == OP_Explain) + break; + if (aOp[i].opcode == OP_Init && iPc > 1) + break; } } *piPc = iPc; @@ -82881,18 +81929,18 @@ SQLITE_PRIVATE int sqlite3VdbeNextOpcode( } #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){ +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]); + Mem* aMem = VdbeFrameMem(p); + VdbeCursor** apCsr = (VdbeCursor**)&aMem[p->nChildMem]; + assert(sqlite3VdbeFrameIsValid(p)); + for (i = 0; i < p->nChildCsr; i++) { + if (apCsr[i]) + sqlite3VdbeFreeCursorNN(p->v, apCsr[i]); } releaseMemArray(aMem, p->nChildMem); sqlite3VdbeDeleteAuxData(p->v->db, &p->pAuxData, -1, 0); @@ -82918,21 +81966,20 @@ SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame *p){ ** 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 */ +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 ); + 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 @@ -82941,66 +81988,65 @@ SQLITE_PRIVATE int sqlite3VdbeList( releaseMemArray(pMem, 8); p->pResultSet = 0; - if( p->rc==SQLITE_NOMEM ){ + 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 ){ + 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 ); + assert(p->nMem > 9); pSub = &p->aMem[9]; - }else{ + } else { pSub = 0; } /* Figure out which opcode is next to display */ - rc = sqlite3VdbeNextOpcode(p, pSub, p->explain==2, &p->pc, &i, &aOp); + rc = sqlite3VdbeNextOpcode(p, pSub, p->explain == 2, &p->pc, &i, &aOp); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pOp = aOp + i; - if( AtomicLoad(&db->u1.isInterrupted) ){ + 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 ){ + } 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); + 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); + } 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); + 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); + char* zCom = sqlite3VdbeDisplayComment(db, pOp, zP4); + sqlite3VdbeMemSetStr(pMem + 7, zCom, -1, SQLITE_UTF8, sqlite3_free); } #else - sqlite3VdbeMemSetNull(pMem+7); + sqlite3VdbeMemSetNull(pMem + 7); #endif - sqlite3VdbeMemSetStr(pMem+5, zP4, -1, SQLITE_UTF8, sqlite3_free); + sqlite3VdbeMemSetStr(pMem + 5, zP4, -1, SQLITE_UTF8, sqlite3_free); p->nResColumn = 8; } p->pResultSet = pMem; - if( db->mallocFailed ){ + if (db->mallocFailed) { p->rc = SQLITE_NOMEM; rc = SQLITE_ERROR; - }else{ + } else { p->rc = SQLITE_OK; rc = SQLITE_ROW; } @@ -83014,18 +82060,20 @@ SQLITE_PRIVATE int sqlite3VdbeList( /* ** Print the SQL that was used to generate a VDBE program. */ -SQLITE_PRIVATE void sqlite3VdbePrintSql(Vdbe *p){ - const char *z = 0; - if( p->zSql ){ +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 ){ + } 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++; + while (sqlite3Isspace(*z)) + z++; } } - if( z ) printf("SQL: [%s]\n", z); + if (z) + printf("SQL: [%s]\n", z); } #endif @@ -83033,23 +82081,26 @@ SQLITE_PRIVATE void sqlite3VdbePrintSql(Vdbe *p){ /* ** Print an IOTRACE message showing SQL content. */ -SQLITE_PRIVATE void sqlite3VdbeIOTraceSql(Vdbe *p){ +SQLITE_PRIVATE void sqlite3VdbeIOTraceSql(Vdbe* p) { int nOp = p->nOp; - VdbeOp *pOp; - if( sqlite3IoTrace==0 ) return; - if( nOp<1 ) return; + VdbeOp* pOp; + if (sqlite3IoTrace == 0) + return; + if (nOp < 1) + return; pOp = &p->aOp[0]; - if( pOp->opcode==OP_Init && pOp->p4.z!=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]!=' ' ){ + for (i = 0; sqlite3Isspace(z[i]); i++) { + } + for (j = 0; z[i]; i++) { + if (sqlite3Isspace(z[i])) { + if (z[i - 1] != ' ') { z[j++] = ' '; } - }else{ + } else { z[j++] = z[i]; } } @@ -83064,7 +82115,7 @@ SQLITE_PRIVATE void sqlite3VdbeIOTraceSql(Vdbe *p){ ** of a ReusableSpace object by the allocSpace() routine below. */ struct ReusableSpace { - u8 *pSpace; /* Available memory */ + u8* pSpace; /* Available memory */ sqlite3_int64 nFree; /* Bytes of available memory */ sqlite3_int64 nNeeded; /* Total bytes that could not be allocated */ }; @@ -83083,22 +82134,21 @@ struct ReusableSpace { ** 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 ){ +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 ){ + if (nByte <= p->nFree) { p->nFree -= nByte; pBuf = &p->pSpace[p->nFree]; - }else{ + } else { p->nNeeded += nByte; } } - assert( EIGHT_BYTE_ALIGNMENT(pBuf) ); + assert(EIGHT_BYTE_ALIGNMENT(pBuf)); return pBuf; } @@ -83106,24 +82156,22 @@ static void *allocSpace( ** Rewind the VDBE back to the beginning in preparation for ** running it. */ -SQLITE_PRIVATE void sqlite3VdbeRewind(Vdbe *p){ +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 ); + 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 ); + */ + assert(p->nOp > 0); p->eVdbeState = VDBE_READY_STATE; #ifdef SQLITE_DEBUG - for(i=0; inMem; i++){ - assert( p->aMem[i].db==p->db ); + for (i = 0; i < p->nMem; i++) { + assert(p->aMem[i].db == p->db); } #endif p->pc = -1; @@ -83135,7 +82183,7 @@ SQLITE_PRIVATE void sqlite3VdbeRewind(Vdbe *p){ p->iStatement = 0; p->nFkConstraint = 0; #ifdef VDBE_PROFILE - for(i=0; inOp; i++){ + for (i = 0; i < p->nOp; i++) { p->aOp[i].cnt = 0; p->aOp[i].cycles = 0; } @@ -83160,27 +82208,26 @@ SQLITE_PRIVATE void sqlite3VdbeRewind(Vdbe *p){ ** 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 ); +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; + pParse->pVList = 0; db = p->db; - assert( db->mallocFailed==0 ); + assert(db->mallocFailed == 0); nVar = pParse->nVar; nMem = pParse->nMem; nCursor = pParse->nTab; @@ -83192,41 +82239,39 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( ** See also: allocateCursor(). */ nMem += nCursor; - if( nCursor==0 && nMem>0 ) nMem++; /* Space for aMem[0] even if not used */ + 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]) ); + 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" - }; + 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; + if (nMem < 10) + nMem = 10; p->explain = pParse->explain; - if( pParse->explain==2 ){ + if (pParse->explain == 2) { sqlite3VdbeSetNumCols(p, 4); iFirst = 8; mx = 12; - }else{ + } else { sqlite3VdbeSetNumCols(p, 8); iFirst = 0; mx = 8; } - for(i=iFirst; iexpired = 0; @@ -83242,40 +82287,40 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( ** 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*)); + 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)); + p->anExec = allocSpace(&x, 0, p->nOp * sizeof(i64)); #endif - if( x.nNeeded ){ + 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*)); + 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)); + p->anExec = allocSpace(&x, p->anExec, p->nOp * sizeof(i64)); #endif } } - if( db->mallocFailed ){ + if (db->mallocFailed) { p->nVar = 0; p->nCursor = 0; p->nMem = 0; - }else{ + } 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*)); + memset(p->apCsr, 0, nCursor * sizeof(VdbeCursor*)); #ifdef SQLITE_ENABLE_STMT_SCANSTATUS - memset(p->anExec, 0, p->nOp*sizeof(i64)); + memset(p->anExec, 0, p->nOp * sizeof(i64)); #endif } sqlite3VdbeRewind(p); @@ -83285,25 +82330,26 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( ** 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 sqlite3VdbeFreeCursor(Vdbe* p, VdbeCursor* pCx) { + if (pCx) + sqlite3VdbeFreeCursorNN(p, pCx); } -SQLITE_PRIVATE void sqlite3VdbeFreeCursorNN(Vdbe *p, VdbeCursor *pCx){ - switch( pCx->eCurType ){ +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 ); + 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 ); + 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; @@ -83315,11 +82361,11 @@ SQLITE_PRIVATE void sqlite3VdbeFreeCursorNN(Vdbe *p, VdbeCursor *pCx){ /* ** Close all cursors in the current frame. */ -static void closeCursorsInFrame(Vdbe *p){ +static void closeCursorsInFrame(Vdbe* p) { int i; - for(i=0; inCursor; i++){ - VdbeCursor *pC = p->apCsr[i]; - if( pC ){ + for (i = 0; i < p->nCursor; i++) { + VdbeCursor* pC = p->apCsr[i]; + if (pC) { sqlite3VdbeFreeCursorNN(p, pC); p->apCsr[i] = 0; } @@ -83331,8 +82377,8 @@ static void closeCursorsInFrame(Vdbe *p){ ** 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; +SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame* pFrame) { + Vdbe* v = pFrame->v; closeCursorsInFrame(v); #ifdef SQLITE_ENABLE_STMT_SCANSTATUS v->anExec = pFrame->anExec; @@ -83360,26 +82406,28 @@ SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame *pFrame){ ** 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); +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 ); + assert(p->nFrame == 0); closeCursorsInFrame(p); releaseMemArray(p->aMem, p->nMem); - while( p->pDelFrame ){ - VdbeFrame *pDel = p->pDelFrame; + 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 ); + if (p->pAuxData) + sqlite3VdbeDeleteAuxData(p->db, &p->pAuxData, -1, 0); + assert(p->pAuxData == 0); } /* @@ -83388,18 +82436,19 @@ static void closeAllCursors(Vdbe *p){ ** 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){ +SQLITE_PRIVATE void sqlite3VdbeSetNumCols(Vdbe* p, int nResColumn) { int n; - sqlite3 *db = p->db; + sqlite3* db = p->db; - if( p->nResColumn ){ - releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); + if (p->nResColumn) { + releaseMemArray(p->aColName, p->nResColumn * COLNAME_N); sqlite3DbFree(db, p->aColName); } - n = nResColumn*COLNAME_N; + n = nResColumn * COLNAME_N; p->nResColumn = (u16)nResColumn; - p->aColName = (Mem*)sqlite3DbMallocRawNN(db, sizeof(Mem)*n ); - if( p->aColName==0 ) return; + p->aColName = (Mem*)sqlite3DbMallocRawNN(db, sizeof(Mem) * n); + if (p->aColName == 0) + return; initMemArray(p->aColName, n, db, MEM_Null); } @@ -83413,25 +82462,24 @@ SQLITE_PRIVATE void sqlite3VdbeSetNumCols(Vdbe *p, int nResColumn){ ** 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 */ -){ +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 ); + Mem* pColName; + assert(idx < p->nResColumn); + assert(var < COLNAME_N); + if (p->db->mallocFailed) { + assert(!zName || xDel != SQLITE_DYNAMIC); return SQLITE_NOMEM_BKPT; } - assert( p->aColName!=0 ); - pColName = &(p->aColName[idx+var*p->nResColumn]); + 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 ); + assert(rc != 0 || !zName || (pColName->flags & MEM_Term) != 0); return rc; } @@ -83441,11 +82489,11 @@ SQLITE_PRIVATE int sqlite3VdbeSetColName( ** write-transaction spanning more than one database file, this routine ** takes care of the super-journal trickery. */ -static int vdbeCommit(sqlite3 *db, Vdbe *p){ +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 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; @@ -83470,43 +82518,39 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ ** 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 ){ + for (i = 0; rc == SQLITE_OK && i < db->nDb; 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 */ + 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 ); + 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 ){ + if (rc != SQLITE_OK) { return rc; } /* If there are any write-transactions at all, invoke the commit hook */ - if( needXcommit && db->xCommitCallback ){ + if (needXcommit && db->xCommitCallback) { rc = db->xCommitCallback(db->pCommitArg); - if( rc ){ + if (rc) { return SQLITE_CONSTRAINT_COMMITHOOK; } } @@ -83520,12 +82564,10 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ ** 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 ){ + if (0 == sqlite3Strlen30(sqlite3BtreeGetFilename(db->aDb[0].pBt)) || nTrans <= 1) { + for (i = 0; rc == SQLITE_OK && i < db->nDb; i++) { + Btree* pBt = db->aDb[i].pBt; + if (pBt) { rc = sqlite3BtreeCommitPhaseOne(pBt, 0); } } @@ -83535,13 +82577,13 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ ** 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 ){ + for (i = 0; rc == SQLITE_OK && i < db->nDb; i++) { + Btree* pBt = db->aDb[i].pBt; + if (pBt) { rc = sqlite3BtreeCommitPhaseTwo(pBt, 0); } } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { sqlite3VtabCommit(db); } } @@ -83551,11 +82593,11 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ ** 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; + 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; @@ -83563,39 +82605,37 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ /* 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 = 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 ){ + if (retryCount) { + if (retryCount > 100) { sqlite3_log(SQLITE_FULL, "MJ delete: %s", zSuper); sqlite3OsDelete(pVfs, zSuper, 0); break; - }else if( retryCount==1 ){ + } 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); + 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' ); + 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 ){ + } 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 - ); + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_SUPER_JOURNAL, 0); } - if( rc!=SQLITE_OK ){ - sqlite3DbFree(db, zSuper-4); + if (rc != SQLITE_OK) { + sqlite3DbFree(db, zSuper - 4); return rc; } @@ -83605,20 +82645,20 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ ** 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 ){ + for (i = 0; i < db->nDb; 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); + sqlite3DbFree(db, zSuper - 4); return rc; } } @@ -83627,12 +82667,11 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ /* 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)) - ){ + 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); + sqlite3DbFree(db, zSuper - 4); return rc; } @@ -83646,16 +82685,16 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ ** 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 ){ + for (i = 0; rc == SQLITE_OK && i < db->nDb; 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); + assert(rc != SQLITE_BUSY); + if (rc != SQLITE_OK) { + sqlite3DbFree(db, zSuper - 4); return rc; } @@ -83664,9 +82703,9 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ ** transaction files are deleted. */ rc = sqlite3OsDelete(pVfs, zSuper, 1); - sqlite3DbFree(db, zSuper-4); + sqlite3DbFree(db, zSuper - 4); zSuper = 0; - if( rc ){ + if (rc) { return rc; } @@ -83679,9 +82718,9 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ */ disable_simulated_io_errors(); sqlite3BeginBenignMalloc(); - for(i=0; inDb; i++){ - Btree *pBt = db->aDb[i].pBt; - if( pBt ){ + for (i = 0; i < db->nDb; i++) { + Btree* pBt = db->aDb[i].pBt; + if (pBt) { sqlite3BtreeCommitPhaseTwo(pBt, 1); } } @@ -83705,23 +82744,25 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ ** This is a no-op if NDEBUG is defined. */ #ifndef NDEBUG -static void checkActiveVdbeCnt(sqlite3 *db){ - Vdbe *p; +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) ){ + while (p) { + if (sqlite3_stmt_busy((sqlite3_stmt*)p)) { cnt++; - if( p->readOnly==0 ) nWrite++; - if( p->bIsReader ) nRead++; + if (p->readOnly == 0) + nWrite++; + if (p->bIsReader) + nRead++; } p = p->pNext; } - assert( cnt==db->nVdbeActive ); - assert( nWrite==db->nVdbeWrite ); - assert( nRead==db->nVdbeRead ); + assert(cnt == db->nVdbeActive); + assert(nWrite == db->nVdbeWrite); + assert(nRead == db->nVdbeRead); } #else #define checkActiveVdbeCnt(x) @@ -83737,27 +82778,27 @@ static void checkActiveVdbeCnt(sqlite3 *db){ ** 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; +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; + const int iSavepoint = p->iStatement - 1; - assert( eOp==SAVEPOINT_ROLLBACK || eOp==SAVEPOINT_RELEASE); - assert( db->nStatement>0 ); - assert( p->iStatement==(db->nStatement+db->nSavepoint) ); + assert(eOp == SAVEPOINT_ROLLBACK || eOp == SAVEPOINT_RELEASE); + assert(db->nStatement > 0); + assert(p->iStatement == (db->nStatement + db->nSavepoint)); - for(i=0; inDb; i++){ + for (i = 0; i < db->nDb; i++) { int rc2 = SQLITE_OK; - Btree *pBt = db->aDb[i].pBt; - if( pBt ){ - if( eOp==SAVEPOINT_ROLLBACK ){ + Btree* pBt = db->aDb[i].pBt; + if (pBt) { + if (eOp == SAVEPOINT_ROLLBACK) { rc2 = sqlite3BtreeSavepoint(pBt, SAVEPOINT_ROLLBACK, iSavepoint); } - if( rc2==SQLITE_OK ){ + if (rc2 == SQLITE_OK) { rc2 = sqlite3BtreeSavepoint(pBt, SAVEPOINT_RELEASE, iSavepoint); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = rc2; } } @@ -83765,11 +82806,11 @@ static SQLITE_NOINLINE int vdbeCloseStatement(Vdbe *p, int eOp){ db->nStatement--; p->iStatement = 0; - if( rc==SQLITE_OK ){ - if( eOp==SAVEPOINT_ROLLBACK ){ + if (rc == SQLITE_OK) { + if (eOp == SAVEPOINT_ROLLBACK) { rc = sqlite3VtabSavepoint(db, SAVEPOINT_ROLLBACK, iSavepoint); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = sqlite3VtabSavepoint(db, SAVEPOINT_RELEASE, iSavepoint); } } @@ -83777,20 +82818,19 @@ static SQLITE_NOINLINE int vdbeCloseStatement(Vdbe *p, int eOp){ /* 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 ){ + 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 ){ +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 @@ -83802,15 +82842,14 @@ SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *p, int eOp){ ** 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) - ){ +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; + if ((p->prepFlags & SQLITE_PREPARE_SAVESQL) == 0) + return SQLITE_ERROR; return SQLITE_CONSTRAINT_FOREIGNKEY; } return SQLITE_OK; @@ -83830,9 +82869,9 @@ SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *p, int deferred){ ** 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; +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 @@ -83850,8 +82889,8 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ ** one, or the complete transaction if there is no statement transaction. */ - assert( p->eVdbeState==VDBE_RUN_STATE ); - if( db->mallocFailed ){ + assert(p->eVdbeState == VDBE_RUN_STATE); + if (db->mallocFailed) { p->rc = SQLITE_NOMEM_BKPT; } closeAllCursors(p); @@ -83859,25 +82898,22 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ /* 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 */ + if (p->bIsReader) { + int mrc; /* Primary error code from p->rc */ int eStatementOp = 0; - int isSpecialError; /* Set to true if a 'special' error */ + 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 ){ + if (p->rc) { mrc = p->rc & 0xff; - isSpecialError = mrc==SQLITE_NOMEM - || mrc==SQLITE_IOERR - || mrc==SQLITE_INTERRUPT - || mrc==SQLITE_FULL; - }else{ + isSpecialError = mrc == SQLITE_NOMEM || mrc == SQLITE_IOERR || mrc == SQLITE_INTERRUPT || mrc == SQLITE_FULL; + } else { mrc = isSpecialError = 0; } - if( isSpecialError ){ + 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 @@ -83890,10 +82926,10 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ ** 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 ){ + if (!p->readOnly || mrc != SQLITE_INTERRUPT) { + if ((mrc == SQLITE_NOMEM || mrc == SQLITE_FULL) && p->usesStmtJournal) { eStatementOp = SAVEPOINT_ROLLBACK; - }else{ + } else { /* We are forced to roll back the active transaction. Before doing ** so, abort any other statements this handle currently has active. */ @@ -83906,7 +82942,7 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ } /* Check for immediate foreign key violations. */ - if( p->rc==SQLITE_OK || (p->errorAction==OE_Fail && !isSpecialError) ){ + if (p->rc == SQLITE_OK || (p->errorAction == OE_Fail && !isSpecialError)) { sqlite3VdbeCheckFk(p, 0); } @@ -83916,52 +82952,49 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ ** 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) ){ + 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) ){ + if (rc != SQLITE_OK) { + if (NEVER(p->readOnly)) { sqlite3VdbeLeave(p); return SQLITE_ERROR; } rc = SQLITE_CONSTRAINT_FOREIGNKEY; - }else if( db->flags & SQLITE_CorruptRdOnly ){ + } else if (db->flags & SQLITE_CorruptRdOnly) { rc = SQLITE_CORRUPT; db->flags &= ~SQLITE_CorruptRdOnly; - }else{ + } 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 ){ + if (rc == SQLITE_BUSY && p->readOnly) { sqlite3VdbeLeave(p); return SQLITE_BUSY; - }else if( rc!=SQLITE_OK ){ + } else if (rc != SQLITE_OK) { p->rc = rc; sqlite3RollbackAll(db, SQLITE_OK); p->nChange = 0; - }else{ + } else { db->nDeferredCons = 0; db->nDeferredImmCons = 0; db->flags &= ~(u64)SQLITE_DeferFKs; sqlite3CommitInternalChanges(db); } - }else{ + } else { sqlite3RollbackAll(db, SQLITE_OK); p->nChange = 0; } db->nStatement = 0; - }else if( eStatementOp==0 ){ - if( p->rc==SQLITE_OK || p->errorAction==OE_Fail ){ + } else if (eStatementOp == 0) { + if (p->rc == SQLITE_OK || p->errorAction == OE_Fail) { eStatementOp = SAVEPOINT_RELEASE; - }else if( p->errorAction==OE_Abort ){ + } else if (p->errorAction == OE_Abort) { eStatementOp = SAVEPOINT_ROLLBACK; - }else{ + } else { sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); sqlite3CloseSavepoints(db); db->autoCommit = 1; @@ -83975,10 +83008,10 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ ** error code is SQLITE_OK or SQLITE_CONSTRAINT, then promote the ** current statement error code. */ - if( eStatementOp ){ + if (eStatementOp) { rc = sqlite3VdbeCloseStatement(p, eStatementOp); - if( rc ){ - if( p->rc==SQLITE_OK || (p->rc&0xff)==SQLITE_CONSTRAINT ){ + if (rc) { + if (p->rc == SQLITE_OK || (p->rc & 0xff) == SQLITE_CONSTRAINT) { p->rc = rc; sqlite3DbFree(db, p->zErrMsg); p->zErrMsg = 0; @@ -83993,10 +83026,10 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ /* 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 ){ + if (p->changeCntOn) { + if (eStatementOp != SAVEPOINT_ROLLBACK) { sqlite3VdbeSetChanges(db, p->nChange); - }else{ + } else { sqlite3VdbeSetChanges(db, 0); } p->nChange = 0; @@ -84008,14 +83041,16 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *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 ); + 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 ){ + if (db->mallocFailed) { p->rc = SQLITE_NOMEM_BKPT; } @@ -84023,20 +83058,19 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ ** by connection db have now been released. Call sqlite3ConnectionUnlocked() ** to invoke any required unlock-notify callbacks. */ - if( db->autoCommit ){ + if (db->autoCommit) { sqlite3ConnectionUnlocked(db); } - assert( db->nVdbeActive>0 || db->autoCommit==0 || db->nStatement==0 ); - return (p->rc==SQLITE_BUSY ? SQLITE_BUSY : SQLITE_OK); + 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){ +SQLITE_PRIVATE void sqlite3VdbeResetStepResult(Vdbe* p) { p->rc = SQLITE_OK; } @@ -84048,17 +83082,18 @@ SQLITE_PRIVATE void sqlite3VdbeResetStepResult(Vdbe *p){ ** 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; +SQLITE_PRIVATE int sqlite3VdbeTransferError(Vdbe* p) { + sqlite3* db = p->db; int rc = p->rc; - if( p->zErrMsg ){ + if (p->zErrMsg) { db->bBenignMalloc++; sqlite3BeginBenignMalloc(); - if( db->pErr==0 ) db->pErr = sqlite3ValueNew(db); + 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 ){ + } else if (db->pErr) { sqlite3ValueSetNull(db->pErr); } db->errCode = rc; @@ -84071,20 +83106,18 @@ SQLITE_PRIVATE int sqlite3VdbeTransferError(Vdbe *p){ ** 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 - ); +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) +#define vdbeInvokeSqllog(x) #endif /* @@ -84098,45 +83131,49 @@ static void vdbeInvokeSqllog(Vdbe *v){ ** virtual machine from VDBE_RUN_STATE or VDBE_HALT_STATE back to ** VDBE_READY_STATE. */ -SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ +SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe* p) { #if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) int i; #endif - sqlite3 *db; + 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 (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 ){ + if (p->pc >= 0) { vdbeInvokeSqllog(p); - if( db->pErr || p->zErrMsg ){ + if (db->pErr || p->zErrMsg) { sqlite3VdbeTransferError(p); - }else{ + } 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 ); + if (p->apCsr) + for (i = 0; i < p->nCursor; i++) + assert(p->apCsr[i] == 0); + if (p->aMem) { + for (i = 0; i < p->nMem; i++) + assert(p->aMem[i].flags == MEM_Undefined); } #endif - if( p->zErrMsg ){ + if (p->zErrMsg) { sqlite3DbFree(db, p->zErrMsg); p->zErrMsg = 0; } @@ -84146,33 +83183,32 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ #endif /* Save profiling information from this VDBE run. - */ + */ #ifdef VDBE_PROFILE { - FILE *out = fopen("vdbe_profile.out", "a"); - if( out ){ + FILE* out = fopen("vdbe_profile.out", "a"); + if (out) { fprintf(out, "---- "); - for(i=0; inOp; i++){ + for (i = 0; i < p->nOp; i++) { fprintf(out, "%02x", p->aOp[i].opcode); } fprintf(out, "\n"); - if( p->zSql ){ + if (p->zSql) { char c, pc = 0; fprintf(out, "-- "); - for(i=0; (c = p->zSql[i])!=0; i++){ - if( pc=='\n' ) 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"); + if (pc != '\n') + fprintf(out, "\n"); } - for(i=0; inOp; i++){ + for (i = 0; i < p->nOp; 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 - ); + 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]); } @@ -84187,14 +83223,14 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ ** 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){ +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 ){ + assert(VDBE_RUN_STATE > VDBE_READY_STATE); + assert(VDBE_HALT_STATE > VDBE_READY_STATE); + assert(VDBE_INIT_STATE < VDBE_READY_STATE); + if (p->eVdbeState >= VDBE_READY_STATE) { rc = sqlite3VdbeReset(p); - assert( (rc & p->db->errMask)==rc ); + assert((rc & p->db->errMask) == rc); } sqlite3VdbeDelete(p); return rc; @@ -84216,22 +83252,18 @@ SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe *p){ ** * 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 ){ +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; + } else { + pp = &pAux->pNextAux; } } } @@ -84244,22 +83276,24 @@ SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(sqlite3 *db, AuxData **pp, int iOp, ** 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){ +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); + 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){ + 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 ){ + 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); + if (p->pVList) + sqlite3DbFreeNN(db, p->pVList); + if (p->pFree) + sqlite3DbFreeNN(db, p->pFree); } vdbeFreeOpArray(db, p->aOp, p->nOp); sqlite3DbFree(db, p->zSql); @@ -84267,7 +83301,7 @@ static void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ sqlite3DbFree(db, p->zNormSql); { DblquoteStr *pThis, *pNext; - for(pThis=p->pDblStr; pThis; pThis=pNext){ + for (pThis = p->pDblStr; pThis; pThis = pNext) { pNext = pThis->pNextStr; sqlite3DbFree(db, pThis); } @@ -84276,7 +83310,7 @@ static void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ #ifdef SQLITE_ENABLE_STMT_SCANSTATUS { int i; - for(i=0; inScan; i++){ + for (i = 0; i < p->nScan; i++) { sqlite3DbFree(db, p->aScan[i].zName); } sqlite3DbFree(db, p->aScan); @@ -84287,21 +83321,21 @@ static void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ /* ** Delete an entire VDBE. */ -SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe *p){ - sqlite3 *db; +SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe* p) { + sqlite3* db; - assert( p!=0 ); + assert(p != 0); db = p->db; - assert( sqlite3_mutex_held(db->mutex) ); + assert(sqlite3_mutex_held(db->mutex)); sqlite3VdbeClearObject(db, p); - if( db->pnBytesFreed==0 ){ - if( p->pPrev ){ + if (db->pnBytesFreed == 0) { + if (p->pPrev) { p->pPrev->pNext = p->pNext; - }else{ - assert( db->pVdbe==p ); + } else { + assert(db->pVdbe == p); db->pVdbe = p->pNext; } - if( p->pNext ){ + if (p->pNext) { p->pNext->pPrev = p->pPrev; } } @@ -84313,17 +83347,19 @@ SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe *p){ ** carried out. Seek the cursor now. If an error occurs, return ** the appropriate error code. */ -SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeFinishMoveto(VdbeCursor *p){ +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 ); + 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; + if (rc) + return rc; + if (res != 0) + return SQLITE_CORRUPT_BKPT; #ifdef SQLITE_TEST sqlite3_search_count++; #endif @@ -84339,14 +83375,15 @@ SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeFinishMoveto(VdbeCursor *p){ ** 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){ +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) ); + 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; + if (isDifferentRow) + p->nullRow = 1; return rc; } @@ -84354,9 +83391,9 @@ SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeHandleMovedCursor(VdbeCursor *p){ ** 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) ){ +SQLITE_PRIVATE int sqlite3VdbeCursorRestore(VdbeCursor* p) { + assert(p->eCurType == CURTYPE_BTREE || IsNullCursor(p)); + if (sqlite3BtreeCursorHasMoved(p->uc.pCursor)) { return sqlite3VdbeHandleMovedCursor(p); } return SQLITE_OK; @@ -84427,7 +83464,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){ } 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) +#define MAX_6BYTE ((((i64)0x00008000) << 32) - 1) i64 i = pMem->u.i; u64 u; testcase( flags & MEM_Int ); @@ -84480,37 +83517,34 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){ /* ** 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 -}; +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 ); +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 ); +SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8 serial_type) { + assert(serial_type < 128); return sqlite3SmallTypeSizes[serial_type]; } @@ -84549,7 +83583,7 @@ SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8 serial_type){ ** so we trust him. */ #ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT -SQLITE_PRIVATE u64 sqlite3FloatSwap(u64 in){ +SQLITE_PRIVATE u64 sqlite3FloatSwap(u64 in) { union { u64 r; u32 i[2]; @@ -84564,15 +83598,14 @@ SQLITE_PRIVATE u64 sqlite3FloatSwap(u64 in){ } #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]) +#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 @@ -84583,21 +83616,20 @@ SQLITE_PRIVATE u64 sqlite3FloatSwap(u64 in){ ** 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 */ -){ +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 ){ + 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{ + 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) @@ -84606,33 +83638,32 @@ static void serialGet( ** defined that 64-bit floating point values really are mixed ** endian. */ - static const u64 t1 = ((u64)0x3ff00000)<<32; + 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 ); + assert(sizeof(r1) == sizeof(t2) && memcmp(&r1, &t2, sizeof(r1)) == 0); #endif - assert( sizeof(x)==8 && sizeof(pMem->u.r)==8 ); + 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 ){ +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->flags = MEM_Null | MEM_Zero; pMem->n = 0; pMem->u.nZero = 0; return; } - case 11: /* Reserved for future use */ - case 0: { /* Null */ + case 11: /* Reserved for future use */ + case 0: { /* Null */ /* EVIDENCE-OF: R-24078-09375 Value is a NULL. */ pMem->flags = MEM_Null; return; @@ -84642,7 +83673,7 @@ SQLITE_PRIVATE void sqlite3VdbeSerialGet( ** integer. */ pMem->u.i = ONE_BYTE_INT(buf); pMem->flags = MEM_Int; - testcase( pMem->u.i<0 ); + testcase(pMem->u.i < 0); return; } case 2: { /* 2-byte signed integer */ @@ -84650,7 +83681,7 @@ SQLITE_PRIVATE void sqlite3VdbeSerialGet( ** twos-complement integer. */ pMem->u.i = TWO_BYTE_INT(buf); pMem->flags = MEM_Int; - testcase( pMem->u.i<0 ); + testcase(pMem->u.i < 0); return; } case 3: { /* 3-byte signed integer */ @@ -84658,7 +83689,7 @@ SQLITE_PRIVATE void sqlite3VdbeSerialGet( ** twos-complement integer. */ pMem->u.i = THREE_BYTE_INT(buf); pMem->flags = MEM_Int; - testcase( pMem->u.i<0 ); + testcase(pMem->u.i < 0); return; } case 4: { /* 4-byte signed integer */ @@ -84667,32 +83698,33 @@ SQLITE_PRIVATE void sqlite3VdbeSerialGet( 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; + if (buf[0] & 0x80) + pMem->u.i |= 0xffffffff80000000LL; #endif pMem->flags = MEM_Int; - testcase( pMem->u.i<0 ); + 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->u.i = FOUR_BYTE_UINT(buf + 2) + (((i64)1) << 32) * TWO_BYTE_INT(buf); pMem->flags = MEM_Int; - testcase( pMem->u.i<0 ); + 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); + serialGet(buf, serial_type, pMem); return; } - case 8: /* Integer 0 */ - case 9: { /* Integer 1 */ + 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->u.i = serial_type - 8; pMem->flags = MEM_Int; return; } @@ -84701,10 +83733,10 @@ SQLITE_PRIVATE void sqlite3VdbeSerialGet( ** 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]; + 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; } } @@ -84724,16 +83756,16 @@ SQLITE_PRIVATE void sqlite3VdbeSerialGet( ** ** 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; +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 ); + assert(pKeyInfo->aSortFlags != 0); p->pKeyInfo = pKeyInfo; p->nField = pKeyInfo->nKeyField + 1; return p; @@ -84744,25 +83776,24 @@ SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord( ** 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; +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 idx; /* Offset in aKey[] to read from */ + u16 u; /* Unsigned loop counter */ u32 szHdr; - Mem *pMem = p->aMem; + Mem* pMem = p->aMem; p->default_rc = 0; - assert( EIGHT_BYTE_ALIGNMENT(pMem) ); + assert(EIGHT_BYTE_ALIGNMENT(pMem)); idx = getVarint32(aKey, szHdr); d = szHdr; u = 0; - while( idx=p->nField ) break; + if ((++u) >= p->nField) + break; } - if( d>(u32)nKey && u ){ - assert( CORRUPT_DB ); + 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); + sqlite3VdbeMemSetNull(pMem - 1); } - assert( u<=pKeyInfo->nKeyField + 1 ); + assert(u <= pKeyInfo->nKeyField + 1); p->nField = u; } @@ -84799,26 +83831,26 @@ SQLITE_PRIVATE void sqlite3VdbeRecordUnpack( ** 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 */ +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; + const unsigned char* aKey1 = (const unsigned char*)pKey1; + KeyInfo* pKeyInfo; Mem mem1; pKeyInfo = pPKey2->pKeyInfo; - if( pKeyInfo->db==0 ) return 1; + 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 */ + 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. @@ -84830,17 +83862,18 @@ static int vdbeRecordCompareDebug( /* mem1.u.i = 0; // not needed, here to silence compiler warning */ idx1 = getVarint32(aKey1, szHdr1); - if( szHdr1>98307 ) return SQLITE_CORRUPT; + 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{ + 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 ); + 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 @@ -84848,41 +83881,36 @@ static int vdbeRecordCompareDebug( ** 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 - ){ + 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 = 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. */ + if (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_DESC) { + rc = -rc; /* Invert the result for DESC sort order. */ } goto debugCompareEnd; } i++; - }while( idx1nField ); + } while (idx1 < szHdr1 && i < pPKey2->nField); /* 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 ); + 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 @@ -84890,11 +83918,16 @@ static int vdbeRecordCompareDebug( 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; + 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 @@ -84911,28 +83944,28 @@ static int vdbeRecordCompareDebug( ** 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 */ -){ +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; + const unsigned char* aKey = (const unsigned char*)pKey; - if( CORRUPT_DB ) return; + if (CORRUPT_DB) + return; idx = getVarint32(aKey, szHdr); - assert( nKey>=0 ); - assert( szHdr<=(u32)nKey ); - while( idx= 0); + assert(szHdr <= (u32)nKey); + while (idx < szHdr) { + idx += getVarint32(aKey + idx, notUsed); nField++; } - assert( nField <= pKeyInfo->nAllField ); + assert(nField <= pKeyInfo->nAllField); } #else -# define vdbeAssertFieldCountWithinLimits(A,B,C) +#define vdbeAssertFieldCountWithinLimits(A, B, C) #endif /* @@ -84941,17 +83974,14 @@ static void vdbeAssertFieldCountWithinLimits( ** 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 ){ +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{ + return pColl->xCmp(pColl->pUser, pMem1->n, pMem1->z, pMem2->n, pMem2->z); + } else { int rc; const void *v1, *v2; Mem c1; @@ -84962,10 +83992,11 @@ static int vdbeCompareMemString( 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; + if ((v1 == 0 || v2 == 0)) { + if (prcErr) + *prcErr = SQLITE_NOMEM_BKPT; rc = 0; - }else{ + } else { rc = pColl->xCmp(pColl->pUser, c1.n, v1, c2.n, v2); } sqlite3VdbeMemReleaseMalloc(&c1); @@ -84978,10 +84009,11 @@ static int vdbeCompareMemString( ** 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){ +static int isAllZero(const char* z, int n) { int i; - for(i=0; in; int n2 = pB2->n; @@ -85000,22 +84032,25 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3BlobCompare(const Mem *pB1, const Mem ** 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 ); + 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 ){ + 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; + } 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; + } 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; + c = memcmp(pB1->z, pB2->z, n1 > n2 ? n2 : n1); + if (c) + return c; return n1 - n2; } @@ -85024,26 +84059,34 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3BlobCompare(const Mem *pB1, const Mem ** 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 ){ +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{ + testcase(x < r); + testcase(x > r); + testcase(x == r); + if (x < r) + return -1; + if (x > r) + 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; + if (r < -9223372036854775808.0) + return +1; + if (r >= 9223372036854775808.0) + return -1; y = (i64)r; - if( iy ) return +1; + if (i < y) + return -1; + if (i > y) + return +1; s = (double)i; - if( sr ) return +1; + if (s < r) + return -1; + if (s > r) + return +1; return 0; } } @@ -85057,59 +84100,65 @@ SQLITE_PRIVATE int sqlite3IntFloatCompare(i64 i, double r){ ** ** Two NULL values are considered equal by this function. */ -SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const CollSeq *pColl){ +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) ); + 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); + 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; + */ + 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; + 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 ){ + 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; + } 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{ + } else { return -1; } } - if( (f1&MEM_Real)!=0 ){ - if( (f2&(MEM_Int|MEM_IntReal))!=0 ){ - testcase( f2 & MEM_Int ); - testcase( f2 & MEM_IntReal ); + 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{ + } else { return -1; } } @@ -85119,25 +84168,24 @@ SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const C /* 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 ){ + if (combined_flags & MEM_Str) { + if ((f1 & MEM_Str) == 0) { return 1; } - if( (f2 & MEM_Str)==0 ){ + 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 ); + 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 ); + assert(!pColl || pColl->xCmp); - if( pColl ){ + if (pColl) { return vdbeCompareMemString(pMem1, pMem2, pColl, 0); } /* If a NULL pointer was passed as the collate function, fall through @@ -85148,7 +84196,6 @@ SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const C 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 @@ -85156,34 +84203,34 @@ SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const C ** serialized according to serial_type. This function deserializes ** and returns the value. */ -static i64 vdbeRecordDecodeInt(u32 serial_type, const u8 *aKey){ +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 ){ + assert(CORRUPT_DB || (serial_type >= 1 && serial_type <= 9 && serial_type != 7)); + switch (serial_type) { case 0: case 1: - testcase( aKey[0]&0x80 ); + testcase(aKey[0] & 0x80); return ONE_BYTE_INT(aKey); case 2: - testcase( aKey[0]&0x80 ); + testcase(aKey[0] & 0x80); return TWO_BYTE_INT(aKey); case 3: - testcase( aKey[0]&0x80 ); + testcase(aKey[0] & 0x80); return THREE_BYTE_INT(aKey); case 4: { - testcase( aKey[0]&0x80 ); + testcase(aKey[0] & 0x80); y = FOUR_BYTE_UINT(aKey); - return (i64)*(int*)&y; + return (i64) * (int*)&y; } case 5: { - testcase( aKey[0]&0x80 ); - return FOUR_BYTE_UINT(aKey+2) + (((i64)1)<<32)*TWO_BYTE_INT(aKey); + 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; + testcase(aKey[0] & 0x80); + x = (x << 32) | FOUR_BYTE_UINT(aKey + 4); + return (i64) * (i64*)&x; } } @@ -85211,219 +84258,209 @@ static i64 vdbeRecordDecodeInt(u32 serial_type, const u8 *aKey){ ** 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; +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 ){ + if (bSkip) { u32 s1 = aKey1[1]; - if( s1<0x80 ){ + if (s1 < 0x80) { idx1 = 2; - }else{ + } else { idx1 = 1 + sqlite3GetVarint32(&aKey1[1], &s1); } szHdr1 = aKey1[0]; d1 = szHdr1 + sqlite3VdbeSerialTypeLen(s1); i = 1; pRhs++; - }else{ - if( (szHdr1 = aKey1[0])<0x80 ){ + } else { + if ((szHdr1 = aKey1[0]) < 0x80) { idx1 = 1; - }else{ + } else { idx1 = sqlite3GetVarint32(aKey1, &szHdr1); } d1 = szHdr1; i = 0; } - if( d1>(unsigned)nKey1 ){ + if (d1 > (unsigned)nKey1) { pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; - return 0; /* Corruption */ + 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{ + 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 ); + 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 ){ + testcase(serial_type == 12); + if (serial_type >= 10) { rc = +1; - }else if( serial_type==0 ){ + } else if (serial_type == 0) { rc = -1; - }else if( serial_type==7 ){ + } else if (serial_type == 7) { sqlite3VdbeSerialGet(&aKey1[d1], serial_type, &mem1); rc = -sqlite3IntFloatCompare(pRhs->u.i, mem1.u.r); - }else{ + } else { i64 lhs = vdbeRecordDecodeInt(serial_type, &aKey1[d1]); i64 rhs = pRhs->u.i; - if( lhsrhs ){ + } else if (lhs > rhs) { rc = +1; } } } /* RHS is real */ - else if( pRhs->flags & MEM_Real ){ + else if (pRhs->flags & MEM_Real) { serial_type = aKey1[idx1]; - if( serial_type>=10 ){ + 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 ){ + } else if (serial_type == 0) { rc = -1; - }else{ + } else { sqlite3VdbeSerialGet(&aKey1[d1], serial_type, &mem1); - if( serial_type==7 ){ - if( mem1.u.ru.r ){ + if (serial_type == 7) { + if (mem1.u.r < pRhs->u.r) { rc = -1; - }else if( mem1.u.r>pRhs->u.r ){ + } else if (mem1.u.r > pRhs->u.r) { rc = +1; } - }else{ + } else { rc = sqlite3IntFloatCompare(mem1.u.i, pRhs->u.r); } } } /* RHS is a string */ - else if( pRhs->flags & MEM_Str ){ + else if (pRhs->flags & MEM_Str) { getVarint32NR(&aKey1[idx1], serial_type); - testcase( serial_type==12 ); - if( serial_type<12 ){ + testcase(serial_type == 12); + if (serial_type < 12) { rc = -1; - }else if( !(serial_type & 0x01) ){ + } else if (!(serial_type & 0x01)) { rc = +1; - }else{ + } 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 - ){ + 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] ){ + 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{ + 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; + 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 ); + 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) ){ + testcase(serial_type == 12); + if (serial_type < 12 || (serial_type & 0x01)) { rc = -1; - }else{ + } else { int nStr = (serial_type - 12) / 2; - testcase( (d1+nStr)==(unsigned)nKey1 ); - testcase( (d1+nStr+1)==(unsigned)nKey1 ); - if( (d1+nStr) > (unsigned)nKey1 ){ + 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) ){ + return 0; /* Corruption */ + } else if (pRhs->flags & MEM_Zero) { + if (!isAllZero((const char*)&aKey1[d1], nStr)) { rc = 1; - }else{ + } else { rc = nStr - pRhs->u.nZero; } - }else{ + } else { int nCmp = MIN(nStr, pRhs->n); rc = memcmp(&aKey1[d1], pRhs->z, nCmp); - if( rc==0 ) rc = nStr - pRhs->n; + if (rc == 0) + rc = nStr - pRhs->n; } } } /* RHS is null */ - else{ + else { serial_type = aKey1[idx1]; - rc = (serial_type!=0); + rc = (serial_type != 0); } - if( rc!=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))) - ){ + 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 */ + assert(vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, rc)); + assert(mem1.szMalloc == 0); /* See comment below */ return rc; } i++; - if( i==pPKey2->nField ) break; + if (i == pPKey2->nField) + break; pRhs++; d1 += sqlite3VdbeSerialTypeLen(serial_type); idx1 += sqlite3VarintLen(serial_type); - }while( idx1<(unsigned)szHdr1 && d1<=(unsigned)nKey1 ); + } 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 ); + 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 - ); + 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 */ -){ +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 @@ -85433,11 +84470,10 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompare( ** 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]; +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; @@ -85446,39 +84482,39 @@ static int vdbeRecordCompareInt( i64 lhs; vdbeAssertFieldCountWithinLimits(nKey1, pKey1, pPKey2->pKeyInfo); - assert( (*(u8*)pKey1)<=0x3F || CORRUPT_DB ); - switch( serial_type ){ + assert((*(u8*)pKey1) <= 0x3F || CORRUPT_DB); + switch (serial_type) { case 1: { /* 1-byte signed integer */ lhs = ONE_BYTE_INT(aKey); - testcase( lhs<0 ); + testcase(lhs < 0); break; } case 2: { /* 2-byte signed integer */ lhs = TWO_BYTE_INT(aKey); - testcase( lhs<0 ); + testcase(lhs < 0); break; } case 3: { /* 3-byte signed integer */ lhs = THREE_BYTE_INT(aKey); - testcase( lhs<0 ); + testcase(lhs < 0); break; } case 4: { /* 4-byte signed integer */ y = FOUR_BYTE_UINT(aKey); - lhs = (i64)*(int*)&y; - testcase( lhs<0 ); + 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 ); + 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); + x = (x << 32) | FOUR_BYTE_UINT(aKey + 4); lhs = *(i64*)&x; - testcase( lhs<0 ); + testcase(lhs < 0); break; } case 8: @@ -85494,31 +84530,32 @@ static int vdbeRecordCompareInt( ** 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: + case 0: + case 7: return sqlite3VdbeRecordCompare(nKey1, pKey1, pPKey2); default: return sqlite3VdbeRecordCompare(nKey1, pKey1, pPKey2); } - assert( pPKey2->u.i == pPKey2->aMem[0].u.i ); + assert(pPKey2->u.i == pPKey2->aMem[0].u.i); v = pPKey2->u.i; - if( v>lhs ){ + if (v > lhs) { res = pPKey2->r1; - }else if( vr2; - }else if( pPKey2->nField>1 ){ + } 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{ + } 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) ); + assert(vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, res)); return res; } @@ -85528,68 +84565,65 @@ static int vdbeRecordCompareInt( ** 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; +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 ); + 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 ){ + if (serial_type < 12) { + if (serial_type < 0) { sqlite3GetVarint32(&aKey1[1], (u32*)&serial_type); - if( serial_type>=12 ) goto vrcs_restart; - assert( CORRUPT_DB ); + 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{ + 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 ){ + nStr = (serial_type - 12) / 2; + if ((szHdr + nStr) > nKey1) { pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; - return 0; /* Corruption */ + return 0; /* Corruption */ } - nCmp = MIN( pPKey2->n, nStr ); + nCmp = MIN(pPKey2->n, nStr); res = memcmp(&aKey1[szHdr], pPKey2->u.z, nCmp); - if( res>0 ){ + if (res > 0) { res = pPKey2->r2; - }else if( res<0 ){ + } else if (res < 0) { res = pPKey2->r1; - }else{ + } else { res = nStr - pPKey2->n; - if( res==0 ){ - if( pPKey2->nField>1 ){ + if (res == 0) { + if (pPKey2->nField > 1) { res = sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 1); - }else{ + } else { res = pPKey2->default_rc; pPKey2->eqSeen = 1; } - }else if( res>0 ){ + } else if (res > 0) { res = pPKey2->r2; - }else{ + } else { res = pPKey2->r1; } } } - assert( vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, res) - || CORRUPT_DB - || pPKey2->pKeyInfo->db->mallocFailed - ); + assert(vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, res) || CORRUPT_DB || pPKey2->pKeyInfo->db->mallocFailed); return res; } @@ -85598,7 +84632,7 @@ static int vdbeRecordCompareString( ** suitable for comparing serialized records to the unpacked record passed ** as the only argument. */ -SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord *p){ +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() @@ -85612,29 +84646,27 @@ SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord *p){ ** 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 ){ + if (p->pKeyInfo->nAllField <= 13) { int flags = p->aMem[0].flags; - if( p->pKeyInfo->aSortFlags[0] ){ - if( p->pKeyInfo->aSortFlags[0] & KEYINFO_ORDER_BIGNULL ){ + if (p->pKeyInfo->aSortFlags[0]) { + if (p->pKeyInfo->aSortFlags[0] & KEYINFO_ORDER_BIGNULL) { return sqlite3VdbeRecordCompare; } p->r1 = 1; p->r2 = -1; - }else{ + } else { p->r1 = -1; p->r2 = 1; } - if( (flags & MEM_Int) ){ + 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 ); + 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; @@ -85652,12 +84684,12 @@ SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord *p){ ** 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){ +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 */ + 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 @@ -85665,49 +84697,49 @@ SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3 *db, BtCursor *pCur, i64 *rowid){ ** Any corruption is detected in sqlite3BtreeParseCellPtr(), though, so ** this code can safely assume that nCellKey is 32-bits */ - assert( sqlite3BtreeCursorIsValid(pCur) ); + assert(sqlite3BtreeCursorIsValid(pCur)); nCellKey = sqlite3BtreePayloadSize(pCur); - assert( (nCellKey & SQLITE_MAX_U32)==(u64)nCellKey ); + 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 ){ + 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) ){ + 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) ){ + 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 ); + assert(pC->eCurType == CURTYPE_BTREE); pCur = pC->uc.pCursor; - assert( sqlite3BtreeCursorIsValid(pCur) ); + 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 ){ + if (nCellKey <= 0 || nCellKey > 0x7fffffff) { *res = 0; return SQLITE_CORRUPT_BKPT; } sqlite3VdbeMemInit(&m, db, 0); rc = sqlite3VdbeMemFromBtreeZeroOffset(pCur, (u32)nCellKey, &m); - if( rc ){ + if (rc) { return rc; } *res = sqlite3VdbeRecordCompareWithSkip(m.n, m.z, pUnpacked, 0); @@ -85766,8 +84797,8 @@ SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare( ** 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) ); +SQLITE_PRIVATE void sqlite3VdbeSetChanges(sqlite3* db, i64 nChange) { + assert(sqlite3_mutex_held(db->mutex)); db->nChange = nChange; db->nTotalChange += nChange; } @@ -85776,7 +84807,7 @@ SQLITE_PRIVATE void sqlite3VdbeSetChanges(sqlite3 *db, i64 nChange){ ** Set a flag in the vdbe to update the change counter when it is finalised ** or reset. */ -SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe *v){ +SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe* v) { v->changeCntOn = 1; } @@ -85798,24 +84829,24 @@ SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe *v){ ** 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; +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){ +SQLITE_PRIVATE sqlite3* sqlite3VdbeDb(Vdbe* v) { return v->db; } /* ** Return the SQLITE_PREPARE flags for a Vdbe. */ -SQLITE_PRIVATE u8 sqlite3VdbePrepareFlags(Vdbe *v){ +SQLITE_PRIVATE u8 sqlite3VdbePrepareFlags(Vdbe* v) { return v->prepFlags; } @@ -85827,15 +84858,15 @@ SQLITE_PRIVATE u8 sqlite3VdbePrepareFlags(Vdbe *v){ ** ** 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); +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; @@ -85849,13 +84880,13 @@ SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetBoundValue(Vdbe *v, int iVar, u8 aff ** 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 ){ +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)); + } else { + v->expmask |= ((u32)1 << (iVar - 1)); } } @@ -85868,24 +84899,24 @@ SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe *v, int iVar){ ** 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; +SQLITE_PRIVATE int sqlite3NotPureFunc(sqlite3_context* pCtx) { + const VdbeOp* pOp; #ifdef SQLITE_ENABLE_STAT4 - if( pCtx->pVdbe==0 ) return 1; + 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 ){ + 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 ){ + } else if (pOp->p5 & NC_GenCol) { zContext = "a generated column"; - }else{ + } else { zContext = "an index"; } - zMsg = sqlite3_mprintf("non-deterministic use of %s() in %s", - pCtx->pFunc->zName, zContext); + 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; @@ -85899,9 +84930,9 @@ SQLITE_PRIVATE int sqlite3NotPureFunc(sqlite3_context *pCtx){ ** 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; +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); @@ -85920,12 +84951,13 @@ SQLITE_PRIVATE void sqlite3VtabImportErrmsg(Vdbe *p, sqlite3_vtab *pVtab){ ** 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 ){ +static void vdbeFreeUnpacked(sqlite3* db, int nField, UnpackedRecord* p) { + if (p) { int i; - for(i=0; iaMem[i]; - if( pMem->zMalloc ) sqlite3VdbeMemReleaseMalloc(pMem); + for (i = 0; i < nField; i++) { + Mem* pMem = &p->aMem[i]; + if (pMem->zMalloc) + sqlite3VdbeMemReleaseMalloc(pMem); } sqlite3DbFreeNN(db, p); } @@ -85939,40 +84971,36 @@ static void vdbeFreeUnpacked(sqlite3 *db, int nField, UnpackedRecord *p){ ** 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; +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; + const char* zTbl = pTab->zName; static const u8 fakeSortOrder = 0; - assert( db->pPreUpdate==0 ); + assert(db->pPreUpdate == 0); memset(&preupdate, 0, sizeof(PreUpdate)); - if( HasRowid(pTab)==0 ){ + if (HasRowid(pTab) == 0) { iKey1 = iKey2 = 0; preupdate.pPk = sqlite3PrimaryKeyIndex(pTab); - }else{ - if( op==SQLITE_UPDATE ){ + } else { + if (op == SQLITE_UPDATE) { iKey2 = v->aMem[iReg].u.i; - }else{ + } 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) - ); + 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; @@ -85991,11 +85019,11 @@ SQLITE_PRIVATE void sqlite3VdbePreUpdateHook( 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 ){ + 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++){ + for (i = 0; i < pCsr->nField; i++) { sqlite3VdbeMemRelease(&preupdate.aNew[i]); } sqlite3DbFreeNN(db, preupdate.aNew); @@ -86032,9 +85060,9 @@ SQLITE_PRIVATE void sqlite3VdbePreUpdateHook( ** 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; +SQLITE_API int sqlite3_expired(sqlite3_stmt* pStmt) { + Vdbe* p = (Vdbe*)pStmt; + return p == 0 || p->expired; } #endif @@ -86043,19 +85071,19 @@ SQLITE_API int sqlite3_expired(sqlite3_stmt *pStmt){ ** 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 ){ +static int vdbeSafety(Vdbe* p) { + if (p->db == 0) { sqlite3_log(SQLITE_MISUSE, "API called with finalized prepared statement"); return 1; - }else{ + } else { return 0; } } -static int vdbeSafetyNotNull(Vdbe *p){ - if( p==0 ){ +static int vdbeSafetyNotNull(Vdbe* p) { + if (p == 0) { sqlite3_log(SQLITE_MISUSE, "API called with NULL prepared statement"); return 1; - }else{ + } else { return vdbeSafety(p); } } @@ -86065,21 +85093,21 @@ static int vdbeSafetyNotNull(Vdbe *p){ ** 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){ +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 ); + 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; + iElapse = (iNow - p->startTime) * 1000000; #ifndef SQLITE_OMIT_DEPRECATED - if( db->xProfile ){ + if (db->xProfile) { db->xProfile(db->pProfileArg, p->zSql, iElapse); } #endif - if( db->mTrace & SQLITE_TRACE_PROFILE ){ + if (db->mTrace & SQLITE_TRACE_PROFILE) { db->trace.xV2(SQLITE_TRACE_PROFILE, db->pTraceArg, p, (void*)&iElapse); } p->startTime = 0; @@ -86088,10 +85116,12 @@ static SQLITE_NOINLINE void invokeProfileCallback(sqlite3 *db, Vdbe *p){ ** 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); } +#define checkProfileCallback(DB, P) \ + if (((P)->startTime) > 0) { \ + invokeProfileCallback(DB, P); \ + } #else -# define checkProfileCallback(DB,P) /*no-op*/ +#define checkProfileCallback(DB, P) /*no-op*/ #endif /* @@ -86103,16 +85133,17 @@ static SQLITE_NOINLINE void invokeProfileCallback(sqlite3 *db, Vdbe *p){ ** 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){ +SQLITE_API int sqlite3_finalize(sqlite3_stmt* pStmt) { int rc; - if( pStmt==0 ){ + 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; + } 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); @@ -86130,18 +85161,18 @@ SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt){ ** 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){ +SQLITE_API int sqlite3_reset(sqlite3_stmt* pStmt) { int rc; - if( pStmt==0 ){ + if (pStmt == 0) { rc = SQLITE_OK; - }else{ - Vdbe *v = (Vdbe*)pStmt; - sqlite3 *db = v->db; + } 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 ); + assert((rc & (db->errMask)) == rc); rc = sqlite3ApiExit(db, rc); sqlite3_mutex_leave(db->mutex); } @@ -86151,87 +85182,82 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt){ /* ** Set all the parameters in the compiled SQL statement to NULL. */ -SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt *pStmt){ +SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt* pStmt) { int i; int rc = SQLITE_OK; - Vdbe *p = (Vdbe*)pStmt; + Vdbe* p = (Vdbe*)pStmt; #if SQLITE_THREADSAFE - sqlite3_mutex *mutex = ((Vdbe*)pStmt)->db->mutex; + sqlite3_mutex* mutex = ((Vdbe*)pStmt)->db->mutex; #endif sqlite3_mutex_enter(mutex); - for(i=0; inVar; i++){ + for (i = 0; i < p->nVar; i++) { sqlite3VdbeMemRelease(&p->aVar[i]); p->aVar[i].flags = MEM_Null; } - assert( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 || p->expmask==0 ); - if( p->expmask ){ + 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 ); +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{ + } else { return sqlite3_value_text(pVal); } } -SQLITE_API int sqlite3_value_bytes(sqlite3_value *pVal){ +SQLITE_API int sqlite3_value_bytes(sqlite3_value* pVal) { return sqlite3ValueBytes(pVal, SQLITE_UTF8); } -SQLITE_API int sqlite3_value_bytes16(sqlite3_value *pVal){ +SQLITE_API int sqlite3_value_bytes16(sqlite3_value* pVal) { return sqlite3ValueBytes(pVal, SQLITE_UTF16NATIVE); } -SQLITE_API double sqlite3_value_double(sqlite3_value *pVal){ +SQLITE_API double sqlite3_value_double(sqlite3_value* pVal) { return sqlite3VdbeRealValue((Mem*)pVal); } -SQLITE_API int sqlite3_value_int(sqlite3_value *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){ +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; +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 - ){ +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{ + } else { return 0; } } -SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value *pVal){ - return (const unsigned char *)sqlite3ValueText(pVal, SQLITE_UTF8); +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){ +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){ +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){ +SQLITE_API const void* sqlite3_value_text16le(sqlite3_value* pVal) { return sqlite3ValueText(pVal, SQLITE_UTF16LE); } #endif /* SQLITE_OMIT_UTF16 */ @@ -86239,122 +85265,124 @@ SQLITE_API const void *sqlite3_value_text16le(sqlite3_value *pVal){ ** fundamental datatypes: 64-bit signed integer 64-bit IEEE floating ** point number string BLOB NULL */ -SQLITE_API int sqlite3_value_type(sqlite3_value* pVal){ +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) */ + 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 ){ + if (pVal->flags & MEM_Null) { eType = SQLITE_NULL; - }else if( pVal->flags & (MEM_Real|MEM_IntReal) ){ + } else if (pVal->flags & (MEM_Real | MEM_IntReal)) { eType = SQLITE_FLOAT; - }else if( pVal->flags & MEM_Int ){ + } else if (pVal->flags & MEM_Int) { eType = SQLITE_INTEGER; - }else if( pVal->flags & MEM_Str ){ + } else if (pVal->flags & MEM_Str) { eType = SQLITE_TEXT; } - assert( eType == aType[pVal->flags&MEM_AffMask] ); + assert(eType == aType[pVal->flags & MEM_AffMask]); } #endif - return aType[pVal->flags&MEM_AffMask]; + 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); +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; +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; + */ +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); + if (pNew->flags & (MEM_Str | MEM_Blob)) { + pNew->flags &= ~(MEM_Static | MEM_Dyn); pNew->flags |= MEM_Ephem; - if( sqlite3VdbeMemMakeWriteable(pNew)!=SQLITE_OK ){ + if (sqlite3VdbeMemMakeWriteable(pNew) != SQLITE_OK) { sqlite3ValueFree(pNew); pNew = 0; } - }else if( pNew->flags & MEM_Null ){ + } else if (pNew->flags & MEM_Null) { /* Do not duplicate pointer values */ - pNew->flags &= ~(MEM_Term|MEM_Subtype); + pNew->flags &= ~(MEM_Term | MEM_Subtype); } return pNew; } @@ -86362,11 +85390,10 @@ SQLITE_API sqlite3_value *sqlite3_value_dup(const sqlite3_value *pOrig){ /* Destroy an sqlite3_value object previously obtained from ** sqlite3_value_dup(). */ -SQLITE_API void sqlite3_value_free(sqlite3_value *pOld){ +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. @@ -86378,187 +85405,145 @@ SQLITE_API void sqlite3_value_free(sqlite3_value *pOld){ ** 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; +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 ){ + if (rc) { + if (rc == SQLITE_TOOBIG) { sqlite3_result_error_toobig(pCtx); - }else{ + } else { /* The only errors possible from sqlite3VdbeMemSetStr are ** SQLITE_TOOBIG and SQLITE_NOMEM */ - assert( rc==SQLITE_NOMEM ); + assert(rc == SQLITE_NOMEM); sqlite3_result_error_nomem(pCtx); } return; } sqlite3VdbeChangeEncoding(pOut, pCtx->enc); - if( sqlite3VdbeMemTooBig(pOut) ){ + 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 ){ +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 ){ + } else if (xDel == SQLITE_TRANSIENT) { /* noop */ - }else{ + } 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) ); +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 ){ +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{ + } 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) ); +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) ); +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) ); +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) ); +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) ); +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) ); +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) ); +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) ); +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) ); +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 ){ +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{ + } 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) ); +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) ); +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) ); +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) ); +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) ){ + 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 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] ){ +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; } @@ -86569,28 +85554,27 @@ SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context *pCtx, u64 n){ return sqlite3VdbeMemSetZeroBlob(pCtx->pOut, (int)n); #endif } -SQLITE_API void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){ +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; + if (pCtx->pVdbe) + pCtx->pVdbe->rcApp = errCode; #endif - if( pCtx->pOut->flags & MEM_Null ){ - setResultStrOrError(pCtx, sqlite3ErrStr(errCode), -1, SQLITE_UTF8, - SQLITE_STATIC); + 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) ); +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); + 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) ); +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); @@ -86601,32 +85585,31 @@ SQLITE_API void sqlite3_result_error_nomem(sqlite3_context *pCtx){ ** 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 ){ +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){ +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 ){ + for (i = 0; i < db->nDb; 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 ){ + if (nEntry > 0 && db->xWalCallback && rc == SQLITE_OK) { rc = db->xWalCallback(db->pWalArg, db, db->aDb[i].zDbSName, nEntry); } } @@ -86635,7 +85618,6 @@ static int doWalCallbacks(sqlite3 *db){ return rc; } - /* ** Execute the statement pStmt, either until a row of data is ready, the ** statement is completely executed or an error occurs. @@ -86645,19 +85627,19 @@ static int doWalCallbacks(sqlite3 *db){ ** schema change has occurred. That detail is handled by the ** outer sqlite3_step() wrapper procedure. */ -static int sqlite3Step(Vdbe *p){ - sqlite3 *db; +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 ){ + 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 ((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 @@ -86672,31 +85654,30 @@ static int sqlite3Step(Vdbe *p){ ** reset the interrupt flag. This prevents a call to sqlite3_interrupt ** from interrupting a statement that has not yet started. */ - if( db->nVdbeActive==0 ){ + if (db->nVdbeActive == 0) { AtomicStore(&db->u1.isInterrupted, 0); } - assert( db->nVdbeWrite>0 || db->autoCommit==0 - || (db->nDeferredCons==0 && db->nDeferredImmCons==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 ){ + 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 ); + } else { + assert(p->startTime == 0); } #endif db->nVdbeActive++; - if( p->readOnly==0 ) db->nVdbeWrite++; - if( p->bIsReader ) db->nVdbeRead++; + if (p->readOnly == 0) + db->nVdbeWrite++; + if (p->bIsReader) + db->nVdbeRead++; p->pc = 0; p->eVdbeState = VDBE_RUN_STATE; - }else + } else - if( ALWAYS(p->eVdbeState==VDBE_HALT_STATE) ){ + 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 @@ -86714,15 +85695,15 @@ static int sqlite3Step(Vdbe *p){ ** or SQLITE_BUSY error. */ #ifdef SQLITE_OMIT_AUTORESET - if( (rc = p->rc&0xff)==SQLITE_BUSY || rc==SQLITE_LOCKED ){ + if ((rc = p->rc & 0xff) == SQLITE_BUSY || rc == SQLITE_LOCKED) { sqlite3_reset((sqlite3_stmt*)p); - }else{ + } else { return SQLITE_MISUSE_BKPT; } #else sqlite3_reset((sqlite3_stmt*)p); #endif - assert( p->eVdbeState==VDBE_READY_STATE ); + assert(p->eVdbeState == VDBE_READY_STATE); goto restart_step; } } @@ -86731,9 +85712,9 @@ static int sqlite3Step(Vdbe *p){ p->rcApp = SQLITE_OK; #endif #ifndef SQLITE_OMIT_EXPLAIN - if( p->explain ){ + if (p->explain) { rc = sqlite3VdbeList(p); - }else + } else #endif /* SQLITE_OMIT_EXPLAIN */ { db->nVdbeExec++; @@ -86741,24 +85722,24 @@ static int sqlite3Step(Vdbe *p){ db->nVdbeExec--; } - if( rc==SQLITE_ROW ){ - assert( p->rc==SQLITE_OK ); - assert( db->mallocFailed==0 ); + if (rc == SQLITE_ROW) { + assert(p->rc == SQLITE_OK); + assert(db->mallocFailed == 0); db->errCode = SQLITE_ROW; return SQLITE_ROW; - }else{ + } 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 ); + if (rc == SQLITE_DONE && db->autoCommit) { + assert(p->rc == SQLITE_OK); p->rc = doWalCallbacks(db); - if( p->rc!=SQLITE_OK ){ + if (p->rc != SQLITE_OK) { rc = SQLITE_ERROR; } - }else if( rc!=SQLITE_DONE && (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 ){ + } 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. @@ -86768,18 +85749,17 @@ static int sqlite3Step(Vdbe *p){ } db->errCode = rc; - if( SQLITE_NOMEM==sqlite3ApiExit(p->db, p->rc) ){ + if (SQLITE_NOMEM == sqlite3ApiExit(p->db, p->rc)) { p->rc = SQLITE_NOMEM_BKPT; - if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 ) rc = p->rc; + 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); + 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); } /* @@ -86787,22 +85767,21 @@ static int sqlite3Step(Vdbe *p){ ** 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 */ +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) ){ + 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 ){ + while ((rc = sqlite3Step(v)) == SQLITE_SCHEMA && cnt++ < SQLITE_MAX_SCHEMA_RETRY) { int savedPc = v->pc; rc = sqlite3Reprepare(v); - if( rc!=SQLITE_OK ){ + 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 @@ -86811,9 +85790,9 @@ SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){ ** 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); + const char* zErr = (const char*)sqlite3_value_text(db->pErr); sqlite3DbFree(db, v->zErrMsg); - if( !db->mallocFailed ){ + if (!db->mallocFailed) { v->zErrMsg = sqlite3DbStrDup(db, zErr); v->rc = rc = sqlite3ApiExit(db, rc); } else { @@ -86823,26 +85802,25 @@ SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){ break; } sqlite3_reset(pStmt); - if( savedPc>=0 ){ + 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 ); + 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 ); +SQLITE_API void* sqlite3_user_data(sqlite3_context* p) { + assert(p && p->pFunc); return p->pFunc->pUserData; } @@ -86856,8 +85834,8 @@ SQLITE_API void *sqlite3_user_data(sqlite3_context *p){ ** 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 ); +SQLITE_API sqlite3* sqlite3_context_db_handle(sqlite3_context* p) { + assert(p && p->pOut); return p->pOut->db; } @@ -86875,8 +85853,8 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context *p){ ** 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 ); +SQLITE_API int sqlite3_vtab_nochange(sqlite3_context* p) { + assert(p); return sqlite3_value_nochange(p->pOut); } @@ -86884,42 +85862,44 @@ SQLITE_API int sqlite3_vtab_nochange(sqlite3_context *p){ ** 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() */ -){ +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; + ValueList* pRhs; *ppOut = 0; - if( pVal==0 ) return SQLITE_MISUSE; + if (pVal == 0) + return SQLITE_MISUSE; pRhs = (ValueList*)sqlite3_value_pointer(pVal, "ValueList"); - if( pRhs==0 ) return SQLITE_MISUSE; - if( bNext ){ + if (pRhs == 0) + return SQLITE_MISUSE; + if (bNext) { rc = sqlite3BtreeNext(pRhs->pCsr, 0); - }else{ + } else { int dummy = 0; rc = sqlite3BtreeFirst(pRhs->pCsr, &dummy); - assert( rc==SQLITE_OK || sqlite3BtreeEof(pRhs->pCsr) ); - if( sqlite3BtreeEof(pRhs->pCsr) ) rc = SQLITE_DONE; + 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 */ + 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; + rc = sqlite3VdbeMemFromBtreeZeroOffset(pRhs->pCsr, (int)sz, &sMem); + if (rc == SQLITE_OK) { + u8* zBuf = (u8*)sMem.z; u32 iSerial; - sqlite3_value *pOut = pRhs->pOut; + 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) ){ + if ((pOut->flags & MEM_Ephem) != 0 && sqlite3VdbeMemMakeWriteable(pOut)) { rc = SQLITE_NOMEM; - }else{ + } else { *ppOut = pOut; } } @@ -86932,7 +85912,7 @@ static int valueFromValueList( ** 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){ +SQLITE_API int sqlite3_vtab_in_first(sqlite3_value* pVal, sqlite3_value** ppOut) { return valueFromValueList(pVal, ppOut, 0); } @@ -86940,7 +85920,7 @@ SQLITE_API int sqlite3_vtab_in_first(sqlite3_value *pVal, sqlite3_value **ppOut) ** 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){ +SQLITE_API int sqlite3_vtab_in_next(sqlite3_value* pVal, sqlite3_value** ppOut) { return valueFromValueList(pVal, ppOut, 1); } @@ -86951,18 +85931,19 @@ SQLITE_API int sqlite3_vtab_in_next(sqlite3_value *pVal, sqlite3_value **ppOut){ ** 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){ +SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context* p) { int rc; #ifndef SQLITE_ENABLE_STAT4 - sqlite3_int64 *piTime = &p->pVdbe->iCurrentTime; - assert( p->pVdbe!=0 ); + 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; + sqlite3_int64* piTime = p->pVdbe != 0 ? &p->pVdbe->iCurrentTime : &iTime; #endif - if( *piTime==0 ){ + if (*piTime == 0) { rc = sqlite3OsCurrentTimeInt64(p->pOut->db->pVfs, piTime); - if( rc ) *piTime = 0; + if (rc) + *piTime = 0; } return *piTime; } @@ -86971,17 +85952,17 @@ SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context *p){ ** 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 ){ +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{ + } else { sqlite3VdbeMemClearAndResize(pMem, nByte); pMem->flags = MEM_Agg; pMem->u.pDef = p->pFunc; - if( pMem->z ){ + if (pMem->z) { memset(pMem->z, 0, nByte); } } @@ -86993,13 +85974,13 @@ static SQLITE_NOINLINE void *createAggContext(sqlite3_context *p, int nByte){ ** 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 ){ +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{ + } else { return (void*)p->pMem->z; } } @@ -87014,17 +85995,18 @@ SQLITE_API void *sqlite3_aggregate_context(sqlite3_context *p, int nByte){ ** 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; +SQLITE_API void* sqlite3_get_auxdata(sqlite3_context* pCtx, int iArg) { + AuxData* pAuxData; - assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + assert(sqlite3_mutex_held(pCtx->pOut->db->mutex)); #if SQLITE_ENABLE_STAT4 - if( pCtx->pVdbe==0 ) return 0; + if (pCtx->pVdbe == 0) + return 0; #else - assert( pCtx->pVdbe!=0 ); + assert(pCtx->pVdbe != 0); #endif - for(pAuxData=pCtx->pVdbe->pAuxData; pAuxData; pAuxData=pAuxData->pNextAux){ - if( pAuxData->iAuxArg==iArg && (pAuxData->iAuxOp==pCtx->iOp || iArg<0) ){ + for (pAuxData = pCtx->pVdbe->pAuxData; pAuxData; pAuxData = pAuxData->pNextAux) { + if (pAuxData->iAuxArg == iArg && (pAuxData->iAuxOp == pCtx->iOp || iArg < 0)) { return pAuxData->pAux; } } @@ -87042,36 +86024,34 @@ SQLITE_API void *sqlite3_get_auxdata(sqlite3_context *pCtx, int iArg){ ** 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; +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) ); + assert(sqlite3_mutex_held(pCtx->pOut->db->mutex)); #ifdef SQLITE_ENABLE_STAT4 - if( pVdbe==0 ) goto failed; + if (pVdbe == 0) + goto failed; #else - assert( pVdbe!=0 ); + assert(pVdbe != 0); #endif - for(pAuxData=pVdbe->pAuxData; pAuxData; pAuxData=pAuxData->pNextAux){ - if( pAuxData->iAuxArg==iArg && (pAuxData->iAuxOp==pCtx->iOp || iArg<0) ){ + for (pAuxData = pVdbe->pAuxData; pAuxData; pAuxData = pAuxData->pNextAux) { + if (pAuxData->iAuxArg == iArg && (pAuxData->iAuxOp == pCtx->iOp || iArg < 0)) { break; } } - if( pAuxData==0 ){ + if (pAuxData == 0) { pAuxData = sqlite3DbMallocZero(pVdbe->db, sizeof(AuxData)); - if( !pAuxData ) goto failed; + 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 ){ + if (pCtx->isError == 0) + pCtx->isError = -1; + } else if (pAuxData->xDeleteAux) { pAuxData->xDeleteAux(pAuxData->pAux); } @@ -87080,7 +86060,7 @@ SQLITE_API void sqlite3_set_auxdata( return; failed: - if( xDelete ){ + if (xDelete) { xDelete(pAux); } } @@ -87095,8 +86075,8 @@ SQLITE_API void sqlite3_set_auxdata( ** 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 ); +SQLITE_API int sqlite3_aggregate_count(sqlite3_context* p) { + assert(p && p->pMem && p->pFunc && p->pFunc->xFinalize); return p->pMem->n; } #endif @@ -87104,8 +86084,8 @@ SQLITE_API int sqlite3_aggregate_count(sqlite3_context *p){ /* ** 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; +SQLITE_API int sqlite3_column_count(sqlite3_stmt* pStmt) { + Vdbe* pVm = (Vdbe*)pStmt; return pVm ? pVm->nResColumn : 0; } @@ -87113,16 +86093,17 @@ SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt){ ** 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; +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){ +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 @@ -87134,23 +86115,23 @@ static const Mem *columnNullValue(void){ ** __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, + __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, + /* .pScopyFrom = */ (Mem*)0, + /* .mScopyFlags= */ 0, #endif }; return &nullMem; @@ -87162,17 +86143,18 @@ static const Mem *columnNullValue(void){ ** 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; +static Mem* columnMem(sqlite3_stmt* pStmt, int i) { + Vdbe* pVm; + Mem* pOut; - pVm = (Vdbe *)pStmt; - if( pVm==0 ) return (Mem*)columnNullValue(); - assert( pVm->db ); + 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 ){ + if (pVm->pResultSet != 0 && i < pVm->nResColumn && i >= 0) { pOut = &pVm->pResultSet[i]; - }else{ + } else { sqlite3Error(pVm->db, SQLITE_RANGE); pOut = (Mem*)columnNullValue(); } @@ -87197,17 +86179,16 @@ static Mem *columnMem(sqlite3_stmt *pStmt, int i){ ** sqlite3_column_bytes16() ** sqiite3_column_blob() */ -static void columnMallocFailure(sqlite3_stmt *pStmt) -{ +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) ); + 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); } @@ -87217,9 +86198,9 @@ static void columnMallocFailure(sqlite3_stmt *pStmt) ** 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) ); +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. @@ -87227,54 +86208,54 @@ SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt *pStmt, int i){ columnMallocFailure(pStmt); return val; } -SQLITE_API int sqlite3_column_bytes(sqlite3_stmt *pStmt, int i){ - int val = sqlite3_value_bytes( columnMem(pStmt,i) ); +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) ); +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) ); +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) ); +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) ); +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) ); +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 ){ +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; + 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) ); +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) ); +SQLITE_API int sqlite3_column_type(sqlite3_stmt* pStmt, int i) { + int iType = sqlite3_value_type(columnMem(pStmt, i)); columnMallocFailure(pStmt); return iType; } @@ -87295,35 +86276,34 @@ SQLITE_API int sqlite3_column_type(sqlite3_stmt *pStmt, int i){ ** 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; +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; + sqlite3* db; #ifdef SQLITE_ENABLE_API_ARMOR - if( pStmt==0 ){ + if (pStmt == 0) { (void)SQLITE_MISUSE_BKPT; return 0; } #endif ret = 0; - p = (Vdbe *)pStmt; + p = (Vdbe*)pStmt; db = p->db; - assert( db!=0 ); + assert(db != 0); n = sqlite3_column_count(pStmt); - if( N=0 ){ - N += useType*n; + if (N < n && N >= 0) { + N += useType * n; sqlite3_mutex_enter(db->mutex); - assert( db->mallocFailed==0 ); + assert(db->mallocFailed == 0); #ifndef SQLITE_OMIT_UTF16 - if( useUtf16 ){ + if (useUtf16) { ret = sqlite3_value_text16((sqlite3_value*)&p->aColName[N]); - }else + } else #endif { ret = sqlite3_value_text((sqlite3_value*)&p->aColName[N]); @@ -87331,7 +86311,7 @@ static const void *columnName( /* 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 ){ + if (db->mallocFailed) { sqlite3OomClear(db); ret = 0; } @@ -87344,11 +86324,11 @@ static const void *columnName( ** 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){ +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){ +SQLITE_API const void* sqlite3_column_name16(sqlite3_stmt* pStmt, int N) { return columnName(pStmt, N, 1, COLNAME_NAME); } #endif @@ -87358,7 +86338,7 @@ SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt *pStmt, int N){ ** not define OMIT_DECLTYPE. */ #if defined(SQLITE_OMIT_DECLTYPE) && defined(SQLITE_ENABLE_COLUMN_METADATA) -# error "Must not define both SQLITE_OMIT_DECLTYPE \ +#error "Must not define both SQLITE_OMIT_DECLTYPE \ and SQLITE_ENABLE_COLUMN_METADATA" #endif @@ -87367,11 +86347,11 @@ SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt *pStmt, int N){ ** 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){ +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){ +SQLITE_API const void* sqlite3_column_decltype16(sqlite3_stmt* pStmt, int N) { return columnName(pStmt, N, 1, COLNAME_DECLTYPE); } #endif /* SQLITE_OMIT_UTF16 */ @@ -87383,11 +86363,11 @@ SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt *pStmt, int N){ ** 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){ +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){ +SQLITE_API const void* sqlite3_column_database_name16(sqlite3_stmt* pStmt, int N) { return columnName(pStmt, N, 1, COLNAME_DATABASE); } #endif /* SQLITE_OMIT_UTF16 */ @@ -87397,11 +86377,11 @@ SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt *pStmt, int N ** 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){ +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){ +SQLITE_API const void* sqlite3_column_table_name16(sqlite3_stmt* pStmt, int N) { return columnName(pStmt, N, 1, COLNAME_TABLE); } #endif /* SQLITE_OMIT_UTF16 */ @@ -87411,17 +86391,16 @@ SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt *pStmt, int N){ ** 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){ +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){ +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. @@ -87437,20 +86416,19 @@ SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt *pStmt, int N){ ** 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) ){ +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 ){ + 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); + sqlite3_log(SQLITE_MISUSE, "bind on a busy prepared statement: [%s]", p->zSql); return SQLITE_MISUSE_BKPT; } - if( i<1 || i>p->nVar ){ + if (i < 1 || i > p->nVar) { sqlite3Error(p->db, SQLITE_RANGE); sqlite3_mutex_leave(p->db->mutex); return SQLITE_RANGE; @@ -87470,8 +86448,8 @@ static int vdbeUnbind(Vdbe *p, int i){ ** 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<prepFlags & SQLITE_PREPARE_SAVESQL) != 0 || p->expmask == 0); + if (p->expmask != 0 && (p->expmask & (i >= 31 ? 0x80000000 : (u32)1 << i)) != 0) { p->expired = 1; } return SQLITE_OK; @@ -87480,171 +86458,132 @@ static int vdbeUnbind(Vdbe *p, int i){ /* ** 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; +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]; + 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 ){ + if (rc == SQLITE_OK && encoding != 0) { rc = sqlite3VdbeChangeEncoding(pVar, ENC(p->db)); } - if( rc ){ + 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 ){ + } 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*) -){ +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; + 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 ); +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){ +SQLITE_API int sqlite3_bind_double(sqlite3_stmt* pStmt, int i, double rValue) { int rc; - Vdbe *p = (Vdbe *)pStmt; + Vdbe* p = (Vdbe*)pStmt; rc = vdbeUnbind(p, i); - if( rc==SQLITE_OK ){ - sqlite3VdbeMemSetDouble(&p->aVar[i-1], rValue); + 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){ +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){ +SQLITE_API int sqlite3_bind_int64(sqlite3_stmt* pStmt, int i, sqlite_int64 iValue) { int rc; - Vdbe *p = (Vdbe *)pStmt; + Vdbe* p = (Vdbe*)pStmt; rc = vdbeUnbind(p, i); - if( rc==SQLITE_OK ){ - sqlite3VdbeMemSetInt64(&p->aVar[i-1], iValue); + 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){ +SQLITE_API int sqlite3_bind_null(sqlite3_stmt* pStmt, int i) { int rc; - Vdbe *p = (Vdbe*)pStmt; + Vdbe* p = (Vdbe*)pStmt; rc = vdbeUnbind(p, i); - if( rc==SQLITE_OK ){ + 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*) -){ +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; + Vdbe* p = (Vdbe*)pStmt; rc = vdbeUnbind(p, i); - if( rc==SQLITE_OK ){ - sqlite3VdbeMemSetPointer(&p->aVar[i-1], pPtr, zPTtype, xDestructor); + if (rc == SQLITE_OK) { + sqlite3VdbeMemSetPointer(&p->aVar[i - 1], pPtr, zPTtype, xDestructor); sqlite3_mutex_leave(p->db->mutex); - }else if( xDestructor ){ + } 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*) -){ +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; +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*) -){ +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){ +SQLITE_API int sqlite3_bind_value(sqlite3_stmt* pStmt, int i, const sqlite3_value* pValue) { int rc; - switch( sqlite3_value_type((sqlite3_value*)pValue) ){ + 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 - ); + 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 ){ + 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); + } 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); + rc = bindText(pStmt, i, pValue->z, pValue->n, SQLITE_TRANSIENT, pValue->enc); break; } default: { @@ -87654,28 +86593,28 @@ SQLITE_API int sqlite3_bind_value(sqlite3_stmt *pStmt, int i, const sqlite3_valu } return rc; } -SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt *pStmt, int i, int n){ +SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt* pStmt, int i, int n) { int rc; - Vdbe *p = (Vdbe *)pStmt; + Vdbe* p = (Vdbe*)pStmt; rc = vdbeUnbind(p, i); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { #ifndef SQLITE_OMIT_INCRBLOB - sqlite3VdbeMemSetZeroBlob(&p->aVar[i-1], n); + sqlite3VdbeMemSetZeroBlob(&p->aVar[i - 1], n); #else - rc = sqlite3VdbeMemSetZeroBlob(&p->aVar[i-1], n); + 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){ +SQLITE_API int sqlite3_bind_zeroblob64(sqlite3_stmt* pStmt, int i, sqlite3_uint64 n) { int rc; - Vdbe *p = (Vdbe *)pStmt; + Vdbe* p = (Vdbe*)pStmt; sqlite3_mutex_enter(p->db->mutex); - if( n>(u64)p->db->aLimit[SQLITE_LIMIT_LENGTH] ){ + if (n > (u64)p->db->aLimit[SQLITE_LIMIT_LENGTH]) { rc = SQLITE_TOOBIG; - }else{ - assert( (n & 0x7FFFFFFF)==n ); + } else { + assert((n & 0x7FFFFFFF) == n); rc = sqlite3_bind_zeroblob(pStmt, i, n); } rc = sqlite3ApiExit(p->db, rc); @@ -87687,8 +86626,8 @@ SQLITE_API int sqlite3_bind_zeroblob64(sqlite3_stmt *pStmt, int i, sqlite3_uint6 ** 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; +SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt* pStmt) { + Vdbe* p = (Vdbe*)pStmt; return p ? p->nVar : 0; } @@ -87698,9 +86637,10 @@ SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt *pStmt){ ** ** 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; +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); } @@ -87709,25 +86649,26 @@ SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt *pStmt, int i){ ** 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; +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){ +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; +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 ); + assert(pTo->db == pFrom->db); + assert(pTo->nVar == pFrom->nVar); sqlite3_mutex_enter(pTo->db->mutex); - for(i=0; inVar; i++){ + for (i = 0; i < pFrom->nVar; i++) { sqlite3VdbeMemMove(&pTo->aVar[i], &pFrom->aVar[i]); } sqlite3_mutex_leave(pTo->db->mutex); @@ -87747,18 +86688,18 @@ SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *pFromStmt, sqlite3_stmt ** 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 ){ +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 ){ + 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 ){ + assert((pFrom->prepFlags & SQLITE_PREPARE_SAVESQL) != 0 || pFrom->expmask == 0); + if (pFrom->expmask) { pFrom->expired = 1; } return sqlite3TransferBindings(pFromStmt, pToStmt); @@ -87771,7 +86712,7 @@ SQLITE_API int sqlite3_transfer_bindings(sqlite3_stmt *pFromStmt, sqlite3_stmt * ** 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){ +SQLITE_API sqlite3* sqlite3_db_handle(sqlite3_stmt* pStmt) { return pStmt ? ((Vdbe*)pStmt)->db : 0; } @@ -87779,7 +86720,7 @@ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt *pStmt){ ** Return true if the prepared statement is guaranteed to not modify the ** database. */ -SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt){ +SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt* pStmt) { return pStmt ? ((Vdbe*)pStmt)->readOnly : 1; } @@ -87787,16 +86728,16 @@ SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt){ ** 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){ +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; +SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt* pStmt) { + Vdbe* v = (Vdbe*)pStmt; + return v != 0 && v->eVdbeState == VDBE_RUN_STATE; } /* @@ -87805,18 +86746,18 @@ SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt *pStmt){ ** 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; +SQLITE_API sqlite3_stmt* sqlite3_next_stmt(sqlite3* pDb, sqlite3_stmt* pStmt) { + sqlite3_stmt* pNext; #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(pDb) ){ + if (!sqlite3SafetyCheckOk(pDb)) { (void)SQLITE_MISUSE_BKPT; return 0; } #endif sqlite3_mutex_enter(pDb->mutex); - if( pStmt==0 ){ + if (pStmt == 0) { pNext = (sqlite3_stmt*)pDb->pVdbe; - }else{ + } else { pNext = (sqlite3_stmt*)((Vdbe*)pStmt)->pNext; } sqlite3_mutex_leave(pDb->mutex); @@ -87826,28 +86767,27 @@ SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt){ /* ** 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; +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))) - ){ + 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; + 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{ + } else { v = pVdbe->aCounter[op]; - if( resetFlag ) pVdbe->aCounter[op] = 0; + if (resetFlag) + pVdbe->aCounter[op] = 0; } return (int)v; } @@ -87855,8 +86795,8 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt *pStmt, int op, int resetFlag){ /* ** Return the SQL associated with a prepared statement */ -SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt){ - Vdbe *p = (Vdbe *)pStmt; +SQLITE_API const char* sqlite3_sql(sqlite3_stmt* pStmt) { + Vdbe* p = (Vdbe*)pStmt; return p ? p->zSql : 0; } @@ -87869,14 +86809,14 @@ SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt){ ** 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){ +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; + 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); @@ -87889,10 +86829,11 @@ SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt){ /* ** 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) ){ +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); @@ -87907,16 +86848,12 @@ SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt){ ** 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 */ +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)); + if (pRet) { + memset(pRet->aMem, 0, sizeof(Mem) * (pKeyInfo->nKeyField + 1)); sqlite3VdbeRecordUnpack(pKeyInfo, nKey, pKey, pRet); } return pRet; @@ -87926,40 +86863,42 @@ static UnpackedRecord *vdbeUnpackRecord( ** 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; +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 ){ + if (!p || p->op == SQLITE_INSERT) { rc = SQLITE_MISUSE_BKPT; goto preupdate_old_out; } - if( p->pPk ){ + if (p->pPk) { iIdx = sqlite3TableColumnToIndex(p->pPk, iIdx); } - if( iIdx>=p->pCsr->nField || iIdx<0 ){ + 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 ){ + if (p->pUnpacked == 0) { u32 nRec; - u8 *aRec; + u8* aRec; - assert( p->pCsr->eCurType==CURTYPE_BTREE ); + assert(p->pCsr->eCurType == CURTYPE_BTREE); nRec = sqlite3BtreePayloadSize(p->pCsr->uc.pCursor); aRec = sqlite3DbMallocRaw(db, nRec); - if( !aRec ) goto preupdate_old_out; + if (!aRec) + goto preupdate_old_out; rc = sqlite3BtreePayload(p->pCsr->uc.pCursor, 0, nRec, aRec); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { p->pUnpacked = vdbeUnpackRecord(&p->keyinfo, nRec, aRec); - if( !p->pUnpacked ) rc = SQLITE_NOMEM; + if (!p->pUnpacked) + rc = SQLITE_NOMEM; } - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { sqlite3DbFree(db, aRec); goto preupdate_old_out; } @@ -87967,19 +86906,19 @@ SQLITE_API int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppVa } pMem = *ppValue = &p->pUnpacked->aMem[iIdx]; - if( iIdx==p->pTab->iPKey ){ + 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 ); + } 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: +preupdate_old_out: sqlite3Error(db, rc); return sqlite3ApiExit(db, rc); } @@ -87990,8 +86929,8 @@ SQLITE_API int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppVa ** 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; +SQLITE_API int sqlite3_preupdate_count(sqlite3* db) { + PreUpdate* p = db->pPreUpdate; return (p ? p->keyinfo.nKeyField : 0); } #endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ @@ -88008,8 +86947,8 @@ SQLITE_API int sqlite3_preupdate_count(sqlite3 *db){ ** 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; +SQLITE_API int sqlite3_preupdate_depth(sqlite3* db) { + PreUpdate* p = db->pPreUpdate; return (p ? p->v->nFrame : 0); } #endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ @@ -88019,8 +86958,8 @@ SQLITE_API int sqlite3_preupdate_depth(sqlite3 *db){ ** 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; +SQLITE_API int sqlite3_preupdate_blobwrite(sqlite3* db) { + PreUpdate* p = db->pPreUpdate; return (p ? p->iBlobWrite : -1); } #endif @@ -88030,72 +86969,74 @@ SQLITE_API int sqlite3_preupdate_blobwrite(sqlite3 *db){ ** 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; +SQLITE_API int sqlite3_preupdate_new(sqlite3* db, int iIdx, sqlite3_value** ppValue) { + PreUpdate* p = db->pPreUpdate; int rc = SQLITE_OK; - Mem *pMem; + Mem* pMem; - if( !p || p->op==SQLITE_DELETE ){ + if (!p || p->op == SQLITE_DELETE) { rc = SQLITE_MISUSE_BKPT; goto preupdate_new_out; } - if( p->pPk && p->op!=SQLITE_UPDATE ){ + if (p->pPk && p->op != SQLITE_UPDATE) { iIdx = sqlite3TableColumnToIndex(p->pPk, iIdx); } - if( iIdx>=p->pCsr->nField || iIdx<0 ){ + if (iIdx >= p->pCsr->nField || iIdx < 0) { rc = SQLITE_RANGE; goto preupdate_new_out; } - if( p->op==SQLITE_INSERT ){ + 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]; + UnpackedRecord* pUnpack = p->pNewUnpacked; + if (!pUnpack) { + Mem* pData = &p->v->aMem[p->iNewReg]; rc = ExpandBlob(pData); - if( rc!=SQLITE_OK ) goto preupdate_new_out; + if (rc != SQLITE_OK) + goto preupdate_new_out; pUnpack = vdbeUnpackRecord(&p->keyinfo, pData->n, pData->z); - if( !pUnpack ){ + if (!pUnpack) { rc = SQLITE_NOMEM; goto preupdate_new_out; } p->pNewUnpacked = pUnpack; } pMem = &pUnpack->aMem[iIdx]; - if( iIdx==p->pTab->iPKey ){ + if (iIdx == p->pTab->iPKey) { sqlite3VdbeMemSetInt64(pMem, p->iKey2); - }else if( iIdx>=pUnpack->nField ){ - pMem = (sqlite3_value *)columnNullValue(); + } else if (iIdx >= pUnpack->nField) { + pMem = (sqlite3_value*)columnNullValue(); } - }else{ + } 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 ){ + 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 ); + assert(iIdx >= 0 && iIdx < p->pCsr->nField); pMem = &p->aNew[iIdx]; - if( pMem->flags==0 ){ - if( iIdx==p->pTab->iPKey ){ + 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; + } else { + rc = sqlite3VdbeMemCopy(pMem, &p->v->aMem[p->iNewReg + 1 + iIdx]); + if (rc != SQLITE_OK) + goto preupdate_new_out; } } } *ppValue = pMem; - preupdate_new_out: +preupdate_new_out: sqlite3Error(db, rc); return sqlite3ApiExit(db, rc); } @@ -88105,17 +87046,17 @@ SQLITE_API int sqlite3_preupdate_new(sqlite3 *db, int iIdx, sqlite3_value **ppVa /* ** 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; +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 ){ + switch (iScanStatusOp) { case SQLITE_SCANSTAT_NLOOP: { *(sqlite3_int64*)pOut = p->anExec[pScan->addrLoop]; break; @@ -88127,11 +87068,11 @@ SQLITE_API int sqlite3_stmt_scanstatus( case SQLITE_SCANSTAT_EST: { double r = 1.0; LogEst x = pScan->nEst; - while( x<100 ){ + while (x < 100) { x += 10; r *= 0.5; } - *(double*)pOut = r*sqlite3LogEstToInt(x); + *(double*)pOut = r * sqlite3LogEstToInt(x); break; } case SQLITE_SCANSTAT_NAME: { @@ -88139,17 +87080,17 @@ SQLITE_API int sqlite3_stmt_scanstatus( break; } case SQLITE_SCANSTAT_EXPLAIN: { - if( pScan->addrExplain ){ - *(const char**)pOut = p->aOp[ pScan->addrExplain ].p4.z; - }else{ + 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{ + if (pScan->addrExplain) { + *(int*)pOut = p->aOp[pScan->addrExplain].p1; + } else { *(int*)pOut = -1; } break; @@ -88164,8 +87105,8 @@ SQLITE_API int sqlite3_stmt_scanstatus( /* ** Zero all counters associated with the sqlite3_stmt_scanstatus() data. */ -SQLITE_API void sqlite3_stmt_scanstatus_reset(sqlite3_stmt *pStmt){ - Vdbe *p = (Vdbe*)pStmt; +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 */ @@ -88200,16 +87141,16 @@ SQLITE_API void sqlite3_stmt_scanstatus_reset(sqlite3_stmt *pStmt){ ** 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){ +static int findNextHostParameter(const char* zSql, int* pnToken) { int tokenType; int nTotal = 0; int n; *pnToken = 0; - while( zSql[0] ){ + while (zSql[0]) { n = sqlite3GetToken((u8*)zSql, &tokenType); - assert( n>0 && tokenType!=TK_ILLEGAL ); - if( tokenType==TK_VARIABLE ){ + assert(n > 0 && tokenType != TK_ILLEGAL); + if (tokenType == TK_VARIABLE) { *pnToken = n; break; } @@ -88243,78 +87184,78 @@ static int findNextHostParameter(const char *zSql, int *pnToken){ ** 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 */ +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 */ + 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 ); + 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)); + assert((zRawSql - zStart) > 0); + sqlite3_str_append(&out, zStart, (int)(zRawSql - zStart)); } - }else if( p->nVar==0 ){ + } else if (p->nVar == 0) { sqlite3_str_append(&out, zRawSql, sqlite3Strlen30(zRawSql)); - }else{ - while( zRawSql[0] ){ + } else { + while (zRawSql[0]) { n = findNextHostParameter(zRawSql, &nToken); - assert( n>0 ); + 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]) ); + assert(zRawSql[0] || nToken == 0); + if (nToken == 0) + break; + if (zRawSql[0] == '?') { + if (nToken > 1) { + assert(sqlite3Isdigit(zRawSql[1])); sqlite3GetInt32(&zRawSql[1], &idx); - }else{ + } 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]=='#' ); + } 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 ); + 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 ){ + 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) ){ + } else if (pVar->flags & (MEM_Int | MEM_IntReal)) { sqlite3_str_appendf(&out, "%lld", pVar->u.i); - }else if( pVar->flags & MEM_Real ){ + } 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 */ + } 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 ){ + 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) ){ + if (SQLITE_NOMEM == sqlite3VdbeChangeEncoding(&utf8, SQLITE_UTF8)) { out.accError = SQLITE_NOMEM; out.nAlloc = 0; } @@ -88323,43 +87264,48 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql( #endif nOut = pVar->n; #ifdef SQLITE_TRACE_SIZE_LIMIT - if( nOut>SQLITE_TRACE_SIZE_LIMIT ){ + if (nOut > SQLITE_TRACE_SIZE_LIMIT) { nOut = SQLITE_TRACE_SIZE_LIMIT; - while( nOutn && (pVar->z[nOut]&0xc0)==0x80 ){ nOut++; } + while (nOut < pVar->n && (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); + if (nOut < pVar->n) { + sqlite3_str_appendf(&out, "/*+%d bytes*/", pVar->n - nOut); } #endif #ifndef SQLITE_OMIT_UTF16 - if( enc!=SQLITE_UTF8 ) sqlite3VdbeMemRelease(&utf8); + if (enc != SQLITE_UTF8) + sqlite3VdbeMemRelease(&utf8); #endif - }else if( pVar->flags & MEM_Zero ){ + } 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 ); + } 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; + if (nOut > SQLITE_TRACE_SIZE_LIMIT) + nOut = SQLITE_TRACE_SIZE_LIMIT; #endif - for(i=0; iz[i]&0xff); + for (i = 0; i < nOut; i++) { + sqlite3_str_appendf(&out, "%02x", pVar->z[i] & 0xff); } sqlite3_str_append(&out, "'", 1); #ifdef SQLITE_TRACE_SIZE_LIMIT - if( nOutn ){ - sqlite3_str_appendf(&out, "/*+%d bytes*/", pVar->n-nOut); + if (nOut < pVar->n) { + sqlite3_str_appendf(&out, "/*+%d bytes*/", pVar->n - nOut); } #endif } } } - if( out.accError ) sqlite3_str_reset(&out); + if (out.accError) + sqlite3_str_reset(&out); return sqlite3StrAccumFinish(&out); } @@ -88400,9 +87346,9 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql( ** like that ever happens. */ #ifdef SQLITE_DEBUG -# define memAboutToChange(P,M) sqlite3VdbeMemAboutToChange(P,M) +#define memAboutToChange(P, M) sqlite3VdbeMemAboutToChange(P, M) #else -# define memAboutToChange(P,M) +#define memAboutToChange(P, M) #endif /* @@ -88448,8 +87394,8 @@ SQLITE_API int sqlite3_sort_count = 0; */ #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 ){ +static void updateMaxBlobsize(Mem* p) { + if ((p->flags & (MEM_Str | MEM_Blob)) != 0 && p->n > sqlite3_max_blobsize) { sqlite3_max_blobsize = p->n; } } @@ -88460,9 +87406,9 @@ static void updateMaxBlobsize(Mem *p){ ** hook are enabled for database connect DB. */ #ifdef SQLITE_ENABLE_PREUPDATE_HOOK -# define HAS_UPDATE_HOOK(DB) ((DB)->xPreUpdateCallback||(DB)->xUpdateCallback) +#define HAS_UPDATE_HOOK(DB) ((DB)->xPreUpdateCallback || (DB)->xUpdateCallback) #else -# define HAS_UPDATE_HOOK(DB) ((DB)->xUpdateCallback) +#define HAS_UPDATE_HOOK(DB) ((DB)->xUpdateCallback) #endif /* @@ -88481,9 +87427,9 @@ SQLITE_API int sqlite3_found_count = 0; ** If it does, record the new maximum blob size. */ #if defined(SQLITE_TEST) && !defined(SQLITE_UNTESTABLE) -# define UPDATE_MAX_BLOBSIZE(P) updateMaxBlobsize(P) +#define UPDATE_MAX_BLOBSIZE(P) updateMaxBlobsize(P) #else -# define UPDATE_MAX_BLOBSIZE(P) +#define UPDATE_MAX_BLOBSIZE(P) #endif #ifdef SQLITE_DEBUG @@ -88500,7 +87446,7 @@ SQLITE_API int sqlite3_found_count = 0; ** sqlite3MisuseError(lineno) ** sqlite3CantopenError(lineno) */ -static void test_trace_breakpoint(int pc, Op *pOp, Vdbe *v){ +static void test_trace_breakpoint(int pc, Op* pOp, Vdbe* v) { static int n = 0; n++; } @@ -88544,44 +87490,46 @@ static void test_trace_breakpoint(int pc, Op *pOp, Vdbe *v){ ** 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); - } +#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 < M); /* I can only be 2 if M is 3 or 4 */ + /* Transform I from a integer [0,1,2] into a bitmask of [1,2,4] */ + I = 1 << I; + /* The upper 8 bits of iSrcLine are flags. The lower three bits of + ** the flags indicate directions that the branch can never go. If + ** a branch really does go in one of those directions, assert right + ** away. */ + mNever = iSrcLine >> 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 /* @@ -88595,23 +87543,23 @@ static void test_trace_breakpoint(int pc, Op *pOp, Vdbe *v){ ** 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;} +#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) +#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 */ -){ +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 @@ -88630,16 +87578,14 @@ static VdbeCursor *allocateCursor( ** 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; + 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); + 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*/ + assert(iCur >= 0 && iCur < p->nCursor); + if (p->apCsr[iCur]) { /*OPTIMIZATION-IF-FALSE*/ sqlite3VdbeFreeCursorNN(p, p->apCsr[iCur]); p->apCsr[iCur] = 0; } @@ -88648,15 +87594,15 @@ static VdbeCursor *allocateCursor( ** 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 ){ + assert(pMem->flags == MEM_Undefined); + assert((pMem->flags & MEM_Dyn) == 0); + assert(pMem->szMalloc == 0 || pMem->z == pMem->zMalloc); + if (pMem->szMalloc < nByte) { + if (pMem->szMalloc > 0) { sqlite3DbFreeNN(pMem->db, pMem->zMalloc); } pMem->z = pMem->zMalloc = sqlite3DbMallocRaw(pMem->db, nByte); - if( pMem->zMalloc==0 ){ + if (pMem->zMalloc == 0) { pMem->szMalloc = 0; return 0; } @@ -88664,13 +87610,12 @@ static VdbeCursor *allocateCursor( } p->apCsr[iCur] = pCx = (VdbeCursor*)pMem->zMalloc; - memset(pCx, 0, offsetof(VdbeCursor,pAltCursor)); + 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]; + if (eCurType == CURTYPE_BTREE) { + pCx->uc.pCursor = (BtCursor*)&pMem->z[ROUND8P(sizeof(VdbeCursor)) + 2 * sizeof(u32) * nField]; sqlite3BtreeCursorZero(pCx->uc.pCursor); } return pCx; @@ -88682,13 +87627,13 @@ static VdbeCursor *allocateCursor( ** integer value if the string is in range to be an integer. Otherwise, ** return false. */ -static int alsoAnInt(Mem *pRec, double rValue, i64 *piValue){ +static int alsoAnInt(Mem* pRec, double rValue, i64* piValue) { i64 iValue = (double)rValue; - if( sqlite3RealSameAsInt(rValue,iValue) ){ + if (sqlite3RealSameAsInt(rValue, iValue)) { *piValue = iValue; return 1; } - return 0==sqlite3Atoi64(pRec->z, piValue, pRec->n, pRec->enc); + return 0 == sqlite3Atoi64(pRec->z, piValue, pRec->n, pRec->enc); } /* @@ -88706,19 +87651,21 @@ static int alsoAnInt(Mem *pRec, double rValue, i64 *piValue){ ** 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){ +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 ); + 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) ){ + if (rc <= 0) + return; + if (rc == 1 && alsoAnInt(pRec, rValue, &pRec->u.i)) { pRec->flags |= MEM_Int; - }else{ + } else { pRec->u.r = rValue; pRec->flags |= MEM_Real; - if( bTryForInt ) sqlite3VdbeIntegerAffinity(pRec); + 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 @@ -88746,36 +87693,35 @@ static void applyNumericAffinity(Mem *pRec, int bTryForInt){ ** 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{ +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 ){ + } 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 ); + 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); + pRec->flags &= ~(MEM_Real | MEM_Int | MEM_IntReal); } } @@ -88785,10 +87731,10 @@ static void applyAffinity( ** 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){ +SQLITE_API int sqlite3_value_numeric_type(sqlite3_value* pVal) { int eType = sqlite3_value_type(pVal); - if( eType==SQLITE_TEXT ){ - Mem *pMem = (Mem*)pVal; + if (eType == SQLITE_TEXT) { + Mem* pMem = (Mem*)pVal; applyNumericAffinity(pMem, 0); eType = sqlite3_value_type(pVal); } @@ -88799,12 +87745,8 @@ SQLITE_API int sqlite3_value_numeric_type(sqlite3_value *pVal){ ** 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); +SQLITE_PRIVATE void sqlite3ValueApplyAffinity(sqlite3_value* pVal, u8 affinity, u8 enc) { + applyAffinity((Mem*)pVal, affinity, enc); } /* @@ -88813,24 +87755,24 @@ SQLITE_PRIVATE void sqlite3ValueApplyAffinity( ** numeric type, if has one. Set the pMem->u.r and pMem->u.i fields ** accordingly. */ -static u16 SQLITE_NOINLINE computeNumericType(Mem *pMem){ +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) ){ + 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 ){ + if (rc <= 0) { + if (rc == 0 && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc) <= 1) { pMem->u.i = ix; return MEM_Int; - }else{ + } else { return MEM_Real; } - }else if( rc==1 && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)==0 ){ + } else if (rc == 1 && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc) == 0) { pMem->u.i = ix; return MEM_Int; } @@ -88844,16 +87786,16 @@ static u16 SQLITE_NOINLINE computeNumericType(Mem *pMem){ ** 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); +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 ); + if (pMem->flags & (MEM_Str | MEM_Blob)) { + testcase(pMem->flags & MEM_Str); + testcase(pMem->flags & MEM_Blob); return computeNumericType(pMem); } return 0; @@ -88864,56 +87806,56 @@ static u16 numericType(Mem *pMem){ ** Write a nice string representation of the contents of cell pMem ** into buffer zBuf, length nBuf. */ -SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, StrAccum *pStr){ +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 ){ + static const char* const encnames[] = {"(X)", "(8)", "(16LE)", "(16BE)"}; + if (f & MEM_Blob) { int i; char c; - if( f & MEM_Dyn ){ + if (f & MEM_Dyn) { c = 'z'; - assert( (f & (MEM_Static|MEM_Ephem))==0 ); - }else if( f & MEM_Static ){ + 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 ){ + assert((f & (MEM_Dyn | MEM_Ephem)) == 0); + } else if (f & MEM_Ephem) { c = 'e'; - assert( (f & (MEM_Static|MEM_Dyn))==0 ); - }else{ + assert((f & (MEM_Static | MEM_Dyn)) == 0); + } else { c = 's'; } sqlite3_str_appendf(pStr, "%cx[", c); - for(i=0; i<25 && in; i++){ + for (i = 0; i < 25 && i < pMem->n; i++) { sqlite3_str_appendf(pStr, "%02X", ((int)pMem->z[i] & 0xFF)); } sqlite3_str_appendf(pStr, "|"); - for(i=0; i<25 && in; i++){ + for (i = 0; i < 25 && i < pMem->n; i++) { char z = pMem->z[i]; - sqlite3_str_appendchar(pStr, 1, (z<32||z>126)?'.':z); + 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); + sqlite3_str_appendf(pStr, "]"); + if (f & MEM_Zero) { + sqlite3_str_appendf(pStr, "+%dz", pMem->u.nZero); } - }else if( f & MEM_Str ){ + } else if (f & MEM_Str) { int j; u8 c; - if( f & MEM_Dyn ){ + if (f & MEM_Dyn) { c = 'z'; - assert( (f & (MEM_Static|MEM_Ephem))==0 ); - }else if( f & MEM_Static ){ + 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 ){ + assert((f & (MEM_Dyn | MEM_Ephem)) == 0); + } else if (f & MEM_Ephem) { c = 'e'; - assert( (f & (MEM_Static|MEM_Dyn))==0 ); - }else{ + 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++){ + for (j = 0; j < 25 && j < pMem->n; j++) { c = pMem->z[j]; - sqlite3_str_appendchar(pStr, 1, (c>=0x20&&c<=0x7f) ? c : '.'); + sqlite3_str_appendchar(pStr, 1, (c >= 0x20 && c <= 0x7f) ? c : '.'); } sqlite3_str_appendf(pStr, "]%s", encnames[pMem->enc]); } @@ -88924,42 +87866,43 @@ SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, StrAccum *pStr){ /* ** Print the value of a register for tracing purposes: */ -static void memTracePrint(Mem *p){ - if( p->flags & MEM_Undefined ){ +static void memTracePrint(Mem* p) { + if (p->flags & MEM_Undefined) { printf(" undefined"); - }else if( p->flags & MEM_Null ){ + } 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) ){ + } 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 ){ + } else if ((p->flags & (MEM_IntReal)) != 0) { printf(" ir:%lld", p->u.i); - }else if( p->flags & MEM_Int ){ + } else if (p->flags & MEM_Int) { printf(" i:%lld", p->u.i); #ifndef SQLITE_OMIT_FLOATING_POINT - }else if( p->flags & MEM_Real ){ + } else if (p->flags & MEM_Real) { printf(" r:%.17g", p->u.r); #endif - }else if( sqlite3VdbeMemIsRowSet(p) ){ + } else if (sqlite3VdbeMemIsRowSet(p)) { printf(" (rowset)"); - }else{ + } 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); + if (p->flags & MEM_Subtype) + printf(" subtype=0x%02x", p->eSubtype); } -static void registerTrace(int iReg, Mem *p){ +static void registerTrace(int iReg, Mem* p) { printf("R[%d] = ", iReg); memTracePrint(p); - if( p->pScopyFrom ){ + if (p->pScopyFrom) { printf(" <== R[%d]", (int)(p->pScopyFrom - &p[-iReg])); } printf("\n"); sqlite3VdbeCheckMemInvariants(p); } -/**/ void sqlite3PrintMem(Mem *pMem){ +/**/ void sqlite3PrintMem(Mem* pMem) { memTracePrint(pMem); printf("\n"); fflush(stdout); @@ -88971,20 +87914,21 @@ static void registerTrace(int iReg, Mem *p){ ** Show the values of all registers in the virtual machine. Used for ** interactive debugging. */ -SQLITE_PRIVATE void sqlite3VdbeRegisterDump(Vdbe *v){ +SQLITE_PRIVATE void sqlite3VdbeRegisterDump(Vdbe* v) { int i; - for(i=1; inMem; i++) registerTrace(i, v->aMem+i); + for (i = 1; i < v->nMem; 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) +#define REGISTER_TRACE(R, M) \ + if (db->flags & SQLITE_VdbeTrace) \ + registerTrace(R, M) #else -# define REGISTER_TRACE(R,M) +#define REGISTER_TRACE(R, M) #endif - #ifdef VDBE_PROFILE /* @@ -89006,11 +87950,12 @@ SQLITE_PRIVATE void sqlite3VdbeRegisterDump(Vdbe *v){ ** ** assert( checkSavepointCount(db) ); */ -static int checkSavepointCount(sqlite3 *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) ); + Savepoint* p; + for (p = db->pSavepoint; p; p = p->pNext) + n++; + assert(n == (db->nSavepoint + db->isTransactionSavepoint)); return 1; } #endif @@ -89019,20 +87964,20 @@ static int checkSavepointCount(sqlite3 *db){ ** Return the register of pOp->p2 after first preparing it to be ** overwritten with an integer value. */ -static SQLITE_NOINLINE Mem *out2PrereleaseWithClear(Mem *pOut){ +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) ); +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*/ + if (VdbeMemDynamic(pOut)) { /*OPTIMIZATION-IF-FALSE*/ return out2PrereleaseWithClear(pOut); - }else{ + } else { pOut->flags = MEM_Int; return pOut; } @@ -89042,20 +87987,21 @@ static Mem *out2Prerelease(Vdbe *p, VdbeOp *pOp){ ** 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){ +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) ){ + assert(pOp->p4type == P4_INT32); + for (i = pOp->p3, mx = i + pOp->p4.i; i < mx; i++) { + const Mem* p = &aMem[i]; + if (p->flags & (MEM_Int | MEM_IntReal)) { h += p->u.i; - }else if( p->flags & MEM_Real ){ + } else if (p->flags & MEM_Real) { h += sqlite3VdbeIntValue(p); - }else if( p->flags & (MEM_Str|MEM_Blob) ){ + } else if (p->flags & (MEM_Str | MEM_Blob)) { h += p->n; - if( p->flags & MEM_Zero ) h += p->u.nZero; + if (p->flags & MEM_Zero) + h += p->u.nZero; } } return h; @@ -89064,135 +88010,133 @@ static u64 filterHash(const Mem *aMem, const Op *pOp){ /* ** 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]; +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 */ +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 */ + Op* pOrigOp; /* Value of pOp at the top of the loop */ #endif #ifdef SQLITE_DEBUG - int nExtraDelete = 0; /* Verifies FORDELETE and AUXDELETE flags */ + int nExtraDelete = 0; /* Verifies FORDELETE and AUXDELETE flags */ #endif int rc = SQLITE_OK; /* Value to return */ - sqlite3 *db = p->db; /* The database */ + 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 */ + 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 */ + 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 */ + u64 start; /* CPU clock count at start of opcode */ #endif /*** INSERT STACK UNION HERE ***/ - assert( p->eVdbeState==VDBE_RUN_STATE ); /* sqlite3_step() verifies this */ + assert(p->eVdbeState == VDBE_RUN_STATE); /* sqlite3_step() verifies this */ sqlite3VdbeEnter(p); #ifndef SQLITE_OMIT_PROGRESS_CALLBACK - if( db->xProgress ){ + if (db->xProgress) { u32 iPrior = p->aCounter[SQLITE_STMTSTATUS_VM_STEP]; - assert( 0 < db->nProgressOps ); + assert(0 < db->nProgressOps); nProgressLimit = db->nProgressOps - (iPrior % db->nProgressOps); - }else{ + } else { nProgressLimit = LARGEST_UINT64; } #endif - if( p->rc==SQLITE_NOMEM ){ + 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 ); + 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 ); + assert(p->bIsReader || p->readOnly != 0); p->iCurrentTime = 0; - assert( p->explain==0 ); + assert(p->explain == 0); p->pResultSet = 0; db->busyHandler.nBusy = 0; - if( AtomicLoad(&db->u1.isInterrupted) ) goto abort_due_to_interrupt; + 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 - ){ + 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 ){ + if (p->db->flags & SQLITE_VdbeListing) { printf("VDBE Program Listing:\n"); - for(i=0; inOp; i++){ + for (i = 0; i < p->nOp; 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"); + if (p->db->flags & SQLITE_VdbeEQP) { + for (i = 0; i < p->nOp; 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"); + if (p->db->flags & SQLITE_VdbeTrace) + printf("VDBE Trace:\n"); } sqlite3EndBenignMalloc(); #endif - for(pOp=&aOp[p->pc]; 1; pOp++){ + 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(rc == SQLITE_OK); - assert( pOp>=aOp && pOp<&aOp[p->nOp]); + 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)]++; + if (p->anExec) + p->anExec[(int)(pOp - aOp)]++; #endif - /* Only allow tracing if SQLITE_DEBUG is defined. - */ + /* Only allow tracing if SQLITE_DEBUG is defined. + */ #ifdef SQLITE_DEBUG - if( db->flags & SQLITE_VdbeTrace ){ + if (db->flags & SQLITE_VdbeTrace) { sqlite3VdbePrintOp(stdout, (int)(pOp - aOp), pOp); - test_trace_breakpoint((int)(pOp - aOp),pOp,p); + 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 ){ + if (sqlite3_interrupt_count > 0) { sqlite3_interrupt_count--; - if( sqlite3_interrupt_count==0 ){ + if (sqlite3_interrupt_count == 0) { sqlite3_interrupt(db); } } @@ -89202,35 +88146,35 @@ SQLITE_PRIVATE int sqlite3VdbeExec( #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]) ); + 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]) ); + 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]) ); + 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) ); + 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) ); + if ((opProperty & OPFLG_OUT3) != 0) { + assert(pOp->p3 > 0); + assert(pOp->p3 <= (p->nMem + 1 - p->nCursor)); memAboutToChange(p, &aMem[pOp->p3]); } } @@ -89239,7747 +88183,7853 @@ SQLITE_PRIVATE int sqlite3VdbeExec( pOrigOp = pOp; #endif - switch( pOp->opcode ){ + 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. -** -*****************************************************************************/ + /***************************************************************************** + ** 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 */ + /* 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; - } + /* 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]; + 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; + /* 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; - } - } + /* 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; -} + break; + } -/* 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: 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; + /* 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->p2 < p->nOp); + assert(pOp->p3 >= 0 && pOp->p3 < p->nOp); + 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; -} + /* 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->p2 < p->nOp); /* 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: 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.i < p->nOp); + pCaller = &aOp[pIn1->u.i]; + assert(pCaller->opcode == OP_Yield); + assert(pCaller->p2 >= 0 && pCaller->p2 < p->nOp); + 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: 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]; + /* 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); } + 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 -} + 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; + /* 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); + 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; } - }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: 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; -} + /* 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; -} + /* 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); + /* 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; - } + 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 -} + 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); + /* 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; - } + 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; -} + 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; + /* 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; + pOut->uTemp = 0; #endif - while( cnt>0 ){ - pOut++; - memAboutToChange(p, pOut); - sqlite3VdbeMemSetNull(pOut); - pOut->flags = nullFlag; - pOut->n = 0; - cnt--; - } - break; -} + 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: 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; + /* 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; } - } -#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; + /* 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 */ - 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; -} + 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: 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); + /* 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 - pOut->pScopyFrom = pIn1; - pOut->mScopyFlags = pIn1->flags; + pIn1->pScopyFrom = 0; + { + int i; + for (i = 1; i < p->nMem; i++) { + if (aMem[i].pScopyFrom == pIn1) { + aMem[i].pScopyFrom = pOut; + } + } + } #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; -} + Deephemeralize(pOut); + REGISTER_TRACE(p2++, pOut); + pIn1++; + pOut++; + } while (--n); + 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 ); + /* 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; - p->cacheCtr = (p->cacheCtr + 2)|1; - p->pResultSet = &aMem[pOp->p1]; + 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 - { - 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; + pOut->pScopyFrom = 0; +#endif + REGISTER_TRACE(pOp->p2 + pOp->p3 - n, pOut); + if ((n--) == 0) + break; + pOut++; + pIn1++; + } break; } - default: { - if( iA==0 ) goto arithmetic_result_is_null; - if( iA==-1 ) iA = 1; - iB %= iA; + + /* 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; } - } - 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; + + /* 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; } - default: { - iA = sqlite3VdbeIntValue(pIn1); - iB = sqlite3VdbeIntValue(pIn2); - if( iA==0 ) goto arithmetic_result_is_null; - if( iA==-1 ) iA = 1; - rB = (double)(iB % iA); + + /* 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; i < pOp->p2; 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); + 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); + if (sqlite3IsNaN(rB)) { + goto arithmetic_result_is_null; + } + pOut->u.r = rB; + MemSetTypeFlag(pOut, MEM_Real); #endif - } - break; + } + break; -arithmetic_result_is_null: - sqlite3VdbeMemSetNull(pOut); - 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: 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; + /* 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; + } - 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); + 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; } - 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: 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; + /* 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; } - } - } - 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; -} + /* 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; -} + /* 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. + /* 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. */ - 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. + /* 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. */ - 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; + /* 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( (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; + 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; + /* 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; -} + 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 */ + /* 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; - } + /* 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; -} + VdbeBranchTaken(iCompare == 0, 2); + if (iCompare == 0) + goto jump_to_p2; + 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 */ + /* 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; + } - 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; + /* 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 ); - } + if (aPermute) { + int k, mx = 0; + for (k = 0; k < n; k++) + if (aPermute[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; + for (i = 0; i < n; i++) { + idx = aPermute ? aPermute[i] : (u32)i; + assert(memIsValid(&aMem[p1 + idx])); + assert(memIsValid(&aMem[p2 + idx])); + REGISTER_TRACE(p1 + idx, &aMem[p1 + idx]); + REGISTER_TRACE(p2 + idx, &aMem[p2 + idx]); + assert(i < pKeyInfo->nKeyField); + 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; } - 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: 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: 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: 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: 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; -} + /* 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; + } -#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: 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: 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; + /* 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; } - }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; + + /* 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; + } } - 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. + 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. */ - if( aOffset[0] > 98307 || aOffset[0] > pC->payloadSize ){ - goto op_column_corrupt; + 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; } - }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. + + /* 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. */ - 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; - } + 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; + } - /* 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; + 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; } - 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(). + /* 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. */ - 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; + 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; } - 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. + + /* 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. */ - 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; - } - } + 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; + } -op_column_out: - UPDATE_MAX_BLOBSIZE(pDest); - REGISTER_TRACE(pOp->p3, pDest); - 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; + } -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: 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->p1 < p->nCursor); + assert(p->apCsr[pOp->p1] != 0); + if (p->apCsr[pOp->p1]->nullRow) { + sqlite3VdbeMemSetNull(aMem + pOp->p3); + goto jump_to_p2; + } + break; + } -/* 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; +#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->p1 < p->nCursor); + 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 */ - 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; + /* 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->p1 < p->nCursor); + 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->szRow < aOffset[0]) { /*OPTIMIZATION-IF-FALSE*/ + /* pC->aRow 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; } - case COLTYPE_INTEGER: - case COLTYPE_INT: { - if( (pIn1->flags & MEM_Int)==0 ) goto vdbe_type_error; - break; + + /* 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->iHdrOffset < aOffset[0]) { + /* Make sure zData points to enough of the record to cover the header. */ + if (pC->aRow == 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); + + /* The record is corrupt if any of the following are true: + ** (1) the bytes of the header extend past the declared header size + ** (2) the entire header was used but not all data was used + ** (3) the end of the data extends beyond the end of the record. + */ + if ((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]; } - case COLTYPE_TEXT: { - if( (pIn1->flags & MEM_Str)==0 ) goto vdbe_type_error; + + /* 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(p2 < pC->nHdrParsed); + 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; } - 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 ){ + } + + /* 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; i < pTab->nCol; 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){ + 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{ + } 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); + zAffinity++; + if (zAffinity[0] == 0) + break; + pIn1++; } + 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] ); - } + /* 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->p3 < pOp->p1 || 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--; - } - } + /* 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(). */ + /* 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 ); + 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; + 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 (nVarint < sqlite3VarintLen(nHdr)) + nHdr++; + } + nByte = nHdr + nData; + + /* Make sure the output register has a buffer large enough to store + ** the new record. The output register (pOp->p3) 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; + /* 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; } - }else{ - zHdr += sqlite3PutVarint(zHdr, serial_type); - if( pRec->n ){ - assert( pRec->z!=0 ); - memcpy(zPayload, pRec->z, pRec->n); - zPayload += pRec->n; + + /* 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; } - } - 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: 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; -/* 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; + p1 = pOp->p1; + zName = pOp->p4.z; - 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; -} + /* 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); -/* 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; +#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++; + } - p1 = pOp->p1; - zName = pOp->p4.z; + /* 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; - /* 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 ); + /* 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; ii < db->nDb; 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; ii < db->nDb; 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( 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); + /* 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; + } -#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; + 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; } - } - }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. + /* 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. */ - 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; + 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; } - rc = p->rc; - if( rc ){ - db->autoCommit = 0; - }else{ - db->isTransactionSavepoint = 0; + /*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->p1 < db->nDb); + 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; } - }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 ){ + 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( 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 (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; + } - /* 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--; + 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; + } } - }else{ - assert( p1==SAVEPOINT_ROLLBACK ); - db->nDeferredCons = pSavepoint->nDeferredCons; - db->nDeferredImmCons = pSavepoint->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; - if( !isTransaction || p1==SAVEPOINT_ROLLBACK ){ - rc = sqlite3VtabSavepoint(db, p1, iSavepoint); - if( rc!=SQLITE_OK ) goto abort_due_to_error; + /* 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; } - } - } - 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. + /* 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. */ - 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")); + case OP_ReadCookie: { /* out2 */ + int iMeta; + int iDb; + int iCookie; - rc = SQLITE_ERROR; - goto abort_due_to_error; - } - /*NOTREACHED*/ assert(0); -} + assert(p->bIsReader); + iDb = pOp->p1; + iCookie = pOp->p3; + assert(pOp->p3 < SQLITE_N_BTREE_META); + assert(iDb >= 0 && iDb < db->nDb); + assert(db->aDb[iDb].pBt != 0); + assert(DbMaskTest(p->btreeMask, iDb)); -/* 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; + sqlite3BtreeGetMeta(db->aDb[iDb].pBt, iCookie, (u32*)&iMeta); + pOut = out2Prerelease(p, pOp); + pOut->u.i = iMeta; + break; } - rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN, p->iStatement-1); - if( rc==SQLITE_OK ){ - rc = sqlite3BtreeBeginStmt(pBt, p->iStatement); + /* 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->p2 < SQLITE_N_BTREE_META); + assert(pOp->p1 >= 0 && pOp->p1 < db->nDb); + 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; } - /* 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; + } -/* 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); + nField = 0; + pKeyInfo = 0; + p2 = (u32)pOp->p2; + iDb = pOp->p3; + assert(iDb >= 0 && iDb < db->nDb); + 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; } - 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 (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; } - } - } - 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: 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: 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; -} + /* 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; + } -#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); + /* 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->p1 < p->nCursor); + pC = p->apCsr[pOp->p1]; + assert(isSorter(pC)); + if ((pC->seqCount++) == 0) { goto jump_to_p2; - }else{ - rc = sqlite3BtreeLast(pC->uc.pCursor, &res); - if( rc!=SQLITE_OK ) goto abort_due_to_error; - goto seek_not_found; } + break; } - 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: + /* Opcode: OpenPseudo P1 P2 P3 * * + ** Synopsis: P3 columns in r[P2] ** - ** (x > 4.9) -> (x >= 5) - ** (x <= 4.9) -> (x < 5) + ** 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. */ - 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--; + 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->p1 < p->nCursor); + sqlite3VdbeFreeCursor(p, p->apCsr[pOp->p1]); + p->apCsr[pOp->p1] = 0; + break; } - /* 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++; +#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; } - } - 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 ); +#endif - r.aMem = &aMem[pOp->p3]; + /* 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->p1 < p->nCursor); + 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 - { int i; for(i=0; iseekOp = pOp->opcode; #endif - r.eqSeen = 0; - rc = sqlite3BtreeIndexMoveto(pC->uc.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++; + + 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; i < r.nField; i++) + assert(memIsValid(&r.aMem[i])); + } #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; + r.eqSeen = 0; + rc = sqlite3BtreeIndexMoveto(pC->uc.pCursor, &r, &res); + if (rc != SQLITE_OK) { + goto abort_due_to_error; + } + if (eqOnly && r.eqSeen == 0) { + assert(res != 0); + goto seek_not_found; + } } - } - }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; +#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; } - }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; -/* 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) ){ + 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"); - } + 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]; + 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: + res = 0; /* Not needed. Only used to silence a warning. */ + while (1) { + rc = sqlite3VdbeIdxKeyCompare(db, pC, &r, &res); + if (rc) + goto abort_due_to_error; + if (res > 0) { + seekscan_search_fail: #ifdef SQLITE_DEBUG - if( db->flags&SQLITE_VdbeTrace ){ - printf("... %d steps and then skip\n", pOp->p1 - nStep); - } + 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 ){ + 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); - } + 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 ){ + 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); - } + 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; -} + 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 ){ + /* 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->p1 < p->nCursor); + pC = p->apCsr[pOp->p1]; + assert(pC != 0); + assert(pOp->p3 >= pOp->p2); + if (pC->seekHit < pOp->p2) { #ifdef SQLITE_DEBUG - if( db->flags&SQLITE_VdbeTrace ){ - printf("seekHit changes from %d to %d\n", pC->seekHit, pOp->p2); - } + 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 ){ + 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); - } + if (db->flags & SQLITE_VdbeTrace) { + printf("seekHit changes from %d to %d\n", pC->seekHit, pOp->p3); + } #endif - pC->seekHit = pOp->p3; - } - break; -} + 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: 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->p1 < p->nCursor); + 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 ); + /* 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->p1 < p->nCursor); + pC = p->apCsr[pOp->p1]; + assert(pC != 0); #ifdef SQLITE_DEBUG - if( db->flags&SQLITE_VdbeTrace ){ - printf("seekHit is %d\n", pC->seekHit); - } + 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; + 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++; + 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 ); + assert(pOp->p1 >= 0 && pOp->p1 < p->nCursor); + 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; + 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]); - } + for (ii = 0; ii < r.nField; ii++) { + assert(memIsValid(&r.aMem[ii])); + assert((r.aMem[ii].flags & MEM_Zero) == 0 || r.aMem[ii].n == 0); + if (ii) + REGISTER_TRACE(pOp->p3 + 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; iiuc.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; ii < r.nField; ii++) { + if (r.aMem[ii].flags & MEM_Null) { + VdbeBranchTaken(1, 2); + goto jump_to_p2; + } + } + } + VdbeBranchTaken(0, 2); + if (pOp->opcode == OP_IfNoHope) { + pC->seekHit = pOp->p4.i; + } + } + break; } - } - VdbeBranchTaken(0,2); - if( pOp->opcode==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 ); + /* 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->p1 < p->nCursor); + 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; -} + 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->p1 < p->nCursor); + 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 */ + /* 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 ); + 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->p1 < p->nCursor); + 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 +#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 ) + /* 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 */ - } - } - } + 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); + 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 (v < pMem->u.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; } - 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; - } + /* 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->p1 < p->nCursor); + 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; + /* 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; -}; + 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: 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); + /* 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->p1 < p->nCursor); + 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; - } + 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; + /* 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 ); + /* 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--; - } - } + 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; + 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 ); - } - } + /* 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; -} + 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: 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; + /* 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->p1 < p->nCursor); + if (rc) + goto abort_due_to_error; + p->apCsr[pOp->p3]->cacheStatus = CACHE_STALE; + break; + } - 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; + /* 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->p1 < p->nCursor); + 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->p1 < p->nCursor); + 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; + } 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; + } 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; + } - 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); - } + /* 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->p1 < p->nCursor); + 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; + if (pC->seekOp == 0) + pC->seekOp = OP_NullRow; #endif - break; -} + 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; + /* 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 ); + assert(pOp->p1 >= 0 && pOp->p1 < p->nCursor); + 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; + 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; -} + 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->p1 < p->nCursor); + 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) < pOp->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 */ + /* 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--; + 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; + 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; + assert(pOp->p1 >= 0 && pOp->p1 < p->nCursor); + 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; + 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]++; + 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->p2 < p->nOp); + 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->p1 < p->nCursor); + assert(pOp->p5 < ArraySize(p->aCounter)); + 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->p1 < p->nCursor); + assert(pOp->p5 < ArraySize(p->aCounter)); + 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; -} + 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->p1 < p->nCursor); + 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->p1 < p->nCursor); + 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->p1 < p->nCursor); + 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: 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 */ + /* 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->p1 < p->nCursor); + 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; - 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; -} + 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->p3 < p->nCursor); + 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: 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]; + /* 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->p1 < p->nCursor); + 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->p1 < p->nCursor); + 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->opcode < OP_IdxLT) { + assert(pOp->opcode == 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]); - } - } + { + int i; + for (i = 0; i < r.nField; i++) { + assert(memIsValid(&r.aMem[i])); + REGISTER_TRACE(pOp->p3 + 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; -} + /* 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() */ -/* 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; + 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; + } - 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; + /* 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; - } + 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; -} + } + 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; + /* 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; + } - 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: 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->p1 < p->nCursor); + 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: 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: 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->p1 < db->nDb); + 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: 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; + /* 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; + } - /* Any prepared statement that invokes this opcode will hold mutexes - ** on every btree. This is a prerequisite for invoking - ** sqlite3InitCallback(). - */ + /* 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) ); - } + for (iDb = 0; iDb < db->nDb; 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) ); + iDb = pOp->p1; + assert(iDb >= 0 && iDb < db->nDb); + 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 + 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; + { + 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; } - 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; -} + /* 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->p1 < db->nDb); + 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: 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: 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; -} + /* 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; -} + /* 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->p5 < db->nDb); + 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: 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: 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; + /* 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; + } - pIn1 = &aMem[pOp->p1]; - pIn3 = &aMem[pOp->p3]; - iSet = pOp->p4.i; - assert( pIn3->flags&MEM_Int ); + /* 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; - /* 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; -} + 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 */ + /* 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; + } - pProgram = pOp->p4.pProgram; - pRt = &aMem[pOp->p3]; - assert( pProgram->nOp>0 ); + 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; + } - /* 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; + /* 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; + pFrame->anExec = p->anExec; #endif #ifdef SQLITE_DEBUG - pFrame->iFrameMagic = SQLITE_FRAME_MAGIC; + 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; + 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; + 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 */ - } - } + /* 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; i < p->nMem; 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; -} + 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; -} + /* 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: 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; -} + /* 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; -} + /* 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.i < pIn2->u.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: 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: 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; + /* 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; + } - /* OP_AggInverse must have P1==1 and OP_AggStep must have P1==0 */ - assert( pOp->p1==(pOp->opcode==OP_AggInverse) ); + /* 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; + } - pOp->opcode = OP_AggStep1; - /* Fall through into OP_AggStep */ - /* no break */ deliberate_fall_through -} -case OP_AggStep1: { - int i; - sqlite3_context *pCtx; - Mem *pMem; + /* 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->p3 < pOp->p2 || 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]; + 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; - } + 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]; - } + /* 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]); - } + for (i = 0; i < pCtx->argc; 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 ); + 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 ); + 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 + 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); - } + { + 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; -} + 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; -}; + /* 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 */ + /* 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; + 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->p1 < db->nDb); + 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; - } + zFilename = sqlite3PagerFilename(pPager, 1); - 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. + /* Do not allow a transition to journal_mode=WAL for a database + ** in temporary storage or if the VFS does not support shared memory */ - rc = sqlite3PagerCloseWal(pPager, db); - if( rc==SQLITE_OK ){ - sqlite3PagerSetJournalMode(pPager, eNew); + if (eNew == PAGER_JOURNALMODE_WAL && (sqlite3Strlen30(zFilename) == 0 /* Temp file */ + || !sqlite3PagerWalSupported(pPager)) /* No shared-memory support */ + ) { + eNew = eOld; } - }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)); - } - } - } + 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); + 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; -}; + 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; -} + /* 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; -} + /* 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->p1 < db->nDb); + 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: 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: 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->p1 < p->nCursor); + 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; -} + /* 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->p1 < p->nCursor); + 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); + /* 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 && p1 < db->nDb); + 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; } - 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; -} + /* 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; -} + /* 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; -} + /* 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; -} + /* 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 */ + /* 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; -} + /* 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; i < nArg; i++) { + apArg[i] = &pArgc[i + 1]; + } + rc = pModule->xFilter(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); + /* 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; -} + 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; + /* 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 ); + 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; -} + /* 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; -} + /* 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); + /* 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; i < nArg; i++) { + assert(memIsValid(pX)); + memAboutToChange(p, pX); + apArg[i] = pX; + pX++; + } + db->vtabOnConflict = 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; } - }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; -} +#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; -#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; -} + 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); + /* 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]); - } + for (i = 0; i < pCtx->argc; 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; - } + MemSetTypeFlag(pOut, MEM_Null); + assert(pCtx->isError == 0); + (*pCtx->pFunc->xSFunc)(pCtx, pCtx->argc, pCtx->argv); /* IMP: R-24505-23230 */ - assert( (pOut->flags&MEM_Str)==0 - || pOut->enc==encoding - || db->mallocFailed ); - assert( !sqlite3VdbeMemTooBig(pOut) ); + /* 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; + } - REGISTER_TRACE(pOp->p3, pOut); - UPDATE_MAX_BLOBSIZE(pOut); - break; -} + assert((pOut->flags & MEM_Str) == 0 || pOut->enc == encoding || db->mallocFailed); + assert(!sqlite3VdbeMemTooBig(pOut)); -/* 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; -} + REGISTER_TRACE(pOp->p3, pOut); + UPDATE_MAX_BLOBSIZE(pOut); + 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; + /* 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; + } - 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); + /* 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)); - } + if (db->flags & SQLITE_VdbeTrace) { + int ii; + for (ii = pOp->p3; ii < pOp->p3 + 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; + h %= pIn1->n; + pIn1->z[h / 8] |= 1 << (h & 7); + break; + } - 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); + /* 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)); - } + if (db->flags & SQLITE_VdbeTrace) { + int ii; + for (ii = pOp->p3; ii < pOp->p3 + 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; -} + 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; + /* 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; + 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 ); + /* 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 ); + /* 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 - ){ + 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); - } - } + 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); - } - } + zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql); + if (zTrace) { + int j; + for (j = 0; j < db->nDb; 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); - } + 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; -} + assert(pOp->p2 > 0); + if (pOp->p1 >= sqlite3GlobalConfig.iOnceResetThreshold) { + if (pOp->opcode == OP_Trace) + break; + for (i = 1; i < p->nOp; 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; + /* 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; -} + assert(pOp->p1 >= 0 && pOp->p1 < p->nCursor); + 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; -} + /* 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; -} + /* 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; i < pOp->p2; 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 ); + /* 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; -} + 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. -*****************************************************************************/ + /***************************************************************************** + ** 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; + if (endTime > start) + pOrigOp->cycles += endTime - start; pOrigOp->cnt++; } #endif @@ -96990,67 +96040,70 @@ default: { /* This is really OP_Noop, OP_Explain */ ** the evaluator loop. So we can leave it out when NDEBUG is defined. */ #ifndef NDEBUG - assert( pOp>=&aOp[-1] && pOp<&aOp[p->nOp-1] ); + assert(pOp >= &aOp[-1] && pOp < &aOp[p->nOp - 1]); #ifdef SQLITE_DEBUG - if( db->flags & SQLITE_VdbeTrace ){ + if (db->flags & SQLITE_VdbeTrace) { u8 opProperty = sqlite3OpcodeProperty[pOrigOp->opcode]; - if( rc!=0 ) printf("rc=%d\n",rc); - if( opProperty & (OPFLG_OUT2) ){ + if (rc != 0) + printf("rc=%d\n", rc); + if (opProperty & (OPFLG_OUT2)) { registerTrace(pOrigOp->p2, &aMem[pOrigOp->p2]); } - if( opProperty & OPFLG_OUT3 ){ + if (opProperty & OPFLG_OUT3) { registerTrace(pOrigOp->p3, &aMem[pOrigOp->p3]); } - if( opProperty==0xff ){ + 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 */ +#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 ){ + if (db->mallocFailed) { rc = SQLITE_NOMEM_BKPT; - }else if( rc==SQLITE_IOERR_CORRUPTFS ){ + } else if (rc == SQLITE_IOERR_CORRUPTFS) { rc = SQLITE_CORRUPT_BKPT; } - assert( rc ); + assert(rc); #ifdef SQLITE_DEBUG - if( db->flags & SQLITE_VdbeTrace ){ - const char *zTrace = p->zSql; - if( zTrace==0 ){ - if( aOp[0].opcode==OP_Trace ){ + 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 = "???"; + if (zTrace == 0) + zTrace = "???"; } printf("ABORT-due-to-error (rc=%d): %s\n", rc, zTrace); } #endif - if( p->zErrMsg==0 && rc!=SQLITE_IOERR_NOMEM ){ + 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 ){ + 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); + if (resetSchemaOnFault > 0) { + sqlite3ResetOneSchema(db, resetSchemaOnFault - 1); } /* This is the only way out of this procedure. We have to @@ -97058,9 +96111,9 @@ default: { /* This is really OP_Noop, OP_Explain */ ** top. */ vdbe_return: #ifndef SQLITE_OMIT_PROGRESS_CALLBACK - while( nVmStep>=nProgressLimit && db->xProgress!=0 ){ + while (nVmStep >= nProgressLimit && db->xProgress != 0) { nProgressLimit += db->nProgressOps; - if( db->xProgress(db->pProgressArg) ){ + if (db->xProgress(db->pProgressArg)) { nProgressLimit = LARGEST_UINT64; rc = SQLITE_INTERRUPT; goto abort_due_to_error; @@ -97069,9 +96122,7 @@ default: { /* This is really OP_Noop, OP_Explain */ #endif p->aCounter[SQLITE_STMTSTATUS_VM_STEP] += (int)nVmStep; sqlite3VdbeLeave(p); - assert( rc!=SQLITE_OK || nExtraDelete==0 - || sqlite3_strlike("DELETE%",p->zSql,0)!=0 - ); + 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 @@ -97083,7 +96134,7 @@ default: { /* This is really OP_Noop, OP_Explain */ goto abort_due_to_error; /* Jump to here if a malloc() fails. - */ + */ no_mem: sqlite3OomFault(db); sqlite3VdbeError(p, "out of memory"); @@ -97094,12 +96145,11 @@ default: { /* This is really OP_Noop, OP_Explain */ ** flag. */ abort_due_to_interrupt: - assert( AtomicLoad(&db->u1.isInterrupted) ); + assert(AtomicLoad(&db->u1.isInterrupted)); rc = SQLITE_INTERRUPT; goto abort_due_to_error; } - /************** End of vdbe.c ************************************************/ /************** Begin file vdbeblob.c ****************************************/ /* @@ -97127,17 +96177,16 @@ default: { /* This is really OP_Noop, OP_Explain */ */ 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 */ + 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. @@ -97155,10 +96204,10 @@ struct Incrblob { ** 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; +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 @@ -97170,51 +96219,49 @@ static int blobSeekToRow(Incrblob *p, sqlite3_int64 iRow, char **pzErr){ ** 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 ){ + if (v->pc > 4) { v->pc = 4; - assert( v->aOp[v->pc].opcode==OP_NotExists ); + assert(v->aOp[v->pc].opcode == OP_NotExists); rc = sqlite3VdbeExec(v); - }else{ + } else { rc = sqlite3_step(p->pStmt); } - if( rc==SQLITE_ROW ){ - VdbeCursor *pC = v->apCsr[0]; + 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" - ); + 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{ + } else { p->iOffset = pC->aType[p->iCol + pC->nField]; p->nByte = sqlite3VdbeSerialTypeLen(type); - p->pCsr = pC->uc.pCursor; + p->pCsr = pC->uc.pCursor; sqlite3BtreeIncrblobCursor(p->pCsr); } } - if( rc==SQLITE_ROW ){ + if (rc == SQLITE_ROW) { rc = SQLITE_OK; - }else if( p->pStmt ){ + } else if (p->pStmt) { rc = sqlite3_finalize(p->pStmt); p->pStmt = 0; - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { zErr = sqlite3MPrintf(p->db, "no such rowid: %lld", iRow); rc = SQLITE_ERROR; - }else{ + } else { zErr = sqlite3MPrintf(p->db, "%s", sqlite3_errmsg(p->db)); } } - assert( rc!=SQLITE_OK || zErr==0 ); - assert( rc!=SQLITE_ROW && rc!=SQLITE_DONE ); + assert(rc != SQLITE_OK || zErr == 0); + assert(rc != SQLITE_ROW && rc != SQLITE_DONE); *pzErr = zErr; return rc; @@ -97223,63 +96270,63 @@ static int blobSeekToRow(Incrblob *p, sqlite3_int64 iRow, char **pzErr){ /* ** 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 */ -){ +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 iCol; /* Index of zColumn in row-record */ int rc = SQLITE_OK; - char *zErr = 0; - Table *pTab; - Incrblob *pBlob = 0; + char* zErr = 0; + Table* pTab; + Incrblob* pBlob = 0; Parse sParse; #ifdef SQLITE_ENABLE_API_ARMOR - if( ppBlob==0 ){ + if (ppBlob == 0) { return SQLITE_MISUSE_BKPT; } #endif *ppBlob = 0; #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) || zTable==0 ){ + if (!sqlite3SafetyCheckOk(db) || zTable == 0) { return SQLITE_MISUSE_BKPT; } #endif - wrFlag = !!wrFlag; /* wrFlag = (wrFlag ? 1 : 0); */ + 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; + 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) ){ + if (pTab && IsVirtual(pTab)) { pTab = 0; sqlite3ErrorMsg(&sParse, "cannot open virtual table: %s", zTable); } - if( pTab && !HasRowid(pTab) ){ + if (pTab && !HasRowid(pTab)) { pTab = 0; sqlite3ErrorMsg(&sParse, "cannot open table without rowid: %s", zTable); } #ifndef SQLITE_OMIT_VIEW - if( pTab && IsView(pTab) ){ + if (pTab && IsView(pTab)) { pTab = 0; sqlite3ErrorMsg(&sParse, "cannot open view: %s", zTable); } #endif - if( !pTab ){ - if( sParse.zErrMsg ){ + if (!pTab) { + if (sParse.zErrMsg) { sqlite3DbFree(db, zErr); zErr = sParse.zErrMsg; sParse.zErrMsg = 0; @@ -97292,12 +96339,12 @@ SQLITE_API int sqlite3_blob_open( 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 ){ + for (iCol = 0; iCol < pTab->nCol; iCol++) { + if (sqlite3StrICmp(pTab->aCol[iCol].zCnName, zColumn) == 0) { break; } } - if( iCol==pTab->nCol ){ + if (iCol == pTab->nCol) { sqlite3DbFree(db, zErr); zErr = sqlite3MPrintf(db, "no such column: \"%s\"", zColumn); rc = SQLITE_ERROR; @@ -97308,37 +96355,37 @@ SQLITE_API int sqlite3_blob_open( /* 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; + if (wrFlag) { + const char* zFault = 0; + Index* pIdx; #ifndef SQLITE_OMIT_FOREIGN_KEY - if( db->flags&SQLITE_ForeignKeys ){ + 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){ + 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 ){ + for (j = 0; j < pFKey->nCol; j++) { + if (pFKey->aCol[j].iFrom == iCol) { zFault = "foreign key"; } } } } #endif - for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + for (pIdx = pTab->pIndex; pIdx; pIdx = pIdx->pNext) { int j; - for(j=0; jnKeyCol; j++){ + for (j = 0; j < pIdx->nKeyCol; j++) { /* FIXME: Be smarter about indexes that use expressions */ - if( pIdx->aiColumn[j]==iCol || pIdx->aiColumn[j]==XN_EXPR ){ + if (pIdx->aiColumn[j] == iCol || pIdx->aiColumn[j] == XN_EXPR) { zFault = "indexed"; } } } - if( zFault ){ + if (zFault) { sqlite3DbFree(db, zErr); zErr = sqlite3MPrintf(db, "cannot open %s column for writing", zFault); rc = SQLITE_ERROR; @@ -97347,9 +96394,9 @@ SQLITE_API int sqlite3_blob_open( } } - pBlob->pStmt = (sqlite3_stmt *)sqlite3VdbeCreate(&sParse); - assert( pBlob->pStmt || db->mallocFailed ); - if( pBlob->pStmt ){ + 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 @@ -97368,30 +96415,28 @@ SQLITE_API int sqlite3_blob_open( */ 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 */ + {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; + Vdbe* v = (Vdbe*)pBlob->pStmt; int iDb = sqlite3SchemaToIndex(db, pTab->pSchema); - VdbeOp *aOp; + VdbeOp* aOp; - sqlite3VdbeAddOp4Int(v, OP_Transaction, iDb, wrFlag, - pTab->pSchema->schema_cookie, - pTab->pSchema->iGeneration); + sqlite3VdbeAddOp4Int(v, OP_Transaction, iDb, wrFlag, pTab->pSchema->schema_cookie, pTab->pSchema->iGeneration); sqlite3VdbeChangeP5(v, 1); - assert( sqlite3VdbeCurrentAddr(v)==2 || db->mallocFailed ); + 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 ); + if (db->mallocFailed == 0) { + assert(aOp != 0); /* Configure the OP_TableLock instruction */ #ifdef SQLITE_OMIT_SHARED_CACHE aOp[0].opcode = OP_Noop; @@ -97401,12 +96446,13 @@ SQLITE_API int sqlite3_blob_open( aOp[0].p3 = wrFlag; sqlite3VdbeChangeP4(v, 2, pTab->zName, P4_TRANSIENT); } - if( db->mallocFailed==0 ){ + 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; + if (wrFlag) + aOp[1].opcode = OP_OpenWrite; aOp[1].p2 = pTab->tnum; aOp[1].p3 = iDb; @@ -97418,7 +96464,7 @@ SQLITE_API int sqlite3_blob_open( ** and offset cache without causing any IO. */ aOp[1].p4type = P4_INT32; - aOp[1].p4.i = pTab->nCol+1; + aOp[1].p4.i = pTab->nCol + 1; aOp[3].p2 = pTab->nCol; sParse.nVar = 0; @@ -97431,19 +96477,21 @@ SQLITE_API int sqlite3_blob_open( pBlob->iCol = iCol; pBlob->db = db; sqlite3BtreeLeaveAll(db); - if( db->mallocFailed ){ + if (db->mallocFailed) { goto blob_open_out; } rc = blobSeekToRow(pBlob, iRow, &zErr); - if( (++nAttempt)>=SQLITE_MAX_SCHEMA_RETRY || rc!=SQLITE_SCHEMA ) break; + 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); + 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); @@ -97458,19 +96506,19 @@ SQLITE_API int sqlite3_blob_open( ** 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; +SQLITE_API int sqlite3_blob_close(sqlite3_blob* pBlob) { + Incrblob* p = (Incrblob*)pBlob; int rc; - sqlite3 *db; + sqlite3* db; - if( p ){ - sqlite3_stmt *pStmt = p->pStmt; + 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{ + } else { rc = SQLITE_OK; } return rc; @@ -97479,40 +96527,35 @@ SQLITE_API int sqlite3_blob_close(sqlite3_blob *pBlob){ /* ** 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*) -){ +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; + Incrblob* p = (Incrblob*)pBlob; + Vdbe* v; + sqlite3* db; - if( p==0 ) return SQLITE_MISUSE_BKPT; + 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 ){ + 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 ){ + } 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{ + } else { /* Call either BtreeData() or BtreePutData(). If SQLITE_ABORT is ** returned, clean-up the statement handle. */ - assert( db == v->db ); + assert(db == v->db); sqlite3BtreeEnterCursor(p->pCsr); #ifdef SQLITE_ENABLE_PREUPDATE_HOOK - if( xCall==sqlite3BtreePutData && db->xPreUpdateCallback ){ + if (xCall == sqlite3BtreePutData && db->xPreUpdateCallback) { /* If a pre-update hook is registered and this is a write cursor, ** invoke it here. ** @@ -97528,20 +96571,18 @@ static int blobReadWrite( */ 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 - ); + 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); + rc = xCall(p->pCsr, iOffset + p->iOffset, n, z); sqlite3BtreeLeaveCursor(p->pCsr); - if( rc==SQLITE_ABORT ){ + if (rc == SQLITE_ABORT) { sqlite3VdbeFinalize(v); p->pStmt = 0; - }else{ + } else { v->rc = rc; } } @@ -97554,15 +96595,15 @@ static int blobReadWrite( /* ** Read data from a blob handle. */ -SQLITE_API int sqlite3_blob_read(sqlite3_blob *pBlob, void *z, int n, int iOffset){ +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); +SQLITE_API int sqlite3_blob_write(sqlite3_blob* pBlob, const void* z, int n, int iOffset) { + return blobReadWrite(pBlob, (void*)z, n, iOffset, sqlite3BtreePutData); } /* @@ -97571,8 +96612,8 @@ SQLITE_API int sqlite3_blob_write(sqlite3_blob *pBlob, const void *z, int n, int ** 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; +SQLITE_API int sqlite3_blob_bytes(sqlite3_blob* pBlob) { + Incrblob* p = (Incrblob*)pBlob; return (p && p->pStmt) ? p->nByte : 0; } @@ -97586,33 +96627,34 @@ SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *pBlob){ ** 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){ +SQLITE_API int sqlite3_blob_reopen(sqlite3_blob* pBlob, sqlite3_int64 iRow) { int rc; - Incrblob *p = (Incrblob *)pBlob; - sqlite3 *db; + Incrblob* p = (Incrblob*)pBlob; + sqlite3* db; - if( p==0 ) return SQLITE_MISUSE_BKPT; + if (p == 0) + return SQLITE_MISUSE_BKPT; db = p->db; sqlite3_mutex_enter(db->mutex); - if( p->pStmt==0 ){ + 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; + } else { + char* zErr; ((Vdbe*)p->pStmt)->rc = SQLITE_OK; rc = blobSeekToRow(p, iRow, &zErr); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { sqlite3ErrorWithMsg(db, rc, (zErr ? "%s" : 0), zErr); sqlite3DbFree(db, zErr); } - assert( rc!=SQLITE_SCHEMA ); + assert(rc != SQLITE_SCHEMA); } rc = sqlite3ApiExit(db, rc); - assert( rc==SQLITE_OK || p->pStmt==0 ); + assert(rc == SQLITE_OK || p->pStmt == 0); sqlite3_mutex_leave(db->mutex); return rc; } @@ -97767,7 +96809,7 @@ SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *pBlob, sqlite3_int64 iRow){ ** characteristics of the sorter in multi-threaded mode. */ #if 0 -# define SQLITE_DEBUG_SORTER_THREADS 1 +#define SQLITE_DEBUG_SORTER_THREADS 1 #endif /* @@ -97775,27 +96817,27 @@ SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *pBlob, sqlite3_int64 iRow){ ** to a level 0 PMA. The purpose of this limit is to prevent various integer ** overflows. 512MiB. */ -#define SQLITE_MAX_PMASZ (1<<29) +#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 */ +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 */ + sqlite3_file* pFd; /* File handle */ + i64 iEof; /* Bytes of data stored in pFd */ }; /* @@ -97807,9 +96849,9 @@ struct SorterFile { ** 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 */ + 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 */ }; /* @@ -97877,10 +96919,10 @@ struct SorterList { ** being merged (rounded up to the next power of 2). */ struct MergeEngine { - int nTree; /* Used size of aTree/aReadr (power of 2) */ - SortSubtask *pTask; /* Used by this thread only */ - int *aTree; /* Current state of incremental merge */ - PmaReader *aReadr; /* Array of PmaReaders to merge data from */ + int nTree; /* Used size of aTree/aReadr (power of 2) */ + SortSubtask* pTask; /* Used by this thread only */ + int* aTree; /* Current state of incremental merge */ + PmaReader* aReadr; /* Array of PmaReaders to merge data from */ }; /* @@ -97914,20 +96956,19 @@ struct MergeEngine { ** after the thread has finished are not dire. So we don't worry about ** memory barriers and such here. */ -typedef int (*SorterCompare)(SortSubtask*,int*,const void*,int,const void*,int); +typedef int (*SorterCompare)(SortSubtask*, int*, const void*, int, const void*, int); struct SortSubtask { - SQLiteThread *pThread; /* Background thread, if any */ - int bDone; /* Set if thread is finished but not joined */ - VdbeSorter *pSorter; /* Sorter that owns this sub-task */ - UnpackedRecord *pUnpacked; /* Space to unpack a record */ - SorterList list; /* List for thread to write to a PMA */ - int nPMA; /* Number of PMAs currently in file */ - SorterCompare xCompare; /* Compare function to use */ - SorterFile file; /* Temp file for level-0 PMAs */ - SorterFile file2; /* Space for other PMAs */ + SQLiteThread* pThread; /* Background thread, if any */ + int bDone; /* Set if thread is finished but not joined */ + VdbeSorter* pSorter; /* Sorter that owns this sub-task */ + UnpackedRecord* pUnpacked; /* Space to unpack a record */ + SorterList list; /* List for thread to write to a PMA */ + int nPMA; /* Number of PMAs currently in file */ + SorterCompare xCompare; /* Compare function to use */ + SorterFile file; /* Temp file for level-0 PMAs */ + SorterFile file2; /* Space for other PMAs */ }; - /* ** Main sorter structure. A single instance of this is allocated for each ** sorter cursor created by the VDBE. @@ -97938,28 +96979,28 @@ struct SortSubtask { ** largest record in the sorter. */ struct VdbeSorter { - int mnPmaSize; /* Minimum PMA size, in bytes */ - int mxPmaSize; /* Maximum PMA size, in bytes. 0==no limit */ - int mxKeysize; /* Largest serialized key seen so far */ - int pgsz; /* Main database page size */ - PmaReader *pReader; /* Readr data from here after Rewind() */ - MergeEngine *pMerger; /* Or here, if bUseThreads==0 */ - sqlite3 *db; /* Database connection */ - KeyInfo *pKeyInfo; /* How to compare records */ - UnpackedRecord *pUnpacked; /* Used by VdbeSorterCompare() */ - SorterList list; /* List of in-memory records */ - int iMemory; /* Offset of free space in list.aMemory */ - int nMemory; /* Size of list.aMemory allocation in bytes */ - u8 bUsePMA; /* True if one or more PMAs created */ - u8 bUseThreads; /* True to use background threads */ - u8 iPrev; /* Previous thread used to flush PMA */ - u8 nTask; /* Size of aTask[] array */ + int mnPmaSize; /* Minimum PMA size, in bytes */ + int mxPmaSize; /* Maximum PMA size, in bytes. 0==no limit */ + int mxKeysize; /* Largest serialized key seen so far */ + int pgsz; /* Main database page size */ + PmaReader* pReader; /* Readr data from here after Rewind() */ + MergeEngine* pMerger; /* Or here, if bUseThreads==0 */ + sqlite3* db; /* Database connection */ + KeyInfo* pKeyInfo; /* How to compare records */ + UnpackedRecord* pUnpacked; /* Used by VdbeSorterCompare() */ + SorterList list; /* List of in-memory records */ + int iMemory; /* Offset of free space in list.aMemory */ + int nMemory; /* Size of list.aMemory allocation in bytes */ + u8 bUsePMA; /* True if one or more PMAs created */ + u8 bUseThreads; /* True to use background threads */ + u8 iPrev; /* Previous thread used to flush PMA */ + u8 nTask; /* Size of aTask[] array */ u8 typeMask; - SortSubtask aTask[1]; /* One or more subtasks */ + SortSubtask aTask[1]; /* One or more subtasks */ }; #define SORTER_TYPE_INTEGER 0x01 -#define SORTER_TYPE_TEXT 0x02 +#define SORTER_TYPE_TEXT 0x02 /* ** An instance of the following object is used to read records out of a @@ -97971,17 +97012,17 @@ struct VdbeSorter { ** pFd==0 at EOF. */ struct PmaReader { - i64 iReadOff; /* Current read offset */ - i64 iEof; /* 1 byte past EOF for this PmaReader */ - int nAlloc; /* Bytes of space at aAlloc */ - int nKey; /* Number of bytes in key */ - sqlite3_file *pFd; /* File handle we are reading from */ - u8 *aAlloc; /* Space for aKey if aBuffer and pMap wont work */ - u8 *aKey; /* Pointer to current key */ - u8 *aBuffer; /* Current read buffer */ - int nBuffer; /* Size of read buffer in bytes */ - u8 *aMap; /* Pointer to mapping of entire file */ - IncrMerger *pIncr; /* Incremental merger */ + i64 iReadOff; /* Current read offset */ + i64 iEof; /* 1 byte past EOF for this PmaReader */ + int nAlloc; /* Bytes of space at aAlloc */ + int nKey; /* Number of bytes in key */ + sqlite3_file* pFd; /* File handle we are reading from */ + u8* aAlloc; /* Space for aKey if aBuffer and pMap wont work */ + u8* aKey; /* Pointer to current key */ + u8* aBuffer; /* Current read buffer */ + int nBuffer; /* Size of read buffer in bytes */ + u8* aMap; /* Pointer to mapping of entire file */ + IncrMerger* pIncr; /* Incremental merger */ }; /* @@ -98017,13 +97058,13 @@ struct PmaReader { ** 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 */ + 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 */ }; /* @@ -98035,13 +97076,13 @@ struct IncrMerger { ** 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 */ + 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 */ }; /* @@ -98063,10 +97104,10 @@ struct PmaWriter { ** vdbeSorterSort() for details. */ struct SorterRecord { - int nVal; /* Size of the record in bytes */ + 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 */ + 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 */ }; @@ -98078,21 +97119,21 @@ struct SorterRecord { */ #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 *); +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){ +static void vdbePmaReaderClear(PmaReader* pReadr) { sqlite3_free(pReadr->aAlloc); sqlite3_free(pReadr->aBuffer); - if( pReadr->aMap ) sqlite3OsUnfetch(pReadr->pFd, 0, pReadr->aMap); + if (pReadr->aMap) + sqlite3OsUnfetch(pReadr->pFd, 0, pReadr->aMap); vdbeIncrFree(pReadr->pIncr); memset(pReadr, 0, sizeof(PmaReader)); } @@ -98106,64 +97147,66 @@ static void vdbePmaReaderClear(PmaReader *pReadr){ ** 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 */ +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 ){ + if (p->aMap) { *ppOut = &p->aMap[p->iReadOff]; p->iReadOff += nByte; return SQLITE_OK; } - assert( p->aBuffer ); + 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 */ + 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 ){ + if ((p->iEof - p->iReadOff) > (i64)p->nBuffer) { nRead = p->nBuffer; - }else{ + } else { nRead = (int)(p->iEof - p->iReadOff); } - assert( nRead>0 ); + 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; + assert(rc != SQLITE_IOERR_SHORT_READ); + if (rc != SQLITE_OK) + return rc; } nAvail = p->nBuffer - iBuf; - if( nByte<=nAvail ){ + 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{ + } 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 */ + int nRem; /* Bytes remaining to copy */ /* Extend the p->aAlloc[] allocation if required. */ - if( p->nAllocnAlloc); - while( nByte>nNew ) nNew = nNew*2; + if (p->nAlloc < nByte) { + u8* aNew; + sqlite3_int64 nNew = MAX(128, 2 * (sqlite3_int64)p->nAlloc); + while (nByte > nNew) + nNew = nNew * 2; aNew = sqlite3Realloc(p->aAlloc, nNew); - if( !aNew ) return SQLITE_NOMEM_BKPT; + if (!aNew) + return SQLITE_NOMEM_BKPT; p->nAlloc = nNew; p->aAlloc = aNew; } @@ -98176,16 +97219,18 @@ static int vdbePmaReadBlob( /* 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 */ + 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; + if (nRem > p->nBuffer) + nCopy = p->nBuffer; rc = vdbePmaReadBlob(p, nCopy, &aNext); - if( rc!=SQLITE_OK ) return rc; - assert( aNext!=p->aAlloc ); + if (rc != SQLITE_OK) + return rc; + assert(aNext != p->aAlloc); memcpy(&p->aAlloc[nByte - nRem], aNext, nCopy); nRem -= nCopy; } @@ -98200,23 +97245,24 @@ static int vdbePmaReadBlob( ** Read a varint from the stream of data accessed by p. Set *pnOut to ** the value read. */ -static int vdbePmaReadVarint(PmaReader *p, u64 *pnOut){ +static int vdbePmaReadVarint(PmaReader* p, u64* pnOut) { int iBuf; - if( p->aMap ){ + if (p->aMap) { p->iReadOff += sqlite3GetVarint(&p->aMap[p->iReadOff], pnOut); - }else{ + } else { iBuf = p->iReadOff % p->nBuffer; - if( iBuf && (p->nBuffer-iBuf)>=9 ){ + if (iBuf && (p->nBuffer - iBuf) >= 9) { p->iReadOff += sqlite3GetVarint(&p->aBuffer[iBuf], pnOut); - }else{ + } else { u8 aVarint[16], *a; int i = 0, rc; - do{ + do { rc = vdbePmaReadBlob(p, 1, &a); - if( rc ) return rc; - aVarint[(i++)&0xf] = a[0]; - }while( (a[0]&0x80)!=0 ); + if (rc) + return rc; + aVarint[(i++) & 0xf] = a[0]; + } while ((a[0] & 0x80) != 0); sqlite3GetVarint(aVarint, pnOut); } } @@ -98233,13 +97279,13 @@ static int vdbePmaReadVarint(PmaReader *p, u64 *pnOut){ ** 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){ +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 ){ + 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 ); + testcase(rc != SQLITE_OK); } } return rc; @@ -98250,18 +97296,18 @@ static int vdbeSorterMapFile(SortSubtask *pTask, SorterFile *pFile, u8 **pp){ ** 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 */ -){ +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 ); + assert(pReadr->pIncr == 0 || pReadr->pIncr->bEof == 0); - if( sqlite3FaultSim(201) ) return SQLITE_IOERR_READ; - if( pReadr->aMap ){ + if (sqlite3FaultSim(201)) + return SQLITE_IOERR_READ; + if (pReadr->aMap) { sqlite3OsUnfetch(pReadr->pFd, 0, pReadr->aMap); pReadr->aMap = 0; } @@ -98270,23 +97316,22 @@ static int vdbePmaReaderSeek( pReadr->pFd = pFile->pFd; rc = vdbeSorterMapFile(pTask, pFile, &pReadr->aMap); - if( rc==SQLITE_OK && pReadr->aMap==0 ){ + if (rc == SQLITE_OK && pReadr->aMap == 0) { int pgsz = pTask->pSorter->pgsz; int iBuf = pReadr->iReadOff % pgsz; - if( pReadr->aBuffer==0 ){ + if (pReadr->aBuffer == 0) { pReadr->aBuffer = (u8*)sqlite3Malloc(pgsz); - if( pReadr->aBuffer==0 ) rc = SQLITE_NOMEM_BKPT; + if (pReadr->aBuffer == 0) + rc = SQLITE_NOMEM_BKPT; pReadr->nBuffer = pgsz; } - if( rc==SQLITE_OK && iBuf ){ + if (rc == SQLITE_OK && iBuf) { int nRead = pgsz - iBuf; - if( (pReadr->iReadOff + nRead) > pReadr->iEof ){ + 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 ); + rc = sqlite3OsRead(pReadr->pFd, &pReadr->aBuffer[iBuf], nRead, pReadr->iReadOff); + testcase(rc != SQLITE_OK); } } @@ -98297,39 +97342,36 @@ static int vdbePmaReaderSeek( ** 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 */ - +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; + if (pReadr->iReadOff >= pReadr->iEof) { + IncrMerger* pIncr = pReadr->pIncr; int bEof = 1; - if( pIncr ){ + if (pIncr) { rc = vdbeIncrSwap(pIncr); - if( rc==SQLITE_OK && pIncr->bEof==0 ){ - rc = vdbePmaReaderSeek( - pIncr->pTask, pReadr, &pIncr->aFile[0], pIncr->iStartOff - ); + if (rc == SQLITE_OK && pIncr->bEof == 0) { + rc = vdbePmaReaderSeek(pIncr->pTask, pReadr, &pIncr->aFile[0], pIncr->iStartOff); bEof = 0; } } - if( bEof ){ + if (bEof) { /* This is an EOF condition */ vdbePmaReaderClear(pReadr); - testcase( rc!=SQLITE_OK ); + testcase(rc != SQLITE_OK); return rc; } } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = vdbePmaReadVarint(pReadr, &nRec); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pReadr->nKey = (int)nRec; rc = vdbePmaReadBlob(pReadr, (int)nRec, &pReadr->aKey); - testcase( rc!=SQLITE_OK ); + testcase(rc != SQLITE_OK); } return rc; @@ -98344,29 +97386,28 @@ static int vdbePmaReaderNext(PmaReader *pReadr){ ** 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 */ -){ +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 ); + 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 */ + 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 ){ + if (rc == SQLITE_OK) { rc = vdbePmaReaderNext(pReadr); } return rc; @@ -98377,14 +97418,13 @@ static int vdbePmaReaderInit( ** 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 ){ +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; } @@ -98404,14 +97444,13 @@ static int vdbeSorterCompareTail( ** 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 ){ +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; } @@ -98423,16 +97462,15 @@ static int vdbeSorterCompare( ** 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 */ +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; @@ -98440,20 +97478,18 @@ static int vdbeSorterCompareText( getVarint32NR(&p1[1], n1); getVarint32NR(&p2[1], n2); - res = memcmp(v1, v2, (MIN(n1, n2) - 13)/2); - if( res==0 ){ + 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 - ); + 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] ){ + } else { + assert(!(pTask->pSorter->pKeyInfo->aSortFlags[0] & KEYINFO_ORDER_BIGNULL)); + if (pTask->pSorter->pKeyInfo->aSortFlags[0]) { res = res * -1; } } @@ -98465,64 +97501,63 @@ static int vdbeSorterCompareText( ** 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 ){ +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 }; + 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 ){ + } else if (s1 > 7 && s2 > 7) { res = s1 - s2; - }else{ - if( s2>7 ){ + } else { + if (s2 > 7) { res = +1; - }else if( s1>7 ){ + } else if (s1 > 7) { res = -1; - }else{ + } else { res = s1 - s2; } - assert( res!=0 ); + assert(res != 0); - if( res>0 ){ - if( *v1 & 0x80 ) res = -1; - }else{ - if( *v2 & 0x80 ) res = +1; + 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 - ); + 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) ); + } else if (pTask->pSorter->pKeyInfo->aSortFlags[0]) { + assert(!(pTask->pSorter->pKeyInfo->aSortFlags[0] & KEYINFO_ORDER_BIGNULL)); res = res * -1; } @@ -98548,57 +97583,56 @@ static int vdbeSorterCompareInt( ** ** 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 */ +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 +#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 ){ +#if SQLITE_MAX_WORKER_THREADS > 0 + if (sqlite3TempInMemory(db) || sqlite3GlobalConfig.bCoreMutex == 0) { nWorker = 0; - }else{ + } 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; +#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*); + 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 ){ + if (pSorter == 0) { rc = SQLITE_NOMEM_BKPT; - }else{ - Btree *pBt = db->aDb[0].pBt; + } 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 ){ + if (nField && nWorker == 0) { pKeyInfo->nKeyField = nField; } sqlite3BtreeEnter(pBt); @@ -98606,24 +97640,24 @@ SQLITE_PRIVATE int sqlite3VdbeSorterInit( sqlite3BtreeLeave(pBt); pSorter->nTask = nWorker + 1; pSorter->iPrev = (u8)(nWorker - 1); - pSorter->bUseThreads = (pSorter->nTask>1); + pSorter->bUseThreads = (pSorter->nTask > 1); pSorter->db = db; - for(i=0; inTask; i++){ - SortSubtask *pTask = &pSorter->aTask[i]; + for (i = 0; i < pSorter->nTask; i++) { + SortSubtask* pTask = &pSorter->aTask[i]; pTask->pSorter = pSorter; } - if( !sqlite3TempInMemory(db) ){ - i64 mxCache; /* Cache size in bytes*/ + 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 ){ + if (mxCache < 0) { /* A negative cache-size value C indicates that the cache is abs(C) ** KiB in size. */ mxCache = mxCache * -1024; - }else{ + } else { mxCache = mxCache * pgsz; } mxCache = MIN(mxCache, SQLITE_MAX_PMASZ); @@ -98631,33 +97665,32 @@ SQLITE_PRIVATE int sqlite3VdbeSorterInit( /* Avoid large memory allocations if the application has requested ** SQLITE_CONFIG_SMALL_MALLOC. */ - if( sqlite3GlobalConfig.bSmallMalloc==0 ){ - assert( pSorter->iMemory==0 ); + 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 (!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 - ){ + 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 */ +#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){ +static void vdbeSorterRecordFree(sqlite3* db, SorterRecord* pRecord) { + SorterRecord* p; + SorterRecord* pNext; + for (p = pRecord; p; p = pNext) { pNext = p->u.pNext; sqlite3DbFree(db, p); } @@ -98667,84 +97700,78 @@ static void vdbeSorterRecordFree(sqlite3 *db, SorterRecord *pRecord){ ** 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){ +static void vdbeSortSubtaskCleanup(sqlite3* db, SortSubtask* pTask) { sqlite3DbFree(db, pTask->pUnpacked); -#if SQLITE_MAX_WORKER_THREADS>0 +#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 ){ + if (pTask->list.aMemory) { sqlite3_free(pTask->list.aMemory); - }else + } else #endif { - assert( pTask->list.aMemory==0 ); + assert(pTask->list.aMemory == 0); vdbeSorterRecordFree(0, pTask->list.pList); } - if( pTask->file.pFd ){ + if (pTask->file.pFd) { sqlite3OsCloseFree(pTask->file.pFd); } - if( pTask->file2.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){ +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){ +static void vdbeSorterRewindDebug(const char* zEvent) { i64 t = 0; - sqlite3_vfs *pVfs = sqlite3_vfs_find(0); - if( ALWAYS(pVfs) ) sqlite3OsCurrentTimeInt64(pVfs, &t); + 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 -){ +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 ){ +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) +#define vdbeSorterWorkDebug(x, y) +#define vdbeSorterRewindDebug(y) +#define vdbeSorterPopulateDebug(x, y) +#define vdbeSorterBlockDebug(x, y, z) #endif -#if SQLITE_MAX_WORKER_THREADS>0 +#if SQLITE_MAX_WORKER_THREADS > 0 /* ** Join thread pTask->thread. */ -static int vdbeSorterJoinThread(SortSubtask *pTask){ +static int vdbeSorterJoinThread(SortSubtask* pTask) { int rc = SQLITE_OK; - if( pTask->pThread ){ + if (pTask->pThread) { #ifdef SQLITE_DEBUG_SORTER_THREADS int bDone = pTask->bDone; #endif - void *pRet = SQLITE_INT_TO_PTR(SQLITE_ERROR); + 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 ); + assert(pTask->bDone == 1); pTask->bDone = 0; pTask->pThread = 0; } @@ -98754,12 +97781,11 @@ static int vdbeSorterJoinThread(SortSubtask *pTask){ /* ** 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 ); +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); } @@ -98767,7 +97793,7 @@ static int vdbeSorterCreateThread( ** Join all outstanding threads launched by SorterWrite() to create ** level-0 PMAs. */ -static int vdbeSorterJoinAll(VdbeSorter *pSorter, int rcin){ +static int vdbeSorterJoinAll(VdbeSorter* pSorter, int rcin) { int rc = rcin; int i; @@ -98778,16 +97804,17 @@ static int vdbeSorterJoinAll(VdbeSorter *pSorter, int rcin){ ** 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]; + for (i = pSorter->nTask - 1; i >= 0; i--) { + SortSubtask* pTask = &pSorter->aTask[i]; int rc2 = vdbeSorterJoinThread(pTask); - if( rc==SQLITE_OK ) rc = rc2; + if (rc == SQLITE_OK) + rc = rc2; } return rc; } #else -# define vdbeSorterJoinAll(x,rcin) (rcin) -# define vdbeSorterJoinThread(pTask) SQLITE_OK +#define vdbeSorterJoinAll(x, rcin) (rcin) +#define vdbeSorterJoinThread(pTask) SQLITE_OK #endif /* @@ -98797,18 +97824,19 @@ static int vdbeSorterJoinAll(VdbeSorter *pSorter, int rcin){ ** 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 */ +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 ); + assert(nReader <= SORTER_MAX_MERGE_COUNT); - while( NnTree = N; pNew->pTask = 0; pNew->aReadr = (PmaReader*)&pNew[1]; @@ -98820,10 +97848,10 @@ static MergeEngine *vdbeMergeEngineNew(int nReader){ /* ** Free the MergeEngine object passed as the only argument. */ -static void vdbeMergeEngineFree(MergeEngine *pMerger){ +static void vdbeMergeEngineFree(MergeEngine* pMerger) { int i; - if( pMerger ){ - for(i=0; inTree; i++){ + if (pMerger) { + for (i = 0; i < pMerger->nTree; i++) { vdbePmaReaderClear(&pMerger->aReadr[i]); } } @@ -98834,13 +97862,15 @@ static void vdbeMergeEngineFree(MergeEngine *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 ){ +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); + if (pIncr->aFile[0].pFd) + sqlite3OsCloseFree(pIncr->aFile[0].pFd); + if (pIncr->aFile[1].pFd) + sqlite3OsCloseFree(pIncr->aFile[1].pFd); } #endif vdbeMergeEngineFree(pIncr->pMerger); @@ -98851,12 +97881,12 @@ static void vdbeIncrFree(IncrMerger *pIncr){ /* ** Reset a sorting cursor back to its original empty state. */ -SQLITE_PRIVATE void sqlite3VdbeSorterReset(sqlite3 *db, VdbeSorter *pSorter){ +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 ){ + 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; @@ -98864,12 +97894,12 @@ SQLITE_PRIVATE void sqlite3VdbeSorterReset(sqlite3 *db, VdbeSorter *pSorter){ #endif vdbeMergeEngineFree(pSorter->pMerger); pSorter->pMerger = 0; - for(i=0; inTask; i++){ - SortSubtask *pTask = &pSorter->aTask[i]; + for (i = 0; i < pSorter->nTask; i++) { + SortSubtask* pTask = &pSorter->aTask[i]; vdbeSortSubtaskCleanup(db, pTask); pTask->pSorter = pSorter; } - if( pSorter->list.aMemory==0 ){ + if (pSorter->list.aMemory == 0) { vdbeSorterRecordFree(0, pSorter->list.pList); } pSorter->list.pList = 0; @@ -98884,11 +97914,11 @@ SQLITE_PRIVATE void sqlite3VdbeSorterReset(sqlite3 *db, VdbeSorter *pSorter){ /* ** Free any cursor components allocated by sqlite3VdbeSorterXXX routines. */ -SQLITE_PRIVATE void sqlite3VdbeSorterClose(sqlite3 *db, VdbeCursor *pCsr){ - VdbeSorter *pSorter; - assert( pCsr->eCurType==CURTYPE_SORTER ); +SQLITE_PRIVATE void sqlite3VdbeSorterClose(sqlite3* db, VdbeCursor* pCsr) { + VdbeSorter* pSorter; + assert(pCsr->eCurType == CURTYPE_SORTER); pSorter = pCsr->uc.pSorter; - if( pSorter ){ + if (pSorter) { sqlite3VdbeSorterReset(db, pSorter); sqlite3_free(pSorter->list.aMemory); sqlite3DbFree(db, pSorter); @@ -98896,7 +97926,7 @@ SQLITE_PRIVATE void sqlite3VdbeSorterClose(sqlite3 *db, VdbeCursor *pCsr){ } } -#if SQLITE_MAX_MMAP_SIZE>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 @@ -98906,18 +97936,19 @@ SQLITE_PRIVATE void sqlite3VdbeSorterClose(sqlite3 *db, VdbeCursor *pCsr){ ** 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; +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); + if (p) + sqlite3OsUnfetch(pFd, 0, p); } } #else -# define vdbeSorterExtendFile(x,y,z) +#define vdbeSorterExtendFile(x, y, z) #endif /* @@ -98925,22 +97956,19 @@ static void vdbeSorterExtendFile(sqlite3 *db, sqlite3_file *pFd, i64 nByte){ ** 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 -){ +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 ){ + 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 ){ + if (nExtend > 0) { vdbeSorterExtendFile(db, *ppFd, nExtend); } } @@ -98952,50 +97980,47 @@ static int vdbeSorterOpenTempFile( ** 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 ){ +static int vdbeSortAllocUnpacked(SortSubtask* pTask) { + if (pTask->pUnpacked == 0) { pTask->pUnpacked = sqlite3VdbeAllocUnpackedRecord(pTask->pSorter->pKeyInfo); - if( pTask->pUnpacked==0 ) return SQLITE_NOMEM_BKPT; + 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; +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(;;){ + assert(p1 != 0 && p2 != 0); + for (;;) { int res; - res = pTask->xCompare( - pTask, &bCached, SRVAL(p1), p1->nVal, SRVAL(p2), p2->nVal - ); + res = pTask->xCompare(pTask, &bCached, SRVAL(p1), p1->nVal, SRVAL(p2), p2->nVal); - if( res<=0 ){ + if (res <= 0) { *pp = p1; pp = &p1->u.pNext; p1 = p1->u.pNext; - if( p1==0 ){ + if (p1 == 0) { *pp = p2; break; } - }else{ + } else { *pp = p2; pp = &p2->u.pNext; p2 = p2->u.pNext; bCached = 0; - if( p2==0 ){ + if (p2 == 0) { *pp = p1; break; } @@ -99008,10 +98033,10 @@ static SorterRecord *vdbeSorterMerge( ** 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 ){ +static SorterCompare vdbeSorterGetCompare(VdbeSorter* p) { + if (p->typeMask == SORTER_TYPE_INTEGER) { return vdbeSorterCompareInt; - }else if( p->typeMask==SORTER_TYPE_TEXT ){ + } else if (p->typeMask == SORTER_TYPE_TEXT) { return vdbeSorterCompareText; } return vdbeSorterCompare; @@ -99022,34 +98047,35 @@ static SorterCompare vdbeSorterGetCompare(VdbeSorter *p){ ** SQLITE_OK if successful, or an SQLite error code (i.e. SQLITE_NOMEM) if ** an error occurs. */ -static int vdbeSorterSort(SortSubtask *pTask, SorterList *pList){ +static int vdbeSorterSort(SortSubtask* pTask, SorterList* pList) { int i; - SorterRecord *p; + SorterRecord* p; int rc; - SorterRecord *aSlot[64]; + SorterRecord* aSlot[64]; rc = vdbeSortAllocUnpacked(pTask); - if( rc!=SQLITE_OK ) return rc; + 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 ){ + while (p) { + SorterRecord* pNext; + if (pList->aMemory) { + if ((u8*)p == pList->aMemory) { pNext = 0; - }else{ - assert( p->u.iNextaMemory) ); + } else { + assert(p->u.iNext < sqlite3MallocSize(pList->aMemory)); pNext = (SorterRecord*)&pList->aMemory[p->u.iNext]; } - }else{ + } else { pNext = p->u.pNext; } p->u.pNext = 0; - for(i=0; aSlot[i]; i++){ + for (i = 0; aSlot[i]; i++) { p = vdbeSorterMerge(pTask, p, aSlot[i]); aSlot[i] = 0; } @@ -99058,32 +98084,30 @@ static int vdbeSorterSort(SortSubtask *pTask, SorterList *pList){ } p = 0; - for(i=0; ipList = p; - assert( pTask->pUnpacked->errCode==SQLITE_OK - || pTask->pUnpacked->errCode==SQLITE_NOMEM - ); + 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 */ -){ +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 ){ + if (!p->aBuffer) { p->eFWErr = SQLITE_NOMEM_BKPT; - }else{ + } else { p->iBufEnd = p->iBufStart = (iStart % nBuf); p->iWriteOff = iStart - p->iBufStart; p->nBuffer = nBuf; @@ -99095,25 +98119,22 @@ static void vdbePmaWriterInit( ** 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){ +static void vdbePmaWriteBlob(PmaWriter* p, u8* pData, int nData) { int nRem = nData; - while( nRem>0 && p->eFWErr==0 ){ + while (nRem > 0 && p->eFWErr == 0) { int nCopy = nRem; - if( nCopy>(p->nBuffer - p->iBufEnd) ){ + if (nCopy > (p->nBuffer - p->iBufEnd)) { nCopy = p->nBuffer - p->iBufEnd; } - memcpy(&p->aBuffer[p->iBufEnd], &pData[nData-nRem], nCopy); + 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 - ); + 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 ); + assert(p->iBufEnd < p->nBuffer); nRem -= nCopy; } @@ -99128,13 +98149,10 @@ static void vdbePmaWriteBlob(PmaWriter *p, u8 *pData, int nData){ ** Before returning, set *piEof to the offset immediately following the ** last byte written to the file. */ -static int vdbePmaWriterFinish(PmaWriter *p, i64 *piEof){ +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 - ); + 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); @@ -99147,7 +98165,7 @@ static int vdbePmaWriterFinish(PmaWriter *p, i64 *piEof){ ** 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){ +static void vdbePmaWriteVarint(PmaWriter* p, u64 iVal) { int nByte; u8 aByte[10]; nByte = sqlite3PutVarint(aByte, iVal); @@ -99168,10 +98186,10 @@ static void vdbePmaWriteVarint(PmaWriter *p, u64 iVal){ ** 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 */ +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. @@ -99181,47 +98199,47 @@ static int vdbeSorterListToPMA(SortSubtask *pTask, SorterList *pList){ vdbeSorterWorkDebug(pTask, "enter"); memset(&writer, 0, sizeof(PmaWriter)); - assert( pList->szPMA>0 ); + assert(pList->szPMA > 0); /* If the first temporary PMA file has not been opened, open it now. */ - if( pTask->file.pFd==0 ){ + 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 ); + 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); + if (rc == SQLITE_OK) { + vdbeSorterExtendFile(db, pTask->file.pFd, pTask->file.iEof + pList->szPMA + 9); } /* Sort the list */ - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = vdbeSorterSort(pTask, pList); } - if( rc==SQLITE_OK ){ - SorterRecord *p; - SorterRecord *pNext = 0; + if (rc == SQLITE_OK) { + SorterRecord* p; + SorterRecord* pNext = 0; - vdbePmaWriterInit(pTask->file.pFd, &writer, pTask->pSorter->pgsz, - pTask->file.iEof); + vdbePmaWriterInit(pTask->file.pFd, &writer, pTask->pSorter->pgsz, pTask->file.iEof); pTask->nPMA++; vdbePmaWriteVarint(&writer, pList->szPMA); - for(p=pList->pList; p; p=pNext){ + 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); + 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 ); + assert(rc != SQLITE_OK || pList->pList == 0); + assert(rc != SQLITE_OK || pTask->file.iEof == iSz); return rc; } @@ -99232,22 +98250,21 @@ static int vdbeSorterListToPMA(SortSubtask *pTask, SorterList *pList){ ** ** 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 */ -){ +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; + 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 */ + 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 @@ -99255,17 +98272,15 @@ static int vdbeMergeEngineStep( pReadr1 = &pMerger->aReadr[(iPrev & 0xFFFE)]; pReadr2 = &pMerger->aReadr[(iPrev | 0x0001)]; - for(i=(pMerger->nTree+iPrev)/2; i>0; i=i/2){ + 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 ){ + if (pReadr1->pFd == 0) { iRes = +1; - }else if( pReadr2->pFd==0 ){ + } else if (pReadr2->pFd == 0) { iRes = -1; - }else{ - iRes = pTask->xCompare(pTask, &bCached, - pReadr1->aKey, pReadr1->nKey, pReadr2->aKey, pReadr2->nKey - ); + } 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. @@ -99283,30 +98298,31 @@ static int vdbeMergeEngineStep( ** 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] ]; + pReadr2 = &pMerger->aReadr[pMerger->aTree[i ^ 0x0001]]; bCached = 0; - }else{ - if( pReadr1->pFd ) bCached = 0; + } else { + if (pReadr1->pFd) + bCached = 0; pMerger->aTree[i] = (int)(pReadr2 - pMerger->aReadr); - pReadr1 = &pMerger->aReadr[ pMerger->aTree[i ^ 0x0001] ]; + pReadr1 = &pMerger->aReadr[pMerger->aTree[i ^ 0x0001]]; } } - *pbEof = (pMerger->aReadr[pMerger->aTree[1]].pFd==0); + *pbEof = (pMerger->aReadr[pMerger->aTree[1]].pFd == 0); } - return (rc==SQLITE_OK ? pTask->pUnpacked->errCode : rc); + return (rc == SQLITE_OK ? pTask->pUnpacked->errCode : rc); } -#if SQLITE_MAX_WORKER_THREADS>0 +#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 ); +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); @@ -99317,15 +98333,15 @@ static void *vdbeSorterFlushThread(void *pCtx){ ** 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 +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); + 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. */ @@ -99339,28 +98355,29 @@ static int vdbeSorterFlushPMA(VdbeSorter *pSorter){ ** 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 ){ + if (pTask->bDone) { rc = vdbeSorterJoinThread(pTask); } - if( rc!=SQLITE_OK || pTask->pThread==0 ) break; + if (rc != SQLITE_OK || pTask->pThread == 0) + break; } - if( rc==SQLITE_OK ){ - if( i==nWorker ){ + if (rc == SQLITE_OK) { + if (i == nWorker) { /* Use the foreground thread for this operation */ rc = vdbeSorterListToPMA(&pSorter->aTask[nWorker], &pSorter->list); - }else{ + } else { /* Launch a background thread for this operation */ - u8 *aMem; - void *pCtx; + 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 ); + 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; @@ -99368,12 +98385,13 @@ static int vdbeSorterFlushPMA(VdbeSorter *pSorter){ pTask->list = pSorter->list; pSorter->list.pList = 0; pSorter->list.szPMA = 0; - if( aMem ){ + if (aMem) { pSorter->list.aMemory = aMem; pSorter->nMemory = sqlite3MallocSize(aMem); - }else if( pSorter->list.aMemory ){ + } else if (pSorter->list.aMemory) { pSorter->list.aMemory = sqlite3Malloc(pSorter->nMemory); - if( !pSorter->list.aMemory ) return SQLITE_NOMEM_BKPT; + if (!pSorter->list.aMemory) + return SQLITE_NOMEM_BKPT; } rc = vdbeSorterCreateThread(pTask, vdbeSorterFlushThread, pCtx); @@ -99387,30 +98405,29 @@ static int vdbeSorterFlushPMA(VdbeSorter *pSorter){ /* ** 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 ); +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 ){ + if (t > 0 && t < 10 && t != 7) { pSorter->typeMask &= SORTER_TYPE_INTEGER; - }else if( t>10 && (t & 0x01) ){ + } else if (t > 10 && (t & 0x01)) { pSorter->typeMask &= SORTER_TYPE_TEXT; - }else{ + } else { pSorter->typeMask = 0; } - assert( pSorter ); + assert(pSorter); /* Figure out whether or not the current contents of memory should be ** flushed to a PMA before continuing. If so, do so. @@ -99430,44 +98447,45 @@ SQLITE_PRIVATE int sqlite3VdbeSorterWrite( */ 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 (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 ){ + if (bFlush) { rc = vdbeSorterFlushPMA(pSorter); pSorter->list.szPMA = 0; pSorter->iMemory = 0; - assert( rc!=SQLITE_OK || pSorter->list.pList==0 ); + assert(rc != SQLITE_OK || pSorter->list.pList == 0); } } pSorter->list.szPMA += nPMA; - if( nPMA>pSorter->mxKeysize ){ + if (nPMA > pSorter->mxKeysize) { pSorter->mxKeysize = nPMA; } - if( pSorter->list.aMemory ){ + if (pSorter->list.aMemory) { int nMin = pSorter->iMemory + nReq; - if( nMin>pSorter->nMemory ){ - u8 *aNew; + if (nMin > pSorter->nMemory) { + u8* aNew; sqlite3_int64 nNew = 2 * (sqlite3_int64)pSorter->nMemory; int iListOff = -1; - if( pSorter->list.pList ){ + 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; + 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 ){ + if (!aNew) + return SQLITE_NOMEM_BKPT; + if (iListOff >= 0) { pSorter->list.pList = (SorterRecord*)&aNew[iListOff]; } pSorter->list.aMemory = aNew; @@ -99476,12 +98494,12 @@ SQLITE_PRIVATE int sqlite3VdbeSorterWrite( pNew = (SorterRecord*)&pSorter->list.aMemory[pSorter->iMemory]; pSorter->iMemory += ROUND8(nReq); - if( pSorter->list.pList ){ + if (pSorter->list.pList) { pNew->u.iNext = (int)((u8*)(pSorter->list.pList) - pSorter->list.aMemory); } - }else{ - pNew = (SorterRecord *)sqlite3Malloc(nReq); - if( pNew==0 ){ + } else { + pNew = (SorterRecord*)sqlite3Malloc(nReq); + if (pNew == 0) { return SQLITE_NOMEM_BKPT; } pNew->u.pNext = pSorter->list.pList; @@ -99499,51 +98517,54 @@ SQLITE_PRIVATE int sqlite3VdbeSorterWrite( ** 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){ +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; + SorterFile* pOut = &pIncr->aFile[1]; + SortSubtask* pTask = pIncr->pTask; + MergeEngine* pMerger = pIncr->pMerger; PmaWriter writer; - assert( pIncr->bEof==0 ); + assert(pIncr->bEof == 0); vdbeSorterPopulateDebug(pTask, "enter"); vdbePmaWriterInit(pOut->pFd, &writer, pTask->pSorter->pgsz, iStart); - while( rc==SQLITE_OK ){ + while (rc == SQLITE_OK) { int dummy; - PmaReader *pReader = &pMerger->aReadr[ pMerger->aTree[1] ]; + 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; + 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 ); + assert(pIncr->pMerger->pTask == pTask); rc = vdbeMergeEngineStep(pIncr->pMerger, &dummy); } rc2 = vdbePmaWriterFinish(&writer, &pOut->iEof); - if( rc==SQLITE_OK ) rc = rc2; + if (rc == SQLITE_OK) + rc = rc2; vdbeSorterPopulateDebug(pTask, "exit"); return rc; } -#if SQLITE_MAX_WORKER_THREADS>0 +#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) ); +static void* vdbeIncrPopulateThread(void* pCtx) { + IncrMerger* pIncr = (IncrMerger*)pCtx; + void* pRet = SQLITE_INT_TO_PTR(vdbeIncrPopulate(pIncr)); pIncr->pTask->bDone = 1; return pRet; } @@ -99551,9 +98572,9 @@ static void *vdbeIncrPopulateThread(void *pCtx){ /* ** Launch a background thread to populate aFile[1] of pIncr. */ -static int vdbeIncrBgPopulate(IncrMerger *pIncr){ - void *p = (void*)pIncr; - assert( pIncr->bUseThread ); +static int vdbeIncrBgPopulate(IncrMerger* pIncr) { + void* p = (void*)pIncr; + assert(pIncr->bUseThread); return vdbeSorterCreateThread(pIncr->pTask, vdbeIncrPopulateThread, p); } #endif @@ -99575,32 +98596,32 @@ static int vdbeIncrBgPopulate(IncrMerger *pIncr){ ** ** SQLITE_OK is returned on success, or an SQLite error code otherwise. */ -static int vdbeIncrSwap(IncrMerger *pIncr){ +static int vdbeIncrSwap(IncrMerger* pIncr) { int rc = SQLITE_OK; -#if SQLITE_MAX_WORKER_THREADS>0 - if( pIncr->bUseThread ){ +#if SQLITE_MAX_WORKER_THREADS > 0 + if (pIncr->bUseThread) { rc = vdbeSorterJoinThread(pIncr->pTask); - if( rc==SQLITE_OK ){ + 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 ){ + if (rc == SQLITE_OK) { + if (pIncr->aFile[0].iEof == pIncr->iStartOff) { pIncr->bEof = 1; - }else{ + } else { rc = vdbeIncrBgPopulate(pIncr); } } - }else + } else #endif { rc = vdbeIncrPopulate(pIncr); pIncr->aFile[0] = pIncr->aFile[1]; - if( pIncr->aFile[0].iEof==pIncr->iStartOff ){ + if (pIncr->aFile[0].iEof == pIncr->iStartOff) { pIncr->bEof = 1; } } @@ -99614,82 +98635,75 @@ static int vdbeIncrSwap(IncrMerger *pIncr){ ** 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 */ -){ +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 ){ + 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); + pIncr->mxSz = MAX(pTask->pSorter->mxKeysize + 9, pTask->pSorter->mxPmaSize / 2); pTask->file2.iEof += pIncr->mxSz; - }else{ + } else { vdbeMergeEngineFree(pMerger); rc = SQLITE_NOMEM_BKPT; } - assert( *ppOut!=0 || rc!=SQLITE_OK ); + assert(*ppOut != 0 || rc != SQLITE_OK); return rc; } -#if SQLITE_MAX_WORKER_THREADS>0 +#if SQLITE_MAX_WORKER_THREADS > 0 /* ** Set the "use-threads" flag on object pIncr. */ -static void vdbeIncrMergerSetThreads(IncrMerger *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] */ -){ +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; + PmaReader* p1; + PmaReader* p2; - assert( iOutnTree && iOut>0 ); + assert(iOut < pMerger->nTree && iOut > 0); - if( iOut>=(pMerger->nTree/2) ){ - i1 = (iOut - pMerger->nTree/2) * 2; + 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]; + } else { + i1 = pMerger->aTree[iOut * 2]; + i2 = pMerger->aTree[iOut * 2 + 1]; } p1 = &pMerger->aReadr[i1]; p2 = &pMerger->aReadr[i2]; - if( p1->pFd==0 ){ + if (p1->pFd == 0) { iRes = i2; - }else if( p2->pFd==0 ){ + } else if (p2->pFd == 0) { iRes = i1; - }else{ - SortSubtask *pTask = pMerger->pTask; + } 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 ){ + 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{ + } else { iRes = i2; } } @@ -99706,15 +98720,15 @@ static void vdbeMergeEngineCompare( ** when there exists one or more separate worker threads. */ #define INCRINIT_NORMAL 0 -#define INCRINIT_TASK 1 -#define INCRINIT_ROOT 2 +#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); +static int vdbePmaReaderIncrInit(PmaReader* pReadr, int eMode); /* ** Initialize the MergeEngine object passed as the second argument. Once this @@ -99734,29 +98748,28 @@ static int vdbePmaReaderIncrInit(PmaReader *pReadr, int eMode); ** ** 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 */ +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 ); + assert(pMerger != 0); /* eMode is always INCRINIT_NORMAL in single-threaded mode */ - assert( SQLITE_MAX_WORKER_THREADS>0 || eMode==INCRINIT_NORMAL ); + assert(SQLITE_MAX_WORKER_THREADS > 0 || eMode == INCRINIT_NORMAL); /* Verify that the MergeEngine is assigned to a single thread */ - assert( pMerger->pTask==0 ); + assert(pMerger->pTask == 0); pMerger->pTask = pTask; nTree = pMerger->nTree; - for(i=0; i0 && eMode==INCRINIT_ROOT ){ + for (i = 0; i < nTree; i++) { + if (SQLITE_MAX_WORKER_THREADS > 0 && 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 @@ -99764,14 +98777,15 @@ static int vdbeMergeEngineInit( ** 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 = vdbePmaReaderNext(&pMerger->aReadr[nTree - i - 1]); + } else { rc = vdbePmaReaderIncrInit(&pMerger->aReadr[i], INCRINIT_NORMAL); } - if( rc!=SQLITE_OK ) return rc; + if (rc != SQLITE_OK) + return rc; } - for(i=pMerger->nTree-1; i>0; i--){ + for (i = pMerger->nTree - 1; i > 0; i--) { vdbeMergeEngineCompare(pMerger, i); } return pTask->pUnpacked->errCode; @@ -99810,37 +98824,37 @@ static int vdbeMergeEngineInit( ** ** SQLITE_OK is returned if successful, or an SQLite error code otherwise. */ -static int vdbePmaReaderIncrMergeInit(PmaReader *pReadr, int eMode){ +static int vdbePmaReaderIncrMergeInit(PmaReader* pReadr, int eMode) { int rc = SQLITE_OK; - IncrMerger *pIncr = pReadr->pIncr; - SortSubtask *pTask = pIncr->pTask; - sqlite3 *db = pTask->pSorter->db; + 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 ); + 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 ){ + if (rc == SQLITE_OK) { int mxSz = pIncr->mxSz; -#if SQLITE_MAX_WORKER_THREADS>0 - if( pIncr->bUseThread ){ +#if SQLITE_MAX_WORKER_THREADS > 0 + if (pIncr->bUseThread) { rc = vdbeSorterOpenTempFile(db, mxSz, &pIncr->aFile[0].pFd); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = vdbeSorterOpenTempFile(db, mxSz, &pIncr->aFile[1].pFd); } - }else + } else #endif - /*if( !pIncr->bUseThread )*/{ - if( pTask->file2.pFd==0 ){ - assert( pTask->file2.iEof>0 ); + /*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 ){ + if (rc == SQLITE_OK) { pIncr->aFile[1].pFd = pTask->file2.pFd; pIncr->iStartOff = pTask->file2.iEof; pTask->file2.iEof += mxSz; @@ -99848,8 +98862,8 @@ static int vdbePmaReaderIncrMergeInit(PmaReader *pReadr, int eMode){ } } -#if SQLITE_MAX_WORKER_THREADS>0 - if( rc==SQLITE_OK && pIncr->bUseThread ){ +#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 @@ -99860,28 +98874,26 @@ static int vdbePmaReaderIncrMergeInit(PmaReader *pReadr, int eMode){ ** 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 ); + assert(eMode == INCRINIT_ROOT || eMode == INCRINIT_TASK); rc = vdbeIncrPopulate(pIncr); } #endif - if( rc==SQLITE_OK && (SQLITE_MAX_WORKER_THREADS==0 || eMode!=INCRINIT_TASK) ){ + if (rc == SQLITE_OK && (SQLITE_MAX_WORKER_THREADS == 0 || eMode != INCRINIT_TASK)) { rc = vdbePmaReaderNext(pReadr); } return rc; } -#if SQLITE_MAX_WORKER_THREADS>0 +#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) - ); +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; } @@ -99898,16 +98910,16 @@ static void *vdbePmaReaderBgIncrInit(void *pCtx){ ** 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; +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 + } else #endif { rc = vdbePmaReaderIncrMergeInit(pReadr, eMode); @@ -99928,28 +98940,28 @@ static int vdbePmaReaderIncrInit(PmaReader *pReadr, int eMode){ ** 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 */ +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; + if (pNew == 0) + rc = SQLITE_NOMEM_BKPT; - for(i=0; iaReadr[i]; + PmaReader* pReadr = &pNew->aReadr[i]; rc = vdbePmaReaderInit(pTask, &pTask->file, iOff, pReadr, &nDummy); iOff = pReadr->iEof; } - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { vdbeMergeEngineFree(pNew); *ppOut = 0; } @@ -99967,10 +98979,10 @@ static int vdbeMergeEngineLevel0( ** nPMA<=256 -> TreeDepth() == 1 ** nPMA<=65536 -> TreeDepth() == 2 */ -static int vdbeSorterTreeDepth(int nPMA){ +static int vdbeSorterTreeDepth(int nPMA) { int nDepth = 0; i64 nDiv = SORTER_MAX_MERGE_COUNT; - while( nDiv < (i64)nPMA ){ + while (nDiv < (i64)nPMA) { nDiv = nDiv * SORTER_MAX_MERGE_COUNT; nDepth++; } @@ -99985,46 +98997,45 @@ static int vdbeSorterTreeDepth(int nPMA){ ** 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 */ -){ +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; + MergeEngine* p = pRoot; + IncrMerger* pIncr; rc = vdbeIncrMergerNew(pTask, pLeaf, &pIncr); - for(i=1; iaReadr[iIter]; + PmaReader* pReadr = &p->aReadr[iIter]; - if( pReadr->pIncr==0 ){ - MergeEngine *pNew = vdbeMergeEngineNew(SORTER_MAX_MERGE_COUNT); - if( pNew==0 ){ + if (pReadr->pIncr == 0) { + MergeEngine* pNew = vdbeMergeEngineNew(SORTER_MAX_MERGE_COUNT); + if (pNew == 0) { rc = SQLITE_NOMEM_BKPT; - }else{ + } else { rc = vdbeIncrMergerNew(pTask, pNew, &pReadr->pIncr); } } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { p = pReadr->pIncr->pMerger; nDiv = nDiv / SORTER_MAX_MERGE_COUNT; } } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { p->aReadr[iSeq % SORTER_MAX_MERGE_COUNT].pIncr = pIncr; - }else{ + } else { vdbeIncrFree(pIncr); } return rc; @@ -100041,69 +99052,70 @@ static int vdbeSorterAddToTree( ** 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; +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 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 ){ + assert(pSorter->bUseThreads || pSorter->nTask == 1); + if (pSorter->nTask > 1) { pMain = vdbeMergeEngineNew(pSorter->nTask); - if( pMain==0 ) rc = SQLITE_NOMEM_BKPT; + 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 */ + for (iTask = 0; rc == SQLITE_OK && iTask < pSorter->nTask; 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 ){ + if (pTask->nPMA <= SORTER_MAX_MERGE_COUNT) { rc = vdbeMergeEngineLevel0(pTask, pTask->nPMA, &iReadOff, &pRoot); - }else{ + } 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 */ + if (pRoot == 0) + rc = SQLITE_NOMEM_BKPT; + for (i = 0; i < pTask->nPMA && 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 ){ + if (rc == SQLITE_OK) { rc = vdbeSorterAddToTree(pTask, nDepth, iSeq++, pRoot, pMerger); } } } - if( rc==SQLITE_OK ){ -#if SQLITE_MAX_WORKER_THREADS>0 - if( pMain!=0 ){ + if (rc == SQLITE_OK) { +#if SQLITE_MAX_WORKER_THREADS > 0 + if (pMain != 0) { rc = vdbeIncrMergerNew(pTask, pRoot, &pMain->aReadr[iTask].pIncr); - }else + } else #endif { - assert( pMain==0 ); + assert(pMain == 0); pMain = pRoot; } - }else{ + } else { vdbeMergeEngineFree(pRoot); } } } - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { vdbeMergeEngineFree(pMain); pMain = 0; } @@ -100120,45 +99132,46 @@ static int vdbeSorterMergeTreeBuild( ** ** 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; +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; + sqlite3* db = pTask0->pSorter->db; int i; SorterCompare xCompare = vdbeSorterGetCompare(pSorter); - for(i=0; inTask; i++){ + for (i = 0; i < pSorter->nTask; i++) { pSorter->aTask[i].xCompare = xCompare; } #endif rc = vdbeSorterMergeTreeBuild(pSorter, &pMain); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { #if SQLITE_MAX_WORKER_THREADS - assert( pSorter->bUseThreads==0 || pSorter->nTask>1 ); - if( pSorter->bUseThreads ){ + assert(pSorter->bUseThreads == 0 || pSorter->nTask > 1); + if (pSorter->bUseThreads) { int iTask; - PmaReader *pReadr = 0; - SortSubtask *pLast = &pSorter->aTask[pSorter->nTask-1]; + PmaReader* pReadr = 0; + SortSubtask* pLast = &pSorter->aTask[pSorter->nTask - 1]; rc = vdbeSortAllocUnpacked(pLast); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pReadr = (PmaReader*)sqlite3DbMallocZero(db, sizeof(PmaReader)); pSorter->pReader = pReadr; - if( pReadr==0 ) rc = SQLITE_NOMEM_BKPT; + if (pReadr == 0) + rc = SQLITE_NOMEM_BKPT; } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = vdbeIncrMergerNew(pLast, pMain, &pReadr->pIncr); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { vdbeIncrMergerSetThreads(pReadr->pIncr); - for(iTask=0; iTask<(pSorter->nTask-1); iTask++){ - IncrMerger *pIncr; - if( (pIncr = pMain->aReadr[iTask].pIncr) ){ + for (iTask = 0; iTask < (pSorter->nTask - 1); iTask++) { + IncrMerger* pIncr; + if ((pIncr = pMain->aReadr[iTask].pIncr)) { vdbeIncrMergerSetThreads(pIncr); - assert( pIncr->pTask!=pLast ); + assert(pIncr->pTask != pLast); } } - for(iTask=0; rc==SQLITE_OK && iTasknTask; iTask++){ + for (iTask = 0; rc == SQLITE_OK && iTask < pSorter->nTask; iTask++) { /* Check that: ** ** a) The incremental merge object is configured to use the @@ -100168,20 +99181,19 @@ static int vdbeSorterSetupMerge(VdbeSorter *pSorter){ ** 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 */ - )); + 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 ){ + if (rc == SQLITE_OK) { rc = vdbePmaReaderIncrMergeInit(pReadr, INCRINIT_ROOT); } - }else + } else #endif { rc = vdbeMergeEngineInit(pTask0, pMain, INCRINIT_NORMAL); @@ -100190,34 +99202,33 @@ static int vdbeSorterSetupMerge(VdbeSorter *pSorter){ } } - if( rc!=SQLITE_OK ){ + 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 */ +SQLITE_PRIVATE int sqlite3VdbeSorterRewind(const VdbeCursor* pCsr, int* pbEof) { + VdbeSorter* pSorter; + int rc = SQLITE_OK; /* Return code */ - assert( pCsr->eCurType==CURTYPE_SORTER ); + assert(pCsr->eCurType == CURTYPE_SORTER); pSorter = pCsr->uc.pSorter; - assert( 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 ){ + if (pSorter->bUsePMA == 0) { + if (pSorter->list.pList) { *pbEof = 0; rc = vdbeSorterSort(&pSorter->aTask[0], &pSorter->list); - }else{ + } else { *pbEof = 1; } return rc; @@ -100227,7 +99238,7 @@ SQLITE_PRIVATE int sqlite3VdbeSorterRewind(const VdbeCursor *pCsr, int *pbEof){ ** 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 ); + assert(pSorter->list.pList); rc = vdbeSorterFlushPMA(pSorter); /* Join all threads */ @@ -100237,8 +99248,8 @@ SQLITE_PRIVATE int sqlite3VdbeSorterRewind(const VdbeCursor *pCsr, int *pbEof){ /* 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 ){ + assert(pSorter->pReader == 0); + if (rc == SQLITE_OK) { rc = vdbeSorterSetupMerge(pSorter); *pbEof = 0; } @@ -100254,35 +99265,38 @@ SQLITE_PRIVATE int sqlite3VdbeSorterRewind(const VdbeCursor *pCsr, int *pbEof){ ** 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 */ +SQLITE_PRIVATE int sqlite3VdbeSorterNext(sqlite3* db, const VdbeCursor* pCsr) { + VdbeSorter* pSorter; + int rc; /* Return code */ - assert( pCsr->eCurType==CURTYPE_SORTER ); + 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 ){ + 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 + 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]) ); + assert(pSorter->pMerger != 0); + assert(pSorter->pMerger->pTask == (&pSorter->aTask[0])); rc = vdbeMergeEngineStep(pSorter->pMerger, &res); - if( rc==SQLITE_OK && res ) rc = SQLITE_DONE; + if (rc == SQLITE_OK && res) + rc = SQLITE_DONE; } - }else{ - SorterRecord *pFree = pSorter->list.pList; + } else { + SorterRecord* pFree = pSorter->list.pList; pSorter->list.pList = pFree->u.pNext; pFree->u.pNext = 0; - if( pSorter->list.aMemory==0 ) vdbeSorterRecordFree(db, pFree); + if (pSorter->list.aMemory == 0) + vdbeSorterRecordFree(db, pFree); rc = pSorter->list.pList ? SQLITE_OK : SQLITE_DONE; } return rc; @@ -100292,24 +99306,23 @@ SQLITE_PRIVATE int sqlite3VdbeSorterNext(sqlite3 *db, const VdbeCursor *pCsr){ ** 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 ){ +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 + } else #endif - /*if( !pSorter->bUseThreads )*/{ + /*if( !pSorter->bUseThreads )*/ { pReader = &pSorter->pMerger->aReadr[pSorter->pMerger->aTree[1]]; } *pnKey = pReader->nKey; pKey = pReader->aKey; - }else{ + } else { *pnKey = pSorter->list.pList->nVal; pKey = SRVAL(pSorter->list.pList); } @@ -100319,14 +99332,15 @@ static void *vdbeSorterRowkey( /* ** 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 */ +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 ); + assert(pCsr->eCurType == CURTYPE_SORTER); pSorter = pCsr->uc.pSorter; pKey = vdbeSorterRowkey(pSorter, &nKey); - if( sqlite3VdbeMemClearAndResize(pOut, nKey) ){ + if (sqlite3VdbeMemClearAndResize(pOut, nKey)) { return SQLITE_NOMEM_BKPT; } pOut->n = nKey; @@ -100352,33 +99366,34 @@ SQLITE_PRIVATE int sqlite3VdbeSorterRowkey(const VdbeCursor *pCsr, Mem *pOut){ ** 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; +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 */ + void* pKey; + int nKey; /* Sorter key to compare pVal with */ - assert( pCsr->eCurType==CURTYPE_SORTER ); + assert(pCsr->eCurType == CURTYPE_SORTER); pSorter = pCsr->uc.pSorter; r2 = pSorter->pUnpacked; pKeyInfo = pCsr->pKeyInfo; - if( r2==0 ){ + if (r2 == 0) { r2 = pSorter->pUnpacked = sqlite3VdbeAllocUnpackedRecord(pKeyInfo); - if( r2==0 ) return SQLITE_NOMEM_BKPT; + if (r2 == 0) + return SQLITE_NOMEM_BKPT; r2->nField = nKeyCol; } - assert( r2->nField==nKeyCol ); + assert(r2->nField == nKeyCol); pKey = vdbeSorterRowkey(pSorter, &nKey); sqlite3VdbeRecordUnpack(pKeyInfo, nKey, pKey, r2); - for(i=0; iaMem[i].flags & MEM_Null ){ + for (i = 0; i < nKeyCol; i++) { + if (r2->aMem[i].flags & MEM_Null) { *pRes = -1; return SQLITE_OK; } @@ -100410,79 +99425,72 @@ SQLITE_PRIVATE int sqlite3VdbeSorterCompare( /* #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(). */ + 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 */ + 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; +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" - ");" - }; + 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) ); + if (rc == SQLITE_OK) { + pNew = sqlite3_malloc(sizeof(*pNew)); *ppVtab = (sqlite3_vtab*)pNew; - if( pNew==0 ) return SQLITE_NOMEM; + if (pNew == 0) + return SQLITE_NOMEM; memset(pNew, 0, sizeof(*pNew)); pNew->db = db; - pNew->bTablesUsed = isTabUsed*2; + pNew->bTablesUsed = isTabUsed * 2; } return rc; } @@ -100490,8 +99498,8 @@ static int bytecodevtabConnect( /* ** This method is the destructor for bytecodevtab objects. */ -static int bytecodevtabDisconnect(sqlite3_vtab *pVtab){ - bytecodevtab *p = (bytecodevtab*)pVtab; +static int bytecodevtabDisconnect(sqlite3_vtab* pVtab) { + bytecodevtab* p = (bytecodevtab*)pVtab; sqlite3_free(p); return SQLITE_OK; } @@ -100499,11 +99507,12 @@ static int bytecodevtabDisconnect(sqlite3_vtab *pVtab){ /* ** 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; +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; @@ -100513,12 +99522,12 @@ static int bytecodevtabOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ /* ** Clear all internal content from a bytecodevtab cursor. */ -static void bytecodevtabCursorClear(bytecodevtab_cursor *pCur){ +static void bytecodevtabCursorClear(bytecodevtab_cursor* pCur) { sqlite3_free(pCur->zP4); pCur->zP4 = 0; sqlite3VdbeMemRelease(&pCur->sub); sqlite3VdbeMemSetNull(&pCur->sub); - if( pCur->needFinalize ){ + if (pCur->needFinalize) { sqlite3_finalize(pCur->pStmt); } pCur->pStmt = 0; @@ -100531,38 +99540,32 @@ static void bytecodevtabCursorClear(bytecodevtab_cursor *pCur){ /* ** Destructor for a bytecodevtab_cursor. */ -static int bytecodevtabClose(sqlite3_vtab_cursor *cur){ - bytecodevtab_cursor *pCur = (bytecodevtab_cursor*)cur; +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; +static int bytecodevtabNext(sqlite3_vtab_cursor* cur) { + bytecodevtab_cursor* pCur = (bytecodevtab_cursor*)cur; + bytecodevtab* pTab = (bytecodevtab*)cur->pVtab; int rc; - if( pCur->zP4 ){ + if (pCur->zP4) { sqlite3_free(pCur->zP4); pCur->zP4 = 0; } - if( pCur->zName ){ + 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 ){ + 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; } @@ -100573,47 +99576,46 @@ static int bytecodevtabNext(sqlite3_vtab_cursor *cur){ ** 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; +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 ){ +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; + } else { + if (i <= 2 && pCur->zType == 0) { + Schema* pSchema; + HashElem* k; int iDb = pOp->p3; Pgno iRoot = (Pgno)pOp->p2; - sqlite3 *db = pVTab->db; + 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 ){ + 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 ){ + 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"; } @@ -100623,64 +99625,66 @@ static int bytecodevtabColumn( i += 10; } } - switch( i ){ - case 0: /* addr */ + 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); + case 1: /* opcode */ + sqlite3_result_text(ctx, (char*)sqlite3OpcodeName(pOp->opcode), -1, SQLITE_STATIC); break; - case 2: /* p1 */ + case 2: /* p1 */ sqlite3_result_int(ctx, pOp->p1); break; - case 3: /* p2 */ + case 3: /* p2 */ sqlite3_result_int(ctx, pOp->p2); break; - case 4: /* p3 */ + case 4: /* p3 */ sqlite3_result_int(ctx, pOp->p3); break; - case 5: /* p4 */ - case 7: /* comment */ - if( pCur->zP4==0 ){ + case 5: /* p4 */ + case 7: /* comment */ + if (pCur->zP4 == 0) { pCur->zP4 = sqlite3VdbeDisplayP4(pVTab->db, pOp); } - if( i==5 ){ + if (i == 5) { sqlite3_result_text(ctx, pCur->zP4, -1, SQLITE_STATIC); - }else{ + } else { #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS - char *zCom = sqlite3VdbeDisplayComment(pVTab->db, pOp, pCur->zP4); + char* zCom = sqlite3VdbeDisplayComment(pVTab->db, pOp, pCur->zP4); sqlite3_result_text(ctx, zCom, -1, sqlite3_free); #endif } break; - case 6: /* p5 */ + 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); + 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 */ + case 10: /* tables_used.type */ sqlite3_result_text(ctx, pCur->zType, -1, SQLITE_STATIC); break; - case 11: /* tables_used.schema */ + case 11: /* tables_used.schema */ sqlite3_result_text(ctx, pCur->zSchema, -1, SQLITE_STATIC); break; - case 12: /* tables_used.name */ + 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); + case 13: /* tables_used.wr */ + sqlite3_result_int(ctx, pOp->opcode == OP_OpenWrite); break; } return SQLITE_OK; @@ -100690,8 +99694,8 @@ static int bytecodevtabColumn( ** 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; +static int bytecodevtabRowid(sqlite3_vtab_cursor* cur, sqlite_int64* pRowid) { + bytecodevtab_cursor* pCur = (bytecodevtab_cursor*)cur; *pRowid = pCur->iRowid; return SQLITE_OK; } @@ -100702,38 +99706,31 @@ static int bytecodevtabRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ ** 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; +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 ){ + 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{ + } 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"); + } 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" - ); + 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{ + } else { bytecodevtabNext(pVtabCursor); } return rc; @@ -100744,26 +99741,24 @@ static int bytecodevtabFilter( ** 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 -){ +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; + 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 ){ + for (i = 0, p = pIdxInfo->aConstraint; i < pIdxInfo->nConstraint; 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 ){ + if (p->op == SQLITE_INDEX_CONSTRAINT_ISNULL && p->iColumn == iBaseCol) { pIdxInfo->aConstraintUsage[i].omit = 1; pIdxInfo->idxNum = 1; } @@ -100775,44 +99770,43 @@ static int bytecodevtabBestIndex( ** 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){ +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 ){ + 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; } +SQLITE_PRIVATE int sqlite3VdbeBytecodeVtabInit(sqlite3* db) { + return SQLITE_OK; +} #endif /* SQLITE_ENABLE_BYTECODE_VTAB */ /************** End of vdbevtab.c ********************************************/ @@ -100856,8 +99850,8 @@ typedef struct FileChunk FileChunk; ** 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 */ + FileChunk* pNext; /* Next chunk in the journal */ + u8 zChunk[8]; /* Content of this chunk */ }; /* @@ -100869,15 +99863,15 @@ struct FileChunk { ** For chunk size nChunkSize, return the number of bytes that should ** be allocated for each FileChunk structure. */ -#define fileChunkSize(nChunkSize) (sizeof(FileChunk) + ((nChunkSize)-8)) +#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 */ + sqlite3_int64 iOffset; /* Offset from the beginning of the file */ + FileChunk* pChunk; /* Specific chunk into which cursor points */ }; /* @@ -100885,53 +99879,49 @@ struct FilePoint { ** is an instance of this class. */ struct MemJournal { - const sqlite3_io_methods *pMethod; /* Parent class. MUST BE FIRST */ - int nChunkSize; /* In-memory chunk-size */ + 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 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 */ + 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; +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; + FileChunk* pChunk; - if( (iAmt+iOfst)>p->endpoint.iOffset ){ + 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 ){ + 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 - ){ + for (pChunk = p->pFirst; ALWAYS(pChunk) && (iOff + p->nChunkSize) <= iOfst; pChunk = pChunk->pNext) { iOff += p->nChunkSize; } - }else{ + } else { pChunk = p->readpoint.pChunk; - assert( pChunk!=0 ); + assert(pChunk != 0); } - iChunkOffset = (int)(iOfst%p->nChunkSize); + iChunkOffset = (int)(iOfst % p->nChunkSize); do { int iSpace = p->nChunkSize - iChunkOffset; int nCopy = MIN(nRead, (p->nChunkSize - iChunkOffset)); @@ -100939,8 +99929,8 @@ static int memjrnlRead( zOut += nCopy; nRead -= iSpace; iChunkOffset = 0; - } while( nRead>=0 && (pChunk=pChunk->pNext)!=0 && nRead>0 ); - p->readpoint.iOffset = pChunk ? iOfst+iAmt : 0; + } while (nRead >= 0 && (pChunk = pChunk->pNext) != 0 && nRead > 0); + p->readpoint.iOffset = pChunk ? iOfst + iAmt : 0; p->readpoint.pChunk = pChunk; return SQLITE_OK; @@ -100949,10 +99939,10 @@ static int memjrnlRead( /* ** 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){ +static void memjrnlFreeChunks(FileChunk* pFirst) { + FileChunk* pIter; + FileChunk* pNext; + for (pIter = pFirst; pIter; pIter = pNext) { pNext = pIter->pNext; sqlite3_free(pIter); } @@ -100961,31 +99951,32 @@ static void memjrnlFreeChunks(FileChunk *pFirst){ /* ** Flush the contents of memory to a real file on disk. */ -static int memjrnlCreateFile(MemJournal *p){ +static int memjrnlCreateFile(MemJournal* p) { int rc; - sqlite3_file *pReal = (sqlite3_file*)p; + 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 ){ + 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 ){ + 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; + if (rc) + break; iOff += nChunk; } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { /* No error has occurred. Free the in-memory buffers. */ memjrnlFreeChunks(copy.pFirst); } } - if( rc!=SQLITE_OK ){ + 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 @@ -100996,72 +99987,70 @@ static int memjrnlCreateFile(MemJournal *p){ return rc; } - /* Forward reference */ -static int memjrnlTruncate(sqlite3_file *pJfd, sqlite_int64 size); +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; +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; + 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 ){ + if (p->nSpill > 0 && (iAmt + iOfst) > p->nSpill) { int rc = memjrnlCreateFile(p); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = sqlite3OsWrite(pJfd, zBuf, iAmt, iOfst); } return rc; } /* If the contents of this write should be stored in memory */ - else{ + 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 ){ + assert(iOfst <= p->endpoint.iOffset); + if (iOfst > 0 && iOfst != p->endpoint.iOffset) { memjrnlTruncate(pJfd, iOfst); } - if( iOfst==0 && p->pFirst ){ - assert( p->nChunkSize>iAmt ); + 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); + } 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 ){ + 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 ){ + FileChunk* pNew = sqlite3_malloc(fileChunkSize(p->nChunkSize)); + if (!pNew) { return SQLITE_IOERR_NOMEM_BKPT; } pNew->pNext = 0; - if( pChunk ){ - assert( p->pFirst ); + if (pChunk) { + assert(p->pFirst); pChunk->pNext = pNew; - }else{ - assert( !p->pFirst ); + } else { + assert(!p->pFirst); p->pFirst = pNew; } pChunk = p->endpoint.pChunk = pNew; } - assert( pChunk!=0 ); + assert(pChunk != 0); memcpy((u8*)pChunk->zChunk + iChunkOffset, zWrite, iSpace); zWrite += iSpace; nWrite -= iSpace; @@ -101076,20 +100065,20 @@ static int memjrnlWrite( /* ** 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 ){ +static int memjrnlTruncate(sqlite3_file* pJfd, sqlite_int64 size) { + MemJournal* p = (MemJournal*)pJfd; + assert(p->endpoint.pChunk == 0 || p->endpoint.pChunk->pNext == 0); + if (size < p->endpoint.iOffset) { + FileChunk* pIter = 0; + if (size == 0) { memjrnlFreeChunks(p->pFirst); p->pFirst = 0; - }else{ + } else { i64 iOff = p->nChunkSize; - for(pIter=p->pFirst; ALWAYS(pIter) && iOffpNext){ + for (pIter = p->pFirst; ALWAYS(pIter) && iOff < size; pIter = pIter->pNext) { iOff += p->nChunkSize; } - if( ALWAYS(pIter) ){ + if (ALWAYS(pIter)) { memjrnlFreeChunks(pIter->pNext); pIter->pNext = 0; } @@ -101106,8 +100095,8 @@ static int memjrnlTruncate(sqlite3_file *pJfd, sqlite_int64 size){ /* ** Close the file. */ -static int memjrnlClose(sqlite3_file *pJfd){ - MemJournal *p = (MemJournal *)pJfd; +static int memjrnlClose(sqlite3_file* pJfd) { + MemJournal* p = (MemJournal*)pJfd; memjrnlFreeChunks(p->pFirst); return SQLITE_OK; } @@ -101118,7 +100107,7 @@ static int memjrnlClose(sqlite3_file *pJfd){ ** 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){ +static int memjrnlSync(sqlite3_file* pJfd, int flags) { UNUSED_PARAMETER2(pJfd, flags); return SQLITE_OK; } @@ -101126,9 +100115,9 @@ static int memjrnlSync(sqlite3_file *pJfd, int flags){ /* ** 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; +static int memjrnlFileSize(sqlite3_file* pJfd, sqlite_int64* pSize) { + MemJournal* p = (MemJournal*)pJfd; + *pSize = (sqlite_int64)p->endpoint.iOffset; return SQLITE_OK; } @@ -101136,25 +100125,25 @@ static int memjrnlFileSize(sqlite3_file *pJfd, sqlite_int64 *pSize){ ** 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 */ + 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 */ }; /* @@ -101169,29 +100158,28 @@ static const struct sqlite3_io_methods MemJournalMethods = { ** 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; +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 ){ + if (nSpill == 0) { return sqlite3OsOpen(pVfs, zName, pJfd, flags, 0); } - if( nSpill>0 ){ + if (nSpill > 0) { p->nChunkSize = nSpill; - }else{ + } else { p->nChunkSize = 8 + MEMJOURNAL_DFLT_FILECHUNKSIZE - sizeof(FileChunk); - assert( MEMJOURNAL_DFLT_FILECHUNKSIZE==fileChunkSize(p->nChunkSize) ); + assert(MEMJOURNAL_DFLT_FILECHUNKSIZE == fileChunkSize(p->nChunkSize)); } pJfd->pMethods = (const sqlite3_io_methods*)&MemJournalMethods; @@ -101205,34 +100193,33 @@ SQLITE_PRIVATE int sqlite3JournalOpen( /* ** Open an in-memory journal file. */ -SQLITE_PRIVATE void sqlite3MemJournalOpen(sqlite3_file *pJfd){ +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 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){ +SQLITE_PRIVATE int sqlite3JournalCreate(sqlite3_file* pJfd) { int rc = SQLITE_OK; - MemJournal *p = (MemJournal*)pJfd; - if( pJfd->pMethods==&MemJournalMethods && ( + MemJournal* p = (MemJournal*)pJfd; + if (pJfd->pMethods == &MemJournalMethods && ( #ifdef SQLITE_ENABLE_ATOMIC_WRITE - p->nSpill>0 + 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) + /* 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) + || (p->flags & SQLITE_OPEN_MAIN_JOURNAL) #endif - )){ + )) { rc = memjrnlCreateFile(p); } return rc; @@ -101244,15 +100231,15 @@ SQLITE_PRIVATE int sqlite3JournalCreate(sqlite3_file *pJfd){ ** 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; +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){ +SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs* pVfs) { return MAX(pVfs->szOsFile, (int)sizeof(MemJournal)); } @@ -101276,27 +100263,32 @@ SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *pVfs){ /* #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){ +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; + if (rc) + return WRC_Abort; rc = sqlite3WalkExprList(pWalker, pWin->pPartition); - if( rc ) return WRC_Abort; + if (rc) + return WRC_Abort; rc = sqlite3WalkExpr(pWalker, pWin->pFilter); - if( rc ) return WRC_Abort; + if (rc) + return WRC_Abort; rc = sqlite3WalkExpr(pWalker, pWin->pStart); - if( rc ) return WRC_Abort; + if (rc) + return WRC_Abort; rc = sqlite3WalkExpr(pWalker, pWin->pEnd); - if( rc ) return WRC_Abort; - if( bOneOnly ) break; + if (rc) + return WRC_Abort; + if (bOneOnly) + break; } return WRC_Continue; } @@ -101321,30 +100313,35 @@ static int walkWindowList(Walker *pWalker, Window *pList, int bOneOnly){ ** 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){ +static SQLITE_NOINLINE int walkExpr(Walker* pWalker, Expr* pExpr) { int rc; - testcase( ExprHasProperty(pExpr, EP_TokenOnly) ); - testcase( ExprHasProperty(pExpr, EP_Reduced) ); - while(1){ + 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) ); + 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; + } 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; + if (ExprHasProperty(pExpr, EP_WinFunc)) { + if (walkWindowList(pWalker, pExpr->y.pWin, 1)) + return WRC_Abort; } #endif } @@ -101353,20 +100350,21 @@ static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){ } return WRC_Continue; } -SQLITE_PRIVATE int sqlite3WalkExpr(Walker *pWalker, Expr *pExpr){ - return pExpr ? walkExpr(pWalker,pExpr) : 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){ +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; + 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; @@ -101376,7 +100374,7 @@ SQLITE_PRIVATE int sqlite3WalkExprList(Walker *pWalker, ExprList *p){ ** 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){ +SQLITE_PRIVATE void sqlite3WalkWinDefnDummyCallback(Walker* pWalker, Select* p) { UNUSED_PARAMETER(pWalker); UNUSED_PARAMETER(p); /* No-op */ @@ -101388,22 +100386,27 @@ SQLITE_PRIVATE void sqlite3WalkWinDefnDummyCallback(Walker *pWalker, Select *p){ ** 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; +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) + if (p->pWinDefn) { + Parse* pParse; + if (pWalker->xSelectCallback2 == sqlite3WalkWinDefnDummyCallback || ((pParse = pWalker->pParse) != 0 && IN_RENAME_OBJECT) #ifndef SQLITE_OMIT_CTE - || pWalker->xSelectCallback2==sqlite3SelectPopWith + || 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); @@ -101421,20 +100424,18 @@ SQLITE_PRIVATE int sqlite3WalkSelectExpr(Walker *pWalker, Select *p){ ** 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; +SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker* pWalker, Select* p) { + SrcList* pSrc; int i; - SrcItem *pItem; + 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) ){ + 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) - ){ + if (pItem->fg.isTabFunc && sqlite3WalkExprList(pWalker, pItem->u1.pFuncArg)) { return WRC_Abort; } } @@ -101459,40 +100460,40 @@ SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker *pWalker, Select *p){ ** 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){ +SQLITE_PRIVATE int sqlite3WalkSelect(Walker* pWalker, Select* p) { int rc; - if( p==0 ) return WRC_Continue; - if( pWalker->xSelectCallback==0 ) return WRC_Continue; - do{ + 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) - ){ + if (rc) + return rc & WRC_Abort; + if (sqlite3WalkSelectExpr(pWalker, p) || sqlite3WalkSelectFrom(pWalker, p)) { return WRC_Abort; } - if( pWalker->xSelectCallback2 ){ + if (pWalker->xSelectCallback2) { pWalker->xSelectCallback2(pWalker, p); } p = p->pPrior; - }while( p!=0 ); + } 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){ +SQLITE_PRIVATE int sqlite3WalkerDepthIncrease(Walker* pWalker, Select* pSelect) { UNUSED_PARAMETER(pSelect); pWalker->walkerDepth++; return WRC_Continue; } -SQLITE_PRIVATE void sqlite3WalkerDepthDecrease(Walker *pWalker, Select *pSelect){ +SQLITE_PRIVATE void sqlite3WalkerDepthDecrease(Walker* pWalker, Select* pSelect) { UNUSED_PARAMETER(pSelect); pWalker->walkerDepth--; } - /* ** No-op routine for the parse-tree walker. ** @@ -101502,7 +100503,7 @@ SQLITE_PRIVATE void sqlite3WalkerDepthDecrease(Walker *pWalker, Select *pSelect) ** Walker.xSelectCallback is set to do something useful for every ** subquery in the parser tree. */ -SQLITE_PRIVATE int sqlite3ExprWalkNoop(Walker *NotUsed, Expr *NotUsed2){ +SQLITE_PRIVATE int sqlite3ExprWalkNoop(Walker* NotUsed, Expr* NotUsed2) { UNUSED_PARAMETER2(NotUsed, NotUsed2); return WRC_Continue; } @@ -101511,7 +100512,7 @@ SQLITE_PRIVATE int sqlite3ExprWalkNoop(Walker *NotUsed, Expr *NotUsed2){ ** No-op routine for the parse-tree walker for SELECT statements. ** subquery in the parser tree. */ -SQLITE_PRIVATE int sqlite3SelectWalkNoop(Walker *NotUsed, Select *NotUsed2){ +SQLITE_PRIVATE int sqlite3SelectWalkNoop(Walker* NotUsed, Select* NotUsed2) { UNUSED_PARAMETER2(NotUsed, NotUsed2); return WRC_Continue; } @@ -101539,7 +100540,7 @@ SQLITE_PRIVATE int sqlite3SelectWalkNoop(Walker *NotUsed, Select *NotUsed2){ /* ** Magic table number to mean the EXCLUDED table in an UPSERT statement. */ -#define EXCLUDED_TABLE_NUMBER 2 +#define EXCLUDED_TABLE_NUMBER 2 /* ** Walk the expression tree pExpr and increase the aggregate function @@ -101552,12 +100553,13 @@ SQLITE_PRIVATE int sqlite3SelectWalkNoop(Walker *NotUsed, Select *NotUsed2){ ** ** 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; +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 ){ +static void incrAggFunctionDepth(Expr* pExpr, int N) { + if (N > 0) { Walker w; memset(&w, 0, sizeof(w)); w.xExprCallback = incrAggDepth; @@ -101585,43 +100587,40 @@ static void incrAggFunctionDepth(Expr *pExpr, int N){ ** 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 */ +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 ); + assert(iCol >= 0 && iCol < pEList->nExpr); pOrig = pEList->a[iCol].pExpr; - assert( pOrig!=0 ); + assert(pOrig != 0); db = pParse->db; pDup = sqlite3ExprDup(db, pOrig, 0); - if( db->mallocFailed ){ + if (db->mallocFailed) { sqlite3ExprDelete(db, pDup); pDup = 0; - }else{ + } else { Expr temp; incrAggFunctionDepth(pDup, nSubquery); - if( pExpr->op==TK_COLLATE ){ - assert( !ExprHasProperty(pExpr, EP_IntValue) ); + 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) ){ + if (ExprHasProperty(pExpr, EP_WinFunc)) { + if (ALWAYS(pExpr->y.pWin != 0)) { pExpr->y.pWin->pOwner = pExpr; } } - sqlite3ParserAddCleanup(pParse, - (void(*)(sqlite3*,void*))sqlite3ExprDelete, - pDup); + sqlite3ParserAddCleanup(pParse, (void (*)(sqlite3*, void*))sqlite3ExprDelete, pDup); } } @@ -101632,27 +100631,25 @@ static void resolveAlias( ** 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 -){ +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; + 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) ){ + 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) ){ + 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 ){ + zSpan += n + 1; + if (zCol && sqlite3StrICmp(zSpan, zCol) != 0) { return 0; } return 1; @@ -101661,17 +100658,18 @@ SQLITE_PRIVATE int sqlite3MatchEName( /* ** 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 ){ +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 ){ + if (sqlite3WritableSchema(db) && (db->flags & SQLITE_DqsDML) != 0) { return 1; } - return (db->flags & SQLITE_DqsDDL)!=0; - }else{ + return (db->flags & SQLITE_DqsDDL) != 0; + } else { /* Currently parsing a DML statement */ - return (db->flags & SQLITE_DqsDML)!=0; + return (db->flags & SQLITE_DqsDML) != 0; } } @@ -101679,25 +100677,24 @@ static int areDoubleQuotedStringsEnabled(sqlite3 *db, NameContext *pTopNC){ ** 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){ +SQLITE_PRIVATE Bitmask sqlite3ExprColUsed(Expr* pExpr) { int n; - Table *pExTab; + Table* pExTab; n = pExpr->iColumn; - assert( ExprUseYTab(pExpr) ); + 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)<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) << n; } } @@ -101707,18 +100704,17 @@ SQLITE_PRIVATE Bitmask sqlite3ExprColUsed(Expr *pExpr){ ** in *ppList. Create a new *ppList if this is the first term in the ** set. */ -static void extendFJMatch( - Parse *pParse, /* Parsing context */ - ExprList **ppList, /* ExprList to extend */ - SrcItem *pMatch, /* Source table containing the column */ - i16 iColumn /* The column number */ -){ - Expr *pNew = sqlite3ExprAlloc(pParse->db, TK_COLUMN, 0, 0); - if( pNew ){ +static void extendFJMatch(Parse* pParse, /* Parsing context */ + ExprList** ppList, /* ExprList to extend */ + SrcItem* pMatch, /* Source table containing the column */ + i16 iColumn /* The column number */ +) { + Expr* pNew = sqlite3ExprAlloc(pParse->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 ); + assert((pMatch->fg.jointype & (JT_LEFT | JT_LTORJ)) != 0); ExprSetProperty(pNew, EP_CanBeNull); *ppList = sqlite3ExprListAppend(pParse, *ppList, pNew); } @@ -101751,32 +100747,31 @@ static void extendFJMatch( ** 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) ); +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; @@ -101786,24 +100781,24 @@ static int lookupName( ** 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 ){ + 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 ){ + } else { + for (i = 0; i < db->nDb; 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 ){ + 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; @@ -101813,19 +100808,19 @@ static int lookupName( } /* 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; + assert(pNC && cnt == 0); + do { + ExprList* pEList; + SrcList* pSrcList = pNC->pSrcList; - if( pSrcList ){ - for(i=0, pItem=pSrcList->a; inSrc; i++, pItem++){ + if (pSrcList) { + for (i = 0, pItem = pSrcList->a; i < pSrcList->nSrc; 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 ){ + 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) ... @@ -101833,34 +100828,30 @@ static int lookupName( ** This pItem -------------^ */ int hit = 0; - assert( pItem->pSelect!=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) ){ + assert(pEList != 0); + assert(pEList->nExpr == pTab->nCol); + for (j = 0; j < pEList->nExpr; j++) { + if (!sqlite3MatchEName(&pEList->a[j], zCol, zTab, zDb)) { continue; } - if( cnt>0 ){ - if( pItem->fg.isUsing==0 - || sqlite3IdListIndex(pItem->u3.pUsing, 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 ){ + } 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 ){ + } else if ((pItem->fg.jointype & JT_LEFT) == 0) { /* A RIGHT JOIN. Use the right-most table */ cnt = 0; sqlite3ExprListDelete(db, pFJMatch); pFJMatch = 0; - }else{ + } else { /* For a FULL JOIN, we must construct a coalesce() func */ extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn); } @@ -101871,52 +100862,50 @@ static int lookupName( pExpr->iColumn = j; pEList->a[j].fg.bUsed = 1; hit = 1; - if( pEList->a[j].fg.bUsingTerm ) break; + if (pEList->a[j].fg.bUsingTerm) + break; } - if( hit || zTab==0 ) continue; + 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; + 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 ){ + assert(zTabName != 0); + if (sqlite3StrICmp(zTabName, zTab) != 0) { continue; } - assert( ExprUseYTab(pExpr) ); - if( IN_RENAME_OBJECT && pItem->zAlias ){ + 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 - ){ + for (j = 0, pCol = pTab->aCol; j < pTab->nCol; 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 ){ + } 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 ){ + } else if ((pItem->fg.jointype & JT_LEFT) == 0) { /* A RIGHT JOIN. Use the right-most table */ cnt = 0; sqlite3ExprListDelete(db, pFJMatch); pFJMatch = 0; - }else{ + } else { /* For a FULL JOIN, we must construct a coalesce() func */ extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn); } @@ -101924,23 +100913,23 @@ static int lookupName( 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 ){ + pExpr->iColumn = j == pTab->iPKey ? -1 : (i16)j; + if (pItem->fg.isNestedFrom) { sqlite3SrcItemColumnUsed(pItem, j); } break; } } - if( 0==cnt && VisibleRowid(pTab) ){ + if (0 == cnt && VisibleRowid(pTab)) { cntTab++; pMatch = pItem; } } - if( pMatch ){ + if (pMatch) { pExpr->iTable = pMatch->iCursor; - assert( ExprUseYTab(pExpr) ); + assert(ExprUseYTab(pExpr)); pExpr->y.pTab = pMatch->pTab; - if( (pMatch->fg.jointype & (JT_LEFT|JT_LTORJ))!=0 ){ + if ((pMatch->fg.jointype & (JT_LEFT | JT_LTORJ)) != 0) { ExprSetProperty(pExpr, EP_CanBeNull); } pSchema = pExpr->y.pTab->pSchema; @@ -101953,97 +100942,91 @@ static int lookupName( ** 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 ){ + if (cnt == 0 && zDb == 0) { pTab = 0; #ifndef SQLITE_OMIT_TRIGGER - if( pParse->pTriggerTab!=0 ){ + 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; + 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 ){ + } 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 ){ + } 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 ){ + 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 ){ + 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 ){ + for (iCol = 0, pCol = pTab->aCol; iCol < pTab->nCol; 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) ){ + if (iCol >= pTab->nCol && sqlite3IsRowid(zCol) && VisibleRowid(pTab)) { /* IMP: R-51414-32910 */ iCol = -1; } - if( iColnCol ){ + if (iCol < pTab->nCol) { cnt++; pMatch = 0; #ifndef SQLITE_OMIT_UPSERT - if( pExpr->iTable==EXCLUDED_TABLE_NUMBER ){ - testcase( iCol==(-1) ); - assert( ExprUseYTab(pExpr) ); - if( IN_RENAME_OBJECT ){ + 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); + } else { + pExpr->iTable = pNC->uNC.pUpsert->regData + sqlite3TableColumnToStorage(pTab, iCol); eNewExprOp = TK_REGISTER; } - }else + } else #endif /* SQLITE_OMIT_UPSERT */ { - assert( ExprUseYTab(pExpr) ); + assert(ExprUseYTab(pExpr)); pExpr->y.pTab = pTab; - if( pParse->bReturning ){ + 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->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 ){ + 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)<iTable == 0) { + testcase(iCol == 31); + testcase(iCol == 32); + pParse->oldmask |= (iCol >= 32 ? 0xffffffff : (((u32)1) << iCol)); + } else { + testcase(iCol == 31); + testcase(iCol == 32); + pParse->newmask |= (iCol >= 32 ? 0xffffffff : (((u32)1) << iCol)); } #endif /* SQLITE_OMIT_TRIGGER */ } @@ -102056,13 +101039,8 @@ static int lookupName( /* ** Perhaps the name is a reference to the ROWID */ - if( cnt==0 - && cntTab==1 - && pMatch - && (pNC->ncFlags & (NC_IdxExpr|NC_GenCol))==0 - && sqlite3IsRowid(zCol) - && ALWAYS(VisibleRowid(pMatch->pTab)) - ){ + if (cnt == 0 && cntTab == 1 && pMatch && (pNC->ncFlags & (NC_IdxExpr | NC_GenCol)) == 0 && sqlite3IsRowid(zCol) && + ALWAYS(VisibleRowid(pMatch->pTab))) { cnt = 1; pExpr->iColumn = -1; pExpr->affExpr = SQLITE_AFF_INTEGER; @@ -102086,41 +101064,34 @@ static int lookupName( ** 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 - ){ + 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 ); + assert(pEList != 0); + for (j = 0; j < pEList->nExpr; 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) ){ + 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); + 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 ){ + 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 ){ + assert(zTab == 0 && zDb == 0); + if (IN_RENAME_OBJECT) { sqlite3RenameTokenRemap(pParse, 0, (void*)pExpr); } goto lookupname_end; @@ -102131,11 +101102,11 @@ static int lookupName( /* 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; + if (cnt) + break; pNC = pNC->pNext; nSubquery++; - }while( pNC ); - + } while (pNC); /* ** If X and Y are NULL (in other words if only the column name Z is @@ -102147,11 +101118,9 @@ static int lookupName( ** 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 (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. ** @@ -102166,8 +101135,7 @@ static int lookupName( ** 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); + sqlite3_log(SQLITE_WARNING, "double-quoted string literal: \"%w\"", zCol); #ifdef SQLITE_ENABLE_NORMALIZE sqlite3VdbeAddDblquoteStr(db, pParse->pVdbe, zCol); #endif @@ -102175,7 +101143,7 @@ static int lookupName( memset(&pExpr->y, 0, sizeof(pExpr->y)); return WRC_Prune; } - if( sqlite3ExprIdToTrueFalse(pExpr) ){ + if (sqlite3ExprIdToTrueFalse(pExpr)) { return WRC_Prune; } } @@ -102187,15 +101155,15 @@ static int lookupName( ** 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{ + 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); @@ -102207,27 +101175,27 @@ static int lookupName( pExpr->x.pList = pFJMatch; cnt = 1; goto lookupname_end; - }else{ + } else { sqlite3ExprListDelete(db, pFJMatch); pFJMatch = 0; } } - zErr = cnt==0 ? "no such column" : "ambiguous column name"; - if( zDb ){ + zErr = cnt == 0 ? "no such column" : "ambiguous column name"; + if (zDb) { sqlite3ErrorMsg(pParse, "%s: %s.%s.%s", zErr, zDb, zTab, zCol); - }else if( zTab ){ + } else if (zTab) { sqlite3ErrorMsg(pParse, "%s: %s.%s", zErr, zTab, zCol); - }else{ + } else { sqlite3ErrorMsg(pParse, "%s: %s", zErr, zCol); } sqlite3RecordErrorOffsetOfExpr(pParse->db, pExpr); pParse->checkSchema = 1; pTopNC->nNcErr++; } - assert( pFJMatch==0 ); + assert(pFJMatch == 0); /* Remove all substructure from pExpr */ - if( !ExprHasProperty(pExpr,(EP_TokenOnly|EP_Leaf)) ){ + if (!ExprHasProperty(pExpr, (EP_TokenOnly | EP_Leaf))) { sqlite3ExprDelete(db, pExpr->pLeft); pExpr->pLeft = 0; sqlite3ExprDelete(db, pExpr->pRight); @@ -102249,27 +101217,26 @@ static int lookupName( ** If a generated column is referenced, set bits for every column ** of the table. */ - if( pExpr->iColumn>=0 && pMatch!=0 ){ + if (pExpr->iColumn >= 0 && pMatch != 0) { pMatch->colUsed |= sqlite3ExprColUsed(pExpr); } pExpr->op = eNewExprOp; lookupname_end: - if( cnt==1 ){ - assert( pNC!=0 ); + if (cnt == 1) { + assert(pNC != 0); #ifndef SQLITE_OMIT_AUTHORIZATION - if( pParse->db->xAuth - && (pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER) - ){ + 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 ); + for (;;) { + assert(pTopNC != 0); pTopNC->nRef++; - if( pTopNC==pNC ) break; + if (pTopNC == pNC) + break; pTopNC = pTopNC->pNext; } return WRC_Prune; @@ -102282,28 +101249,26 @@ static int lookupName( ** 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) ); +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 ){ + if (p->y.pTab->iPKey == iCol) { p->iColumn = -1; - }else{ + } 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); + 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); } } } @@ -102326,42 +101291,48 @@ SQLITE_PRIVATE Expr *sqlite3CreateColumnExpr(sqlite3 *db, SrcList *pSrc, int iSr ** (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"; +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"; + else if (pNC->ncFlags & NC_IsCheck) + zIn = "CHECK constraints"; #endif #ifndef SQLITE_OMIT_GENERATED_COLUMNS - else if( pNC->ncFlags & NC_GenCol ) zIn = "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; + 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); +#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){ +static int exprProbability(Expr* p) { double r = -1.0; - if( p->op!=TK_FLOAT ) return -1; - assert( !ExprHasProperty(p, EP_IntValue) ); + 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); + assert(r >= 0.0); + if (r > 1.0) + return -1; + return (int)(r * 134217728.0); } /* @@ -102375,25 +101346,25 @@ static int exprProbability(Expr *p){ ** function names. The operator for aggregate functions is changed ** to TK_AGG_FUNCTION. */ -static int resolveExprStep(Walker *pWalker, Expr *pExpr){ - NameContext *pNC; - Parse *pParse; +static int resolveExprStep(Walker* pWalker, Expr* pExpr) { + NameContext* pNC; + Parse* pParse; pNC = pWalker->u.pNC; - assert( pNC!=0 ); + assert(pNC != 0); pParse = pNC->pParse; - assert( pParse==pWalker->pParse ); + assert(pParse == pWalker->pParse); #ifndef NDEBUG - if( pNC->pSrcList && pNC->pSrcList->nAlloc>0 ){ - SrcList *pSrcList = pNC->pSrcList; + 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); + for (i = 0; i < pNC->pSrcList->nSrc; i++) { + assert(pSrcList->a[i].iCursor >= 0 && pSrcList->a[i].iCursor < pParse->nTab); } } #endif - switch( pExpr->op ){ + 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 @@ -102401,12 +101372,12 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ ** UPDATE ... FROM statement processing. */ case TK_ROW: { - SrcList *pSrcList = pNC->pSrcList; - SrcItem *pItem; - assert( pSrcList && pSrcList->nSrc>=1 ); + SrcList* pSrcList = pNC->pSrcList; + SrcItem* pItem; + assert(pSrcList && pSrcList->nSrc >= 1); pItem = pSrcList->a; pExpr->op = TK_COLUMN; - assert( ExprUseYTab(pExpr) ); + assert(ExprUseYTab(pExpr)); pExpr->y.pTab = pItem->pTab; pExpr->iTable = pItem->iCursor; pExpr->iColumn--; @@ -102431,24 +101402,24 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ case TK_NOTNULL: case TK_ISNULL: { int anRef[8]; - NameContext *p; + NameContext* p; int i; - for(i=0, p=pNC; p && ipNext, i++){ + for (i = 0, p = pNC; p && i < ArraySize(anRef); p = p->pNext, 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 ){ + 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{ + } else { pExpr->u.zToken = "false"; ExprSetProperty(pExpr, EP_IsFalse); } pExpr->op = TK_TRUEFALSE; - for(i=0, p=pNC; p && ipNext, i++){ + for (i = 0, p = pNC; p && i < ArraySize(anRef); p = p->pNext, i++) { p->nRef = anRef[i]; } sqlite3ExprDelete(pParse->db, pExpr->pLeft); @@ -102467,37 +101438,36 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ */ case TK_ID: case TK_DOT: { - const char *zColumn; - const char *zTable; - const char *zDb; - Expr *pRight; + const char* zColumn; + const char* zTable; + const char* zDb; + Expr* pRight; - if( pExpr->op==TK_ID ){ + if (pExpr->op == TK_ID) { zDb = 0; zTable = 0; - assert( !ExprHasProperty(pExpr, EP_IntValue) ); + 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); + } 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 ){ + if (pRight->op == TK_ID) { zDb = 0; - }else{ - assert( pRight->op==TK_DOT ); - assert( !ExprHasProperty(pRight, EP_IntValue) ); + } 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) ); + assert(ExprUseUToken(pLeft) && ExprUseUToken(pRight)); zTable = pLeft->u.zToken; zColumn = pRight->u.zToken; - assert( ExprUseYTab(pExpr) ); - if( IN_RENAME_OBJECT ){ + assert(ExprUseYTab(pExpr)); + if (IN_RENAME_OBJECT) { sqlite3RenameTokenRemap(pParse, (void*)pExpr, (void*)pRight); sqlite3RenameTokenRemap(pParse, (void*)&pExpr->y.pTab, (void*)pLeft); } @@ -102506,43 +101476,44 @@ static int resolveExprStep(Walker *pWalker, Expr *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 */ + 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); + Window* pWin = (IsWindowFunc(pExpr) ? pExpr->y.pWin : 0); #endif - assert( !ExprHasProperty(pExpr, EP_xIsSelect|EP_IntValue) ); + assert(!ExprHasProperty(pExpr, EP_xIsSelect | EP_IntValue)); zId = pExpr->u.zToken; pDef = sqlite3FindFunction(pParse->db, zId, n, enc, 0); - if( pDef==0 ){ + if (pDef == 0) { pDef = sqlite3FindFunction(pParse->db, zId, -2, enc, 0); - if( pDef==0 ){ + if (pDef == 0) { no_such_func = 1; - }else{ + } else { wrong_num_args = 1; } - }else{ - is_agg = pDef->xFinalize!=0; - if( pDef->funcFlags & SQLITE_FUNC_UNLIKELY ){ + } else { + is_agg = pDef->xFinalize != 0; + if (pDef->funcFlags & SQLITE_FUNC_UNLIKELY) { ExprSetProperty(pExpr, EP_Unlikely); - if( n==2 ){ + if (n == 2) { pExpr->iTable = exprProbability(pList->a[1].pExpr); - if( pExpr->iTable<0 ){ + if (pExpr->iTable < 0) { sqlite3ErrorMsg(pParse, - "second argument to %#T() must be a " - "constant between 0.0 and 1.0", pExpr); + "second argument to %#T() must be a " + "constant between 0.0 and 1.0", + pExpr); pNC->nNcErr++; } - }else{ + } 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 @@ -102552,16 +101523,15 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ ** 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; + 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); + 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; @@ -102569,100 +101539,83 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ } } #endif - if( pDef->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG) ){ + 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); + ExprSetProperty(pExpr, EP_ConstFunc); } - if( (pDef->funcFlags & SQLITE_FUNC_CONSTANT)==0 ){ + 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 */ + 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 (pNC->ncFlags & NC_FromDDL) + ExprSetProperty(pExpr, EP_FromDDL); } - if( (pDef->funcFlags & SQLITE_FUNC_INTERNAL)!=0 - && pParse->nested==0 - && (pParse->db->mDbFlags & DBFLAG_InternalFunc)==0 - ){ + 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 - ){ + } else if ((pDef->funcFlags & (SQLITE_FUNC_DIRECT | SQLITE_FUNC_UNSAFE)) != 0 && !IN_RENAME_OBJECT) { sqlite3ExprFunctionUsable(pParse, pExpr, pDef); } } - if( 0==IN_RENAME_OBJECT ){ + 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 - ); + 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 ){ + } 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{ + } else { zType = "aggregate"; } - sqlite3ErrorMsg(pParse, "misuse of %s function %#T()",zType,pExpr); + 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); + 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 + else if (no_such_func && pParse->db->init.busy == 0 #ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION - && pParse->explain==0 + && 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); + } 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 - ); + 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 ){ + 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. */ @@ -102674,52 +101627,49 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ } } #ifndef SQLITE_OMIT_WINDOWFUNC - else if( ExprHasProperty(pExpr, EP_WinFunc) ){ + else if (ExprHasProperty(pExpr, EP_WinFunc)) { is_agg = 1; } #endif sqlite3WalkExprList(pWalker, pList); - if( is_agg ){ + 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 ){ + 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; + 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 + } else #endif /* SQLITE_OMIT_WINDOWFUNC */ { - NameContext *pNC2; /* For looping up thru outer contexts */ + 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) ){ + if (ExprHasProperty(pExpr, EP_WinFunc)) { sqlite3WalkExpr(pWalker, pExpr->y.pWin->pFilter); } #endif pNC2 = pNC; - while( pNC2 - && sqlite3ReferencesSrcList(pParse, pExpr, pNC2->pSrcList)==0 - ){ + 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)); + 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; @@ -102731,23 +101681,24 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ } #ifndef SQLITE_OMIT_SUBQUERY case TK_SELECT: - case TK_EXISTS: testcase( pExpr->op==TK_EXISTS ); + case TK_EXISTS: + testcase(pExpr->op == TK_EXISTS); #endif case TK_IN: { - testcase( pExpr->op==TK_IN ); - if( ExprUseXSelect(pExpr) ){ + 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 ){ + 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{ + } else { sqlite3WalkSelect(pWalker, pExpr->x.pSelect); } - assert( pNC->nRef>=nRef ); - if( nRef!=pNC->nRef ){ + assert(pNC->nRef >= nRef); + if (nRef != pNC->nRef) { ExprSetProperty(pExpr, EP_VarSelect); pNC->ncFlags |= NC_VarSelect; } @@ -102755,24 +101706,24 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ 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); + 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) ); + 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) ){ + 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 ){ + if (rc == WRC_Abort) + return WRC_Abort; + if (pRight->op == TK_TRUEFALSE) { pExpr->op2 = pExpr->op; pExpr->op = TK_TRUTH; return WRC_Continue; @@ -102788,36 +101739,37 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ case TK_GT: case TK_GE: { int nLeft, nRight; - if( pParse->db->mallocFailed ) break; - assert( pExpr->pLeft!=0 ); + if (pParse->db->mallocFailed) + break; + assert(pExpr->pLeft != 0); nLeft = sqlite3ExprVectorSize(pExpr->pLeft); - if( pExpr->op==TK_BETWEEN ){ - assert( ExprUseXList(pExpr) ); + if (pExpr->op == TK_BETWEEN) { + assert(ExprUseXList(pExpr)); nRight = sqlite3ExprVectorSize(pExpr->x.pList->a[0].pExpr); - if( nRight==nLeft ){ + if (nRight == nLeft) { nRight = sqlite3ExprVectorSize(pExpr->x.pList->a[1].pExpr); } - }else{ - assert( pExpr->pRight!=0 ); + } 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 ); + 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 ); + assert(pParse->db->mallocFailed == 0 || pParse->nErr != 0); return pParse->nErr ? WRC_Abort : WRC_Continue; } @@ -102833,24 +101785,21 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ ** ** 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 */ +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) ); + 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; + for (i = 0; i < pEList->nExpr; i++) { + if (pEList->a[i].fg.eEName == ENAME_NAME && sqlite3_stricmp(pEList->a[i].zEName, zCol) == 0) { + return i + 1; } } } @@ -102875,43 +101824,43 @@ static int resolveAsName( ** ** 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 ); +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.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; + 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; + for (i = 0; i < pEList->nExpr; i++) { + if (sqlite3ExprCompare(0, pEList->a[i].pExpr, pE, -1) < 2) { + return i + 1; } } @@ -102922,16 +101871,16 @@ static int resolveOrderByTermToExprList( /* ** 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 */ -){ +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); + "%r %s BY term out of range - should be " + "between 1 and %d", + i, zType, mx); sqlite3RecordErrorOffsetOfExpr(pParse->db, pError); } @@ -102950,50 +101899,52 @@ static void resolveOutOfRangeError( ** ** 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 */ -){ +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; + ExprList* pOrderBy; + ExprList* pEList; + sqlite3* db; int moreToDo = 1; pOrderBy = pSelect->pOrderBy; - if( pOrderBy==0 ) return 0; + if (pOrderBy == 0) + return 0; db = pParse->db; - if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ + if (pOrderBy->nExpr > db->aLimit[SQLITE_LIMIT_COLUMN]) { sqlite3ErrorMsg(pParse, "too many terms in ORDER BY clause"); return 1; } - for(i=0; inExpr; i++){ + for (i = 0; i < pOrderBy->nExpr; i++) { pOrderBy->a[i].fg.done = 0; } pSelect->pNext = 0; - while( pSelect->pPrior ){ + while (pSelect->pPrior) { pSelect->pPrior->pNext = pSelect; pSelect = pSelect->pPrior; } - while( pSelect && moreToDo ){ - struct ExprList_item *pItem; + while (pSelect && moreToDo) { + struct ExprList_item* pItem; moreToDo = 0; pEList = pSelect->pEList; - assert( pEList!=0 ); - for(i=0, pItem=pOrderBy->a; inExpr; i++, pItem++){ + assert(pEList != 0); + for (i = 0, pItem = pOrderBy->a; i < pOrderBy->nExpr; i++, pItem++) { int iCol = -1; Expr *pE, *pDup; - if( pItem->fg.done ) continue; + 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); + 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{ + } else { iCol = resolveAsName(pParse, pEList, pE); - if( iCol==0 ){ + 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 @@ -103006,47 +101957,51 @@ static int resolveCompoundOrderBy( ** 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 ){ + if (!db->mallocFailed) { assert(pDup); iCol = resolveOrderByTermToExprList(pParse, pSelect, pDup); - if( IN_RENAME_OBJECT && iCol>0 ){ + if (IN_RENAME_OBJECT && iCol > 0) { resolveOrderByTermToExprList(pParse, pSelect, pE); } } sqlite3ExprDelete(db, pDup); } } - if( iCol>0 ){ + 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; + 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 ){ + 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 ); + } 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{ + } 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); + for (i = 0; i < pOrderBy->nExpr; 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; } } @@ -103063,31 +102018,31 @@ static int resolveCompoundOrderBy( ** 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" */ -){ +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; + 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] ){ + 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); + assert(pEList != 0); /* sqlite3SelectNew() guarantees this */ + for (i = 0, pItem = pOrderBy->a; i < pOrderBy->nExpr; 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); + resolveAlias(pParse, pEList, pItem->u.x.iOrderByCol - 1, pItem->pExpr, 0); } } return 0; @@ -103097,10 +102052,10 @@ SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy( /* ** Walker callback for windowRemoveExprFromSelect(). */ -static int resolveRemoveWindowsCb(Walker *pWalker, Expr *pExpr){ +static int resolveRemoveWindowsCb(Walker* pWalker, Expr* pExpr) { UNUSED_PARAMETER(pWalker); - if( ExprHasProperty(pExpr, EP_WinFunc) ){ - Window *pWin = pExpr->y.pWin; + if (ExprHasProperty(pExpr, EP_WinFunc)) { + Window* pWin = pExpr->y.pWin; sqlite3WindowUnlinkFromSelect(pWin); } return WRC_Continue; @@ -103110,8 +102065,8 @@ static int resolveRemoveWindowsCb(Walker *pWalker, Expr *pExpr){ ** 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 ){ +static void windowRemoveExprFromSelect(Select* pSelect, Expr* pExpr) { + if (pSelect->pWin) { Walker sWalker; memset(&sWalker, 0, sizeof(Walker)); sWalker.xExprCallback = resolveRemoveWindowsCb; @@ -103120,7 +102075,7 @@ static void windowRemoveExprFromSelect(Select *pSelect, Expr *pExpr){ } } #else -# define windowRemoveExprFromSelect(a, b) +#define windowRemoveExprFromSelect(a, b) #endif /* SQLITE_OMIT_WINDOWFUNC */ /* @@ -103141,28 +102096,28 @@ static void windowRemoveExprFromSelect(Select *pSelect, Expr *pExpr){ ** 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 */ +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 ); + 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' ){ + for (i = 0, pItem = pOrderBy->a; i < pOrderBy->nExpr; 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 (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 @@ -103171,12 +102126,12 @@ static int resolveOrderGroupBy( continue; } } - if( sqlite3ExprIsInteger(pE2, &iCol) ){ + 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); + if (iCol < 1 || iCol > 0xffff) { + resolveOutOfRangeError(pParse, zType, i + 1, nResult, pE2); return 1; } pItem->u.x.iOrderByCol = (u16)iCol; @@ -103185,16 +102140,16 @@ static int resolveOrderGroupBy( /* Otherwise, treat the ORDER BY term as an ordinary expression */ pItem->u.x.iOrderByCol = 0; - if( sqlite3ResolveExprNames(pNC, pE) ){ + if (sqlite3ResolveExprNames(pNC, pE)) { return 1; } - for(j=0; jpEList->nExpr; j++){ - if( sqlite3ExprCompare(0, pE, pSelect->pEList->a[j].pExpr, -1)==0 ){ + for (j = 0; j < pSelect->pEList->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; + pItem->u.x.iOrderByCol = j + 1; } } } @@ -103204,20 +102159,19 @@ static int resolveOrderGroupBy( /* ** 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 */ - +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 ){ + assert(p != 0); + if (p->selFlags & SF_Resolved) { return WRC_Prune; } pOuterNC = pWalker->u.pNC; @@ -103232,28 +102186,27 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ ** sqlite3SelectPrep() will invoke both sqlite3SelectExpand() and ** this routine in the correct order. */ - if( (p->selFlags & SF_Expanded)==0 ){ + if ((p->selFlags & SF_Expanded) == 0) { sqlite3SelectPrep(pParse, p, pOuterNC); return pParse->nErr ? WRC_Abort : WRC_Prune; } - isCompound = p->pPrior!=0; + 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 */ + 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) ){ + if (sqlite3ResolveExprNames(&sNC, p->pLimit)) { return WRC_Abort; } @@ -103263,27 +102216,29 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ ** 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 ); + 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 ){ + */ + for (i = 0; i < p->pSrc->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; + const char* zSavedContext = pParse->zAuthContext; - if( pItem->zName ) pParse->zAuthContext = pItem->zName; + 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 (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 @@ -103291,9 +102246,9 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ ** 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); + if (pOuterNC) { + assert(pItem->fg.isCorrelated == 0 && pOuterNC->nRef >= nRef); + pItem->fg.isCorrelated = (pOuterNC->nRef > nRef); } } } @@ -103301,24 +102256,25 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ /* Set up the local name-context to pass to sqlite3ResolveExprNames() to ** resolve the result-set expression list. */ - sNC.ncFlags = NC_AllowAgg|NC_AllowWin; + 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; + 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 ); + 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{ + 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; } @@ -103330,35 +102286,33 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ ** 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 ); + 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 ){ + 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->pHaving)) + return WRC_Abort; } - if( sqlite3ResolveExprNames(&sNC, p->pWhere) ) 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) - ){ + for (i = 0; i < p->pSrc->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) - ){ + 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; } } @@ -103369,15 +102323,15 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ ** outer queries */ sNC.pNext = 0; - sNC.ncFlags |= NC_AllowAgg|NC_AllowWin; + 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; + if (p->selFlags & SF_Converted) { + Select* pSub = p->pSrc->a[0].pSelect; p->pOrderBy = pSub->pOrderBy; pSub->pOrderBy = 0; } @@ -103392,13 +102346,11 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ ** 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") - ){ + 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 ){ + if (db->mallocFailed) { return WRC_Abort; } sNC.ncFlags &= ~NC_AllowWin; @@ -103406,16 +102358,16 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ /* 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 (pGroupBy) { + struct ExprList_item* pItem; - if( resolveOrderGroupBy(&sNC, p, pGroupBy, "GROUP") || db->mallocFailed ){ + 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) ){ + for (i = 0, pItem = pGroupBy->a; i < pGroupBy->nExpr; i++, pItem++) { + if (ExprHasProperty(pItem->pExpr, EP_Agg)) { sqlite3ErrorMsg(pParse, "aggregate functions are not allowed in " - "the GROUP BY clause"); + "the GROUP BY clause"); return WRC_Abort; } } @@ -103423,13 +102375,13 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ /* 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 ){ + 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++; } @@ -103437,7 +102389,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ /* Resolve the ORDER BY on a compound SELECT after all terms of ** the compound have been resolved. */ - if( isCompound && resolveCompoundOrderBy(pParse, pLeftmost) ){ + if (isCompound && resolveCompoundOrderBy(pParse, pLeftmost)) { return WRC_Abort; } @@ -103492,38 +102444,38 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ ** 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. */ -){ +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); + 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 +#if SQLITE_MAX_EXPR_DEPTH > 0 w.pParse->nHeight += pExpr->nHeight; - if( sqlite3ExprCheckHeight(w.pParse, w.pParse->nHeight) ){ + if (sqlite3ExprCheckHeight(w.pParse, w.pParse->nHeight)) { return SQLITE_ERROR; } #endif sqlite3WalkExpr(&w, pExpr); -#if SQLITE_MAX_EXPR_DEPTH>0 +#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) ); + 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; + return pNC->nNcErr > 0 || w.pParse->nErr > 0; } /* @@ -103531,45 +102483,46 @@ SQLITE_PRIVATE int sqlite3ResolveExprNames( ** 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. */ -){ +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; + 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 + savedHasAgg = pNC->ncFlags & (NC_HasAgg | NC_MinMaxAgg | NC_HasWin | NC_OrderAgg); + pNC->ncFlags &= ~(NC_HasAgg | NC_MinMaxAgg | NC_HasWin | NC_OrderAgg); + for (i = 0; i < pList->nExpr; 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) ){ + if (sqlite3ExprCheckHeight(w.pParse, w.pParse->nHeight)) { return WRC_Abort; } #endif sqlite3WalkExpr(&w, pExpr); -#if SQLITE_MAX_EXPR_DEPTH>0 +#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); + 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; + if (w.pParse->nErr > 0) + return WRC_Abort; } pNC->ncFlags |= savedHasAgg; return WRC_Continue; @@ -103587,14 +102540,13 @@ SQLITE_PRIVATE int sqlite3ResolveExprListNames( ** 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 */ -){ +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 ); + assert(p != 0); w.xExprCallback = resolveExprStep; w.xSelectCallback = resolveSelectStep; w.xSelectCallback2 = 0; @@ -103621,28 +102573,26 @@ SQLITE_PRIVATE void sqlite3ResolveSelectNames( ** ** 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 */ +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 ); + 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 ){ + 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 ){ + 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; @@ -103651,8 +102601,10 @@ SQLITE_PRIVATE int sqlite3ResolveSelfReference( 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); + if ((rc = sqlite3ResolveExprNames(&sNC, pExpr)) != SQLITE_OK) + return rc; + if (pList) + rc = sqlite3ResolveExprListNames(&sNC, pList); return rc; } @@ -103675,14 +102627,15 @@ SQLITE_PRIVATE int sqlite3ResolveSelfReference( /* #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); +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; +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; } @@ -103702,46 +102655,43 @@ SQLITE_PRIVATE char sqlite3TableColumnAffinity(const Table *pTab, int iCol){ ** SELECT a AS b FROM t1 WHERE b; ** SELECT * FROM t1 WHERE (select a from t1); */ -SQLITE_PRIVATE char sqlite3ExprAffinity(const Expr *pExpr){ +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) ); + 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 ); + 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 ){ + 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 ); + 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) ); + 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_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) ); + if (op == TK_VECTOR) { + assert(ExprUseXList(pExpr)); return sqlite3ExprAffinity(pExpr->x.pList->a[0].pExpr); } return pExpr->affExpr; @@ -103755,29 +102705,27 @@ SQLITE_PRIVATE char sqlite3ExprAffinity(const Expr *pExpr){ ** 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 ){ +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; + 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 */ -){ +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 ); + assert(zC != 0); sqlite3TokenInit(&s, (char*)zC); return sqlite3ExprAddCollateToken(pParse, pExpr, &s, 0); } @@ -103785,9 +102733,9 @@ SQLITE_PRIVATE Expr *sqlite3ExprAddCollateString( /* ** Skip over any TK_COLLATE operators. */ -SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr *pExpr){ - while( pExpr && ExprHasProperty(pExpr, EP_Skip) ){ - assert( pExpr->op==TK_COLLATE ); +SQLITE_PRIVATE Expr* sqlite3ExprSkipCollate(Expr* pExpr) { + while (pExpr && ExprHasProperty(pExpr, EP_Skip)) { + assert(pExpr->op == TK_COLLATE); pExpr = pExpr->pLeft; } return pExpr; @@ -103798,15 +102746,15 @@ SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr *pExpr){ ** 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 ); +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 ); + } else { + assert(pExpr->op == TK_COLLATE); pExpr = pExpr->pLeft; } } @@ -103827,52 +102775,53 @@ SQLITE_PRIVATE Expr *sqlite3ExprSkipCollateAndLikely(Expr *pExpr){ ** 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 ){ +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 ){ + 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]); + 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 ){ + if (op == TK_CAST || op == TK_UPLUS) { p = p->pLeft; continue; } - if( op==TK_VECTOR ){ - assert( ExprUseXList(p) ); + if (op == TK_VECTOR) { + assert(ExprUseXList(p)); p = p->x.pList->a[0].pExpr; continue; } - if( op==TK_COLLATE ){ - assert( !ExprHasProperty(p, EP_IntValue) ); + 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 ){ + if (p->flags & EP_Collate) { + if (p->pLeft && (p->pLeft->flags & EP_Collate) != 0) { p = p->pLeft; - }else{ - Expr *pNext = p->pRight; + } 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 ){ + 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) ){ + for (i = 0; ALWAYS(i < p->x.pList->nExpr); i++) { + if (ExprHasProperty(p->x.pList->a[i].pExpr, EP_Collate)) { pNext = p->x.pList->a[i].pExpr; break; } @@ -103880,11 +102829,11 @@ SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, const Expr *pExpr){ } p = pNext; } - }else{ + } else { break; } } - if( sqlite3CheckCollSeq(pParse, pColl) ){ + if (sqlite3CheckCollSeq(pParse, pColl)) { pColl = 0; } return pColl; @@ -103900,20 +102849,21 @@ SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, const Expr *pExpr){ ** 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 ); +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; +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; } /* @@ -103921,21 +102871,21 @@ SQLITE_PRIVATE int sqlite3ExprCollSeqMatch(Parse *pParse, const Expr *pE1, const ** 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){ +SQLITE_PRIVATE char sqlite3CompareAffinity(const Expr* pExpr, char aff2) { char aff1 = sqlite3ExprAffinity(pExpr); - if( aff1>SQLITE_AFF_NONE && aff2>SQLITE_AFF_NONE ){ + 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) ){ + if (sqlite3IsNumericAffinity(aff1) || sqlite3IsNumericAffinity(aff2)) { return SQLITE_AFF_NUMERIC; - }else{ + } else { return SQLITE_AFF_BLOB; } - }else{ + } 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; + assert(aff1 <= SQLITE_AFF_NONE || aff2 <= SQLITE_AFF_NONE); + return (aff1 <= SQLITE_AFF_NONE ? aff2 : aff1) | SQLITE_AFF_NONE; } } @@ -103943,18 +102893,17 @@ SQLITE_PRIVATE char sqlite3CompareAffinity(const Expr *pExpr, char aff2){ ** 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){ +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 ); + 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 ){ + if (pExpr->pRight) { aff = sqlite3CompareAffinity(pExpr->pRight, aff); - }else if( ExprUseXSelect(pExpr) ){ + } else if (ExprUseXSelect(pExpr)) { aff = sqlite3CompareAffinity(pExpr->x.pSelect->pEList->a[0].pExpr, aff); - }else if( aff==0 ){ + } else if (aff == 0) { aff = SQLITE_AFF_BLOB; } return aff; @@ -103966,13 +102915,13 @@ static char comparisonAffinity(const Expr *pExpr){ ** 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){ +SQLITE_PRIVATE int sqlite3IndexAffinityOk(const Expr* pExpr, char idx_affinity) { char aff = comparisonAffinity(pExpr); - if( affflags & EP_Collate ){ +SQLITE_PRIVATE CollSeq* sqlite3BinaryCompareCollSeq(Parse* pParse, const Expr* pLeft, const Expr* pRight) { + CollSeq* pColl; + assert(pLeft); + if (pLeft->flags & EP_Collate) { pColl = sqlite3ExprCollSeq(pParse, pLeft); - }else if( pRight && (pRight->flags & EP_Collate)!=0 ){ + } else if (pRight && (pRight->flags & EP_Collate) != 0) { pColl = sqlite3ExprCollSeq(pParse, pRight); - }else{ + } else { pColl = sqlite3ExprCollSeq(pParse, pLeft); - if( !pColl ){ + if (!pColl) { pColl = sqlite3ExprCollSeq(pParse, pRight); } } @@ -104031,10 +102975,10 @@ SQLITE_PRIVATE CollSeq *sqlite3BinaryCompareCollSeq( ** 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) ){ +SQLITE_PRIVATE CollSeq* sqlite3ExprCompareCollSeq(Parse* pParse, const Expr* p) { + if (ExprHasProperty(p, EP_Commuted)) { return sqlite3BinaryCompareCollSeq(pParse, p->pRight, p->pLeft); - }else{ + } else { return sqlite3BinaryCompareCollSeq(pParse, p->pLeft, p->pRight); } } @@ -104042,29 +102986,28 @@ SQLITE_PRIVATE CollSeq *sqlite3ExprCompareCollSeq(Parse *pParse, const Expr *p){ /* ** 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 */ -){ +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; + CollSeq* p4; - if( pParse->nErr ) return 0; - if( isCommuted ){ + if (pParse->nErr) + return 0; + if (isCommuted) { p4 = sqlite3BinaryCompareCollSeq(pParse, pRight, pLeft); - }else{ + } else { p4 = sqlite3BinaryCompareCollSeq(pParse, pLeft, pRight); } p5 = binaryCompareP5(pLeft, pRight, jumpIfNull); - addr = sqlite3VdbeAddOp4(pParse->pVdbe, opcode, in2, dest, in1, - (void*)p4, P4_COLLSEQ); + addr = sqlite3VdbeAddOp4(pParse->pVdbe, opcode, in2, dest, in1, (void*)p4, P4_COLLSEQ); sqlite3VdbeChangeP5(pParse->pVdbe, (u8)p5); return addr; } @@ -104078,8 +103021,8 @@ static int codeCompare( ** 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; +SQLITE_PRIVATE int sqlite3ExprIsVector(const Expr* pExpr) { + return sqlite3ExprVectorSize(pExpr) > 1; } /* @@ -104088,16 +103031,17 @@ SQLITE_PRIVATE int sqlite3ExprIsVector(const Expr *pExpr){ ** 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){ +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) ); + 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) ); + } else if (op == TK_SELECT) { + assert(ExprUseXSelect(pExpr)); return pExpr->x.pSelect->pEList->nExpr; - }else{ + } else { return 1; } } @@ -104117,15 +103061,15 @@ SQLITE_PRIVATE int sqlite3ExprVectorSize(const Expr *pExpr){ ** 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) ); +SQLITE_PRIVATE Expr* sqlite3VectorFieldSubexpr(Expr* pVector, int i) { + assert(i < sqlite3ExprVectorSize(pVector) || pVector->op == 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) ); + } else { + assert(ExprUseXList(pVector)); return pVector->x.pList->a[i].pExpr; } } @@ -104153,15 +103097,14 @@ SQLITE_PRIVATE Expr *sqlite3VectorFieldSubexpr(Expr *pVector, int i){ ** 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) ); +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. @@ -104179,18 +103122,18 @@ SQLITE_PRIVATE Expr *sqlite3ExprForVectorField( ** will own the pVector. */ pRet = sqlite3PExpr(pParse, TK_SELECT_COLUMN, 0, 0); - if( pRet ){ + if (pRet) { pRet->iTable = nField; pRet->iColumn = iField; pRet->pLeft = pVector; } - }else{ - if( pVector->op==TK_VECTOR ){ - Expr **ppVector; - assert( ExprUseXList(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 ){ + if (IN_RENAME_OBJECT) { /* This must be a vector UPDATE inside a trigger */ *ppVector = 0; return pVector; @@ -104209,10 +103152,10 @@ SQLITE_PRIVATE Expr *sqlite3ExprForVectorField( ** ** If pExpr is not a TK_SELECT expression, return 0. */ -static int exprCodeSubselect(Parse *pParse, Expr *pExpr){ +static int exprCodeSubselect(Parse* pParse, Expr* pExpr) { int reg = 0; #ifndef SQLITE_OMIT_SUBQUERY - if( pExpr->op==TK_SELECT ){ + if (pExpr->op == TK_SELECT) { reg = sqlite3CodeSubselect(pParse, pExpr); } #endif @@ -104237,27 +103180,26 @@ static int exprCodeSubselect(Parse *pParse, Expr *pExpr){ ** 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 */ -){ +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 ){ + 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; + return pVector->iTable + iField; } - if( op==TK_SELECT ){ - assert( ExprUseXSelect(pVector) ); + if (op == TK_SELECT) { + assert(ExprUseXSelect(pVector)); *ppExpr = pVector->x.pSelect->pEList->a[iField].pExpr; - return regSelect+iField; + return regSelect + iField; } - if( op==TK_VECTOR ){ - assert( ExprUseXList(pVector) ); + if (op == TK_VECTOR) { + assert(ExprUseXList(pVector)); *ppExpr = pVector->x.pList->a[iField].pExpr; return sqlite3ExprCodeTemp(pParse, *ppExpr, pRegFree); } @@ -104275,16 +103217,15 @@ static int exprVectorRegister( ** 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; +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; @@ -104292,91 +103233,100 @@ static void codeVectorCompare( u8 opx = op; int addrCmp = 0; int addrDone = sqlite3VdbeMakeLabel(pParse); - int isCommuted = ExprHasProperty(pExpr,EP_Commuted); + int isCommuted = ExprHasProperty(pExpr, EP_Commuted); - assert( !ExprHasVVAProperty(pExpr,EP_Immutable) ); - if( pParse->nErr ) return; - if( nLeft!=sqlite3ExprVectorSize(pRight) ){ + 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 ); + 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; + 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++){ + 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 && i= 0 && i < nLeft); + if (addrCmp) + sqlite3VdbeJumpHere(v, addrCmp); r1 = exprVectorRegister(pParse, pLeft, i, regLeft, &pL, ®Free1); r2 = exprVectorRegister(pParse, pRight, i, regRight, &pR, ®Free2); addrCmp = sqlite3VdbeCurrentAddr(v); codeCompare(pParse, pL, pR, opx, r1, r2, addrDone, p5, isCommuted); - 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); - testcase(op==OP_Ge); VdbeCoverageIf(v,op==OP_Ge); - testcase(op==OP_Eq); VdbeCoverageIf(v,op==OP_Eq); - testcase(op==OP_Ne); VdbeCoverageIf(v,op==OP_Ne); + 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); + testcase(op == OP_Ge); + VdbeCoverageIf(v, op == OP_Ge); + testcase(op == OP_Eq); + VdbeCoverageIf(v, op == OP_Eq); + testcase(op == OP_Ne); + VdbeCoverageIf(v, op == OP_Ne); sqlite3ReleaseTempReg(pParse, regFree1); sqlite3ReleaseTempReg(pParse, regFree2); - if( (opx==TK_LT || opx==TK_GT) && i0 +#if SQLITE_MAX_EXPR_DEPTH > 0 /* ** 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){ +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 - ); + if (nHeight > mxHeight) { + sqlite3ErrorMsg(pParse, "Expression tree is too large (maximum depth %d)", mxHeight); rc = SQLITE_ERROR; } return rc; @@ -104391,24 +103341,24 @@ SQLITE_PRIVATE int sqlite3ExprCheckHeight(Parse *pParse, int nHeight){ ** 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 ){ +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 ){ +static void heightOfExprList(const ExprList* p, int* pnHeight) { + if (p) { int i; - for(i=0; inExpr; i++){ + for (i = 0; i < p->nExpr; 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){ +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); @@ -104428,12 +103378,13 @@ static void heightOfSelect(const Select *pSelect, int *pnHeight){ ** Also propagate EP_Propagate flags up from Expr.x.pList to Expr.flags, ** if appropriate. */ -static void exprSetHeight(Expr *p){ +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) ){ + if (p->pRight && p->pRight->nHeight > nHeight) + nHeight = p->pRight->nHeight; + if (ExprUseXSelect(p)) { heightOfSelect(p->x.pSelect, &nHeight); - }else if( p->x.pList ){ + } else if (p->x.pList) { heightOfExprList(p->x.pList, &nHeight); p->flags |= EP_Propagate & sqlite3ExprListFlags(p->x.pList); } @@ -104448,8 +103399,9 @@ static void exprSetHeight(Expr *p){ ** 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; +SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse* pParse, Expr* p) { + if (pParse->nErr) + return; exprSetHeight(p); sqlite3ExprCheckHeight(pParse, p->nHeight); } @@ -104458,7 +103410,7 @@ SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p){ ** Return the maximum height of any expression tree referenced ** by the select statement passed as an argument. */ -SQLITE_PRIVATE int sqlite3SelectExprHeight(const Select *p){ +SQLITE_PRIVATE int sqlite3SelectExprHeight(const Select* p) { int nHeight = 0; heightOfSelect(p, &nHeight); return nHeight; @@ -104468,9 +103420,10 @@ SQLITE_PRIVATE int sqlite3SelectExprHeight(const Select *p){ ** 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 ){ +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); } } @@ -104497,44 +103450,43 @@ SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p){ ** 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; +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 ); + 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 ){ + 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); + if (pToken) { + if (nExtra == 0) { + pNew->flags |= EP_IntValue | EP_Leaf | (iValue ? EP_IsTrue : EP_IsFalse); pNew->u.iValue = iValue; - }else{ + } 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); + 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]) ){ + if (dequote && sqlite3Isquote(pNew->u.zToken[0])) { sqlite3DequoteExpr(pNew); } } } -#if SQLITE_MAX_EXPR_DEPTH>0 +#if SQLITE_MAX_EXPR_DEPTH > 0 pNew->nHeight = 1; #endif } @@ -104545,11 +103497,10 @@ SQLITE_PRIVATE Expr *sqlite3ExprAlloc( ** 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 */ -){ +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); @@ -104562,22 +103513,17 @@ SQLITE_PRIVATE Expr *sqlite3Expr( ** 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 ); +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 ){ + } else { + if (pRight) { pRoot->pRight = pRight; pRoot->flags |= EP_Propagate & pRight->flags; } - if( pLeft ){ + if (pLeft) { pRoot->pLeft = pLeft; pRoot->flags |= EP_Propagate & pLeft->flags; } @@ -104592,21 +103538,20 @@ SQLITE_PRIVATE void sqlite3ExprAttachSubtrees( ** 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; +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 ){ + 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{ + } else { sqlite3ExprDelete(pParse->db, pLeft); sqlite3ExprDelete(pParse->db, pRight); } @@ -104617,13 +103562,13 @@ SQLITE_PRIVATE Expr *sqlite3PExpr( ** 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 ){ +SQLITE_PRIVATE void sqlite3PExprAddSelect(Parse* pParse, Expr* pExpr, Select* pSelect) { + if (pExpr) { pExpr->x.pSelect = pSelect; - ExprSetProperty(pExpr, EP_xIsSelect|EP_Subquery); + ExprSetProperty(pExpr, EP_xIsSelect | EP_Subquery); sqlite3ExprSetHeightAndFlags(pParse, pExpr); - }else{ - assert( pParse->db->mallocFailed ); + } else { + assert(pParse->db->mallocFailed); sqlite3SelectDelete(pParse->db, pSelect); } } @@ -104647,31 +103592,29 @@ SQLITE_PRIVATE void sqlite3PExprAddSelect(Parse *pParse, Expr *pExpr, Select *pS ** 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){ +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; + Select* pRet = 0; + assert(nElem > 1); + for (ii = 0; ii < pEList->nExpr; ii++) { + Select* pSel; + Expr* pExpr = pEList->a[ii].pExpr; int nExprElem; - if( pExpr->op==TK_VECTOR ){ - assert( ExprUseXList(pExpr) ); + if (pExpr->op == TK_VECTOR) { + assert(ExprUseXList(pExpr)); nExprElem = pExpr->x.pList->nExpr; - }else{ + } else { nExprElem = 1; } - if( nExprElem!=nElem ){ - sqlite3ErrorMsg(pParse, "IN(...) element has %d term%s - expected %d", - nExprElem, nExprElem>1?"s":"", nElem - ); + 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); + 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 ){ + if (pSel) { + if (pRet) { pSel->op = TK_ALL; pSel->pPrior = pRet; } @@ -104679,7 +103622,7 @@ SQLITE_PRIVATE Select *sqlite3ExprListToValues(Parse *pParse, int nElem, ExprLis } } - if( pRet && pRet->pPrior ){ + if (pRet && pRet->pPrior) { pRet->selFlags |= SF_MultiValue; } sqlite3ExprListDelete(pParse->db, pEList); @@ -104694,19 +103637,17 @@ SQLITE_PRIVATE Select *sqlite3ExprListToValues(Parse *pParse, int nElem, ExprLis ** 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 ){ +SQLITE_PRIVATE Expr* sqlite3ExprAnd(Parse* pParse, Expr* pLeft, Expr* pRight) { + sqlite3* db = pParse->db; + if (pLeft == 0) { return pRight; - }else if( pRight==0 ){ + } else if (pRight == 0) { return pLeft; - }else if( (ExprAlwaysFalse(pLeft) || ExprAlwaysFalse(pRight)) - && !IN_RENAME_OBJECT - ){ + } else if ((ExprAlwaysFalse(pLeft) || ExprAlwaysFalse(pRight)) && !IN_RENAME_OBJECT) { sqlite3ExprDeferredDelete(pParse, pLeft); sqlite3ExprDeferredDelete(pParse, pRight); return sqlite3Expr(db, TK_INTEGER, "0"); - }else{ + } else { return sqlite3PExpr(pParse, TK_AND, pLeft, pRight); } } @@ -104715,33 +103656,30 @@ SQLITE_PRIVATE Expr *sqlite3ExprAnd(Parse *pParse, Expr *pLeft, Expr *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 ); +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 ){ + if (pNew == 0) { sqlite3ExprListDelete(db, pList); /* Avoid memory leak when malloc fails */ return 0; } - assert( !ExprHasProperty(pNew, EP_InnerON|EP_OuterON) ); + 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 - ){ + 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) ); + assert(ExprUseXList(pNew)); sqlite3ExprSetHeightAndFlags(pParse, pNew); - if( eDistinct==SF_Distinct ) ExprSetProperty(pNew, EP_Distinct); + if (eDistinct == SF_Distinct) + ExprSetProperty(pNew, EP_Distinct); return pNew; } @@ -104756,17 +103694,14 @@ SQLITE_PRIVATE Expr *sqlite3ExprFunction( ** ** 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 - ){ +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 @@ -104795,68 +103730,68 @@ SQLITE_PRIVATE void sqlite3ExprFunctionUsable( ** 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; +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) ); + 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 ){ + 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]=='?' ); + assert(z[0] == '?'); x = (ynVar)(++pParse->nVar); - }else{ + } else { int doAdd = 0; - if( z[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 */ + 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]); + } 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 ){ + if (x > pParse->nVar) { pParse->nVar = (int)x; doAdd = 1; - }else if( sqlite3VListNumToName(pParse->pVList, x)==0 ){ + } else if (sqlite3VListNumToName(pParse->pVList, x) == 0) { doAdd = 1; } - }else{ + } 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 ){ + if (x == 0) { x = (ynVar)(++pParse->nVar); doAdd = 1; } } - if( doAdd ){ + if (doAdd) { pParse->pVList = sqlite3VListAdd(db, pParse->pVList, z, n, x); } } pExpr->iColumn = x; - if( x>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){ + if (x > db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]) { sqlite3ErrorMsg(pParse, "too many SQL variables"); sqlite3RecordErrorOffsetOfExpr(pParse->db, pExpr); } @@ -104865,60 +103800,62 @@ SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n /* ** 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) ); +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 ); + 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)) ){ + 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) ); + 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) ); + } else if (ExprUseXSelect(p)) { + assert(!ExprHasProperty(p, EP_WinFunc)); sqlite3SelectDelete(db, p->x.pSelect); - }else{ + } else { sqlite3ExprListDelete(db, p->x.pList); #ifndef SQLITE_OMIT_WINDOWFUNC - if( ExprHasProperty(p, EP_WinFunc) ){ + if (ExprHasProperty(p, EP_WinFunc)) { sqlite3WindowDelete(db, p->y.pWin); } #endif } } - if( ExprHasProperty(p, EP_MemToken) ){ - assert( !ExprHasProperty(p, EP_IntValue) ); + if (ExprHasProperty(p, EP_MemToken)) { + assert(!ExprHasProperty(p, EP_IntValue)); sqlite3DbFree(db, p->u.zToken); } - if( !ExprHasProperty(p, EP_Static) ){ + if (!ExprHasProperty(p, EP_Static)) { sqlite3DbFreeNN(db, p); } } -SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3 *db, Expr *p){ - if( p ) sqlite3ExprDeleteNN(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 ){ +SQLITE_PRIVATE void sqlite3ClearOnOrUsing(sqlite3* db, OnOrUsing* p) { + if (p == 0) { /* Nothing to clear */ - }else if( p->pOn ){ + } else if (p->pOn) { sqlite3ExprDeleteNN(db, p->pOn); - }else if( p->pUsing ){ + } else if (p->pUsing) { sqlite3IdListDelete(db, p->pUsing); } } @@ -104933,17 +103870,16 @@ SQLITE_PRIVATE void sqlite3ClearOnOrUsing(sqlite3 *db, OnOrUsing *p){ ** 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); +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 ){ +SQLITE_PRIVATE void sqlite3ExprUnmapAndDelete(Parse* pParse, Expr* p) { + if (p) { + if (IN_RENAME_OBJECT) { sqlite3RenameExprUnmap(pParse, p); } sqlite3ExprDeleteNN(pParse->db, p); @@ -104955,9 +103891,11 @@ SQLITE_PRIVATE void sqlite3ExprUnmapAndDelete(Parse *pParse, Expr *p){ ** 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; +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; } @@ -104995,26 +103933,26 @@ static int exprStructSize(const Expr *p){ ** of dupedExprStructSize() contain multiple assert() statements that attempt ** to enforce this constraint. */ -static int dupedExprStructSize(const Expr *p, int flags){ +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 + 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) + || 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 ){ + } 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 ); + } else { + assert(p->pRight == 0); nSize = EXPR_TOKENONLYSIZE | EP_TokenOnly; } } @@ -105026,10 +103964,10 @@ static int dupedExprStructSize(const Expr *p, int flags){ ** 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){ +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; + if (!ExprHasProperty(p, EP_IntValue) && p->u.zToken) { + nByte += sqlite3Strlen30NN(p->u.zToken) + 1; } return ROUND8(nByte); } @@ -105047,11 +103985,11 @@ static int dupedExprNodeSize(const Expr *p, int flags){ ** 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){ +static int dupedExprSize(const Expr* p, int flags) { int nByte = 0; - if( p ){ + if (p) { nByte = dupedExprNodeSize(p, flags); - if( flags&EXPRDUP_REDUCE ){ + if (flags & EXPRDUP_REDUCE) { nByte += dupedExprSize(p->pLeft, flags) + dupedExprSize(p->pRight, flags); } } @@ -105066,28 +104004,28 @@ static int dupedExprSize(const Expr *p, int flags){ ** 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 */ +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 ); + 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 ){ + if (pzBuffer) { zAlloc = *pzBuffer; staticFlag = EP_Static; - assert( zAlloc!=0 ); - }else{ + assert(zAlloc != 0); + } else { zAlloc = sqlite3DbMallocRawNN(db, dupedExprSize(p, dupFlags)); staticFlag = 0; } - pNew = (Expr *)zAlloc; + pNew = (Expr*)zAlloc; - if( pNew ){ + 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 @@ -105096,71 +104034,68 @@ static Expr *exprDup(sqlite3 *db, const Expr *p, int dupFlags, u8 **pzBuffer){ const unsigned nStructSize = dupedExprStructSize(p, dupFlags); const int nNewSize = nStructSize & 0xfff; int nToken; - if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ + if (!ExprHasProperty(p, EP_IntValue) && p->u.zToken) { nToken = sqlite3Strlen30(p->u.zToken) + 1; - }else{ + } else { nToken = 0; } - if( dupFlags ){ - assert( ExprHasProperty(p, EP_Reduced)==0 ); + if (dupFlags) { + assert(ExprHasProperty(p, EP_Reduced) == 0); memcpy(zAlloc, p, nNewSize); - }else{ + } 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 &= ~(EP_Reduced | EP_TokenOnly | EP_Static | EP_MemToken); + pNew->flags |= nStructSize & (EP_Reduced | EP_TokenOnly); pNew->flags |= staticFlag; ExprClearVVAProperties(pNew); - if( dupFlags ){ + if (dupFlags) { ExprSetVVAProperty(pNew, EP_Immutable); } /* Copy the p->u.zToken string, if any. */ - if( nToken ){ - char *zToken = pNew->u.zToken = (char*)&zAlloc[nNewSize]; + 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)) ){ + if (0 == ((p->flags | pNew->flags) & (EP_TokenOnly | EP_Leaf))) { /* Fill in the pNew->x.pSelect or pNew->x.pList member. */ - if( ExprUseXSelect(p) ){ + if (ExprUseXSelect(p)) { pNew->x.pSelect = sqlite3SelectDup(db, p->x.pSelect, dupFlags); - }else{ + } 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) ){ + 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; + 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) ){ + if (ExprHasProperty(p, EP_WinFunc)) { pNew->y.pWin = sqlite3WindowDup(db, pNew, p->y.pWin); - assert( ExprHasProperty(pNew, EP_WinFunc) ); + assert(ExprHasProperty(pNew, EP_WinFunc)); } #endif /* SQLITE_OMIT_WINDOWFUNC */ - if( pzBuffer ){ + if (pzBuffer) { *pzBuffer = zAlloc; } - }else{ - if( !ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){ - if( pNew->op==TK_SELECT_COLUMN ){ + } 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{ + 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); @@ -105176,15 +104111,15 @@ static Expr *exprDup(sqlite3 *db, const Expr *p, int dupFlags, u8 **pzBuffer){ ** 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); +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 ){ + if (pRet) { int i; pRet->nCte = p->nCte; - for(i=0; inCte; i++){ + for (i = 0; i < p->nCte; 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); @@ -105195,7 +104130,7 @@ SQLITE_PRIVATE With *sqlite3WithDup(sqlite3 *db, With *p){ return pRet; } #else -# define sqlite3WithDup(x,y) 0 +#define sqlite3WithDup(x, y) 0 #endif #ifndef SQLITE_OMIT_WINDOWFUNC @@ -105205,21 +104140,21 @@ SQLITE_PRIVATE With *sqlite3WithDup(sqlite3 *db, With *p){ ** 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 ); +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 int gatherSelectWindowsSelectCallback(Walker* pWalker, Select* p) { + return p == pWalker->u.pSelect ? WRC_Continue : WRC_Prune; } -static void gatherSelectWindows(Select *p){ +static void gatherSelectWindows(Select* p) { Walker w; w.xExprCallback = gatherSelectWindowsCallback; w.xSelectCallback = gatherSelectWindowsSelectCallback; @@ -105230,7 +104165,6 @@ static void gatherSelectWindows(Select *p){ } #endif - /* ** The following group of routines make deep copies of expressions, ** expression lists, ID lists, and select statements. The copies can @@ -105248,39 +104182,38 @@ static void gatherSelectWindows(Select *p){ ** 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 ); +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; +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; + 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; + 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; + for (i = 0; i < p->nExpr; 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 ){ + 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 ){ + } else { + if (pOldExpr->pLeft != pPriorSelectColOld) { pPriorSelectColOld = pOldExpr->pLeft; pPriorSelectColNew = sqlite3ExprDup(db, pPriorSelectColOld, flags); pNewExpr->pRight = pPriorSelectColNew; @@ -105302,22 +104235,23 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, const ExprList *p, int ** 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; +#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; + 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; + for (i = 0; i < p->nSrc; 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); @@ -105326,60 +104260,62 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3 *db, const SrcList *p, int fla pNewItem->iCursor = pOldItem->iCursor; pNewItem->addrFillSub = pOldItem->addrFillSub; pNewItem->regReturn = pOldItem->regReturn; - if( pNewItem->fg.isIndexedBy ){ + if (pNewItem->fg.isIndexedBy) { pNewItem->u1.zIndexedBy = sqlite3DbStrDup(db, pOldItem->u1.zIndexedBy); } pNewItem->u2 = pOldItem->u2; - if( pNewItem->fg.isCte ){ + if (pNewItem->fg.isCte) { pNewItem->u2.pCteUse->nUse++; } - if( pNewItem->fg.isTabFunc ){ - pNewItem->u1.pFuncArg = - sqlite3ExprListDup(db, pOldItem->u1.pFuncArg, flags); + if (pNewItem->fg.isTabFunc) { + pNewItem->u1.pFuncArg = sqlite3ExprListDup(db, pOldItem->u1.pFuncArg, flags); } pTab = pNewItem->pTab = pOldItem->pTab; - if( pTab ){ + if (pTab) { pTab->nTabRef++; } pNewItem->pSelect = sqlite3SelectDup(db, pOldItem->pSelect, flags); - if( pOldItem->fg.isUsing ){ - assert( pNewItem->fg.isUsing ); + if (pOldItem->fg.isUsing) { + assert(pNewItem->fg.isUsing); pNewItem->u3.pUsing = sqlite3IdListDup(db, pOldItem->u3.pUsing); - }else{ + } 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; +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; + 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]; + for (i = 0; i < p->nId; 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; +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; + 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); @@ -105400,10 +104336,11 @@ SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, const Select *pDup, int fla #ifndef SQLITE_OMIT_WINDOWFUNC pNew->pWin = 0; pNew->pWinDefn = sqlite3WindowListDup(db, p->pWinDefn); - if( p->pWin && db->mallocFailed==0 ) gatherSelectWindows(pNew); + if (p->pWin && db->mallocFailed == 0) + gatherSelectWindows(pNew); #endif pNew->selId = p->selId; - if( db->mallocFailed ){ + 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. */ @@ -105419,13 +104356,12 @@ SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, const Select *pDup, int fla return pRet; } #else -SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, const Select *p, int flags){ - assert( p==0 ); +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. @@ -105442,15 +104378,14 @@ SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, const Select *p, int flags) ** 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; +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 ){ + pList = sqlite3DbMallocRawNN(db, sizeof(ExprList) + sizeof(pList->a[0]) * 4); + if (pList == 0) { sqlite3ExprDelete(db, pExpr); return 0; } @@ -105461,21 +104396,19 @@ SQLITE_PRIVATE SQLITE_NOINLINE ExprList *sqlite3ExprListAppendNew( 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; +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 ){ + 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{ + } else { pList = pNew; } pItem = &pList->a[pList->nExpr++]; @@ -105483,17 +104416,16 @@ SQLITE_PRIVATE SQLITE_NOINLINE ExprList *sqlite3ExprListAppendGrow( 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); +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); + if (pList->nAlloc < pList->nExpr + 1) { + return sqlite3ExprListAppendGrow(pParse->db, pList, pExpr); } pItem = &pList->a[pList->nExpr++]; *pItem = zeroItem; @@ -105512,48 +104444,49 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListAppend( ** 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; +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 (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); + 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; + for (i = 0; i < pColumns->nId; 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; + 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 ); + 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 */ @@ -105574,31 +104507,26 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector( /* ** 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 ); +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 - ); + 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 ){ + 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 ){ + if (eNulls != SQLITE_SO_UNDEFINED) { pItem->fg.bNulls = 1; - if( iSortOrder!=eNulls ){ + if (iSortOrder != eNulls) { pItem->fg.sortFlags |= KEYINFO_ORDER_BIGNULL; } } @@ -105612,27 +104540,26 @@ SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder, int ** 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 ); +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) { /* 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 ){ + if (IN_RENAME_OBJECT) { sqlite3RenameTokenMap(pParse, (const void*)pItem->zEName, pName); } } @@ -105647,18 +104574,17 @@ SQLITE_PRIVATE void sqlite3ExprListSetName( ** 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 ){ +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; } @@ -105669,15 +104595,11 @@ SQLITE_PRIVATE void sqlite3ExprListSetSpan( ** 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 -){ +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 ){ + testcase(pEList && pEList->nExpr == mx); + testcase(pEList && pEList->nExpr == mx + 1); + if (pEList && pEList->nExpr > mx) { sqlite3ErrorMsg(pParse, "too many columns in %s", zObject); } } @@ -105685,33 +104607,34 @@ SQLITE_PRIVATE void sqlite3ExprListCheckLength( /* ** Delete an entire expression list. */ -static SQLITE_NOINLINE void exprListDeleteNN(sqlite3 *db, ExprList *pList){ +static SQLITE_NOINLINE void exprListDeleteNN(sqlite3* db, ExprList* pList) { int i = pList->nExpr; - struct ExprList_item *pItem = pList->a; - assert( pList->nExpr>0 ); - do{ + struct ExprList_item* pItem = pList->a; + assert(pList->nExpr > 0); + do { sqlite3ExprDelete(db, pItem->pExpr); sqlite3DbFree(db, pItem->zEName); pItem++; - }while( --i>0 ); + } while (--i > 0); sqlite3DbFreeNN(db, pList); } -SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3 *db, ExprList *pList){ - if( pList ) exprListDeleteNN(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){ +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; + assert(pList != 0); + for (i = 0; i < pList->nExpr; i++) { + Expr* pExpr = pList->a[i].pExpr; + assert(pExpr != 0); + m |= pExpr->flags; } return m; } @@ -105723,7 +104646,7 @@ SQLITE_PRIVATE u32 sqlite3ExprListFlags(const ExprList *pList){ ** ** This callback is used by multiple expression walkers. */ -SQLITE_PRIVATE int sqlite3SelectWalkFail(Walker *pWalker, Select *NotUsed){ +SQLITE_PRIVATE int sqlite3SelectWalkFail(Walker* pWalker, Select* NotUsed) { UNUSED_PARAMETER(NotUsed); pWalker->eCode = 0; return WRC_Abort; @@ -105737,24 +104660,23 @@ SQLITE_PRIVATE int sqlite3SelectWalkFail(Walker *pWalker, Select *NotUsed){ ** "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; +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){ +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 - ){ + 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; @@ -105766,13 +104688,12 @@ SQLITE_PRIVATE int sqlite3ExprIdToTrueFalse(Expr *pExpr){ ** 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){ +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; + 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; } /* @@ -105788,21 +104709,20 @@ SQLITE_PRIVATE int sqlite3ExprTruthValue(const Expr *pExpr){ ** (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; +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 @@ -105829,79 +104749,74 @@ SQLITE_PRIVATE Expr *sqlite3ExprSimplifiedAndOr(Expr *pExpr){ ** of SQLite to be parsed by newer versions of SQLite without raising a ** malformed schema error. */ -static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){ +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) ){ + if (pWalker->eCode == 2 && ExprHasProperty(pExpr, EP_OuterON)) { pWalker->eCode = 0; return WRC_Abort; } - switch( pExpr->op ){ + 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); + if ((pWalker->eCode >= 4 || ExprHasProperty(pExpr, EP_ConstFunc)) && !ExprHasProperty(pExpr, EP_WinFunc)) { + if (pWalker->eCode == 5) + ExprSetProperty(pExpr, EP_FromDDL); return WRC_Continue; - }else{ + } 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) ){ + if (sqlite3ExprIdToTrueFalse(pExpr)) { return WRC_Prune; } - /* no break */ deliberate_fall_through - case TK_COLUMN: + /* 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 ){ + 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 ){ + if (pWalker->eCode == 3 && pExpr->iTable == pWalker->u.iCur) { return WRC_Continue; } - /* no break */ deliberate_fall_through - case TK_IF_NULL_ROW: + /* 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 ); + 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 ){ + 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 ){ + } 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 */ + /* 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){ +static int exprIsConst(Expr* p, int initFlag, int iCur) { Walker w; w.eCode = initFlag; w.xExprCallback = exprNodeIsConstant; @@ -105922,7 +104837,7 @@ static int exprIsConst(Expr *p, int initFlag, int iCur){ ** is considered a variable but a single-quoted string (ex: 'abc') is ** a constant. */ -SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr *p){ +SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr* p) { return exprIsConst(p, 1, 0); } @@ -105939,7 +104854,7 @@ SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr *p){ ** 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){ +SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr* p) { return exprIsConst(p, 2, 0); } @@ -105949,7 +104864,7 @@ SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr *p){ ** expression must not refer to any non-deterministic function nor any ** table other than iCur. */ -SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr *p, int iCur){ +SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr* p, int iCur) { return exprIsConst(p, 3, iCur); } @@ -105976,41 +104891,43 @@ SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr *p, int iCur){ ** 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) */ +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) */ + 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; +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) ){ + for (i = 0; i < pGroupBy->nExpr; 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) ){ + if (ExprUseXSelect(pExpr)) { pWalker->eCode = 0; return WRC_Abort; } @@ -106037,7 +104954,7 @@ static int exprNodeIsConstantOrGroupBy(Walker *pWalker, Expr *pExpr){ ** 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){ +SQLITE_PRIVATE int sqlite3ExprIsConstantOrGroupBy(Parse* pParse, Expr* p, ExprList* pGroupBy) { Walker w; w.eCode = 1; w.xExprCallback = exprNodeIsConstantOrGroupBy; @@ -106069,9 +104986,9 @@ SQLITE_PRIVATE int sqlite3ExprIsConstantOrGroupBy(Parse *pParse, Expr *p, ExprLi ** 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); +SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr* p, u8 isInit) { + assert(isInit == 0 || isInit == 1); + return exprIsConst(p, 4 + isInit, 0); } #ifdef SQLITE_ENABLE_CURSOR_HINTS @@ -106079,7 +104996,7 @@ SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr *p, u8 isInit){ ** 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){ +SQLITE_PRIVATE int sqlite3ExprContainsSubquery(Expr* p) { Walker w; w.eCode = 1; w.xExprCallback = sqlite3ExprWalkNoop; @@ -106088,7 +105005,7 @@ SQLITE_PRIVATE int sqlite3ExprContainsSubquery(Expr *p){ w.xSelectCallback2 = sqlite3SelectWalkAssert2; #endif sqlite3WalkExpr(&w, p); - return w.eCode==0; + return w.eCode == 0; } #endif @@ -106098,34 +105015,35 @@ SQLITE_PRIVATE int sqlite3ExprContainsSubquery(Expr *p){ ** 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){ +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 (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 ); + assert(p->op != TK_INTEGER || (p->flags & EP_IntValue) != 0 || sqlite3GetInt32(p->u.zToken, &rc) == 0); - if( p->flags & EP_IntValue ){ + if (p->flags & EP_IntValue) { *pValue = p->u.iValue; return 1; } - switch( p->op ){ + 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 ); + if (sqlite3ExprIsInteger(p->pLeft, &v)) { + assert(((unsigned int)v) != 0x80000000); *pValue = -v; rc = 1; } break; } - default: break; + default: + break; } return rc; } @@ -106144,28 +105062,27 @@ SQLITE_PRIVATE int sqlite3ExprIsInteger(const Expr *p, int *pValue){ ** will likely result in an incorrect answer. So when in doubt, return ** TRUE. */ -SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr *p){ +SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr* p) { u8 op; - assert( p!=0 ); - while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ + assert(p != 0); + while (p->op == TK_UPLUS || p->op == TK_UMINUS) { p = p->pLeft; - assert( p!=0 ); + assert(p != 0); } op = p->op; - if( op==TK_REGISTER ) op = p->op2; - switch( 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); + 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; } @@ -106181,32 +105098,35 @@ SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr *p){ ** is harmless. A false positive, however, can result in the wrong ** answer. */ -SQLITE_PRIVATE int sqlite3ExprNeedsNoAffinityChange(const Expr *p, char aff){ +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; + 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 ){ + if (op == TK_REGISTER) + op = p->op2; + switch (op) { case TK_INTEGER: { - return aff>=SQLITE_AFF_NUMERIC; + return aff >= SQLITE_AFF_NUMERIC; } case TK_FLOAT: { - return aff>=SQLITE_AFF_NUMERIC; + return aff >= SQLITE_AFF_NUMERIC; } case TK_STRING: { - return !unaryMinus && aff==SQLITE_AFF_TEXT; + 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; + assert(p->iTable >= 0); /* p cannot be part of a CHECK constraint */ + return aff >= SQLITE_AFF_NUMERIC && p->iColumn < 0; } default: { return 0; @@ -106217,10 +105137,13 @@ SQLITE_PRIVATE int sqlite3ExprNeedsNoAffinityChange(const Expr *p, char aff){ /* ** 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; +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; } @@ -106232,39 +105155,48 @@ SQLITE_PRIVATE int sqlite3IsRowid(const char *z){ ** table, then return NULL. */ #ifndef SQLITE_OMIT_SUBQUERY -static Select *isCandidateForInOpt(const Expr *pX){ - Select *p; - SrcList *pSrc; - ExprList *pEList; - Table *pTab; +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 */ + 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 ); + 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 */ + 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 */ + 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 */ + 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 ); + 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 */ + for (i = 0; i < pEList->nExpr; 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; } @@ -106277,10 +105209,11 @@ static Select *isCandidateForInOpt(const Expr *pX){ ** 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){ +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); + 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)); @@ -106288,16 +105221,15 @@ static void sqlite3SetHasNullFlag(Vdbe *v, int iCur, int regHasNull){ } #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; +static int sqlite3InRhsIsConstant(Expr* pIn) { + Expr* pLHS; int res; - assert( !ExprHasProperty(pIn, EP_xIsSelect) ); + assert(!ExprHasProperty(pIn, EP_xIsSelect)); pLHS = pIn->pLeft; pIn->pLeft = 0; res = sqlite3ExprIsConstant(pIn); @@ -106390,22 +105322,21 @@ static int sqlite3InRhsIsConstant(Expr *pIn){ ** 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; +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 @@ -106413,13 +105344,14 @@ SQLITE_PRIVATE int sqlite3FindInIndex( ** 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) ){ + if (prRhsHasNull && ExprUseXSelect(pX)) { int i; - ExprList *pEList = pX->x.pSelect->pEList; - for(i=0; inExpr; i++){ - if( sqlite3ExprCanBeNull(pEList->a[i].pExpr) ) break; + ExprList* pEList = pX->x.pSelect->pEList; + for (i = 0; i < pEList->nExpr; i++) { + if (sqlite3ExprCanBeNull(pEList->a[i].pExpr)) + break; } - if( i==pEList->nExpr ){ + if (i == pEList->nExpr) { prRhsHasNull = 0; } } @@ -106427,37 +105359,36 @@ SQLITE_PRIVATE int sqlite3FindInIndex( /* 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; + 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) */ + 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 && iDb= 0 && iDb < SQLITE_MAX_DB); sqlite3CodeVerifySchema(pParse, iDb); sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); - assert(v); /* sqlite3GetVdbe() has always been previously called */ - if( nExpr==1 && pEList->a[0].pExpr->iColumn<0 ){ + 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)); + ExplainQueryPlan((pParse, 0, "USING ROWID SEARCH ON TABLE %s FOR IN-OPERATOR", pTab->zName)); sqlite3VdbeJumpHere(v, iAddr); - }else{ - Index *pIdx; /* Iterator variable */ + } else { + Index* pIdx; /* Iterator variable */ int affinity_ok = 1; int i; @@ -106465,14 +105396,14 @@ SQLITE_PRIVATE int sqlite3FindInIndex( ** 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); + for (i = 0; i < nExpr && affinity_ok; i++) { + Expr* pLhs = sqlite3VectorFieldSubexpr(pX->pLeft, i); int iCol = pEList->a[i].pExpr->iColumn; - char idxaff = sqlite3TableColumnAffinity(pTab,iCol); /* RHS table */ + char idxaff = sqlite3TableColumnAffinity(pTab, iCol); /* RHS table */ char cmpaff = sqlite3CompareAffinity(pLhs, idxaff); - testcase( cmpaff==SQLITE_AFF_BLOB ); - testcase( cmpaff==SQLITE_AFF_TEXT ); - switch( cmpaff ){ + testcase(cmpaff == SQLITE_AFF_BLOB); + testcase(cmpaff == SQLITE_AFF_TEXT); + switch (cmpaff) { case SQLITE_AFF_BLOB: break; case SQLITE_AFF_TEXT: @@ -106480,76 +105411,80 @@ SQLITE_PRIVATE int sqlite3FindInIndex( ** 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 ); + assert(idxaff == SQLITE_AFF_TEXT); break; default: affinity_ok = sqlite3IsNumericAffinity(idxaff); } } - if( affinity_ok ){ + 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; + 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->nColumn < nExpr) + continue; + if (pIdx->pPartIdxWhere != 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 */ + 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); + colUsed = 0; /* Columns of index used so far */ + for (i = 0; i < nExpr; i++) { + Expr* pLhs = sqlite3VectorFieldSubexpr(pX->pLeft, 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 ){ + assert(pReq != 0 || pRhs->iColumn == XN_ROWID || pParse->nErr); + for (j = 0; j < nExpr; j++) { + if (pIdx->aiColumn[j] != pRhs->iColumn) + continue; + assert(pIdx->azColl[j]); + if (pReq != 0 && sqlite3StrICmp(pReq->zName, pIdx->azColl[j]) != 0) { continue; } break; } - if( j==nExpr ) break; + if (j == nExpr) + break; mCol = MASKBIT(j); - if( mCol & colUsed ) break; /* Each column used only once */ + if (mCol & colUsed) + break; /* Each column used only once */ colUsed |= mCol; - if( aiMap ) aiMap[i] = j; + if (aiMap) + aiMap[i] = j; } - assert( i==nExpr || colUsed!=(MASKBIT(nExpr)-1) ); - if( colUsed==(MASKBIT(nExpr)-1) ){ + 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)); + 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 ); + assert(IN_INDEX_INDEX_DESC == IN_INDEX_INDEX_ASC + 1); eType = IN_INDEX_INDEX_ASC + pIdx->aSortOrder[0]; - if( prRhsHasNull ){ + if (prRhsHasNull) { #ifdef SQLITE_ENABLE_COLUMN_USED_MASK - i64 mask = (1<nMem; - if( nExpr==1 ){ + if (nExpr == 1) { sqlite3SetHasNullFlag(v, iTab, *prRhsHasNull); } } @@ -106567,40 +105502,37 @@ SQLITE_PRIVATE int sqlite3FindInIndex( ** 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 */ + 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 ){ + 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 ){ + if (inFlags & IN_INDEX_LOOP) { pParse->nQueryLoop = 0; - }else if( prRhsHasNull ){ + } else if (prRhsHasNull) { *prRhsHasNull = rMayHaveNull = ++pParse->nMem; } - assert( pX->op==TK_IN ); + assert(pX->op == TK_IN); sqlite3CodeRhsOfIN(pParse, pX, iTab); - if( rMayHaveNull ){ + if (rMayHaveNull) { sqlite3SetHasNullFlag(v, iTab, rMayHaveNull); } pParse->nQueryLoop = savedNQueryLoop; } - if( aiMap && eType!=IN_INDEX_INDEX_ASC && eType!=IN_INDEX_INDEX_DESC ){ + if (aiMap && eType != IN_INDEX_INDEX_ASC && eType != IN_INDEX_INDEX_DESC) { int i, n; n = sqlite3ExprVectorSize(pX->pLeft); - for(i=0; ipLeft; +static char* exprINAffinity(Parse* pParse, const Expr* pExpr) { + Expr* pLeft = pExpr->pLeft; int nVal = sqlite3ExprVectorSize(pLeft); - Select *pSelect = ExprUseXSelect(pExpr) ? pExpr->x.pSelect : 0; - char *zRet; + Select* pSelect = ExprUseXSelect(pExpr) ? pExpr->x.pSelect : 0; + char* zRet; - assert( pExpr->op==TK_IN ); - zRet = sqlite3DbMallocRaw(pParse->db, nVal+1); - if( 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{ + } else { zRet[i] = a; } } @@ -106648,9 +105580,9 @@ static char *exprINAffinity(Parse *pParse, const Expr *pExpr){ ** ** "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"; +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); } } @@ -106667,11 +105599,11 @@ SQLITE_PRIVATE void sqlite3SubselectError(Parse *pParse, int nActual, int nExpec ** ** "row value misused" */ -SQLITE_PRIVATE void sqlite3VectorErrorMsg(Parse *pParse, Expr *pExpr){ +SQLITE_PRIVATE void sqlite3VectorErrorMsg(Parse* pParse, Expr* pExpr) { #ifndef SQLITE_OMIT_SUBQUERY - if( ExprUseXSelect(pExpr) ){ + if (ExprUseXSelect(pExpr)) { sqlite3SubselectError(pParse, pExpr->x.pSelect->pEList->nExpr, 1); - }else + } else #endif { sqlite3ErrorMsg(pParse, "row value misused"); @@ -106701,20 +105633,19 @@ SQLITE_PRIVATE void sqlite3VectorErrorMsg(Parse *pParse, Expr *pExpr){ ** '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 */ +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 ); + assert(v != 0); /* The evaluation of the IN must be repeated every time it ** is encountered if any of the following is true: @@ -106726,35 +105657,34 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN( ** 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 ){ + 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 ); + 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) ); + assert(!ExprUseYWin(pExpr)); ExprSetProperty(pExpr, EP_Subrtn); - assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) ); + 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; + pExpr->y.sub.iAddr = sqlite3VdbeAddOp2(v, OP_BeginSubrtn, 0, pExpr->y.sub.regReturn) + 1; - addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); + VdbeCoverage(v); } /* Check to see if this is a vector IN operator */ @@ -106767,58 +105697,54 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN( pExpr->iTable = iTab; addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pExpr->iTable, nVal); #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS - if( ExprUseXSelect(pExpr) ){ + if (ExprUseXSelect(pExpr)) { VdbeComment((v, "Result of SELECT %u", pExpr->x.pSelect->selId)); - }else{ + } else { VdbeComment((v, "RHS of IN operator")); } #endif pKeyInfo = sqlite3KeyInfoAlloc(pParse->db, nVal, 1); - if( ExprUseXSelect(pExpr) ){ + 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; + Select* pSelect = pExpr->x.pSelect; + ExprList* pEList = pSelect->pEList; - ExplainQueryPlan((pParse, 1, "%sLIST SUBQUERY %d", - addrOnce?"":"CORRELATED ", pSelect->selId - )); + 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; + 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() */ + 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); + rc = pParse->db->mallocFailed ? 1 : sqlite3Select(pParse, pCopy, &dest); sqlite3SelectDelete(pParse->db, pCopy); sqlite3DbFree(pParse->db, dest.zAffSdst); - if( rc ){ + 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 - ); + assert(pKeyInfo != 0); /* OOM will cause exit after sqlite3Select() */ + assert(pEList != 0); + assert(pEList->nExpr > 0); + assert(sqlite3KeyInfoIsWriteable(pKeyInfo)); + for (i = 0; i < nVal; i++) { + Expr* p = sqlite3VectorFieldSubexpr(pLeft, i); + pKeyInfo->aColl[i] = sqlite3BinaryCompareCollSeq(pParse, p, pEList->a[i].pExpr); } } - }else if( ALWAYS(pExpr->x.pList!=0) ){ + } else if (ALWAYS(pExpr->x.pList != 0)) { /* Case 2: expr IN (exprlist) ** ** For each expression, build an index key from the evaluation and @@ -106826,35 +105752,35 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN( ** that columns affinity when building index keys. If is not ** a column, use numeric affinity. */ - char affinity; /* Affinity of the LHS of the IN */ + char affinity; /* Affinity of the LHS of the IN */ int i; - ExprList *pList = pExpr->x.pList; - struct ExprList_item *pItem; + ExprList* pList = pExpr->x.pList; + struct ExprList_item* pItem; int r1, r2; affinity = sqlite3ExprAffinity(pLeft); - if( affinity<=SQLITE_AFF_NONE ){ + if (affinity <= SQLITE_AFF_NONE) { affinity = SQLITE_AFF_BLOB; - }else if( affinity==SQLITE_AFF_REAL ){ + } else if (affinity == SQLITE_AFF_REAL) { affinity = SQLITE_AFF_NUMERIC; } - if( pKeyInfo ){ - assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); + 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; + 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); + if (addrOnce && !sqlite3ExprIsConstant(pE2)) { + sqlite3VdbeChangeToNoop(v, addrOnce - 1); sqlite3VdbeChangeToNoop(v, addrOnce); ExprClearProperty(pExpr, EP_Subrtn); addrOnce = 0; @@ -106868,17 +105794,15 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN( sqlite3ReleaseTempReg(pParse, r1); sqlite3ReleaseTempReg(pParse, r2); } - if( pKeyInfo ){ - sqlite3VdbeChangeP4(v, addr, (void *)pKeyInfo, P4_KEYINFO); + if (pKeyInfo) { + sqlite3VdbeChangeP4(v, addr, (void*)pKeyInfo, P4_KEYINFO); } - if( addrOnce ){ + 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); + 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); } @@ -106900,40 +105824,39 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN( ** 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) ); +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) ){ + 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); + 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) ); + 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; + 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: @@ -106945,8 +105868,9 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ ** 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); + 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 @@ -106959,57 +105883,53 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ ** 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); + 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 ){ + 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); + sqlite3VdbeAddOp3(v, OP_Null, 0, dest.iSDParm, dest.iSDParm + nReg - 1); VdbeComment((v, "Init subquery result")); - }else{ + } else { dest.eDest = SRT_Exists; sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iSDParm); VdbeComment((v, "Init EXISTS result")); } - if( pSel->pLimit ){ + 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; + sqlite3* db = pParse->db; pLimit = sqlite3Expr(db, TK_INTEGER, "0"); - if( pLimit ){ + if (pLimit) { pLimit->affExpr = SQLITE_AFF_NUMERIC; - pLimit = sqlite3PExpr(pParse, TK_NE, - sqlite3ExprDup(db, pSel->pLimit->pLeft, 0), pLimit); + pLimit = sqlite3PExpr(pParse, TK_NE, sqlite3ExprDup(db, pSel->pLimit->pLeft, 0), pLimit); } sqlite3ExprDelete(db, pSel->pLimit->pLeft); pSel->pLimit->pLeft = pLimit; - }else{ + } 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) ){ + 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 ){ + 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); + 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; @@ -107023,14 +105943,14 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ ** 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){ +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 ){ + 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 ){ + } else if (nVector != 1) { sqlite3VectorErrorMsg(pParse, pIn->pLeft); return 1; } @@ -107064,63 +105984,60 @@ SQLITE_PRIVATE int sqlite3ExprCheckIN(Parse *pParse, Expr *pIn){ ** 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 */ +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) ); + assert(!ExprHasVVAProperty(pExpr, EP_Immutable)); pLeft = pExpr->pLeft; - if( sqlite3ExprCheckIN(pParse, pExpr) ) return; + 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; + 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 */ + 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); + 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 - ); + 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; iokConstFactor==okConstFactor ); + 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 ){ + if (destIfNull != destIfFalse) { regCkNull = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp3(v, OP_BitAnd, rLhs, rLhs, regCkNull); } - for(ii=0; iinExpr; ii++){ + for (ii = 0; ii < pList->nExpr; ii++) { r2 = sqlite3ExprCodeTemp(pParse, pList->a[ii].pExpr, ®ToFree); - if( regCkNull && sqlite3ExprCanBeNull(pList->a[ii].pExpr) ){ + 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); + if (ii < pList->nExpr - 1 || destIfNull != destIfFalse) { + int op = rLhs != r2 ? OP_Eq : OP_NotNull; + sqlite3VdbeAddOp4(v, op, rLhs, labelOk, r2, (void*)pColl, P4_COLLSEQ); + VdbeCoverageIf(v, ii < pList->nExpr - 1 && op == OP_Eq); + VdbeCoverageIf(v, ii == pList->nExpr - 1 && op == OP_Eq); + VdbeCoverageIf(v, ii < pList->nExpr - 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); + } 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); + if (regCkNull) { + sqlite3VdbeAddOp2(v, OP_IsNull, regCkNull, destIfNull); + VdbeCoverage(v); sqlite3VdbeGoto(v, destIfFalse); } sqlite3VdbeResolveLabel(v, labelOk); @@ -107210,16 +106127,17 @@ static void sqlite3ExprCodeIN( ** 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 ){ + if (destIfNull == destIfFalse) { destStep2 = destIfFalse; - }else{ + } 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); + for (i = 0; i < nVector; i++) { + Expr* p = sqlite3VectorFieldSubexpr(pExpr->pLeft, i); + if (pParse->nErr) + goto sqlite3ExprCodeIN_oom_error; + if (sqlite3ExprCanBeNull(p)) { + sqlite3VdbeAddOp2(v, OP_IsNull, rLhs + i, destStep2); VdbeCoverage(v); } } @@ -107228,30 +106146,30 @@ static void sqlite3ExprCodeIN( ** of the RHS using the LHS as a probe. If found, the result is ** true. */ - if( eType==IN_INDEX_ROWID ){ + 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{ + addrTruthOp = sqlite3VdbeAddOp0(v, OP_Goto); /* Return True */ + } else { sqlite3VdbeAddOp4(v, OP_Affinity, rLhs, nVector, 0, zAff, nVector); - if( destIfFalse==destIfNull ){ + if (destIfFalse == destIfNull) { /* Combine Step 3 and Step 5 into a single opcode */ - sqlite3VdbeAddOp4Int(v, OP_NotFound, iTab, destIfFalse, - rLhs, nVector); VdbeCoverage(v); + 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); + 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 ){ + if (rRhsHasNull && nVector == 1) { sqlite3VdbeAddOp2(v, OP_NotNull, rRhsHasNull, destIfFalse); VdbeCoverage(v); } @@ -107259,7 +106177,8 @@ static void sqlite3ExprCodeIN( /* Step 5. If we do not care about the difference between NULL and ** FALSE, then just return false. */ - if( destIfFalse==destIfNull ) sqlite3VdbeGoto(v, destIfFalse); + 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 @@ -107268,32 +106187,32 @@ static void sqlite3ExprCodeIN( ** For a scalar LHS, it is sufficient to check just the first row ** of the RHS. */ - if( destStep6 ) sqlite3VdbeResolveLabel(v, destStep6); + if (destStep6) + sqlite3VdbeResolveLabel(v, destStep6); addrTop = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, destIfFalse); VdbeCoverage(v); - if( nVector>1 ){ + if (nVector > 1) { destNotNull = sqlite3VdbeMakeLabel(pParse); - }else{ + } 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 ){ + if (nVector > 1) { sqlite3VdbeResolveLabel(v, destNotNull); - sqlite3VdbeAddOp2(v, OP_Next, iTab, addrTop+1); + sqlite3VdbeAddOp2(v, OP_Next, iTab, addrTop + 1); VdbeCoverage(v); /* Step 7: If we reach this point, we know that the result must @@ -107305,7 +106224,8 @@ static void sqlite3ExprCodeIN( sqlite3VdbeJumpHere(v, addrTruthOp); sqlite3ExprCodeIN_finished: - if( rLhs!=rLhsOrig ) sqlite3ReleaseTempReg(pParse, rLhs); + if (rLhs != rLhsOrig) + sqlite3ReleaseTempReg(pParse, rLhs); VdbeComment((v, "end IN expr")); sqlite3ExprCodeIN_oom_error: sqlite3DbFree(pParse->db, aiMap); @@ -107322,79 +106242,78 @@ static void sqlite3ExprCodeIN( ** 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) ){ +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; + 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 ){ +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; + assert(i >= 0); + if (negFlag) + i = -i; sqlite3VdbeAddOp2(v, OP_Integer, i, iMem); - }else{ + } else { int c; i64 value; - const char *z = pExpr->u.zToken; - assert( z!=0 ); + const char* z = pExpr->u.zToken; + assert(z != 0); c = sqlite3DecOrHexToI64(z, &value); - if( (c==3 && !negFlag) || (c==2) || (negFlag && value==SMALLEST_INT64)){ + if ((c == 3 && !negFlag) || (c == 2) || (negFlag && value == SMALLEST_INT64)) { #ifdef SQLITE_OMIT_FLOATING_POINT - sqlite3ErrorMsg(pParse, "oversized integer: %s%#T", negFlag?"-":"",pExpr); + 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 + 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; } + } 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 */ -){ +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 ); + 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); + } else { + sqlite3ExprCodeGetColumnOfTable(pParse->pVdbe, pIdx->pTable, iTabCur, iTabCol, regOut); } } @@ -107403,77 +106322,75 @@ SQLITE_PRIVATE void sqlite3ExprCodeLoadIndexColumn( ** 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 */ -){ +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{ + 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 ){ + 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); + 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 ){ +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 ){ + if (iCol < 0 || iCol == pTab->iPKey) { sqlite3VdbeAddOp2(v, OP_Rowid, iTabCur, regOut); VdbeComment((v, "%s.rowid", pTab->zName)); - }else{ + } else { int op; int x; - if( IsVirtual(pTab) ){ + 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{ + } 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; + 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) ); + } 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 ); + } else { + x = sqlite3TableColumnToStorage(pTab, iCol); + testcase(x != iCol); op = OP_Column; } sqlite3VdbeAddOp3(v, op, iTabCur, x, regOut); @@ -107488,19 +106405,19 @@ SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable( ** 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 ); +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; + if (p5) { + VdbeOp* pOp = sqlite3VdbeGetOp(pParse->pVdbe, -1); + if (pOp->opcode == OP_Column) + pOp->p5 = p5; } return iReg; } @@ -107509,7 +106426,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeGetColumn( ** 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){ +SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse* pParse, int iFrom, int iTo, int nReg) { sqlite3VdbeAddOp3(pParse->pVdbe, OP_Move, iFrom, iTo, nReg); } @@ -107518,9 +106435,10 @@ SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse *pParse, int iFrom, int iTo, int n ** 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; +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; @@ -107537,26 +106455,26 @@ static void exprToRegister(Expr *pExpr, int iReg){ ** is not a temporary or if the expression is a vector set *piFreeable ** to 0. */ -static int exprCodeVector(Parse *pParse, Expr *p, int *piFreeable){ +static int exprCodeVector(Parse* pParse, Expr* p, int* piFreeable) { int iResult; int nResult = sqlite3ExprVectorSize(p); - if( nResult==1 ){ + if (nResult == 1) { iResult = sqlite3ExprCodeTemp(pParse, p, piFreeable); - }else{ + } else { *piFreeable = 0; - if( p->op==TK_SELECT ){ + if (p->op == TK_SELECT) { #if SQLITE_OMIT_SUBQUERY iResult = 0; #else iResult = sqlite3CodeSubselect(pParse, p); #endif - }else{ + } else { int i; - iResult = pParse->nMem+1; + iResult = pParse->nMem + 1; pParse->nMem += nResult; - assert( ExprUseXList(p) ); - for(i=0; ix.pList->a[i].pExpr, i+iResult); + assert(ExprUseXList(p)); + for (i = 0; i < nResult; i++) { + sqlite3ExprCodeFactorable(pParse, p->x.pList->a[i].pExpr, i + iResult); } } } @@ -107567,9 +106485,9 @@ static int exprCodeVector(Parse *pParse, Expr *p, int *piFreeable){ ** 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 */ +static void setDoNotMergeFlagOnCopy(Vdbe* v) { + if (sqlite3VdbeGetOp(v, -1)->opcode == OP_Copy) { + sqlite3VdbeChangeP5(v, 1); /* Tag trailing OP_Copy as not mergable */ } } @@ -107577,19 +106495,18 @@ static void setDoNotMergeFlagOnCopy(Vdbe *v){ ** 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 */ -){ +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 ); + 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 ){ + 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 @@ -107597,9 +106514,9 @@ static int exprCodeInlineFunction( */ int endCoalesce = sqlite3VdbeMakeLabel(pParse); int i; - assert( nFarg>=2 ); + assert(nFarg >= 2); sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target); - for(i=1; ia[i].pExpr, target); @@ -107617,10 +106534,10 @@ static int exprCodeInlineFunction( } #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC case INLINEFUNC_sqlite_offset: { - Expr *pArg = pFarg->a[0].pExpr; - if( pArg->op==TK_COLUMN && pArg->iTable>=0 ){ + Expr* pArg = pFarg->a[0].pExpr; + if (pArg->op == TK_COLUMN && pArg->iTable >= 0) { sqlite3VdbeAddOp3(v, OP_Offset, pArg->iTable, pArg->iColumn, target); - }else{ + } else { sqlite3VdbeAddOp2(v, OP_Null, 0, target); } break; @@ -107630,44 +106547,38 @@ static int exprCodeInlineFunction( /* The UNLIKELY() function is a no-op. The result is the value ** of the first argument. */ - assert( nFarg==1 || nFarg==2 ); + 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 - */ + /*********************************************************************** + ** 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); + 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); + 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 ); + 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{ + 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; @@ -107678,12 +106589,11 @@ static int exprCodeInlineFunction( ** the type affinity of the argument. This is used for testing of ** the SQLite type logic. */ - const char *azAff[] = { "blob", "text", "numeric", "integer", "real" }; + const char* azAff[] = {"blob", "text", "numeric", "integer", "real"}; char aff; - assert( nFarg==1 ); + assert(nFarg == 1); aff = sqlite3ExprAffinity(pFarg->a[0].pExpr); - sqlite3VdbeLoadString(v, target, - (aff<=SQLITE_AFF_NONE) ? "none" : azAff[aff-SQLITE_AFF_BLOB]); + sqlite3VdbeLoadString(v, target, (aff <= SQLITE_AFF_NONE) ? "none" : azAff[aff - SQLITE_AFF_BLOB]); break; } #endif /* !defined(SQLITE_UNTESTABLE) */ @@ -107691,7 +106601,6 @@ static int exprCodeInlineFunction( return target; } - /* ** Generate code into the current Vdbe to evaluate the given ** expression. Attempt to store the results in register "target". @@ -107703,46 +106612,44 @@ static int exprCodeInlineFunction( ** 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 */ +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 ); + assert(target > 0 && target <= pParse->nMem); + assert(v != 0); expr_code_doover: - if( pExpr==0 ){ + if (pExpr == 0) { op = TK_NULL; - }else{ - assert( !ExprHasVVAProperty(pExpr,EP_Immutable) ); + } else { + assert(!ExprHasVVAProperty(pExpr, EP_Immutable)); op = pExpr->op; } - switch( op ){ + switch (op) { case TK_AGG_COLUMN: { - AggInfo *pAggInfo = pExpr->pAggInfo; - struct AggInfo_col *pCol; - assert( pAggInfo!=0 ); - assert( pExpr->iAgg>=0 && pExpr->iAggnColumn ); + AggInfo* pAggInfo = pExpr->pAggInfo; + struct AggInfo_col* pCol; + assert(pAggInfo != 0); + assert(pExpr->iAgg >= 0 && pExpr->iAgg < pAggInfo->nColumn); pCol = &pAggInfo->aCol[pExpr->iAgg]; - if( !pAggInfo->directMode ){ - assert( pCol->iMem>0 ); + 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 ){ + } 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); } } @@ -107754,7 +106661,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) case TK_COLUMN: { int iTab = pExpr->iTable; int iReg; - if( ExprHasProperty(pExpr, EP_FixedCol) ){ + 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 @@ -107762,78 +106669,74 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) ** constant. */ int aff; - iReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft,target); - assert( ExprUseYTab(pExpr) ); - if( pExpr->y.pTab ){ + iReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); + assert(ExprUseYTab(pExpr)); + if (pExpr->y.pTab) { aff = sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn); - }else{ + } else { aff = pExpr->affExpr; } - if( aff>SQLITE_AFF_BLOB ){ + 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); + 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 ){ + 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; + Column* pCol; + Table* pTab; int iSrc; int iCol = pExpr->iColumn; - assert( ExprUseYTab(pExpr) ); + assert(ExprUseYTab(pExpr)); pTab = pExpr->y.pTab; - assert( pTab!=0 ); - assert( iCol>=XN_ROWID ); - assert( iColnCol ); - if( iCol<0 ){ - return -1-pParse->iSelfTab; + assert(pTab != 0); + assert(iCol >= XN_ROWID); + assert(iCol < pTab->nCol); + if (iCol < 0) { + return -1 - pParse->iSelfTab; } pCol = pTab->aCol + iCol; - testcase( iCol!=sqlite3TableColumnToStorage(pTab,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); + 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 ){ + if (pCol->colFlags & COLFLAG_NOTAVAIL) { sqlite3ExprCodeGeneratedColumn(pParse, pTab, pCol, iSrc); } - pCol->colFlags &= ~(COLFLAG_BUSY|COLFLAG_NOTAVAIL); + pCol->colFlags &= ~(COLFLAG_BUSY | COLFLAG_NOTAVAIL); return iSrc; - }else + } 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{ + 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 ){ + 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; @@ -107848,13 +106751,13 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) } #ifndef SQLITE_OMIT_FLOATING_POINT case TK_FLOAT: { - assert( !ExprHasProperty(pExpr, EP_IntValue) ); + assert(!ExprHasProperty(pExpr, EP_IntValue)); codeReal(v, pExpr->u.zToken, 0, target); return target; } #endif case TK_STRING: { - assert( !ExprHasProperty(pExpr, EP_IntValue) ); + assert(!ExprHasProperty(pExpr, EP_IntValue)); sqlite3VdbeLoadString(v, target, pExpr->u.zToken); return target; } @@ -107863,34 +106766,34 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) ** 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 ); + 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]=='\'' ); + 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]=='\'' ); + assert(z[n] == '\''); zBlob = sqlite3HexToBlob(sqlite3VdbeDb(v), z, n); - sqlite3VdbeAddOp4(v, OP_Blob, n/2, target, 0, zBlob, P4_DYNAMIC); + 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 ); + 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)) ); + 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); } @@ -107903,19 +106806,18 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) case TK_CAST: { /* Expressions of the form: CAST(pLeft AS token) */ inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); - if( inReg!=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)); + 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; + op = (op == TK_IS) ? TK_EQ : TK_NE; p5 = SQLITE_NULLEQ; /* fall-through */ case TK_LT: @@ -107924,29 +106826,39 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) case TK_GE: case TK_NE: case TK_EQ: { - Expr *pLeft = pExpr->pLeft; - if( sqlite3ExprIsVector(pLeft) ){ + Expr* pLeft = pExpr->pLeft; + if (sqlite3ExprIsVector(pLeft)) { codeVectorCompare(pParse, pExpr, target, op, p5); - }else{ + } 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 ){ + 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{ + } else { sqlite3VdbeAddOp3(v, OP_ZeroOrNull, r1, inReg, r2); } - testcase( regFree1==0 ); - testcase( regFree2==0 ); + testcase(regFree1 == 0); + testcase(regFree2 == 0); } break; } @@ -107962,158 +106874,169 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) 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 ); + 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 ); + testcase(regFree1 == 0); + testcase(regFree2 == 0); break; } case TK_UMINUS: { - Expr *pLeft = pExpr->pLeft; - assert( pLeft ); - if( pLeft->op==TK_INTEGER ){ + 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) ); + } else if (pLeft->op == TK_FLOAT) { + assert(!ExprHasProperty(pExpr, EP_IntValue)); codeReal(v, pLeft->u.zToken, 1, target); return target; #endif - }else{ + } else { tempX.op = TK_INTEGER; - tempX.flags = EP_IntValue|EP_TokenOnly; + 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 ); + 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 ); + 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 ); + 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 */ + int isTrue; /* IS TRUE or IS NOT TRUE */ + int bNormal; /* IS TRUE or IS FALSE */ r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); - testcase( regFree1==0 ); + testcase(regFree1 == 0); isTrue = sqlite3ExprTruthValue(pExpr->pRight); - bNormal = pExpr->op2==TK_IS; - testcase( isTrue && bNormal); - testcase( !isTrue && bNormal); + 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 ); + 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 ); + testcase(regFree1 == 0); addr = sqlite3VdbeAddOp1(v, op, r1); - VdbeCoverageIf(v, op==TK_ISNULL); - VdbeCoverageIf(v, op==TK_NOTNULL); + 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) ); + 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{ + } 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 */ + 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) ){ + if (ExprHasProperty(pExpr, EP_WinFunc)) { return pExpr->y.pWin->regResult; } #endif - if( ConstFactorOk(pParse) && sqlite3ExprIsConstantNotJoin(pExpr) ){ + 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) ); + assert(!ExprHasProperty(pExpr, EP_TokenOnly)); + assert(ExprUseXList(pExpr)); pFarg = pExpr->x.pList; nFarg = pFarg ? pFarg->nExpr : 0; - assert( !ExprHasProperty(pExpr, EP_IntValue) ); + 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 ){ + if (pDef == 0 && pParse->explain) { pDef = sqlite3FindFunction(db, "unknown", nFarg, enc, 0); } #endif - if( pDef==0 || pDef->xFinalize!=0 ){ + 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) ){ + 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 ); + for (i = 0; i < nFarg; i++) { + if (i < 32 && sqlite3ExprIsConstant(pFarg->a[i].pExpr)) { + testcase(i == 31); constMask |= MASKBIT32(i); } - if( (pDef->funcFlags & SQLITE_FUNC_NEEDCOLL)!=0 && !pColl ){ + if ((pDef->funcFlags & SQLITE_FUNC_NEEDCOLL) != 0 && !pColl) { pColl = sqlite3ExprCollSeq(pParse, pFarg->a[i].pExpr); } } - if( pFarg ){ - if( constMask ){ - r1 = pParse->nMem+1; + if (pFarg) { + if (constMask) { + r1 = pParse->nMem + 1; pParse->nMem += nFarg; - }else{ + } else { r1 = sqlite3GetTempRange(pParse, nFarg); } @@ -108122,23 +107045,21 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) ** or OPFLAG_TYPEOFARG respectively, to avoid unnecessary data ** loading. */ - if( (pDef->funcFlags & (SQLITE_FUNC_LENGTH|SQLITE_FUNC_TYPEOF))!=0 ){ + if ((pDef->funcFlags & (SQLITE_FUNC_LENGTH | SQLITE_FUNC_TYPEOF)) != 0) { u8 exprOp; - assert( nFarg==1 ); - assert( pFarg->a[0].pExpr!=0 ); + 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); + 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{ + sqlite3ExprCodeExprList(pParse, pFarg, r1, 0, SQLITE_ECEL_DUP | SQLITE_ECEL_FACTOR); + } else { r1 = 0; } #ifndef SQLITE_OMIT_VIRTUALTABLE @@ -108154,22 +107075,22 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) ** "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) ){ + if (nFarg >= 2 && ExprHasProperty(pExpr, EP_InfixFunc)) { pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[1].pExpr); - }else if( nFarg>0 ){ + } 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); + 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 ){ + sqlite3VdbeAddFunctionCall(pParse, constMask, r1, target, nFarg, pDef, pExpr->op2); + if (nFarg) { + if (constMask == 0) { sqlite3ReleaseTempRange(pParse, r1, nFarg); - }else{ + } else { sqlite3VdbeReleaseRegisters(pParse, r1, nFarg, constMask, 1); } } @@ -108179,32 +107100,28 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) case TK_EXISTS: case TK_SELECT: { int nCol; - testcase( op==TK_EXISTS ); - testcase( op==TK_SELECT ); - if( pParse->db->mallocFailed ){ + 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 - ){ + } else if (op == TK_SELECT && ALWAYS(ExprUseXSelect(pExpr)) && (nCol = pExpr->x.pSelect->pEList->nExpr) != 1) { sqlite3SubselectError(pParse, nCol, 1); - }else{ + } else { return sqlite3CodeSubselect(pParse, pExpr); } break; } case TK_SELECT_COLUMN: { int n; - Expr *pLeft = pExpr->pLeft; - if( pLeft->iTable==0 || pParse->withinRJSubrtn > pLeft->op2 ){ + 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 ); + 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); + if (pExpr->iTable != n) { + sqlite3ErrorMsg(pParse, "%d columns assigned %d values", pExpr->iTable, n); } return pLeft->iTable + pExpr->iColumn; } @@ -108221,7 +107138,6 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) } #endif /* SQLITE_OMIT_SUBQUERY */ - /* ** x BETWEEN y AND z ** @@ -108238,18 +107154,15 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) return target; } case TK_COLLATE: { - if( !ExprHasProperty(pExpr, EP_Collate) - && ALWAYS(pExpr->pLeft) - && pExpr->pLeft->op==TK_FUNCTION - ){ + if (!ExprHasProperty(pExpr, EP_Collate) && ALWAYS(pExpr->pLeft) && pExpr->pLeft->op == TK_FUNCTION) { inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); - if( inReg!=target ){ + if (inReg != target) { sqlite3VdbeAddOp2(v, OP_SCopy, inReg, target); inReg = target; } sqlite3VdbeAddOp1(v, OP_ClrSubtype, inReg); return inReg; - }else{ + } else { pExpr = pExpr->pLeft; goto expr_code_doover; /* 2018-04-28: Prevent deep recursion. */ } @@ -108286,26 +107199,23 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) ** p1==1 -> old.a p1==4 -> new.a ** p1==2 -> old.b p1==5 -> new.b */ - Table *pTab; + Table* pTab; int iCol; int p1; - assert( ExprUseYTab(pExpr) ); + assert(ExprUseYTab(pExpr)); pTab = pExpr->y.pTab; iCol = pExpr->iColumn; - p1 = pExpr->iTable * (pTab->nCol+1) + 1 - + sqlite3TableColumnToStorage(pTab, iCol); + 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) ); + assert(pExpr->iTable == 0 || pExpr->iTable == 1); + assert(iCol >= -1 && iCol < pTab->nCol); + 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) - )); + 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 @@ -108313,7 +107223,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) ** ** 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 ){ + if (iCol >= 0 && pTab->aCol[iCol].affinity == SQLITE_AFF_REAL) { sqlite3VdbeAddOp1(v, OP_RealAffinity, target); } #endif @@ -108369,33 +107279,33 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) ** 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 ); + 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 ){ + if ((pX = pExpr->pLeft) != 0) { pDel = sqlite3ExprDup(db, pX, 0); - if( db->mallocFailed ){ + if (db->mallocFailed) { sqlite3ExprDelete(db, pDel); break; } - testcase( pX->op==TK_COLUMN ); + testcase(pX->op == TK_COLUMN); exprToRegister(pDel, exprCodeVector(pParse, pDel, ®Free1)); - testcase( regFree1==0 ); + testcase(regFree1 == 0); memset(&opCompare, 0, sizeof(opCompare)); opCompare.op = TK_EQ; opCompare.pLeft = pDel; @@ -108406,24 +107316,24 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) ** purposes and possibly overwritten. */ regFree1 = 0; } - for(i=0; iop==TK_COLUMN ); + testcase(pTest->op == TK_COLUMN); sqlite3ExprIfFalse(pParse, pTest, nextCase, SQLITE_JUMPIFNULL); - testcase( aListelem[i+1].pExpr->op==TK_COLUMN ); - sqlite3ExprCode(pParse, aListelem[i+1].pExpr, target); + 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{ + if ((nExpr & 1) != 0) { + sqlite3ExprCode(pParse, pEList->a[nExpr - 1].pExpr, target); + } else { sqlite3VdbeAddOp2(v, OP_Null, 0, target); } sqlite3ExprDelete(db, pDel); @@ -108433,28 +107343,21 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) } #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"); + 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 ){ + 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); + 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); + } else { + sqlite3HaltConstraint(pParse, pParse->pTriggerTab ? SQLITE_CONSTRAINT_TRIGGER : SQLITE_ERROR, pExpr->affExpr, pExpr->u.zToken, 0, + 0); } break; @@ -108483,46 +107386,46 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) ** 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) ); +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; + 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 - ){ + 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; + if (pExpr != 0 && ExprHasProperty(pExpr, EP_HasFunc)) { + Vdbe* v = pParse->pVdbe; int addr; - assert( v ); - addr = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + assert(v); + addr = sqlite3VdbeAddOp0(v, OP_Once); + VdbeCoverage(v); pParse->okConstFactor = 0; - if( !pParse->db->mallocFailed ){ - if( regDest<0 ) regDest = ++pParse->nMem; + 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{ + } 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; + 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; } @@ -108542,22 +107445,18 @@ SQLITE_PRIVATE int sqlite3ExprCodeRunJustOnce( ** 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){ +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; + if (ConstFactorOk(pParse) && ALWAYS(pExpr != 0) && pExpr->op != TK_REGISTER && sqlite3ExprIsConstantNotJoin(pExpr)) { + *pReg = 0; r2 = sqlite3ExprCodeRunJustOnce(pParse, pExpr, -1); - }else{ + } else { int r1 = sqlite3GetTempReg(pParse); r2 = sqlite3ExprCodeTarget(pParse, pExpr, r1); - if( r2==r1 ){ + if (r2 == r1) { *pReg = r1; - }else{ + } else { sqlite3ReleaseTempReg(pParse, r1); *pReg = 0; } @@ -108570,19 +107469,20 @@ SQLITE_PRIVATE int sqlite3ExprCodeTemp(Parse *pParse, Expr *pExpr, int *pReg){ ** results in register target. The results are guaranteed to appear ** in register target. */ -SQLITE_PRIVATE void sqlite3ExprCode(Parse *pParse, Expr *pExpr, int 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; + 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 ){ + if (inReg != target) { u8 op; - if( ALWAYS(pExpr) && ExprHasProperty(pExpr,EP_Subquery) ){ + if (ALWAYS(pExpr) && ExprHasProperty(pExpr, EP_Subquery)) { op = OP_Copy; - }else{ + } else { op = OP_SCopy; } sqlite3VdbeAddOp2(pParse->pVdbe, op, inReg, target); @@ -108594,10 +107494,11 @@ SQLITE_PRIVATE void sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ ** 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; +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); + if (!db->mallocFailed) + sqlite3ExprCode(pParse, pExpr, target); sqlite3ExprDelete(db, pExpr); } @@ -108607,10 +107508,10 @@ SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse *pParse, Expr *pExpr, int target){ ** 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) ){ +SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse* pParse, Expr* pExpr, int target) { + if (pParse->okConstFactor && sqlite3ExprIsConstantNotJoin(pExpr)) { sqlite3ExprCodeRunJustOnce(pParse, pExpr, target); - }else{ + } else { sqlite3ExprCodeCopy(pParse, pExpr, target); } } @@ -108635,54 +107536,49 @@ SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse *pParse, Expr *pExpr, int ta ** 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; +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 */ + 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; + if (!ConstFactorOk(pParse)) + flags &= ~SQLITE_ECEL_FACTOR; + for (pItem = pList->a, i = 0; i < n; i++, pItem++) { + Expr* pExpr = pItem->pExpr; #ifdef SQLITE_ENABLE_SORTER_REFERENCES - if( pItem->fg.bSorterRef ){ + if (pItem->fg.bSorterRef) { i--; n--; - }else + } else #endif - if( (flags & SQLITE_ECEL_REF)!=0 && (j = pItem->u.x.iOrderByCol)>0 ){ - if( flags & SQLITE_ECEL_OMITREF ){ + 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 { + 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 */ - ){ + } 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); + } else { + sqlite3VdbeAddOp2(v, copyOp, inReg, target + i); } } } @@ -108710,27 +107606,26 @@ SQLITE_PRIVATE int sqlite3ExprCodeExprList( ** ** 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 */ -){ +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; + 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) ); + assert(ExprUseXList(pExpr)); pDel = sqlite3ExprDup(db, pExpr->pLeft, 0); - if( db->mallocFailed==0 ){ + if (db->mallocFailed == 0) { exprAnd.op = TK_AND; exprAnd.pLeft = &compLeft; exprAnd.pRight = &compRight; @@ -108741,9 +107636,9 @@ static void exprCodeBetween( compRight.pLeft = pDel; compRight.pRight = pExpr->x.pList->a[1].pExpr; exprToRegister(pDel, exprCodeVector(pParse, pDel, ®Free1)); - if( xJump ){ + if (xJump) { xJump(pParse, &exprAnd, dest, jumpIfNull); - }else{ + } 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, @@ -108757,15 +107652,15 @@ static void exprCodeBetween( 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 ); + 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); } /* @@ -108782,106 +107677,116 @@ static void exprCodeBetween( ** 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; +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) ); + 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 ){ + switch (op) { case TK_AND: case TK_OR: { - Expr *pAlt = sqlite3ExprSimplifiedAndOr(pExpr); - if( pAlt!=pExpr ){ + Expr* pAlt = sqlite3ExprSimplifiedAndOr(pExpr); + if (pAlt != pExpr) { sqlite3ExprIfTrue(pParse, pAlt, dest, jumpIfNull); - }else if( op==TK_AND ){ + } else if (op == TK_AND) { int d2 = sqlite3VdbeMakeLabel(pParse); - testcase( jumpIfNull==0 ); - sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2, - jumpIfNull^SQLITE_JUMPIFNULL); + testcase(jumpIfNull == 0); + sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2, jumpIfNull ^ SQLITE_JUMPIFNULL); sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); sqlite3VdbeResolveLabel(v, d2); - }else{ - testcase( jumpIfNull==0 ); + } else { + testcase(jumpIfNull == 0); sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); } break; } case TK_NOT: { - testcase( jumpIfNull==0 ); + 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; + 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); + 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; + 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: + /* 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 ); + 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 ); + 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 ); + 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 ); + VdbeCoverageIf(v, op == TK_ISNULL); + VdbeCoverageIf(v, op == TK_NOTNULL); + testcase(regFree1 == 0); break; } case TK_BETWEEN: { - testcase( jumpIfNull==0 ); + testcase(jumpIfNull == 0); exprCodeBetween(pParse, pExpr, dest, sqlite3ExprIfTrue, jumpIfNull); break; } @@ -108897,16 +107802,16 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int #endif default: { default_expr: - if( ExprAlwaysTrue(pExpr) ){ + if (ExprAlwaysTrue(pExpr)) { sqlite3VdbeGoto(v, dest); - }else if( ExprAlwaysFalse(pExpr) ){ + } else if (ExprAlwaysFalse(pExpr)) { /* No-op */ - }else{ + } else { r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); - sqlite3VdbeAddOp3(v, OP_If, r1, dest, jumpIfNull!=0); + sqlite3VdbeAddOp3(v, OP_If, r1, dest, jumpIfNull != 0); VdbeCoverage(v); - testcase( regFree1==0 ); - testcase( jumpIfNull==0 ); + testcase(regFree1 == 0); + testcase(jumpIfNull == 0); } break; } @@ -108924,17 +107829,19 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int ** 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; +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) ); + 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: ** @@ -108954,116 +107861,124 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int ** 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); + 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 ){ + */ + 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 ){ + Expr* pAlt = sqlite3ExprSimplifiedAndOr(pExpr); + if (pAlt != pExpr) { sqlite3ExprIfFalse(pParse, pAlt, dest, jumpIfNull); - }else if( pExpr->op==TK_AND ){ - testcase( jumpIfNull==0 ); + } else if (pExpr->op == TK_AND) { + testcase(jumpIfNull == 0); sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); - }else{ + } else { int d2 = sqlite3VdbeMakeLabel(pParse); - testcase( jumpIfNull==0 ); - sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, - jumpIfNull^SQLITE_JUMPIFNULL); + 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 ); + 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; + 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 ){ + testcase(isTrue && isNot); + testcase(!isTrue && isNot); + if (isTrue ^ isNot) { /* IS TRUE and IS NOT FALSE */ - sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, - isNot ? 0 : SQLITE_JUMPIFNULL); + sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, isNot ? 0 : SQLITE_JUMPIFNULL); - }else{ + } else { /* IS FALSE and IS NOT TRUE */ - sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, - isNot ? 0 : SQLITE_JUMPIFNULL); + 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; + 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: + /* 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 ); + 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 ); + 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 ); + 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 ); + testcase(jumpIfNull == 0); exprCodeBetween(pParse, pExpr, dest, sqlite3ExprIfFalse, jumpIfNull); break; } #ifndef SQLITE_OMIT_SUBQUERY case TK_IN: { - if( jumpIfNull ){ + if (jumpIfNull) { sqlite3ExprCodeIN(pParse, pExpr, dest, dest); - }else{ + } else { int destIfNull = sqlite3VdbeMakeLabel(pParse); sqlite3ExprCodeIN(pParse, pExpr, dest, destIfNull); sqlite3VdbeResolveLabel(v, destIfNull); @@ -109073,16 +107988,16 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int #endif default: { default_expr: - if( ExprAlwaysFalse(pExpr) ){ + if (ExprAlwaysFalse(pExpr)) { sqlite3VdbeGoto(v, dest); - }else if( ExprAlwaysTrue(pExpr) ){ + } else if (ExprAlwaysTrue(pExpr)) { /* no-op */ - }else{ + } else { r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); - sqlite3VdbeAddOp3(v, OP_IfNot, r1, dest, jumpIfNull!=0); + sqlite3VdbeAddOp3(v, OP_IfNot, r1, dest, jumpIfNull != 0); VdbeCoverage(v); - testcase( regFree1==0 ); - testcase( jumpIfNull==0 ); + testcase(regFree1 == 0); + testcase(jumpIfNull == 0); } break; } @@ -109096,10 +108011,10 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int ** 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 ){ +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); @@ -109118,25 +108033,21 @@ SQLITE_PRIVATE void sqlite3ExprIfFalseDup(Parse *pParse, Expr *pExpr, int dest,i ** 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 -){ +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 ){ + 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 ){ + 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); + res = 0 == sqlite3MemCompare(pL, pR, 0); } sqlite3ValueFree(pR); sqlite3ValueFree(pL); @@ -109174,79 +108085,73 @@ static int exprCompareVariable( ** 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 -){ +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 (pA == 0 || pB == 0) { + return pB == pA ? 0 : 2; } - if( pParse && pA->op==TK_VARIABLE && exprCompareVariable(pParse, pA, pB) ){ + 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 ){ + 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 ){ + 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 ){ + 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; + 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) ){ + 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 ){ + 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 ){ + } 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 - ){ + } 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 ){ + 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; } } @@ -109270,17 +108175,22 @@ SQLITE_PRIVATE int sqlite3ExprCompare( ** 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){ +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++){ + if (pA == 0 && pB == 0) + return 0; + if (pA == 0 || pB == 0) + return 1; + if (pA->nExpr != pB->nExpr) + return 1; + for (i = 0; i < pA->nExpr; 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; + 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; } @@ -109289,11 +108199,8 @@ SQLITE_PRIVATE int sqlite3ExprListCompare(const ExprList *pA, const ExprList *pB ** 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); +SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr* pA, Expr* pB, int iTab) { + return sqlite3ExprCompare(0, sqlite3ExprSkipCollateAndLikely(pA), sqlite3ExprSkipCollateAndLikely(pB), iTab); } /* @@ -109302,34 +108209,33 @@ SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr *pA,Expr *pB, int iTab){ ** 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; +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 ){ + 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) ); + 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) ); + 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) - ){ + 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); @@ -109347,12 +108253,12 @@ static int exprImpliesNotNull( case TK_RSHIFT: case TK_CONCAT: seenNot = 1; - /* no break */ deliberate_fall_through - case TK_STAR: + /* 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; + if (exprImpliesNotNull(pParse, p->pRight, pNN, iTab, seenNot)) + return 1; /* no break */ deliberate_fall_through } case TK_SPAN: @@ -109362,8 +108268,10 @@ static int exprImpliesNotNull( return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, seenNot); } case TK_TRUTH: { - if( seenNot ) return 0; - if( p->op2!=TK_IS ) return 0; + if (seenNot) + return 0; + if (p->op2 != TK_IS) + return 0; return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); } case TK_BITNOT: @@ -109399,24 +108307,15 @@ static int exprImpliesNotNull( ** 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 ){ +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) ) - ){ + 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) - ){ + if (pE2->op == TK_NOTNULL && exprImpliesNotNull(pParse, pE1, pE2->pLeft, iTab, 0)) { return 1; } return 0; @@ -109431,11 +108330,12 @@ SQLITE_PRIVATE int sqlite3ExprImpliesExpr( ** 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 ){ +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: @@ -109446,28 +108346,28 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ 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 ); + 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 ){ + if (pWalker->u.iCur == pExpr->iTable) { pWalker->eCode = 1; return WRC_Abort; } return WRC_Prune; case TK_AND: - if( pWalker->eCode==0 ){ + if (pWalker->eCode == 0) { sqlite3WalkExpr(pWalker, pExpr->pLeft); - if( pWalker->eCode ){ + if (pWalker->eCode) { pWalker->eCode = 0; sqlite3WalkExpr(pWalker, pExpr->pRight); } @@ -109475,8 +108375,8 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ return WRC_Prune; case TK_BETWEEN: - if( sqlite3WalkExpr(pWalker, pExpr->pLeft)==WRC_Abort ){ - assert( pWalker->eCode ); + if (sqlite3WalkExpr(pWalker, pExpr->pLeft) == WRC_Abort) { + assert(pWalker->eCode); return WRC_Abort; } return WRC_Prune; @@ -109490,25 +108390,20 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ 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 ); + 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)) - ){ + 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 @@ -109540,15 +108435,17 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ ** be non-NULL, then the LEFT JOIN can be safely converted into an ** ordinary join. */ -SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr *p, int iTab){ +SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr* p, int iTab) { Walker w; p = sqlite3ExprSkipCollateAndLikely(p); - if( p==0 ) return 0; - if( p->op==TK_NOTNULL ){ + 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; + } else { + while (p->op == TK_AND) { + if (sqlite3ExprImpliesNonNullRow(p->pLeft, iTab)) + return 1; p = p->pRight; } } @@ -109569,8 +108466,8 @@ SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr *p, int iTab){ ** 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 */ + Index* pIdx; /* The index to be tested for coverage */ + int iCur; /* Cursor number for the table corresponding to the index */ }; /* @@ -109578,11 +108475,9 @@ struct IdxCover { ** 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 - ){ +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; } @@ -109599,11 +108494,10 @@ static int exprIdxCover(Walker *pWalker, Expr *pExpr){ ** 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 */ -){ +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)); @@ -109615,15 +108509,14 @@ SQLITE_PRIVATE int sqlite3ExprCoveredByIndex( 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 */ + 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 */ }; /* @@ -109634,31 +108527,32 @@ struct RefSrcList { ** ** 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; +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; + 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 ){ + piNew = sqlite3DbRealloc(p->db, p->aiExclude, p->nExclude * sizeof(int)); + if (piNew == 0) { p->nExclude = 0; return WRC_Abort; - }else{ + } else { p->aiExclude = piNew; } - for(i=0; inSrc; i++, j++){ - p->aiExclude[j] = pSrc->a[i].iCursor; + for (i = 0; i < pSrc->nSrc; 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 ); +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; } } @@ -109671,22 +108565,21 @@ static void selectRefLeave(Walker *pWalker, Select *pSelect){ ** 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 - ){ +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; + struct RefSrcList* p = pWalker->u.pRefSrcList; + SrcList* pSrc = p->pRef; int nSrc = pSrc ? pSrc->nSrc : 0; - for(i=0; iiTable==pSrc->a[i].iCursor ){ + for (i = 0; i < nSrc; i++) { + if (pExpr->iTable == pSrc->a[i].iCursor) { pWalker->eCode |= 1; return WRC_Continue; } } - for(i=0; inExclude && p->aiExclude[i]!=pExpr->iTable; i++){} - if( i>=p->nExclude ){ + for (i = 0; i < p->nExclude && p->aiExclude[i] != pExpr->iTable; i++) { + } + if (i >= p->nExclude) { pWalker->eCode |= 2; } } @@ -109708,7 +108601,7 @@ static int exprRefToSrcList(Walker *pWalker, Expr *pExpr){ ** 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){ +SQLITE_PRIVATE int sqlite3ReferencesSrcList(Parse* pParse, Expr* pExpr, SrcList* pSrcList) { Walker w; struct RefSrcList x; memset(&w, 0, sizeof(w)); @@ -109719,20 +108612,20 @@ SQLITE_PRIVATE int sqlite3ReferencesSrcList(Parse *pParse, Expr *pExpr, SrcList w.u.pRefSrcList = &x; x.db = pParse->db; x.pRef = pSrcList; - assert( pExpr->op==TK_AGG_FUNCTION ); - assert( ExprUseXList(pExpr) ); + assert(pExpr->op == TK_AGG_FUNCTION); + assert(ExprUseXList(pExpr)); sqlite3WalkExprList(&w, pExpr->x.pList); #ifndef SQLITE_OMIT_WINDOWFUNC - if( ExprHasProperty(pExpr, EP_WinFunc) ){ + if (ExprHasProperty(pExpr, EP_WinFunc)) { sqlite3WalkExpr(&w, pExpr->y.pWin->pFilter); } #endif sqlite3DbFree(pParse->db, x.aiExclude); - if( w.eCode & 0x01 ){ + if (w.eCode & 0x01) { return 1; - }else if( w.eCode ){ + } else if (w.eCode) { return 0; - }else{ + } else { return -1; } } @@ -109750,29 +108643,27 @@ SQLITE_PRIVATE int sqlite3ReferencesSrcList(Parse *pParse, Expr *pExpr, SrcList ** 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; +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 ){ + 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 && iAgg < pAggInfo->nColumn); + if (pAggInfo->aCol[iAgg].pCExpr == pExpr) { pExpr = sqlite3ExprDup(db, pExpr, 0); - if( pExpr ){ + if (pExpr) { pAggInfo->aCol[iAgg].pCExpr = pExpr; sqlite3ExprDeferredDelete(pParse, pExpr); } } - }else{ - assert( iAgg>=0 && iAggnFunc ); - if( pAggInfo->aFunc[iAgg].pFExpr==pExpr ){ + } else { + assert(iAgg >= 0 && iAgg < pAggInfo->nFunc); + if (pAggInfo->aFunc[iAgg].pFExpr == pExpr) { pExpr = sqlite3ExprDup(db, pExpr, 0); - if( pExpr ){ + if (pExpr) { pAggInfo->aFunc[iAgg].pFExpr = pExpr; sqlite3ExprDeferredDelete(pParse, pExpr); } @@ -109786,7 +108677,7 @@ static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){ ** 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){ +SQLITE_PRIVATE void sqlite3AggInfoPersistWalkerInit(Walker* pWalker, Parse* pParse) { memset(pWalker, 0, sizeof(*pWalker)); pWalker->pParse = pParse; pWalker->xExprCallback = agginfoPersistExprCb; @@ -109797,15 +108688,9 @@ SQLITE_PRIVATE void sqlite3AggInfoPersistWalkerInit(Walker *pWalker, Parse *pPar ** 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){ +static int addAggInfoColumn(sqlite3* db, AggInfo* pInfo) { int i; - pInfo->aCol = sqlite3ArrayAllocate( - db, - pInfo->aCol, - sizeof(pInfo->aCol[0]), - &pInfo->nColumn, - &i - ); + pInfo->aCol = sqlite3ArrayAllocate(db, pInfo->aCol, sizeof(pInfo->aCol[0]), &pInfo->nColumn, &i); return i; } @@ -109813,15 +108698,9 @@ static int addAggInfoColumn(sqlite3 *db, AggInfo *pInfo){ ** 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){ +static int addAggInfoFunc(sqlite3* db, AggInfo* pInfo) { int i; - pInfo->aFunc = sqlite3ArrayAllocate( - db, - pInfo->aFunc, - sizeof(pInfo->aFunc[0]), - &pInfo->nFunc, - &i - ); + pInfo->aFunc = sqlite3ArrayAllocate(db, pInfo->aFunc, sizeof(pInfo->aFunc[0]), &pInfo->nFunc, &i); return i; } @@ -109830,27 +108709,27 @@ static int addAggInfoFunc(sqlite3 *db, AggInfo *pInfo){ ** implement sqlite3ExprAnalyzeAggregates(). See sqlite3ExprAnalyzeAggregates ** for additional information. */ -static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ +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; + 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 ){ + 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 ); + 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 (ALWAYS(pSrcList != 0)) { + SrcItem* pItem = pSrcList->a; + for (i = 0; i < pSrcList->nSrc; 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. ** @@ -109859,38 +108738,34 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ */ int k; pCol = pAggInfo->aCol; - for(k=0; knColumn; k++, pCol++){ - if( pCol->iTable==pExpr->iTable && - pCol->iColumn==pExpr->iColumn ){ + for (k = 0; k < pAggInfo->nColumn; k++, pCol++) { + if (pCol->iTable == pExpr->iTable && pCol->iColumn == pExpr->iColumn) { break; } } - if( (k>=pAggInfo->nColumn) - && (k = addAggInfoColumn(pParse->db, pAggInfo))>=0 - ){ + if ((k >= pAggInfo->nColumn) && (k = addAggInfoColumn(pParse->db, pAggInfo)) >= 0) { pCol = &pAggInfo->aCol[k]; - assert( ExprUseYTab(pExpr) ); + 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 ){ + if (pAggInfo->pGroupBy) { int j, n; - ExprList *pGB = pAggInfo->pGroupBy; - struct ExprList_item *pTerm = pGB->a; + 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 ){ + for (j = 0; j < n; j++, pTerm++) { + Expr* pE = pTerm->pExpr; + if (pE->op == TK_COLUMN && pE->iTable == pExpr->iTable && pE->iColumn == pExpr->iColumn) { pCol->iSorterColumn = j; break; } } } - if( pCol->iSorterColumn<0 ){ + if (pCol->iSorterColumn < 0) { pCol->iSorterColumn = pAggInfo->nSortingColumn++; } } @@ -109910,48 +108785,45 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ return WRC_Prune; } case TK_AGG_FUNCTION: { - if( (pNC->ncFlags & NC_InAggFunc)==0 - && pWalker->walkerDepth==pExpr->op2 - ){ + 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 ){ + struct AggInfo_func* pItem = pAggInfo->aFunc; + for (i = 0; i < pAggInfo->nFunc; i++, pItem++) { + if (pItem->pFExpr == pExpr) + break; + if (sqlite3ExprCompare(0, pItem->pFExpr, pExpr, -1) == 0) { break; } } - if( i>=pAggInfo->nFunc ){ + 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) ); + 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 ){ + 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{ + } else { pItem->iDistinct = -1; } } } /* Make pExpr point to the appropriate pAggInfo->aFunc[] entry - */ - assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) ); + */ + assert(!ExprHasProperty(pExpr, EP_TokenOnly | EP_Reduced)); ExprSetVVAProperty(pExpr, EP_NoReduce); pExpr->iAgg = (i16)i; pExpr->pAggInfo = pAggInfo; return WRC_Prune; - }else{ + } else { return WRC_Continue; } } @@ -109968,7 +108840,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ ** This routine should only be called after the expression has been ** analyzed by sqlite3ResolveExprNames(). */ -SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){ +SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext* pNC, Expr* pExpr) { Walker w; w.xExprCallback = analyzeAggregate; w.xSelectCallback = sqlite3WalkerDepthIncrease; @@ -109976,7 +108848,7 @@ SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){ w.walkerDepth = 0; w.u.pNC = pNC; w.pParse = 0; - assert( pNC->pSrcList!=0 ); + assert(pNC->pSrcList != 0); sqlite3WalkExpr(&w, pExpr); } @@ -109986,11 +108858,11 @@ SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){ ** ** If an error is found, the analysis is cut short. */ -SQLITE_PRIVATE void sqlite3ExprAnalyzeAggList(NameContext *pNC, ExprList *pList){ - struct ExprList_item *pItem; +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++){ + if (pList) { + for (pItem = pList->a, i = 0; i < pList->nExpr; i++, pItem++) { sqlite3ExprAnalyzeAggregates(pNC, pItem->pExpr); } } @@ -109999,8 +108871,8 @@ SQLITE_PRIVATE void sqlite3ExprAnalyzeAggList(NameContext *pNC, ExprList *pList) /* ** Allocate a single new register for use to hold some intermediate result. */ -SQLITE_PRIVATE int sqlite3GetTempReg(Parse *pParse){ - if( pParse->nTempReg==0 ){ +SQLITE_PRIVATE int sqlite3GetTempReg(Parse* pParse) { + if (pParse->nTempReg == 0) { return ++pParse->nMem; } return pParse->aTempReg[--pParse->nTempReg]; @@ -110010,10 +108882,10 @@ SQLITE_PRIVATE int sqlite3GetTempReg(Parse *pParse){ ** Deallocate a register, making available for reuse for some other ** purpose. */ -SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse *pParse, int iReg){ - if( iReg ){ +SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse* pParse, int iReg) { + if (iReg) { sqlite3VdbeReleaseRegisters(pParse, iReg, 1, 0, 0); - if( pParse->nTempRegaTempReg) ){ + if (pParse->nTempReg < ArraySize(pParse->aTempReg)) { pParse->aTempReg[pParse->nTempReg++] = iReg; } } @@ -110022,27 +108894,28 @@ SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse *pParse, int iReg){ /* ** Allocate or deallocate a block of nReg consecutive registers. */ -SQLITE_PRIVATE int sqlite3GetTempRange(Parse *pParse, int nReg){ +SQLITE_PRIVATE int sqlite3GetTempRange(Parse* pParse, int nReg) { int i, n; - if( nReg==1 ) return sqlite3GetTempReg(pParse); + if (nReg == 1) + return sqlite3GetTempReg(pParse); i = pParse->iRangeReg; n = pParse->nRangeReg; - if( nReg<=n ){ + if (nReg <= n) { pParse->iRangeReg += nReg; pParse->nRangeReg -= nReg; - }else{ - i = pParse->nMem+1; + } else { + i = pParse->nMem + 1; pParse->nMem += nReg; } return i; } -SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse *pParse, int iReg, int nReg){ - if( nReg==1 ){ +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 ){ + if (nReg > pParse->nRangeReg) { pParse->nRangeReg = nReg; pParse->iRangeReg = iReg; } @@ -110056,7 +108929,7 @@ SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse *pParse, int iReg, int nReg){ ** 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){ +SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse* pParse) { pParse->nTempReg = 0; pParse->nRangeReg = 0; } @@ -110067,16 +108940,13 @@ SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse *pParse){ ** statements. */ #ifdef SQLITE_DEBUG -SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse *pParse, int iFirst, int iLast){ +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; + 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 ){ + for (i = 0; i < pParse->nTempReg; i++) { + if (pParse->aTempReg[i] >= iFirst && pParse->aTempReg[i] <= iLast) { return 0; } } @@ -110116,15 +108986,12 @@ SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse *pParse, int iFirst, int iLast){ ** ** 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) +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) - ) + || (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; } @@ -110138,33 +109005,29 @@ static int isAlterableTable(Parse *pParse, Table *pTab){ ** 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 */ -){ +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 ){ + "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 - ); + "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); } } @@ -110175,20 +109038,16 @@ static void renameTestSchema( ** 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){ +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%%'" - ); + "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%%'"); } } @@ -110196,12 +109055,13 @@ static void renameFixQuotes(Parse *pParse, const char *zDb, int bTemp){ ** 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 ){ +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); + if (iDb != 1) + sqlite3VdbeAddParseSchemaOp(pParse->pVdbe, 1, 0, p5); } } @@ -110209,58 +109069,56 @@ static void renameReloadSchema(Parse *pParse, int iDb, u16 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. */ -){ +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 */ + 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() */ + 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) ); + 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; + 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; + 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); + 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) ){ + if (SQLITE_OK != isAlterableTable(pParse, pTab)) { goto exit_rename_table; } - if( SQLITE_OK!=sqlite3CheckObjectName(pParse,zName,"table",zName) ){ + if (SQLITE_OK != sqlite3CheckObjectName(pParse, zName, "table", zName)) { goto exit_rename_table; } #ifndef SQLITE_OMIT_VIEW - if( IsView(pTab) ){ + if (IsView(pTab)) { sqlite3ErrorMsg(pParse, "view %s may not be altered", pTab->zName); goto exit_rename_table; } @@ -110268,18 +109126,18 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( #ifndef SQLITE_OMIT_AUTHORIZATION /* Invoke the authorization callback. */ - if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){ + if (sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0)) { goto exit_rename_table; } #endif #ifndef SQLITE_OMIT_VIRTUALTABLE - if( sqlite3ViewGetColumnNames(pParse, pTab) ){ + if (sqlite3ViewGetColumnNames(pParse, pTab)) { goto exit_rename_table; } - if( IsVirtual(pTab) ){ + if (IsVirtual(pTab)) { pVTab = sqlite3GetVTable(db, pTab); - if( pVTab->pVtab->pModule->xRename==0 ){ + if (pVTab->pVtab->pModule->xRename == 0) { pVTab = 0; } } @@ -110290,7 +109148,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( ** as the scalar functions (e.g. sqlite_rename_table()) invoked by the ** nested SQL may raise an exception. */ v = sqlite3GetVdbe(pParse); - if( v==0 ){ + if (v == 0) { goto exit_rename_table; } sqlite3MayAbort(pParse); @@ -110302,55 +109160,49 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( /* 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 \"%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 - ); + "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); + 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 ){ + 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); + "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 @@ -110359,15 +109211,15 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( ** SQLite tables) that are identified by the name of the virtual table. */ #ifndef SQLITE_OMIT_VIRTUALTABLE - if( pVTab ){ + if (pVTab) { int i = ++pParse->nMem; sqlite3VdbeLoadString(v, i, zName); - sqlite3VdbeAddOp4(v, OP_VRename, i, 0, 0,(const char*)pVTab, P4_VTAB); + 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); + renameTestSchema(pParse, zDb, iDb == 1, "after rename", 0); exit_rename_table: sqlite3SrcListDelete(db, pSrc); @@ -110378,16 +109230,12 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( ** 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 - ); +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); } /* @@ -110398,123 +109246,115 @@ static void sqlite3ErrorIfNotEmpty( ** 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 */ +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 ); + assert(db->pParse == pParse); + if (pParse->nErr) + return; + assert(db->mallocFailed == 0); pNew = pParse->pNewTable; - assert( pNew ); + assert(pNew); - assert( sqlite3BtreeHoldsAllMutexes(db) ); + 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]; + 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 ); + assert(pTab); #ifndef SQLITE_OMIT_AUTHORIZATION /* Invoke the authorization callback. */ - if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){ + 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 ){ + if (pCol->colFlags & COLFLAG_PRIMKEY) { sqlite3ErrorMsg(pParse, "Cannot add a PRIMARY KEY column"); return; } - if( pNew->pIndex ){ - sqlite3ErrorMsg(pParse, - "Cannot add a UNIQUE column"); + if (pNew->pIndex) { + sqlite3ErrorMsg(pParse, "Cannot add a UNIQUE column"); return; } - if( (pCol->colFlags & COLFLAG_GENERATED)==0 ){ + 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 ){ + 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"); + 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"); + 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; + 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 ); + 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"); + if (!pVal) { + sqlite3ErrorIfNotEmpty(pParse, zDb, zTab, "Cannot add a column with non-constant default"); } sqlite3ValueFree(pVal); } - }else if( pCol->colFlags & COLFLAG_STORED ){ + } 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)) ){ + 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) ); + 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 - ); + "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 ){ + 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. @@ -110523,7 +109363,7 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ 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); + sqlite3VdbeAddOp2(v, OP_IfPos, r1, sqlite3VdbeCurrentAddr(v) + 2); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, 3); sqlite3ReleaseTempReg(pParse, r1); @@ -110532,18 +109372,15 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ renameReloadSchema(pParse, iDb, INITFLAG_AlterAdd); /* Verify that constraints are still satisfied */ - if( pNew->pCheck!=0 - || (pCol->notNull && (pCol->colFlags & COLFLAG_GENERATED)!=0) - ){ + 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 - ); + "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); } } } @@ -110563,40 +109400,42 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ ** 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; +SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse* pParse, SrcList* pSrc) { + Table* pNew; + Table* pTab; int iDb; int i; int nAlloc; - sqlite3 *db = pParse->db; + 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; + 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; + if (!pTab) + goto exit_begin_add_column; #ifndef SQLITE_OMIT_VIRTUALTABLE - if( IsVirtual(pTab) ){ + 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) ){ + if (IsView(pTab)) { sqlite3ErrorMsg(pParse, "Cannot add a column to a view"); goto exit_begin_add_column; } - if( SQLITE_OK!=isAlterableTable(pParse, pTab) ){ + if (SQLITE_OK != isAlterableTable(pParse, pTab)) { goto exit_begin_add_column; } sqlite3MayAbort(pParse); - assert( IsOrdinaryTable(pTab) ); - assert( pTab->u.tab.addColOffset>0 ); + 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 @@ -110607,26 +109446,27 @@ SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ ** prefix on their name. */ pNew = (Table*)sqlite3DbMallocZero(db, sizeof(Table)); - if( !pNew ) goto exit_begin_add_column; + 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); + 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 ); + 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]; + memcpy(pNew->aCol, pTab->aCol, sizeof(Column) * pNew->nCol); + for (i = 0; i < pNew->nCol; i++) { + Column* pCol = &pNew->aCol[i]; pCol->zCnName = sqlite3DbStrDup(db, pCol->zCnName); pCol->hName = sqlite3StrIHash(pCol->zCnName); } - assert( IsOrdinaryTable(pNew) ); + 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; @@ -110646,29 +109486,26 @@ SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ ** 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; +static int isRealTable(Parse* pParse, Table* pTab, int bDrop) { + const char* zType = 0; #ifndef SQLITE_OMIT_VIEW - if( IsView(pTab) ){ + if (IsView(pTab)) { zType = "view"; } #endif #ifndef SQLITE_OMIT_VIRTUALTABLE - if( IsVirtual(pTab) ){ + 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 - ); + 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) +#define isRealTable(x, y, z) (0) #endif /* @@ -110676,37 +109513,39 @@ static int isRealTable(Parse *pParse, Table *pTab, int bDrop){ ** ** 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 */ +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; + 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; + 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 ); + 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) ){ + if (sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0)) { goto exit_rename_column; } #endif @@ -110714,18 +109553,20 @@ SQLITE_PRIVATE void sqlite3AlterRenameColumn( /* 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 (!zOld) + goto exit_rename_column; + for (iCol = 0; iCol < pTab->nCol; iCol++) { + if (0 == sqlite3StrICmp(pTab->aCol[iCol].zCnName, zOld)) + break; } - if( iCol==pTab->nCol ){ + 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); + 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 @@ -110733,31 +109574,28 @@ SQLITE_PRIVATE void sqlite3AlterRenameColumn( */ sqlite3MayAbort(pParse); zNew = sqlite3NameFromToken(db, pNew); - if( !zNew ) goto exit_rename_column; - assert( pNew->n>0 ); + 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 - ); + "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 - ); + "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); + renameTestSchema(pParse, zDb, iSchema == 1, "after rename", 1); - exit_rename_column: +exit_rename_column: sqlite3SrcListDelete(db, pSrc); sqlite3DbFree(db, zOld); sqlite3DbFree(db, zNew); @@ -110782,9 +109620,9 @@ SQLITE_PRIVATE void sqlite3AlterRenameColumn( ** 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 */ + 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 */ }; /* @@ -110793,11 +109631,11 @@ struct RenameToken { */ 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 */ + 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 @@ -110824,22 +109662,22 @@ struct RenameCtx { ** 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; +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 ); + for (p = pParse->pRename; p; p = p->pNext) { + if (p->p) { + assert(p->p != pPtr); i += *(u8*)(p->p); } } } } #else -# define renameTokenCheckAll(x,y) +#define renameTokenCheckAll(x, y) #endif /* @@ -110854,17 +109692,13 @@ static void renameTokenCheckAll(Parse *pParse, const void *pPtr){ ** 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 ); +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) ){ + if (ALWAYS(pParse->eParseMode != PARSE_MODE_UNMAP)) { pNew = sqlite3DbMallocZero(pParse->db, sizeof(RenameToken)); - if( pNew ){ + if (pNew) { pNew->p = pPtr; pNew->t = *pToken; pNew->pNext = pParse->pRename; @@ -110880,11 +109714,11 @@ SQLITE_PRIVATE const void *sqlite3RenameTokenMap( ** 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; +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 ){ + for (p = pParse->pRename; p; p = p->pNext) { + if (p->p == pFrom) { p->p = pTo; break; } @@ -110894,10 +109728,10 @@ SQLITE_PRIVATE void sqlite3RenameTokenRemap(Parse *pParse, const void *pTo, cons /* ** Walker callback used by sqlite3RenameExprUnmap(). */ -static int renameUnmapExprCb(Walker *pWalker, Expr *pExpr){ - Parse *pParse = pWalker->pParse; +static int renameUnmapExprCb(Walker* pWalker, Expr* pExpr) { + Parse* pParse = pWalker->pParse; sqlite3RenameTokenRemap(pParse, 0, (const void*)pExpr); - if( ExprUseYTab(pExpr) ){ + if (ExprUseYTab(pExpr)) { sqlite3RenameTokenRemap(pParse, 0, (const void*)&pExpr->y.pTab); } return WRC_Continue; @@ -110907,14 +109741,14 @@ static int renameUnmapExprCb(Walker *pWalker, Expr *pExpr){ ** 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; +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 ){ + 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 @@ -110923,17 +109757,19 @@ static void renameWalkWith(Walker *pWalker, Select *pSelect){ pCopy = sqlite3WithDup(pParse->db, pWith); pCopy = sqlite3WithPush(pParse, pCopy, 1); } - for(i=0; inCte; i++){ - Select *p = pWith->a[i].pSelect; + for (i = 0; i < pWith->nCte; 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; + 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 ){ + if (pCopy && pParse->pWith == pCopy) { pParse->pWith = pCopy->pOuter; } } @@ -110942,13 +109778,10 @@ static void renameWalkWith(Walker *pWalker, Select *pSelect){ /* ** Unmap all tokens in the IdList object passed as the second argument. */ -static void unmapColumnIdlistNames( - Parse *pParse, - const IdList *pIdList -){ +static void unmapColumnIdlistNames(Parse* pParse, const IdList* pIdList) { int ii; - assert( pIdList!=0 ); - for(ii=0; iinId; ii++){ + assert(pIdList != 0); + for (ii = 0; ii < pIdList->nId; ii++) { sqlite3RenameTokenRemap(pParse, 0, (const void*)pIdList->a[ii].zName); } } @@ -110956,30 +109789,31 @@ static void unmapColumnIdlistNames( /* ** Walker callback used by sqlite3RenameExprUnmap(). */ -static int renameUnmapSelectCb(Walker *pWalker, Select *p){ - Parse *pParse = pWalker->pParse; +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) ){ + 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 ){ + if (ALWAYS(p->pEList)) { + ExprList* pList = p->pEList; + for (i = 0; i < pList->nExpr; 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++){ + if (ALWAYS(p->pSrc)) { /* Every Select as a SrcList, even if it is empty */ + SrcList* pSrc = p->pSrc; + for (i = 0; i < pSrc->nSrc; i++) { sqlite3RenameTokenRemap(pParse, 0, (void*)pSrc->a[i].zName); - if( pSrc->a[i].fg.isUsing==0 ){ + if (pSrc->a[i].fg.isUsing == 0) { sqlite3WalkExpr(pWalker, pSrc->a[i].u3.pOn); - }else{ + } else { unmapColumnIdlistNames(pParse, pSrc->a[i].u3.pUsing); } } @@ -110992,7 +109826,7 @@ static int renameUnmapSelectCb(Walker *pWalker, Select *p){ /* ** Remove all nodes that are part of expression pExpr from the rename list. */ -SQLITE_PRIVATE void sqlite3RenameExprUnmap(Parse *pParse, Expr *pExpr){ +SQLITE_PRIVATE void sqlite3RenameExprUnmap(Parse* pParse, Expr* pExpr) { u8 eMode = pParse->eParseMode; Walker sWalker; memset(&sWalker, 0, sizeof(Walker)); @@ -111008,16 +109842,16 @@ SQLITE_PRIVATE void sqlite3RenameExprUnmap(Parse *pParse, Expr *pExpr){ ** Remove all nodes that are part of expression-list pEList from the ** rename list. */ -SQLITE_PRIVATE void sqlite3RenameExprlistUnmap(Parse *pParse, ExprList *pEList){ - if( pEList ){ +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) ){ + for (i = 0; i < pEList->nExpr; i++) { + if (ALWAYS(pEList->a[i].fg.eEName == ENAME_NAME)) { sqlite3RenameTokenRemap(pParse, 0, (void*)pEList->a[i].zEName); } } @@ -111027,10 +109861,10 @@ SQLITE_PRIVATE void sqlite3RenameExprlistUnmap(Parse *pParse, ExprList *pEList){ /* ** 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){ +static void renameTokenFree(sqlite3* db, RenameToken* pToken) { + RenameToken* pNext; + RenameToken* p; + for (p = pToken; p; p = pNext) { pNext = p->pNext; sqlite3DbFree(db, p); } @@ -111045,19 +109879,15 @@ static void renameTokenFree(sqlite3 *db, RenameToken *pToken){ ** 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) ){ +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 ){ + 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; @@ -111074,10 +109904,10 @@ static RenameToken *renameTokenFind( ** 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 ); +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); @@ -111093,18 +109923,11 @@ static int renameColumnSelectCb(Walker *pWalker, Select *p){ ** 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 - ){ +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 - ){ + } 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; @@ -111119,15 +109942,17 @@ static int renameColumnExprCb(Walker *pWalker, Expr *pExpr){ ** 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; +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 (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); + for (pp = &pCtx->pList; *pp != pBest; pp = &(*pp)->pNext) + ; *pp = pBest->pNext; return pBest; @@ -111140,21 +109965,12 @@ static RenameToken *renameColumnTokenNext(RenameCtx *pCtx){ ** 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; +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 - ); + 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); } @@ -111165,20 +109981,12 @@ static void renameColumnParseError( ** 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 ){ +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) - ){ + for (i = 0; i < pEList->nExpr; 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); } } @@ -111190,42 +109998,35 @@ static void renameColumnElistNames( ** 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 ){ +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) ){ + for (i = 0; i < pIdList->nId; 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 */ -){ +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 ){ + if (zSql == 0) { return SQLITE_NOMEM; } - if( sqlite3StrNICmp(zSql,"CREATE ",7)!=0 ){ + if (sqlite3StrNICmp(zSql, "CREATE ", 7) != 0) { return SQLITE_CORRUPT_BKPT; } db->init.iDb = bTemp ? 1 : sqlite3FindDbName(db, zDb); @@ -111233,21 +110034,20 @@ static int renameParseSql( 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) - ){ + 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 ){ + 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] ); + RenameToken* pToken; + for (pToken = p->pRename; pToken; pToken = pToken->pNext) { + assert(pToken->t.z >= zSql && &pToken->t.z[pToken->t.n] <= &zSql[nSql]); } } #endif @@ -111265,43 +110065,42 @@ static int renameParseSql( ** 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 */ -){ +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); + sqlite3* db = sqlite3_context_db_handle(pCtx); int rc = SQLITE_OK; - char *zQuot = 0; - char *zOut; + char* zQuot = 0; + char* zOut; i64 nQuot = 0; - char *zBuf1 = 0; - char *zBuf2 = 0; + char* zBuf1 = 0; + char* zBuf2 = 0; - if( zNew ){ + 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 ){ + if (zQuot == 0) { return SQLITE_NOMEM; - }else{ - nQuot = sqlite3Strlen30(zQuot)-1; + } 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]; + 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]; } } @@ -111309,25 +110108,26 @@ static int renameEditSql( ** 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 ){ + if (zOut) { int nOut = nSql; memcpy(zOut, zSql, nSql); - while( pRename->pList ){ - int iOff; /* Offset of token to replace in zOut */ + while (pRename->pList) { + int iOff; /* Offset of token to replace in zOut */ u32 nReplace; - const char *zReplace; - RenameToken *pBest = renameColumnTokenNext(pRename); + const char* zReplace; + RenameToken* pBest = renameColumnTokenNext(pRename); - if( zNew ){ - if( bQuote==0 && sqlite3IsIdChar(*pBest->t.z) ){ + if (zNew) { + if (bQuote == 0 && sqlite3IsIdChar(*pBest->t.z)) { nReplace = nNew; zReplace = zNew; - }else{ + } else { nReplace = nQuot; zReplace = zQuot; - if( pBest->t.z[pBest->t.n]=='"' ) nReplace++; + if (pBest->t.z[pBest->t.n] == '"') + nReplace++; } - }else{ + } 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 @@ -111337,18 +110137,14 @@ static int renameEditSql( 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]=='\'' ? " " : "" - ); + 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) - ); + 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'; } @@ -111358,7 +110154,7 @@ static int renameEditSql( sqlite3_result_text(pCtx, zOut, -1, SQLITE_TRANSIENT); sqlite3DbFree(db, zOut); - }else{ + } else { rc = SQLITE_NOMEM; } @@ -111372,97 +110168,95 @@ static int renameEditSql( ** 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; +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 - ); + 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) ){ + if (ALWAYS(pParse->pTriggerTab)) { rc = sqlite3ViewGetColumnNames(pParse, pParse->pTriggerTab); } /* Resolve symbols in WHEN clause */ - if( rc==SQLITE_OK && pNew->pWhen ){ + 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 ){ + 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 ){ + 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{ + } 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; + 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 ){ + if (pStep->pFrom) { int i; - for(i=0; ipFrom->nSrc && rc==SQLITE_OK; i++){ - SrcItem *p = &pStep->pFrom->a[i]; - if( p->pSelect ){ + for (i = 0; i < pStep->pFrom->nSrc && rc == SQLITE_OK; i++) { + SrcItem* p = &pStep->pFrom->a[i]; + if (p->pSelect) { sqlite3SelectPrep(pParse, p->pSelect, 0); } } } - if( db->mallocFailed ){ + if (db->mallocFailed) { rc = SQLITE_NOMEM; } sNC.pSrcList = pSrc; - if( rc==SQLITE_OK && pStep->pWhere ){ + if (rc == SQLITE_OK && pStep->pWhere) { rc = sqlite3ResolveExprNames(&sNC, pStep->pWhere); } - if( rc==SQLITE_OK ){ + 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; + 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; + if (rc == SQLITE_OK) { + ExprList* pUpsertSet = pUpsert->pUpsertSet; rc = sqlite3ResolveExprListNames(&sNC, pUpsertSet); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = sqlite3ResolveExprNames(&sNC, pUpsert->pUpsertWhere); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = sqlite3ResolveExprNames(&sNC, pUpsert->pUpsertTargetWhere); } sNC.ncFlags = 0; } sNC.pSrcList = 0; sqlite3SrcListDelete(db, pSrc); - }else{ + } else { rc = SQLITE_NOMEM; } } @@ -111474,27 +110268,27 @@ static int renameResolveTrigger(Parse *pParse){ ** 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; +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){ + 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; + 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 ){ + if (pStep->pFrom) { int i; - for(i=0; ipFrom->nSrc; i++){ + for (i = 0; i < pStep->pFrom->nSrc; i++) { sqlite3WalkSelect(pWalker, pStep->pFrom->a[i].pSelect); } } @@ -111505,14 +110299,14 @@ static void renameWalkTrigger(Walker *pWalker, Trigger *pTrigger){ ** 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 ){ +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 ){ + while ((pIdx = pParse->pNewIndex) != 0) { pParse->pNewIndex = pIdx->pNext; sqlite3FreeIndex(db, pIdx); } @@ -111546,45 +110340,45 @@ static void renameParseCleanup(Parse *pParse){ ** 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); +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]); + 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]); + 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; + const char* zOld; int rc; Parse sParse; Walker sWalker; - Index *pIdx; + Index* pIdx; int i; - Table *pTab; + 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; + 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 ){ + 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); + sCtx.iCol = ((iCol == pTab->iPKey) ? -1 : iCol); #ifndef SQLITE_OMIT_AUTHORIZATION db->xAuth = 0; @@ -111599,77 +110393,75 @@ static void renameColumnFunc( 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; + 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 ){ + if (rc == SQLITE_OK) { sqlite3WalkSelect(&sWalker, pSelect); } - if( rc!=SQLITE_OK ) goto renameColumnFunc_done; - }else if( IsOrdinaryTable(sParse.pNewTable) ){ + 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; + FKey* pFKey; sCtx.pTab = sParse.pNewTable; - if( bFKOnly==0 ){ - if( iColnCol ){ - renameTokenFind( - &sParse, &sCtx, (void*)sParse.pNewTable->aCol[iCol].zCnName - ); + if (bFKOnly == 0) { + if (iCol < sParse.pNewTable->nCol) { + renameTokenFind(&sParse, &sCtx, (void*)sParse.pNewTable->aCol[iCol].zCnName); } - if( sCtx.iCol<0 ){ + 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){ + for (pIdx = sParse.pNewTable->pIndex; pIdx; pIdx = pIdx->pNext) { sqlite3WalkExprList(&sWalker, pIdx->aColExpr); } - for(pIdx=sParse.pNewIndex; pIdx; pIdx=pIdx->pNext){ + 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]); + for (i = 0; i < sParse.pNewTable->nCol; 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 ){ + assert(IsOrdinaryTable(sParse.pNewTable)); + for (pFKey = sParse.pNewTable->u.tab.pFKey; pFKey; pFKey = pFKey->pNextFrom) { + for (i = 0; i < pFKey->nCol; 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) - ){ + 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 ){ + } else if (sParse.pNewIndex) { sqlite3WalkExprList(&sWalker, sParse.pNewIndex->aColExpr); sqlite3WalkExpr(&sWalker, sParse.pNewIndex->pPartIdxWhere); - }else{ + } else { /* A trigger */ - TriggerStep *pStep; + 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; + 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); @@ -111678,26 +110470,25 @@ static void renameColumnFunc( } } - /* Find tokens to edit in UPDATE OF clause */ - if( sParse.pTriggerTab==pTab ){ - renameColumnIdlistNames(&sParse, &sCtx,sParse.pNewTrigger->pColumns,zOld); + 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 ); + assert(rc == SQLITE_OK); rc = renameEditSql(context, &sCtx, zSql, zNew, bQuote); renameColumnFunc_done: - if( rc!=SQLITE_OK ){ - if( rc==SQLITE_ERROR && sqlite3WritableSchema(db) ){ + if (rc != SQLITE_OK) { + if (rc == SQLITE_ERROR && sqlite3WritableSchema(db)) { sqlite3_result_value(context, argv[0]); - }else if( sParse.zErrMsg ){ + } else if (sParse.zErrMsg) { renameColumnParseError(context, "", argv[1], argv[2], &sParse); - }else{ + } else { sqlite3_result_error_code(context, rc); } } @@ -111713,12 +110504,9 @@ static void renameColumnFunc( /* ** 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 - ){ +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; @@ -111727,22 +110515,22 @@ static int renameTableExprCb(Walker *pWalker, Expr *pExpr){ /* ** Walker select callback used by "RENAME TABLE". */ -static int renameTableSelectCb(Walker *pWalker, Select *pSelect){ +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 ); + 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 ); + 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 ){ + for (i = 0; i < pSrc->nSrc; i++) { + SrcItem* pItem = &pSrc->a[i]; + if (pItem->pTab == p->pTab) { renameTokenFind(pWalker->pParse, p, pItem->zName); } } @@ -111751,7 +110539,6 @@ static int renameTableSelectCb(Walker *pWalker, Select *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 @@ -111771,20 +110558,16 @@ static int renameTableSelectCb(Walker *pWalker, Select *pSelect){ ** 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]); +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 ){ + if (zInput && zOld && zNew) { Parse sParse; int rc; int bQuote = 1; @@ -111808,37 +110591,35 @@ static void renameTableFunc( rc = renameParseSql(&sParse, zDb, db, zInput, bTemp); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { int isLegacy = (db->flags & SQLITE_LegacyAlter); - if( sParse.pNewTable ){ - Table *pTab = sParse.pNewTable; + if (sParse.pNewTable) { + Table* pTab = sParse.pNewTable; - if( IsView(pTab) ){ - if( isLegacy==0 ){ - Select *pSelect = pTab->u.view.pSelect; + 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 ); + assert(pSelect->selFlags & SF_View); pSelect->selFlags &= ~SF_View; sqlite3SelectPrep(&sParse, pTab->u.view.pSelect, &sNC); - if( sParse.nErr ){ + if (sParse.nErr) { rc = sParse.rc; - }else{ + } else { sqlite3WalkSelect(&sWalker, pTab->u.view.pSelect); } } - }else{ + } 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 ){ + 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); } } @@ -111848,9 +110629,9 @@ static void renameTableFunc( /* 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 ){ + if (sqlite3_stricmp(zOld, pTab->zName) == 0) { sCtx.pTab = pTab; - if( isLegacy==0 ){ + if (isLegacy == 0) { sqlite3WalkExprList(&sWalker, pTab->pCheck); } renameTokenFind(&sParse, &sCtx, pTab->zName); @@ -111858,36 +110639,34 @@ static void renameTableFunc( } } - else if( sParse.pNewIndex ){ + else if (sParse.pNewIndex) { renameTokenFind(&sParse, &sCtx, sParse.pNewIndex->zName); - if( isLegacy==0 ){ + 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 - ){ + 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 ){ + if (isLegacy == 0) { rc = renameResolveTrigger(&sParse); - if( rc==SQLITE_OK ){ + 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) ){ + 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 ){ + if (pStep->pFrom) { int i; - for(i=0; ipFrom->nSrc; i++){ - SrcItem *pItem = &pStep->pFrom->a[i]; - if( 0==sqlite3_stricmp(pItem->zName, zOld) ){ + for (i = 0; i < pStep->pFrom->nSrc; i++) { + SrcItem* pItem = &pStep->pFrom->a[i]; + if (0 == sqlite3_stricmp(pItem->zName, zOld)) { renameTokenFind(&sParse, &sCtx, pItem->zName); } } @@ -111899,15 +110678,15 @@ static void renameTableFunc( #endif } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = renameEditSql(context, &sCtx, zInput, zNew, bQuote); } - if( rc!=SQLITE_OK ){ - if( rc==SQLITE_ERROR && sqlite3WritableSchema(db) ){ + if (rc != SQLITE_OK) { + if (rc == SQLITE_ERROR && sqlite3WritableSchema(db)) { sqlite3_result_value(context, argv[3]); - }else if( sParse.zErrMsg ){ + } else if (sParse.zErrMsg) { renameColumnParseError(context, "", argv[1], argv[2], &sParse); - }else{ + } else { sqlite3_result_error_code(context, rc); } } @@ -111923,8 +110702,8 @@ static void renameTableFunc( return; } -static int renameQuotefixExprCb(Walker *pWalker, Expr *pExpr){ - if( pExpr->op==TK_STRING && (pExpr->flags & EP_DblQuoted) ){ +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; @@ -111957,14 +110736,10 @@ static int renameQuotefixExprCb(Walker *pWalker, Expr *pExpr){ ** 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]); +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; @@ -111974,12 +110749,12 @@ static void renameQuotefixFunc( sqlite3BtreeEnterAll(db); UNUSED_PARAMETER(NotUsed); - if( zDb && zInput ){ + if (zDb && zInput) { int rc; Parse sParse; rc = renameParseSql(&sParse, zDb, db, zInput, 0); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { RenameCtx sCtx; Walker sWalker; @@ -111991,48 +110766,46 @@ static void renameQuotefixFunc( sWalker.xSelectCallback = renameColumnSelectCb; sWalker.u.pRename = &sCtx; - if( sParse.pNewTable ){ - if( IsView(sParse.pNewTable) ){ - Select *pSelect = sParse.pNewTable->u.view.pSelect; + 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 ){ + if (rc == SQLITE_OK) { sqlite3WalkSelect(&sWalker, pSelect); } - }else{ + } 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])); + for (i = 0; i < sParse.pNewTable->nCol; i++) { + sqlite3WalkExpr(&sWalker, sqlite3ColumnExpr(sParse.pNewTable, &sParse.pNewTable->aCol[i])); } #endif /* SQLITE_OMIT_GENERATED_COLUMNS */ } - }else if( sParse.pNewIndex ){ + } else if (sParse.pNewIndex) { sqlite3WalkExprList(&sWalker, sParse.pNewIndex->aColExpr); sqlite3WalkExpr(&sWalker, sParse.pNewIndex->pPartIdxWhere); - }else{ + } else { #ifndef SQLITE_OMIT_TRIGGER rc = renameResolveTrigger(&sParse); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { renameWalkTrigger(&sWalker, sParse.pNewTrigger); } #endif /* SQLITE_OMIT_TRIGGER */ } - if( rc==SQLITE_OK ){ + 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 ){ + if (rc != SQLITE_OK) { + if (sqlite3WritableSchema(db) && rc == SQLITE_ERROR) { sqlite3_result_value(context, argv[1]); - }else{ + } else { sqlite3_result_error_code(context, rc); } } @@ -112070,17 +110843,13 @@ static void renameQuotefixFunc( ** 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]); +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]); + char const* zWhen = (const char*)sqlite3_value_text(argv[5]); int bNoDQS = sqlite3_value_int(argv[6]); #ifndef SQLITE_OMIT_AUTHORIZATION @@ -112090,30 +110859,32 @@ static void renameTableTest( UNUSED_PARAMETER(NotUsed); - if( zDb && zInput ){ + if (zDb && zInput) { int rc; Parse sParse; int flags = db->flags; - if( bNoDQS ) db->flags &= ~(SQLITE_DqsDML|SQLITE_DqsDDL); + 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) ){ + 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; + if (sParse.nErr) + rc = sParse.rc; } - else if( sParse.pNewTrigger ){ - if( isLegacy==0 ){ + else if (sParse.pNewTrigger) { + if (isLegacy == 0) { rc = renameResolveTrigger(&sParse); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { int i1 = sqlite3SchemaToIndex(db, sParse.pNewTrigger->pTabSchema); int i2 = sqlite3FindDbName(db, zDb); - if( i1==i2 ){ + if (i1 == i2) { /* Handle output case B */ sqlite3_result_int(context, 1); } @@ -112121,9 +110892,9 @@ static void renameTableTest( } } - if( rc!=SQLITE_OK && zWhen && !sqlite3WritableSchema(db) ){ + if (rc != SQLITE_OK && zWhen && !sqlite3WritableSchema(db)) { /* Output case A */ - renameColumnParseError(context, zWhen, argv[2], argv[3],&sParse); + renameColumnParseError(context, zWhen, argv[2], argv[3], &sParse); } renameParseCleanup(&sParse); } @@ -112145,22 +110916,18 @@ static void renameTableTest( ** 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); +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]); + const char* zSql = (const char*)sqlite3_value_text(argv[1]); int iCol = sqlite3_value_int(argv[2]); - const char *zDb = db->aDb[iSchema].zDbSName; + const char* zDb = db->aDb[iSchema].zDbSName; int rc; Parse sParse; - RenameToken *pCol; - Table *pTab; - const char *zEnd; - char *zNew = 0; + RenameToken* pCol; + Table* pTab; + const char* zEnd; + char* zNew = 0; #ifndef SQLITE_OMIT_AUTHORIZATION sqlite3_xauth xAuth = db->xAuth; @@ -112168,27 +110935,29 @@ static void dropColumnFunc( #endif UNUSED_PARAMETER(NotUsed); - rc = renameParseSql(&sParse, zDb, db, zSql, iSchema==1); - if( rc!=SQLITE_OK ) goto drop_column_done; + 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 ){ + 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); + if (iCol < pTab->nCol - 1) { + RenameToken* pEnd; + pEnd = renameTokenFind(&sParse, 0, (void*)pTab->aCol[iCol + 1].zCnName); zEnd = (const char*)pEnd->t.z; - }else{ - assert( IsOrdinaryTable(pTab) ); + } 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--; + 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); + zNew = sqlite3MPrintf(db, "%.*s%s", pCol->t.z - zSql, zSql, zEnd); sqlite3_result_text(context, zNew, -1, SQLITE_TRANSIENT); sqlite3_free(zNew); @@ -112197,7 +110966,7 @@ static void dropColumnFunc( #ifndef SQLITE_OMIT_AUTHORIZATION db->xAuth = xAuth; #endif - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { sqlite3_result_error_code(context, rc); } } @@ -112210,137 +110979,141 @@ static void dropColumnFunc( ** 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[] */ +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; + 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; + 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; + 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 ); + if (zCol == 0) { + assert(db->mallocFailed); goto exit_drop_column; } iCol = sqlite3ColumnIndex(pTab, zCol); - if( iCol<0 ){ + 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 - ); + 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); + 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 ); + 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) ){ + 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); + 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 - ); + "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); + 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 ){ + 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 */ + Index* pPk = 0; + int nField = 0; /* Number of non-virtual columns after drop */ int iCur; - Vdbe *v = sqlite3GetVdbe(pParse); + Vdbe* v = sqlite3GetVdbe(pParse); iCur = pParse->nTab++; sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenWrite); - addr = sqlite3VdbeAddOp1(v, OP_Rewind, iCur); VdbeCoverage(v); + addr = sqlite3VdbeAddOp1(v, OP_Rewind, iCur); + VdbeCoverage(v); reg = ++pParse->nMem; - if( HasRowid(pTab) ){ + if (HasRowid(pTab)) { sqlite3VdbeAddOp2(v, OP_Rowid, iCur, reg); pParse->nMem += pTab->nCol; - }else{ + } else { pPk = sqlite3PrimaryKeyIndex(pTab); pParse->nMem += pPk->nColumn; - for(i=0; inKeyCol; i++){ - sqlite3VdbeAddOp3(v, OP_Column, iCur, i, reg+i+1); + for (i = 0; i < pPk->nKeyCol; 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 ){ + for (i = 0; i < pTab->nCol; i++) { + if (i != iCol && (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL) == 0) { int regOut; - if( pPk ){ + 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 (iPos < pPk->nKeyCol) + continue; + regOut = reg + 1 + iPos - (iPos > iColPos); + } else { + regOut = reg + 1 + nField; } - if( i==pTab->iPKey ){ + if (i == pTab->iPKey) { sqlite3VdbeAddOp2(v, OP_Null, 0, regOut); - }else{ + } else { sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, i, regOut); } nField++; } } - if( nField==0 ){ + if (nField == 0) { /* dbsqlfuzz 5f09e7bcc78b4954d06bf9f2400d7715f48d1fef */ pParse->nMem++; - sqlite3VdbeAddOp2(v, OP_Null, 0, reg+1); + 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_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); + sqlite3VdbeAddOp2(v, OP_Next, iCur, addr + 1); + VdbeCoverage(v); sqlite3VdbeJumpHere(v, addr); } @@ -112352,17 +111125,15 @@ SQLITE_PRIVATE void sqlite3AlterDropColumn(Parse *pParse, SrcList *pSrc, const T /* ** Register built-in functions used to help implement ALTER TABLE */ -SQLITE_PRIVATE void sqlite3AlterFunctions(void){ +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), + 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 */ +#endif /* SQLITE_ALTER_TABLE */ /************** End of alter.c ***********************************************/ /************** Begin file analyze.c *****************************************/ @@ -112511,11 +111282,11 @@ SQLITE_PRIVATE void sqlite3AlterFunctions(void){ /* #include "sqliteInt.h" */ #if defined(SQLITE_ENABLE_STAT4) -# define IsStat4 1 +#define IsStat4 1 #else -# define IsStat4 0 -# undef SQLITE_STAT4_SAMPLES -# define SQLITE_STAT4_SAMPLES 1 +#define IsStat4 0 +#undef SQLITE_STAT4_SAMPLES +#define SQLITE_STAT4_SAMPLES 1 #endif /* @@ -112531,77 +111302,72 @@ SQLITE_PRIVATE void sqlite3AlterFunctions(void){ ** 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 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; + const char* zName; + const char* zCols; } aTable[] = { - { "sqlite_stat1", "tbl,idx,stat" }, + {"sqlite_stat1", "tbl,idx,stat"}, #if defined(SQLITE_ENABLE_STAT4) - { "sqlite_stat4", "tbl,idx,neq,nlt,ndlt,sample" }, + {"sqlite_stat4", "tbl,idx,neq,nlt,ndlt,sample"}, #else - { "sqlite_stat4", 0 }, + {"sqlite_stat4", 0}, #endif - { "sqlite_stat3", 0 }, + {"sqlite_stat3", 0}, }; int i; - sqlite3 *db = pParse->db; - Db *pDb; - Vdbe *v = sqlite3GetVdbe(pParse); + 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; + 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 ); + 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( izDbSName)) == 0) { + if (i < nToOpen) { /* The sqlite_statN table does not exist. Create it. Note that a ** side-effect of the CREATE TABLE statement is to leave the rootpage ** of the new table in register pParse->regRoot. 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 - ); + sqlite3NestedParse(pParse, "CREATE TABLE %Q.%s(%s)", pDb->zDbSName, zTab, aTable[i].zCols); aRoot[i] = (u32)pParse->regRoot; aCreateTbl[i] = OPFLAG_P2ISREG; } - }else{ + } 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 - ); + 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 ){ + } else if (db->xPreUpdateCallback) { sqlite3NestedParse(pParse, "DELETE FROM %Q.%s", pDb->zDbSName, zTab); #endif - }else{ + } else { /* The sqlite_stat[134] table already exists. Delete all rows. */ sqlite3VdbeAddOp2(v, OP_Clear, (int)aRoot[i], iDb); } @@ -112609,9 +111375,9 @@ static void openStatTable( } /* Open the sqlite_stat[134] tables for writing. */ - for(i=0; inRowid ){ +static void sampleClear(sqlite3* db, StatSample* p) { + assert(db != 0); + if (p->nRowid) { sqlite3DbFree(db, p->u.aRowid); p->nRowid = 0; } @@ -112681,47 +111447,48 @@ static void sampleClear(sqlite3 *db, StatSample *p){ #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); +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 ){ + if (p->u.aRowid) { p->nRowid = n; memcpy(p->u.aRowid, pData, n); - }else{ + } 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); +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){ +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 ){ + 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{ + } else { sampleSetRowidInt64(p->db, pTo, pFrom->u.iRowid); } } @@ -112730,13 +111497,15 @@ static void sampleCopy(StatAccum *p, StatSample *pTo, StatSample *pFrom){ /* ** Reclaim all memory of a StatAccum structure. */ -static void statAccumDestructor(void *pOld){ - StatAccum *p = (StatAccum*)pOld; +static void statAccumDestructor(void* pOld) { + StatAccum* p = (StatAccum*)pOld; #ifdef SQLITE_ENABLE_STAT4 - if( p->mxSample ){ + 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); + for (i = 0; i < p->nCol; i++) + sampleClear(p->db, p->aBest + i); + for (i = 0; i < p->mxSample; i++) + sampleClear(p->db, p->a + i); sampleClear(p->db, &p->current); } #endif @@ -112765,44 +111534,39 @@ static void statAccumDestructor(void *pOld){ ** 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 */ +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; + 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; + assert(nCol > 0); + nColUp = sizeof(tRowcnt) < 8 ? (nCol + 1) & ~1 : nCol; nKeyCol = sqlite3_value_int(argv[1]); - assert( nKeyCol<=nCol ); - assert( nKeyCol>0 ); + 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 */ + 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); + 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 ){ + if (p == 0) { sqlite3_result_error_nomem(context); return; } @@ -112818,28 +111582,31 @@ static void statInit( 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->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->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]); + 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; ia[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; i < nCol; i++) { p->aBest[i].iCol = i; } } @@ -112851,17 +111618,15 @@ static void statInit( ** 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} -}; +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 /* @@ -112875,19 +111640,18 @@ static const FuncDef statInitFuncdef = { ** 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 -){ +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; + assert(pNew->iCol == pOld->iCol); + for (i = pNew->iCol + 1; i < nCol; i++) { + if (pNew->anEq[i] > pOld->anEq[i]) + return 1; + if (pNew->anEq[i] < pOld->anEq[i]) + return 0; } - if( pNew->iHash>pOld->iHash ) return 1; + if (pNew->iHash > pOld->iHash) + return 1; return 0; } #endif @@ -112899,21 +111663,19 @@ static int sampleIsBetterPost( ** 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 -){ +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) ); + 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)); + if ((nEqNew > nEqOld)) + return 1; + if (nEqNew == nEqOld) { + if (pNew->iCol < pOld->iCol) + return 1; + return (pNew->iCol == pOld->iCol && sampleIsBetterPost(pAccum, pNew, pOld)); } return 0; } @@ -112922,40 +111684,41 @@ static int sampleIsBetter( ** 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; +static void sampleInsert(StatAccum* p, StatSample* pNew, int nEqZero) { + StatSample* pSample = 0; int i; - assert( IsStat4 || nEqZero==0 ); + 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 ){ + if (nEqZero > p->nMaxEqZero) { p->nMaxEqZero = nEqZero; } - if( pNew->isPSample==0 ){ - StatSample *pUpgrade = 0; - assert( pNew->anEq[pNew->iCol]>0 ); + 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) ){ + 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 ){ + if (pUpgrade) { pUpgrade->iCol = pNew->iCol; pUpgrade->anEq[pUpgrade->iCol] = pNew->anEq[pUpgrade->iCol]; goto find_new_min; @@ -112963,26 +111726,25 @@ static void sampleInsert(StatAccum *p, StatSample *pNew, int nEqZero){ } /* 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; + 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]; + 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; + 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] ); + 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]; @@ -112990,18 +111752,19 @@ static void sampleInsert(StatAccum *p, StatSample *pNew, int nEqZero){ p->nSample++; /* Zero the first nEqZero entries in the anEq[] array. */ - memset(pSample->anEq, 0, sizeof(tRowcnt)*nEqZero); + memset(pSample->anEq, 0, sizeof(tRowcnt) * nEqZero); find_new_min: - if( p->nSample>=p->mxSample ){ + 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]) ){ + for (i = 0; i < p->mxSample; i++) { + if (p->a[i].isPSample) + continue; + if (iMin < 0 || sampleIsBetter(p, &p->a[iMin], &p->a[i])) { iMin = i; } } - assert( iMin>=0 ); + assert(iMin >= 0); p->iMin = iMin; } } @@ -113014,32 +111777,34 @@ static void sampleInsert(StatAccum *p, StatSample *pNew, int nEqZero){ ** index. The value of anEq[iChng] and subsequent anEq[] elements are ** correct at this point. */ -static void samplePushPrevious(StatAccum *p, int iChng){ +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]; + 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]) ){ + if (p->nSample < p->mxSample || 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--){ + for (i = p->nSample - 1; i >= 0; i--) { int j; - for(j=p->nMaxEqZero; jnCol; j++) assert( p->a[i].anEq[j]>0 ); + for (j = p->nMaxEqZero; j < p->nCol; 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--){ + if (iChng < p->nMaxEqZero) { + 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]; + for (j = iChng; j < p->nCol; j++) { + if (p->a[i].anEq[j] == 0) + p->a[i].anEq[j] = p->current.anEq[j]; } } p->nMaxEqZero = iChng; @@ -113066,40 +111831,39 @@ static void samplePushPrevious(StatAccum *p, int iChng){ ** ** The R parameter is only used for STAT4 */ -static void statPush( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ +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]); + 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 ); + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(context); + assert(p->nCol > 0); + assert(iChng < p->nCol); - if( p->nRow==0 ){ + 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{ + for (i = 0; i < p->nCol; i++) + p->current.anEq[i] = 1; + } else { /* Second and subsequent calls get processed here */ #ifdef SQLITE_ENABLE_STAT4 - if( p->mxSample ) samplePushPrevious(p, iChng); + 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++){ + for (i = iChng; i < p->nCol; i++) { p->current.anDLt[i]++; #ifdef SQLITE_ENABLE_STAT4 - if( p->mxSample ) p->current.anLt[i] += p->current.anEq[i]; + if (p->mxSample) + p->current.anLt[i] += p->current.anEq[i]; #endif p->current.anEq[i] = 1; } @@ -113107,57 +111871,54 @@ static void statPush( p->nRow++; #ifdef SQLITE_ENABLE_STAT4 - if( p->mxSample ){ + if (p->mxSample) { tRowcnt nLt; - if( sqlite3_value_type(argv[2])==SQLITE_INTEGER ){ + 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])); + } 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; + p->current.iHash = p->iPrn = p->iPrn * 1103515245 + 12345; - nLt = p->current.anLt[p->nCol-1]; + 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 ){ + if ((nLt / p->nPSample) != (nLt + 1) / p->nPSample) { p->current.isPSample = 1; p->current.iCol = 0; - sampleInsert(p, &p->current, p->nCol-1); + sampleInsert(p, &p->current, p->nCol - 1); p->current.isPSample = 0; } /* Update the aBest[] array. */ - for(i=0; i<(p->nCol-1); i++){ + for (i = 0; i < (p->nCol - 1); i++) { p->current.iCol = i; - if( i>=iChng || sampleIsBetterPost(p, &p->current, &p->aBest[i]) ){ + if (i >= iChng || sampleIsBetterPost(p, &p->current, &p->aBest[i])) { sampleCopy(p, &p->aBest[i], &p->current); } } - }else + } else #endif - if( p->nLimit && p->nRow>(tRowcnt)p->nLimit*(p->nSkipAhead+1) ){ + if (p->nLimit && p->nRow > (tRowcnt)p->nLimit * (p->nSkipAhead + 1)) { p->nSkipAhead++; - sqlite3_result_int(context, p->current.anDLt[0]>0); + 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} -}; +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 */ +#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 @@ -113178,24 +111939,17 @@ static const FuncDef statPushFuncdef = { ** 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]); +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 ) + 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 ); + assert(argc == 1); #endif { /* Return the value to store in the "stat" column of the sqlite_stat1 @@ -113224,180 +111978,179 @@ static void statGet( ** 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 */ + 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++){ + 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; i < p->nKeyCol; 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; + if (iVal == 2 && p->nRow * 10 <= nDistinct * 11) + iVal = 1; sqlite3_str_appendf(&sStat, " %llu", iVal); - assert( p->current.anEq[i] ); + assert(p->current.anEq[i]); } sqlite3ResultStrAccum(context, &sStat); } #ifdef SQLITE_ENABLE_STAT4 - else if( eCall==STAT_GET_ROWID ){ - if( p->iGet<0 ){ + 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 ){ + if (p->iGet < p->nSample) { + 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 { + sqlite3_result_blob(context, pS->u.aRowid, pS->nRowid, SQLITE_TRANSIENT); } } - }else{ - tRowcnt *aCnt = 0; + } 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; + assert(p->iGet < p->nSample); + 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++){ + sqlite3StrAccumInit(&sStat, 0, 0, 0, p->nCol * 100); + for (i = 0; i < p->nCol; i++) { sqlite3_str_appendf(&sStat, "%llu ", (u64)aCnt[i]); } - if( sStat.nChar ) sStat.nChar--; + 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} -}; + 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){ +static void callStatGet(Parse* pParse, int regStat, int iParam, int regOut) { #ifdef SQLITE_ENABLE_STAT4 - sqlite3VdbeAddOp2(pParse->pVdbe, OP_Integer, iParam, regStat+1); + sqlite3VdbeAddOp2(pParse->pVdbe, OP_Integer, iParam, regStat + 1); #elif SQLITE_DEBUG - assert( iParam==STAT_GET_STAT1 ); + assert(iParam == STAT_GET_STAT1); #else - UNUSED_PARAMETER( iParam ); + UNUSED_PARAMETER(iParam); #endif - assert( regOut!=regStat && regOut!=regStat+1 ); - sqlite3VdbeAddFunctionCall(pParse, 0, regStat, regOut, 1+IsStat4, - &statGetFuncdef, 0); + 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 ); +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 && k < pIdx->nColumn); 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)); + 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) +#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) */ +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; + Table* pStat1 = 0; #endif pParse->nMem = MAX(pParse->nMem, iMem); v = sqlite3GetVdbe(pParse); - if( v==0 || NEVER(pTab==0) ){ + if (v == 0 || NEVER(pTab == 0)) { return; } - if( !IsOrdinaryTable(pTab) ){ + if (!IsOrdinaryTable(pTab)) { /* Do not gather statistics on views or virtual tables */ return; } - if( sqlite3_strlike("sqlite\\_%", pTab->zName, '\\')==0 ){ + if (sqlite3_strlike("sqlite\\_%", pTab->zName, '\\') == 0) { /* Do not gather statistics on system tables */ return; } - assert( sqlite3BtreeHoldsAllMutexes(db) ); + assert(sqlite3BtreeHoldsAllMutexes(db)); iDb = sqlite3SchemaToIndex(db, pTab->pSchema); - assert( iDb>=0 ); - assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + assert(iDb >= 0); + assert(sqlite3SchemaMutexHeld(db, iDb, 0)); #ifndef SQLITE_OMIT_AUTHORIZATION - if( sqlite3AuthCheck(pParse, SQLITE_ANALYZE, pTab->zName, 0, - db->aDb[iDb].zDbSName ) ){ + if (sqlite3AuthCheck(pParse, SQLITE_ANALYZE, pTab->zName, 0, db->aDb[iDb].zDbSName)) { return; } #endif #ifdef SQLITE_ENABLE_PREUPDATE_HOOK - if( db->xPreUpdateCallback ){ + if (db->xPreUpdateCallback) { pStat1 = (Table*)sqlite3DbMallocZero(db, sizeof(Table) + 13); - if( pStat1==0 ) return; + 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); + sqlite3VdbeAddOp4(pParse->pVdbe, OP_Noop, 0, 0, 0, (char*)pStat1, P4_DYNAMIC); } #endif @@ -113412,23 +112165,25 @@ static void analyzeOneTable( 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 */ + 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) ){ + 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{ + } else { nCol = pIdx->nColumn; zIdxName = pIdx->zName; - nColTest = pIdx->uniqNotNull ? pIdx->nKeyCol-1 : nCol-1; + nColTest = pIdx->uniqNotNull ? pIdx->nKeyCol - 1 : nCol - 1; } /* Populate the register containing the index name. */ @@ -113471,10 +112226,10 @@ static void analyzeOneTable( ** 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); + pParse->nMem = MAX(pParse->nMem, regPrev + nColTest); /* Open a read-only cursor on the index being analyzed. */ - assert( iDb==sqlite3SchemaToIndex(db, pIdx->pSchema) ); + assert(iDb == sqlite3SchemaToIndex(db, pIdx->pSchema)); sqlite3VdbeAddOp3(v, OP_OpenRead, iIdxCur, pIdx->tnum, iDb); sqlite3VdbeSetP4KeyInfo(pParse, pIdx); VdbeComment((v, "%s", pIdx->zName)); @@ -113486,25 +112241,24 @@ static void analyzeOneTable( ** (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, nCol, regStat + 1); + assert(regRowid == regStat + 2); sqlite3VdbeAddOp2(v, OP_Integer, pIdx->nKeyCol, regRowid); #ifdef SQLITE_ENABLE_STAT4 - if( OptimizationEnabled(db, SQLITE_Stat4) ){ + if (OptimizationEnabled(db, SQLITE_Stat4)) { sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regTemp); addrRewind = sqlite3VdbeAddOp1(v, OP_Rewind, iIdxCur); VdbeCoverage(v); - }else + } else #endif { addrRewind = sqlite3VdbeAddOp1(v, OP_Rewind, iIdxCur); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_Count, iIdxCur, regTemp, 1); } - assert( regTemp2==regStat+4 ); + assert(regTemp2 == regStat + 4); sqlite3VdbeAddOp2(v, OP_Integer, db->nAnalysisLimit, regTemp2); - sqlite3VdbeAddFunctionCall(pParse, 0, regStat+1, regStat, 4, - &statInitFuncdef, 0); + sqlite3VdbeAddFunctionCall(pParse, 0, regStat + 1, regStat, 4, &statInitFuncdef, 0); /* Implementation of the following: ** @@ -113517,11 +112271,12 @@ static void analyzeOneTable( sqlite3VdbeAddOp2(v, OP_Integer, 0, regChng); addrNextRow = sqlite3VdbeCurrentAddr(v); - if( nColTest>0 ){ + if (nColTest > 0) { int endDistinctTest = sqlite3VdbeMakeLabel(pParse); - int *aGotoChng; /* Array of jump instruction addresses */ - aGotoChng = sqlite3DbMallocRawNN(db, sizeof(int)*nColTest); - if( aGotoChng==0 ) continue; + int* aGotoChng; /* Array of jump instruction addresses */ + aGotoChng = sqlite3DbMallocRawNN(db, sizeof(int) * nColTest); + if (aGotoChng == 0) + continue; /* ** next_row: @@ -113535,27 +112290,25 @@ static void analyzeOneTable( */ sqlite3VdbeAddOp0(v, OP_Goto); addrNextRow = sqlite3VdbeCurrentAddr(v); - if( nColTest==1 && pIdx->nKeyCol==1 && IsUniqueIndex(pIdx) ){ + 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]); + for (i = 0; i < nColTest; i++) { + char* pColl = (char*)sqlite3LocateCollSeq(pParse, pIdx->azColl[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); + 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) @@ -113563,11 +112316,11 @@ static void analyzeOneTable( ** regPrev(1) = idx(1) ** ... */ - sqlite3VdbeJumpHere(v, addrNextRow-1); - for(i=0; ipTable); + } else { + Index* pPk = sqlite3PrimaryKeyIndex(pIdx->pTable); int j, k, regKey; regKey = sqlite3GetTempRange(pParse, pPk->nKeyCol); - for(j=0; jnKeyCol; j++){ + for (j = 0; j < pPk->nKeyCol; j++) { k = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[j]); - assert( k>=0 && knColumn ); - sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, regKey+j); - analyzeVdbeCommentIndexWithColumnName(v,pIdx,k); + assert(k >= 0 && k < pIdx->nColumn); + 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) ); + assert(regChng == (regStat + 1)); { - sqlite3VdbeAddFunctionCall(pParse, 1, regStat, regTemp, 2+IsStat4, - &statPushFuncdef, 0); - if( db->nAnalysisLimit ){ + 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); + 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); + sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); + VdbeCoverage(v); sqlite3VdbeJumpHere(v, j2); sqlite3VdbeJumpHere(v, j3); - }else{ - sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v); + } 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 ); + 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); @@ -113632,18 +112388,18 @@ static void analyzeOneTable( /* Add the entries to the stat4 table. */ #ifdef SQLITE_ENABLE_STAT4 - if( OptimizationEnabled(db, SQLITE_Stat4) && db->nAnalysisLimit==0 ){ + 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 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); + pParse->nMem = MAX(pParse->nMem, regCol + nCol); addrNext = sqlite3VdbeCurrentAddr(v); callStatGet(pParse, regStat, STAT_GET_ROWID, regSampleRowid); @@ -113654,13 +112410,13 @@ static void analyzeOneTable( 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); + jZeroRows = sqlite3VdbeAddOp1(v, OP_IfNot, regStat1); + VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Null, 0, regIdxname); - assert( "BBB"[0]==SQLITE_AFF_TEXT ); + 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); @@ -113691,14 +112447,13 @@ static void analyzeOneTable( } } - /* ** 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 ){ +static void loadAnalysis(Parse* pParse, int iDb) { + Vdbe* v = sqlite3GetVdbe(pParse); + if (v) { sqlite3VdbeAddOp1(v, OP_LoadAnalysis, iDb); } } @@ -113706,10 +112461,10 @@ static void loadAnalysis(Parse *pParse, int 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; +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; @@ -113718,11 +112473,11 @@ static void analyzeDatabase(Parse *pParse, int iDb){ iStatCur = pParse->nTab; pParse->nTab += 3; openStatTable(pParse, iDb, iStatCur, 0, 0); - iMem = pParse->nMem+1; + 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); + 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); @@ -113733,22 +112488,22 @@ static void analyzeDatabase(Parse *pParse, int iDb){ ** 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){ +static void analyzeTable(Parse* pParse, Table* pTab, Index* pOnlyIdx) { int iDb; int iStatCur; - assert( pTab!=0 ); - assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); + 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 ){ + if (pOnlyIdx) { openStatTable(pParse, iDb, iStatCur, pOnlyIdx->zName, "idx"); - }else{ + } else { openStatTable(pParse, iDb, iStatCur, pTab->zName, "tbl"); } - analyzeOneTable(pParse, pTab, pOnlyIdx, iStatCur,pParse->nMem+1,pParse->nTab); + analyzeOneTable(pParse, pTab, pOnlyIdx, iStatCur, pParse->nMem + 1, pParse->nTab); loadAnalysis(pParse, iDb); } @@ -113764,50 +112519,51 @@ static void analyzeTable(Parse *pParse, Table *pTab, Index *pOnlyIdx){ ** 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; +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; + 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) ){ + assert(sqlite3BtreeHoldsAllMutexes(pParse->db)); + if (SQLITE_OK != sqlite3ReadSchema(pParse)) { return; } - assert( pName2!=0 || pName1==0 ); - if( pName1==0 ){ + 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 */ + for (i = 0; i < db->nDb; i++) { + if (i == 1) + continue; /* Do not analyze the TEMP database */ analyzeDatabase(pParse, i); } - }else if( pName2->n==0 && (iDb = sqlite3FindDb(db, pName1))>=0 ){ + } else if (pName2->n == 0 && (iDb = sqlite3FindDb(db, pName1)) >= 0) { /* Analyze the schema named as the argument */ analyzeDatabase(pParse, iDb); - }else{ + } else { /* Form 3: Analyze the table or index named as an argument */ iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pTableName); - if( iDb>=0 ){ + if (iDb >= 0) { zDb = pName2->n ? db->aDb[iDb].zDbSName : 0; z = sqlite3NameFromToken(db, pTableName); - if( z ){ - if( (pIdx = sqlite3FindIndex(db, z, zDb))!=0 ){ + if (z) { + if ((pIdx = sqlite3FindIndex(db, z, zDb)) != 0) { analyzeTable(pParse, pIdx->pTable, pIdx); - }else if( (pTab = sqlite3LocateTable(pParse, 0, z, zDb))!=0 ){ + } else if ((pTab = sqlite3LocateTable(pParse, 0, z, zDb)) != 0) { analyzeTable(pParse, pTab, 0); } sqlite3DbFree(db, z); } } } - if( db->nSqlExec==0 && (v = sqlite3GetVdbe(pParse))!=0 ){ + if (db->nSqlExec == 0 && (v = sqlite3GetVdbe(pParse)) != 0) { sqlite3VdbeAddOp0(v, OP_Expire); } } @@ -113818,8 +112574,8 @@ SQLITE_PRIVATE void sqlite3Analyze(Parse *pParse, Token *pName1, Token *pName2){ */ typedef struct analysisInfo analysisInfo; struct analysisInfo { - sqlite3 *db; - const char *zDatabase; + sqlite3* db; + const char* zDatabase; }; /* @@ -113827,64 +112583,71 @@ struct analysisInfo { ** 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; +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 = ""; + if (z == 0) + z = ""; #else - assert( z!=0 ); + assert(z != 0); #endif - for(i=0; *z && i='0' && c<='9' ){ - v = v*10 + c - '0'; + while ((c = z[0]) >= '0' && c <= '9') { + v = v * 10 + c - '0'; z++; } #ifdef SQLITE_ENABLE_STAT4 - if( aOut ) aOut[i] = v; - if( aLog ) aLog[i] = sqlite3LogEst(v); + if (aOut) + aOut[i] = v; + if (aLog) + aLog[i] = sqlite3LogEst(v); #else - assert( aOut==0 ); + assert(aOut == 0); UNUSED_PARAMETER(aOut); - assert( aLog!=0 ); + assert(aLog != 0); aLog[i] = sqlite3LogEst(v); #endif - if( *z==' ' ) z++; + if (*z == ' ') + z++; } #ifndef SQLITE_ENABLE_STAT4 - assert( pIndex!=0 ); { + assert(pIndex != 0); + { #else - if( pIndex ){ + if (pIndex) { #endif pIndex->bUnordered = 0; pIndex->noSkipScan = 0; - while( z[0] ){ - if( sqlite3_strglob("unordered*", z)==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; + } 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 ){ + } 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)); + 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++; + while (z[0] != 0 && z[0] != ' ') + z++; + while (z[0] == ' ') + z++; } } } @@ -113900,52 +112663,53 @@ static void decodeIntArray( ** 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; +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 ); + assert(argc == 3); UNUSED_PARAMETER2(NotUsed, argc); - if( argv==0 || argv[0]==0 || argv[2]==0 ){ + if (argv == 0 || argv[0] == 0 || argv[2] == 0) { return 0; } pTable = sqlite3FindTable(pInfo->db, argv[0], pInfo->zDatabase); - if( pTable==0 ){ + if (pTable == 0) { return 0; } - if( argv[1]==0 ){ + if (argv[1] == 0) { pIndex = 0; - }else if( sqlite3_stricmp(argv[0],argv[1])==0 ){ + } else if (sqlite3_stricmp(argv[0], argv[1]) == 0) { pIndex = sqlite3PrimaryKeyIndex(pTable); - }else{ + } else { pIndex = sqlite3FindIndex(pInfo->db, argv[1], pInfo->zDatabase); } z = argv[2]; - if( pIndex ){ - tRowcnt *aiRowEst = 0; - int nCol = pIndex->nKeyCol+1; + 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 ){ + if (pIndex->aiRowEst == 0) { pIndex->aiRowEst = (tRowcnt*)sqlite3MallocZero(sizeof(tRowcnt) * nCol); - if( pIndex->aiRowEst==0 ) sqlite3OomFault(pInfo->db); + 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 ){ + if (pIndex->pPartIdxWhere == 0) { pTable->nRowLogEst = pIndex->aiRowLogEst[0]; pTable->tabFlags |= TF_HasStat1; } - }else{ + } else { Index fakeIdx; fakeIdx.szIdxRow = pTable->szTabRow; #ifdef SQLITE_ENABLE_COSTMULT @@ -113963,17 +112727,17 @@ static int analysisLoader(void *pData, int argc, char **argv, char **NotUsed){ ** If the Index.aSample variable is not NULL, delete the aSample[] array ** and its contents. */ -SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3 *db, Index *pIdx){ +SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3* db, Index* pIdx) { #ifdef SQLITE_ENABLE_STAT4 - if( pIdx->aSample ){ + if (pIdx->aSample) { int j; - for(j=0; jnSample; j++){ - IndexSample *p = &pIdx->aSample[j]; + for (j = 0; j < pIdx->nSample; j++) { + IndexSample* p = &pIdx->aSample[j]; sqlite3DbFree(db, p->p); } sqlite3DbFree(db, pIdx->aSample); } - if( db && db->pnBytesFreed==0 ){ + if (db && db->pnBytesFreed == 0) { pIdx->nSample = 0; pIdx->aSample = 0; } @@ -113988,36 +112752,36 @@ SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3 *db, Index *pIdx){ ** 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]; +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 (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; + 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 */ + 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 */ + 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 ){ + if (!pIdx->aiRowEst || iCol >= pIdx->nKeyCol || pIdx->aiRowEst[iCol + 1] == 0) { nRow = pFinal->anLt[iCol]; nDist100 = (i64)100 * pFinal->anDLt[iCol]; nSample--; - }else{ + } else { nRow = pIdx->aiRowEst[0]; - nDist100 = ((i64)100 * pIdx->aiRowEst[0]) / pIdx->aiRowEst[iCol+1]; + nDist100 = ((i64)100 * pIdx->aiRowEst[0]) / pIdx->aiRowEst[iCol + 1]; } pIdx->nRowEst0 = nRow; @@ -114025,19 +112789,18 @@ static void initAvgEq(Index *pIdx){ ** 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] - ){ + for (i = 0; i < nSample; i++) { + if (i == (pIdx->nSample - 1) || aSample[i].anDLt[iCol] != aSample[i + 1].anDLt[iCol]) { sumEq += aSample[i].anEq[iCol]; nSum100 += 100; } } - if( nDist100>nSum100 && sumEq nSum100 && sumEq < nRow) { + avgEq = ((i64)100 * (nRow - sumEq)) / (nDist100 - nSum100); } - if( avgEq==0 ) avgEq = 1; + if (avgEq == 0) + avgEq = 1; pIdx->aAvgEq[iCol] = avgEq; } } @@ -114047,15 +112810,12 @@ static void initAvgEq(Index *pIdx){ ** 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); +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; } @@ -114072,100 +112832,110 @@ static Index *findIndexOrPrimaryKey( ** ** 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[] */ +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 ); + assert(db->lookaside.bDisable); zSql = sqlite3MPrintf(db, zSql1, zDb); - if( !zSql ){ + if (!zSql) { return SQLITE_NOMEM_BKPT; } rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0); sqlite3DbFree(db, zSql); - if( rc ) return rc; + if (rc) + return rc; - while( sqlite3_step(pStmt)==SQLITE_ROW ){ - int nIdxCol = 1; /* Number of columns in stat4 records */ + 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; + 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; + 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) ){ + 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{ + } 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[] */ + nByte += nIdxCol * sizeof(tRowcnt); /* Space for Index.aAvgEq[] */ pIdx->aSample = sqlite3DbMallocZero(db, nByte); - if( pIdx->aSample==0 ){ + if (pIdx->aSample == 0) { sqlite3_finalize(pStmt); return SQLITE_NOMEM_BKPT; } pSpace = (tRowcnt*)&pIdx->aSample[nSample]; - pIdx->aAvgEq = pSpace; pSpace += nIdxCol; + 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; + for (i = 0; i < nSample; i++) { + pIdx->aSample[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) ); + assert(((u8*)pSpace) - nByte == (u8*)(pIdx->aSample)); } rc = sqlite3_finalize(pStmt); - if( rc ) return rc; + if (rc) + return rc; zSql = sqlite3MPrintf(db, zSql2, zDb); - if( !zSql ){ + if (!zSql) { return SQLITE_NOMEM_BKPT; } rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0); sqlite3DbFree(db, zSql); - if( rc ) return rc; + 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 */ + 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; + zIndex = (char*)sqlite3_column_text(pStmt, 0); + if (zIndex == 0) + continue; pIdx = findIndexOrPrimaryKey(db, zIndex, zDb); - if( pIdx==0 ) continue; + 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 ){ + 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); + 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 @@ -114175,17 +112945,18 @@ static int loadStatTbl( ** a buffer overread. */ pSample->n = sqlite3_column_bytes(pStmt, 4); pSample->p = sqlite3DbMallocZero(db, pSample->n + 2); - if( pSample->p==0 ){ + if (pSample->p == 0) { sqlite3_finalize(pStmt); return SQLITE_NOMEM_BKPT; } - if( pSample->n ){ + 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); + if (rc == SQLITE_OK) + initAvgEq(pPrevIdx); return rc; } @@ -114193,19 +112964,14 @@ static int loadStatTbl( ** 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; +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 - ); + 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; } @@ -114231,25 +112997,25 @@ static int loadStat4(sqlite3 *db, const char *zDb){ ** 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){ +SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3* db, int iDb) { analysisInfo sInfo; - HashElem *i; - char *zSql; + HashElem* i; + char* zSql; int rc = SQLITE_OK; - Schema *pSchema = db->aDb[iDb].pSchema; - const Table *pStat1; + Schema* pSchema = db->aDb[iDb].pSchema; + const Table* pStat1; - assert( iDb>=0 && iDbnDb ); - assert( db->aDb[iDb].pBt!=0 ); + assert(iDb >= 0 && iDb < db->nDb); + 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); + 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); + for (i = sqliteHashFirst(&pSchema->idxHash); i; i = sqliteHashNext(i)) { + Index* pIdx = sqliteHashData(i); pIdx->hasStat1 = 0; #ifdef SQLITE_ENABLE_STAT4 sqlite3DeleteIndexSamples(db, pIdx); @@ -114260,47 +113026,44 @@ SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ /* 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 ){ + 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{ + } 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); + 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 ){ + if (rc == SQLITE_OK) { DisableLookaside; rc = loadStat4(db, sInfo.zDatabase); EnableLookaside; } - for(i=sqliteHashFirst(&pSchema->idxHash); i; i=sqliteHashNext(i)){ - Index *pIdx = sqliteHashData(i); + 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 ){ + if (rc == SQLITE_NOMEM) { sqlite3OomFault(db); } return rc; } - #endif /* SQLITE_OMIT_ANALYZE */ /************** End of analyze.c *********************************************/ @@ -114339,13 +113102,12 @@ SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ ** ** will fail because neither abc or def can be resolved. */ -static int resolveAttachExpr(NameContext *pName, Expr *pExpr) -{ +static int resolveAttachExpr(NameContext* pName, Expr* pExpr) { int rc = SQLITE_OK; - if( pExpr ){ - if( pExpr->op!=TK_ID ){ + if (pExpr) { + if (pExpr->op != TK_ID) { rc = sqlite3ResolveExprNames(pName, pExpr); - }else{ + } else { pExpr->op = TK_STRING; } } @@ -114356,11 +113118,8 @@ static int resolveAttachExpr(NameContext *pName, Expr *pExpr) ** 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) - ); +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)); } /* @@ -114378,48 +113137,48 @@ SQLITE_PRIVATE int sqlite3DbIsNamed(sqlite3 *db, int iDb, const char *zName){ ** 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 -){ +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; + 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; + 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 = ""; + 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) +#define REOPEN_AS_MEMDB(db) (db->init.reopenMemdb) #else -# define REOPEN_AS_MEMDB(db) (0) +#define REOPEN_AS_MEMDB(db) (0) #endif - if( REOPEN_AS_MEMDB(db) ){ + 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; + if (pVfs == 0) + return; pNew = &db->aDb[db->init.iDb]; - if( pNew->pBt ) sqlite3BtreeClose(pNew->pBt); + 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{ + } else { /* This is a real ATTACH ** ** Check for the following errors: @@ -114428,15 +113187,13 @@ static void attachFunc( ** * 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] - ); + 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) ){ + for (i = 0; i < db->nDb; i++) { + assert(zName); + if (sqlite3DbIsNamed(db, i, zName)) { zErrDyn = sqlite3MPrintf(db, "database %s is already in use", zName); goto attach_error; } @@ -114445,13 +113202,15 @@ static void attachFunc( /* 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; + 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]; @@ -114463,89 +113222,87 @@ static void attachFunc( */ flags = db->openFlags; rc = sqlite3ParseUri(db->pVfs->zName, zFile, &flags, &pVfs, &zPath, &zErr); - if( rc!=SQLITE_OK ){ - if( rc==SQLITE_NOMEM ) sqlite3OomFault(db); + if (rc != SQLITE_OK) { + if (rc == SQLITE_NOMEM) + sqlite3OomFault(db); sqlite3_result_error(context, zErr, -1); sqlite3_free(zErr); return; } - assert( pVfs ); + 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 ){ + if (rc == SQLITE_CONSTRAINT) { rc = SQLITE_ERROR; zErrDyn = sqlite3MPrintf(db, "database is already attached"); - }else if( rc==SQLITE_OK ){ - Pager *pPager; + } else if (rc == SQLITE_OK) { + Pager* pPager; pNew->pSchema = sqlite3SchemaGet(db, pNew->pBt); - if( !pNew->pSchema ){ + 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"); + } 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) ); + 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)); + 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 ){ + pNew->safety_level = SQLITE_DEFAULT_SYNCHRONOUS + 1; + if (rc == SQLITE_OK && pNew->zDbSName == 0) { rc = SQLITE_NOMEM_BKPT; } - sqlite3_free_filename( zPath ); + 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 ){ + if (rc == SQLITE_OK) { sqlite3BtreeEnterAll(db); db->init.iDb = 0; db->mDbFlags &= ~(DBFLAG_SchemaKnownOk); - if( !REOPEN_AS_MEMDB(db) ){ + if (!REOPEN_AS_MEMDB(db)) { rc = sqlite3Init(db, &zErrDyn); } sqlite3BtreeLeaveAll(db); - assert( zErrDyn==0 || rc!=SQLITE_OK ); + assert(zErrDyn == 0 || rc != SQLITE_OK); } #ifdef SQLITE_USER_AUTHENTICATION - if( rc==SQLITE_OK && !REOPEN_AS_MEMDB(db) ){ + if (rc == SQLITE_OK && !REOPEN_AS_MEMDB(db)) { u8 newAuth = 0; rc = sqlite3UserAuthCheckLogin(db, zName, &newAuth); - if( newAuthauth.authLevel ){ + if (newAuth < db->auth.authLevel) { rc = SQLITE_AUTH_USER; } } #endif - if( rc ){ - if( !REOPEN_AS_MEMDB(db) ){ + if (rc) { + if (!REOPEN_AS_MEMDB(db)) { int iDb = db->nDb - 1; - assert( iDb>=2 ); - if( db->aDb[iDb].pBt ){ + 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 ){ + if (rc == SQLITE_NOMEM || rc == SQLITE_IOERR_NOMEM) { sqlite3OomFault(db); sqlite3DbFree(db, zErrDyn); zErrDyn = sqlite3MPrintf(db, "out of memory"); - }else if( zErrDyn==0 ){ + } else if (zErrDyn == 0) { zErrDyn = sqlite3MPrintf(db, "unable to open database: %s", zFile); } } @@ -114556,11 +113313,12 @@ static void attachFunc( attach_error: /* Return an error if we get here */ - if( zErrDyn ){ + if (zErrDyn) { sqlite3_result_error(context, zErrDyn, -1); sqlite3DbFree(db, zErrDyn); } - if( rc ) sqlite3_result_error_code(context, rc); + if (rc) + sqlite3_result_error_code(context, rc); } /* @@ -114571,49 +113329,46 @@ static void attachFunc( ** ** 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); +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; + Db* pDb = 0; + HashElem* pEntry; char zErr[128]; UNUSED_PARAMETER(NotUsed); - if( zName==0 ) zName = ""; - for(i=0; inDb; i++){ + if (zName == 0) + zName = ""; + for (i = 0; i < db->nDb; i++) { pDb = &db->aDb[i]; - if( pDb->pBt==0 ) continue; - if( sqlite3DbIsNamed(db, i, zName) ) break; + 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); + 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); + 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); + 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 ); + assert(db->aDb[1].pSchema); pEntry = sqliteHashFirst(&db->aDb[1].pSchema->trigHash); - while( pEntry ){ - Trigger *pTrig = (Trigger*)sqliteHashData(pEntry); - if( pTrig->pTabSchema==pDb->pSchema ){ + while (pEntry) { + Trigger* pTrig = (Trigger*)sqliteHashData(pEntry); + if (pTrig->pTabSchema == pDb->pSchema) { pTrig->pTabSchema = pTrig->pSchema; } pEntry = sqliteHashNext(pEntry); @@ -114633,65 +113388,60 @@ static void detachFunc( ** 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 */ -){ +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; + Vdbe* v; sqlite3* db = pParse->db; int regArgs; - if( pParse->nErr ) goto attach_end; + 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) - ){ + 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) ); + if (ALWAYS(pAuthArg)) { + char* zAuthArg; + if (pAuthArg->op == TK_STRING) { + assert(!ExprHasProperty(pAuthArg, EP_IntValue)); zAuthArg = pAuthArg->u.zToken; - }else{ + } else { zAuthArg = 0; } rc = sqlite3AuthCheck(pParse, type, zAuthArg, 0, 0); - if(rc!=SQLITE_OK ){ + 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); + 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); + 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)); + sqlite3VdbeAddOp1(v, OP_Expire, (type == SQLITE_ATTACH)); } attach_end: @@ -114705,18 +113455,17 @@ static void codeAttach( ** ** 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} - }; +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); } @@ -114725,18 +113474,17 @@ SQLITE_PRIVATE void sqlite3Detach(Parse *pParse, Expr *pDbname){ ** ** 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} - }; +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 */ @@ -114744,13 +113492,14 @@ SQLITE_PRIVATE void sqlite3Attach(Parse *pParse, Expr *p, Expr *pDbname, Expr *p /* ** 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 ){ +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{ + } else { sqlite3ErrorMsg(pFix->pParse, "%s cannot use variables", pFix->zType); return WRC_Abort; } @@ -114761,22 +113510,21 @@ static int fixExprCb(Walker *p, Expr *pExpr){ /* ** Select callback used by sqlite3FixAAAA() routines. */ -static int fixSelectCb(Walker *p, Select *pSelect){ - DbFixer *pFix = p->u.pFix; +static int fixSelectCb(Walker* p, Select* pSelect) { + DbFixer* pFix = p->u.pFix; int i; - SrcItem *pItem; - sqlite3 *db = pFix->pParse->db; + 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); + SrcList* pList = pSelect->pSrc; + + if (NEVER(pList == 0)) + return WRC_Continue; + for (i = 0, pItem = pList->a; i < pList->nSrc; 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); @@ -114787,16 +113535,14 @@ static int fixSelectCb(Walker *p, Select *pSelect){ 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) - ){ + 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) ){ + if (pSelect->pWith) { + for (i = 0; i < pSelect->pWith->nCte; i++) { + if (sqlite3WalkSelect(p, pSelect->pWith->a[i].pSelect)) { return WRC_Abort; } } @@ -114808,21 +113554,20 @@ static int fixSelectCb(Walker *p, Select *pSelect){ ** 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 ); +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->bTemp = (iDb == 1); pFix->w.pParse = pParse; pFix->w.xExprCallback = fixExprCb; pFix->w.xSelectCallback = fixSelectCb; @@ -114846,12 +113591,11 @@ SQLITE_PRIVATE void sqlite3FixInit( ** 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 */ -){ +SQLITE_PRIVATE int sqlite3FixSrcList(DbFixer* pFix, /* Context of the fixation */ + SrcList* pList /* The Source list to check and modify */ +) { int res = 0; - if( pList ){ + if (pList) { Select s; memset(&s, 0, sizeof(s)); s.pSrc = pList; @@ -114860,42 +113604,33 @@ SQLITE_PRIVATE int sqlite3FixSrcList( 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 */ -){ +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 */ -){ +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) - ){ +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) - ){ + 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; } } @@ -114979,18 +113714,17 @@ SQLITE_PRIVATE int sqlite3FixTriggerStep( ** 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 -){ +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; + 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); + if (db->xAuth) + sqlite3ExpirePreparedStatements(db, 1); sqlite3_mutex_leave(db->mutex); return SQLITE_OK; } @@ -114999,7 +113733,7 @@ SQLITE_API int sqlite3_set_authorizer( ** Write an error message into pParse->zErrMsg that explains that the ** user-supplied authorization function returned an illegal value. */ -static void sqliteAuthBadReturnCode(Parse *pParse){ +static void sqliteAuthBadReturnCode(Parse* pParse) { sqlite3ErrorMsg(pParse, "authorizer malfunction"); pParse->rc = SQLITE_ERROR; } @@ -115013,28 +113747,30 @@ static void sqliteAuthBadReturnCode(Parse *pParse){ ** 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 */ +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 + 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 + , + 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); + ); + 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 ){ + } else if (rc != SQLITE_IGNORE && rc != SQLITE_OK) { sqliteAuthBadReturnCode(pParse); } return rc; @@ -115049,53 +113785,53 @@ SQLITE_PRIVATE int sqlite3AuthReadCol( ** 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 ); +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 ){ + if (iDb < 0) { /* An attempt to read a column out of a subquery or other ** temporary table. */ return; } - if( pExpr->op==TK_TRIGGER ){ + if (pExpr->op == TK_TRIGGER) { pTab = pParse->pTriggerTab; - }else{ - assert( pTabList ); - for(iSrc=0; iSrcnSrc; iSrc++){ - if( pExpr->iTable==pTabList->a[iSrc].iCursor ){ + } else { + assert(pTabList); + for (iSrc = 0; iSrc < pTabList->nSrc; iSrc++) { + if (pExpr->iTable == pTabList->a[iSrc].iCursor) { pTab = pTabList->a[iSrc].pTab; break; } } } iCol = pExpr->iColumn; - if( pTab==0 ) return; + if (pTab == 0) + return; - if( iCol>=0 ){ - assert( iColnCol ); + if (iCol >= 0) { + assert(iCol < pTab->nCol); zCol = pTab->aCol[iCol].zCnName; - }else if( pTab->iPKey>=0 ){ - assert( pTab->iPKeynCol ); + } else if (pTab->iPKey >= 0) { + assert(pTab->iPKey < pTab->nCol); zCol = pTab->aCol[pTab->iPKey].zCnName; - }else{ + } else { zCol = "ROWID"; } - assert( iDb>=0 && iDbdb->nDb ); - if( SQLITE_IGNORE==sqlite3AuthReadCol(pParse, pTab->zName, zCol, iDb) ){ + assert(iDb >= 0 && iDb < pParse->db->nDb); + if (SQLITE_IGNORE == sqlite3AuthReadCol(pParse, pTab->zName, zCol, iDb)) { pExpr->op = TK_NULL; } } @@ -115106,21 +113842,15 @@ SQLITE_PRIVATE void sqlite3AuthRead( ** 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; +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 ){ + assert(!IN_RENAME_OBJECT || db->xAuth == 0); + if (db->xAuth == 0 || db->init.busy || IN_SPECIAL_PARSE) { return SQLITE_OK; } @@ -115130,20 +113860,21 @@ SQLITE_PRIVATE int sqlite3AuthCheck( ** ** 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 ); + 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 + , + db->auth.zAuthUser #endif - ); - if( rc==SQLITE_DENY ){ + ); + if (rc == SQLITE_DENY) { sqlite3ErrorMsg(pParse, "not authorized"); pParse->rc = SQLITE_AUTH; - }else if( rc!=SQLITE_OK && rc!=SQLITE_IGNORE ){ + } else if (rc != SQLITE_OK && rc != SQLITE_IGNORE) { rc = SQLITE_DENY; sqliteAuthBadReturnCode(pParse); } @@ -115155,12 +113886,8 @@ SQLITE_PRIVATE int sqlite3AuthCheck( ** 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 ); +SQLITE_PRIVATE void sqlite3AuthContextPush(Parse* pParse, AuthContext* pContext, const char* zContext) { + assert(pParse); pContext->pParse = pParse; pContext->zAuthContext = pParse->zAuthContext; pParse->zAuthContext = zContext; @@ -115170,8 +113897,8 @@ SQLITE_PRIVATE void sqlite3AuthContextPush( ** Pop an authorization context that was previously pushed ** by sqlite3AuthContextPush */ -SQLITE_PRIVATE void sqlite3AuthContextPop(AuthContext *pContext){ - if( pContext->pParse ){ +SQLITE_PRIVATE void sqlite3AuthContextPop(AuthContext* pContext) { + if (pContext->pParse) { pContext->pParse->zAuthContext = pContext->zAuthContext; pContext->pParse = 0; } @@ -115216,7 +113943,7 @@ 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 */ + const char* zLockName; /* Name of the table */ }; /* @@ -115229,51 +113956,50 @@ struct TableLock { ** 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; +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 ); + TableLock* p; + assert(iDb >= 0); pToplevel = sqlite3ParseToplevel(pParse); - for(i=0; inTableLock; i++){ + for (i = 0; i < pToplevel->nTableLock; i++) { p = &pToplevel->aTableLock[i]; - if( p->iDb==iDb && p->iTab==iTab ){ + 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 ){ + 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{ + } 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; +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); } @@ -115281,20 +114007,19 @@ SQLITE_PRIVATE void sqlite3TableLock( ** Code an OP_TableLock instruction for each table locked by the ** statement (configured by calls to sqlite3TableLock()). */ -static void codeTableLocks(Parse *pParse){ +static void codeTableLocks(Parse* pParse) { int i; - Vdbe *pVdbe = pParse->pVdbe; - assert( pVdbe!=0 ); + Vdbe* pVdbe = pParse->pVdbe; + assert(pVdbe != 0); - for(i=0; inTableLock; i++){ - TableLock *p = &pParse->aTableLock[i]; + for (i = 0; i < pParse->nTableLock; i++) { + TableLock* p = &pParse->aTableLock[i]; int p1 = p->iDb; - sqlite3VdbeAddOp4(pVdbe, OP_TableLock, p1, p->iTab, p->isWriteLock, - p->zLockName, P4_STATIC); + sqlite3VdbeAddOp4(pVdbe, OP_TableLock, p1, p->iTab, p->isWriteLock, p->zLockName, P4_STATIC); } } #else - #define codeTableLocks(x) +#define codeTableLocks(x) #endif /* @@ -115302,10 +114027,12 @@ static void codeTableLocks(Parse *pParse){ ** 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){ +#if SQLITE_MAX_ATTACHED > 30 +SQLITE_PRIVATE int sqlite3DbMaskAllZero(yDbMask m) { int i; - for(i=0; ipToplevel==0 ); + assert(pParse->pToplevel == 0); db = pParse->db; - assert( db->pParse==pParse ); - if( pParse->nested ) return; - if( pParse->nErr ){ - if( db->mallocFailed ) pParse->rc = SQLITE_NOMEM; + assert(db->pParse == pParse); + if (pParse->nested) + return; + if (pParse->nErr) { + if (db->mallocFailed) + pParse->rc = SQLITE_NOMEM; return; } - assert( db->mallocFailed==0 ); + 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 ){ + if (v == 0) { + if (db->init.busy) { pParse->rc = SQLITE_DONE; return; } v = sqlite3GetVdbe(pParse); - if( v==0 ) pParse->rc = SQLITE_ERROR; + if (v == 0) + pParse->rc = SQLITE_ERROR; } - assert( !pParse->isMultiWrite - || sqlite3VdbeAssertMayAbort(v, pParse->mayAbort)); - if( v ){ - if( pParse->bReturning ){ - Returning *pReturning = pParse->u1.pReturning; + 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 ){ + if (pReturning->nRetCol) { sqlite3VdbeAddOp0(v, OP_FkCheck); - addrRewind = - sqlite3VdbeAddOp1(v, OP_Rewind, pReturning->iRetCur); + 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); + for (i = 0; i < pReturning->nRetCol; i++) { + sqlite3VdbeAddOp3(v, OP_Column, pReturning->iRetCur, i, reg + i); } sqlite3VdbeAddOp2(v, OP_ResultRow, reg, i); - sqlite3VdbeAddOp2(v, OP_Next, pReturning->iRetCur, addrRewind+1); + sqlite3VdbeAddOp2(v, OP_Next, pReturning->iRetCur, addrRewind + 1); VdbeCoverage(v); sqlite3VdbeJumpHere(v, addrRewind); } @@ -115373,9 +114101,9 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ sqlite3VdbeAddOp0(v, OP_Halt); #if SQLITE_USER_AUTHENTICATION - if( pParse->nTableLock>0 && db->init.busy==0 ){ + if (pParse->nTableLock > 0 && db->init.busy == 0) { sqlite3UserAuthInit(db); - if( db->auth.authLevelauth.authLevel < UAUTH_User) { sqlite3ErrorMsg(pParse, "user not authenticated"); pParse->rc = SQLITE_AUTH_USER; return; @@ -115389,33 +114117,31 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ ** transaction on each used database and to verify the schema cookie ** on each used database. */ - if( db->mallocFailed==0 - && (DbMaskNonZero(pParse->cookieMask) || pParse->pConstExpr) - ){ + if (db->mallocFailed == 0 && (DbMaskNonZero(pParse->cookieMask) || pParse->pConstExpr)) { int iDb, i; - assert( sqlite3VdbeGetOp(v, 0)->opcode==OP_Init ); + assert(sqlite3VdbeGetOp(v, 0)->opcode == OP_Init); sqlite3VdbeJumpHere(v, 0); - assert( db->nDb>0 ); + assert(db->nDb > 0); iDb = 0; - do{ - Schema *pSchema; - if( DbMaskTest(pParse->cookieMask, iDb)==0 ) continue; + 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 */ + 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 ); + if (db->init.busy == 0) + sqlite3VdbeChangeP5(v, 1); + VdbeComment((v, "usesStmtJournal=%d", pParse->mayAbort && pParse->isMultiWrite)); + } while (++iDb < db->nDb); #ifndef SQLITE_OMIT_VIRTUALTABLE - for(i=0; inVtabLock; i++){ - char *vtab = (char *)sqlite3GetVTable(db, pParse->apVtabLock[i]); + for (i = 0; i < pParse->nVtabLock; i++) { + char* vtab = (char*)sqlite3GetVTable(db, pParse->apVtabLock[i]); sqlite3VdbeAddOp4(v, OP_VBegin, 0, 0, 0, vtab, P4_VTAB); } pParse->nVtabLock = 0; @@ -115428,7 +114154,7 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ codeTableLocks(pParse); /* Initialize any AUTOINCREMENT data structures required. - */ + */ sqlite3AutoincrementBegin(pParse); /* Code constant expressions that where factored out of inner loops. @@ -115438,20 +114164,20 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ ** expressions have iConstExprReg==0. Do not generate code for ** those expressions, of course. */ - if( pParse->pConstExpr ){ - ExprList *pEL = pParse->pConstExpr; + if (pParse->pConstExpr) { + ExprList* pEL = pParse->pConstExpr; pParse->okConstFactor = 0; - for(i=0; inExpr; i++){ + for (i = 0; i < pEL->nExpr; i++) { int iReg = pEL->a[i].u.iConstExprReg; - if( iReg>0 ){ + if (iReg > 0) { sqlite3ExprCode(pParse, pEL->a[i].pExpr, iReg); } } } - if( pParse->bReturning ){ - Returning *pRet = pParse->u1.pReturning; - if( pRet->nRetCol ){ + if (pParse->bReturning) { + Returning* pRet = pParse->u1.pReturning; + if (pRet->nRetCol) { sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRet->iRetCur, pRet->nRetCol); } } @@ -115462,16 +114188,16 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ } /* Get the VDBE program ready for execution - */ - assert( v!=0 || pParse->nErr ); - assert( db->mallocFailed==0 || pParse->nErr ); - if( pParse->nErr==0 ){ + */ + 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 ); + * See ticket [a696379c1f08866] */ + assert(pParse->pAinc == 0 || pParse->nTab > 0); sqlite3VdbeMakeReady(v, pParse); pParse->rc = SQLITE_DONE; - }else{ + } else { pParse->rc = SQLITE_ERROR; } } @@ -115489,23 +114215,25 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ ** SQL functions. In other words, it is not possible to override a ** built-in function. */ -SQLITE_PRIVATE void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){ +SQLITE_PRIVATE void sqlite3NestedParse(Parse* pParse, const char* zFormat, ...) { va_list ap; - char *zSql; - sqlite3 *db = pParse->db; + 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 */ + 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 ){ + 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; + if (!db->mallocFailed) + pParse->rc = SQLITE_TOOBIG; pParse->nErr++; return; } @@ -115525,8 +114253,8 @@ SQLITE_PRIVATE void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){ ** 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; +SQLITE_PRIVATE int sqlite3UserAuthTable(const char* zTable) { + return sqlite3_stricmp(zTable, "sqlite_user") == 0; } #endif @@ -115542,68 +114270,67 @@ SQLITE_PRIVATE int sqlite3UserAuthTable(const char *zTable){ ** ** See also sqlite3LocateTable(). */ -SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3 *db, const char *zName, const char *zDatabase){ - Table *p = 0; +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) ); + 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.authLevelauth.authLevel < UAUTH_Admin && sqlite3UserAuthTable(zName) != 0) { return 0; } #endif - if( zDatabase ){ - for(i=0; inDb; i++){ - if( sqlite3StrICmp(zDatabase, db->aDb[i].zDbSName)==0 ) break; + if (zDatabase) { + for (i = 0; i < db->nDb; i++) { + if (sqlite3StrICmp(zDatabase, db->aDb[i].zDbSName) == 0) + break; } - if( i>=db->nDb ){ + 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 ){ + if (sqlite3StrICmp(zDatabase, "main") == 0) { i = 0; - }else{ + } 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); + 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 { + if (sqlite3StrICmp(zName + 7, &PREFERRED_SCHEMA_TABLE[7]) == 0) { + p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, LEGACY_SCHEMA_TABLE); } } } - }else{ + } else { /* Match against TEMP first */ p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, zName); - if( p ) return p; + if (p) + return p; /* The main database is second */ p = sqlite3HashFind(&db->aDb[0].pSchema->tblHash, zName); - if( p ) return p; + if (p) + return p; /* Attached databases are in order of attachment */ - for(i=2; inDb; i++){ - assert( sqlite3SchemaMutexHeld(db, i, 0) ); + for (i = 2; i < db->nDb; i++) { + assert(sqlite3SchemaMutexHeld(db, i, 0)); p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName); - if( p ) break; + if (p) + break; } - if( p==0 && sqlite3StrNICmp(zName, "sqlite_", 7)==0 ){ - if( sqlite3StrICmp(zName+7, &PREFERRED_SCHEMA_TABLE[7])==0 ){ + 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); + } else if (sqlite3StrICmp(zName + 7, &PREFERRED_TEMP_SCHEMA_TABLE[7]) == 0) { + p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, LEGACY_TEMP_SCHEMA_TABLE); } } } @@ -115620,55 +114347,53 @@ SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3 *db, const char *zName, const cha ** 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; +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) - ){ + if ((db->mDbFlags & DBFLAG_SchemaKnownOk) == 0 && SQLITE_OK != sqlite3ReadSchema(pParse)) { return 0; } p = sqlite3FindTable(db, zName, zDbase); - if( p==0 ){ + 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 ){ + 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 ); + if (pMod && sqlite3VtabEponymousTableInit(pParse, pMod)) { + testcase(pMod->pEpoTab == 0); return pMod->pEpoTab; } } #endif - if( flags & LOCATE_NOERR ) return 0; + if (flags & LOCATE_NOERR) + return 0; pParse->checkSchema = 1; - }else if( IsVirtual(p) && pParse->disableVtab ){ + } 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 ){ + 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{ + } else { sqlite3ErrorMsg(pParse, "%s: %s", zMsg, zName); } - }else{ - assert( HasRowid(p) || p->iPKey<0 ); + } else { + assert(HasRowid(p) || p->iPKey < 0); } return p; @@ -115683,17 +114408,13 @@ SQLITE_PRIVATE Table *sqlite3LocateTable( ** 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 ){ +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{ + } else { zDb = p->zDatabase; } return sqlite3LocateTable(pParse, flags, p->zName, zDb); @@ -115703,12 +114424,12 @@ SQLITE_PRIVATE Table *sqlite3LocateTableItem( ** 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 ){ +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 ){ + if (sqlite3StrICmp(zName + 7, &LEGACY_TEMP_SCHEMA_TABLE[7]) == 0) { return PREFERRED_TEMP_SCHEMA_TABLE; } } @@ -115727,19 +114448,21 @@ SQLITE_PRIVATE const char *sqlite3PreferredTableName(const char *zName){ ** 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; +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) ); + assert(zDb != 0 || sqlite3BtreeHoldsAllMutexes(db)); + for (i = OMIT_TEMPDB; i < db->nDb; 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; + if (p) + break; } return p; } @@ -115747,14 +114470,15 @@ SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3 *db, const char *zName, const cha /* ** Reclaim the memory used by an index */ -SQLITE_PRIVATE void sqlite3FreeIndex(sqlite3 *db, Index *p){ +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); + if (p->isResized) + sqlite3DbFree(db, (void*)p->azColl); #ifdef SQLITE_ENABLE_STAT4 sqlite3_free(p->aiRowEst); #endif @@ -115767,23 +114491,25 @@ SQLITE_PRIVATE void sqlite3FreeIndex(sqlite3 *db, Index *p){ ** 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; +SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3* db, int iDb, const char* zIdxName) { + Index* pIndex; + Hash* pHash; - assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + assert(sqlite3SchemaMutexHeld(db, iDb, 0)); pHash = &db->aDb[iDb].pSchema->idxHash; pIndex = sqlite3HashInsert(pHash, zIdxName, 0); - if( ALWAYS(pIndex) ){ - if( pIndex->pTable->pIndex==pIndex ){ + if (ALWAYS(pIndex)) { + if (pIndex->pTable->pIndex == pIndex) { pIndex->pTable->pIndex = pIndex->pNext; - }else{ - Index *p; + } 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) ){ + while (ALWAYS(p) && p->pNext != pIndex) { + p = p->pNext; + } + if (ALWAYS(p && p->pNext == pIndex)) { p->pNext = pIndex->pNext; } } @@ -115800,23 +114526,23 @@ SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3 *db, int iDb, const char ** Entry 0 (the "main" database) and entry 1 (the "temp" database) ** are never candidates for being collapsed. */ -SQLITE_PRIVATE void sqlite3CollapseDatabaseArray(sqlite3 *db){ +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 ){ + for (i = j = 2; i < db->nDb; 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])); + 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; } @@ -115827,20 +114553,20 @@ SQLITE_PRIVATE void sqlite3CollapseDatabaseArray(sqlite3 *db){ ** 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){ +SQLITE_PRIVATE void sqlite3ResetOneSchema(sqlite3* db, int iDb) { int i; - assert( iDbnDb ); + assert(iDb < db->nDb); - if( iDb>=0 ){ - assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + 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) ){ + if (db->nSchemaLock == 0) { + for (i = 0; i < db->nDb; i++) { + if (DbHasProperty(db, i, DB_ResetWanted)) { sqlite3SchemaClear(db->aDb[i].pSchema); } } @@ -115851,23 +114577,23 @@ SQLITE_PRIVATE void sqlite3ResetOneSchema(sqlite3 *db, int iDb){ ** Erase all schema information from all attached databases (including ** "main" and "temp") for a single database connection. */ -SQLITE_PRIVATE void sqlite3ResetAllSchemasOfConnection(sqlite3 *db){ +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 ){ + for (i = 0; i < db->nDb; i++) { + Db* pDb = &db->aDb[i]; + if (pDb->pSchema) { + if (db->nSchemaLock == 0) { sqlite3SchemaClear(pDb->pSchema); - }else{ + } else { DbSetProperty(db, i, DB_ResetWanted); } } } - db->mDbFlags &= ~(DBFLAG_SchemaChange|DBFLAG_SchemaKnownOk); + db->mDbFlags &= ~(DBFLAG_SchemaChange | DBFLAG_SchemaKnownOk); sqlite3VtabUnlockList(db); sqlite3BtreeLeaveAll(db); - if( db->nSchemaLock==0 ){ + if (db->nSchemaLock == 0) { sqlite3CollapseDatabaseArray(db); } } @@ -115875,7 +114601,7 @@ SQLITE_PRIVATE void sqlite3ResetAllSchemasOfConnection(sqlite3 *db){ /* ** This routine is called when a commit occurs. */ -SQLITE_PRIVATE void sqlite3CommitInternalChanges(sqlite3 *db){ +SQLITE_PRIVATE void sqlite3CommitInternalChanges(sqlite3* db) { db->mDbFlags &= ~DBFLAG_SchemaChange; } @@ -115884,24 +114610,20 @@ SQLITE_PRIVATE void sqlite3CommitInternalChanges(sqlite3 *db){ ** 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) ); +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; + if (pCol->iDflt == 0 || NEVER(pList == 0) || NEVER(pList->nExpr < pCol->iDflt)) { + 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; + } else { + sqlite3ExprDelete(pParse->db, pList->a[pCol->iDflt - 1].pExpr); + pList->a[pCol->iDflt - 1].pExpr = pExpr; } } @@ -115910,33 +114632,33 @@ SQLITE_PRIVATE void sqlite3ColumnSetExpr( ** 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; +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->nExpr < pCol->iDflt)) + 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 -){ +SQLITE_PRIVATE void sqlite3ColumnSetColl(sqlite3* db, Column* pCol, const char* zColl) { i64 nColl; i64 n; - char *zNew; - assert( zColl!=0 ); + char* zNew; + assert(zColl != 0); n = sqlite3Strlen30(pCol->zCnName) + 1; - if( pCol->colFlags & COLFLAG_HASTYPE ){ - n += sqlite3Strlen30(pCol->zCnName+n) + 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 ){ + zNew = sqlite3DbRealloc(db, pCol->zCnName, nColl + n); + if (zNew) { pCol->zCnName = zNew; memcpy(pCol->zCnName + n, zColl, nColl); pCol->colFlags |= COLFLAG_HASCOLL; @@ -115946,38 +114668,43 @@ SQLITE_PRIVATE void sqlite3ColumnSetColl( /* ** 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; +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 ); + while (*z) { + z++; } - return z+1; + 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){ +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) ); + Column* pCol; + assert(pTable != 0); + if ((pCol = pTable->aCol) != 0) { + for (i = 0; i < pTable->nCol; i++, pCol++) { + assert(pCol->zCnName == 0 || pCol->hName == sqlite3StrIHash(pCol->zCnName)); sqlite3DbFree(db, pCol->zCnName); } sqlite3DbFree(db, pTable->aCol); - if( IsOrdinaryTable(pTable) ){ + if (IsOrdinaryTable(pTable)) { sqlite3ExprListDelete(db, pTable->u.tab.pDfltList); } - if( db==0 || db->pnBytesFreed==0 ){ + if (db == 0 || db->pnBytesFreed == 0) { pTable->aCol = 0; pTable->nCol = 0; - if( IsOrdinaryTable(pTable) ){ + if (IsOrdinaryTable(pTable)) { pTable->u.tab.pDfltList = 0; } } @@ -115999,7 +114726,7 @@ SQLITE_PRIVATE void sqlite3DeleteColumnNames(sqlite3 *db, Table *pTable){ ** 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){ +static void SQLITE_NOINLINE deleteTable(sqlite3* db, Table* pTable) { Index *pIndex, *pNext; #ifdef SQLITE_DEBUG @@ -116011,42 +114738,39 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){ ** 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 ){ + 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){ + 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 ); + 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) ){ + if (IsOrdinaryTable(pTable)) { sqlite3FkDelete(db, pTable); } #ifndef SQLITE_OMIT_VIRTUAL_TABLE - else if( IsVirtual(pTable) ){ + else if (IsVirtual(pTable)) { sqlite3VtabClear(db, pTable); } #endif - else{ - assert( IsView(pTable) ); + 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); @@ -116054,29 +114778,30 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){ sqlite3DbFree(db, pTable); /* Verify that no lookaside memory was used by schema tables */ - assert( nLookaside==0 || nLookaside==sqlite3LookasideUsed(db,0) ); + assert(nLookaside == 0 || nLookaside == sqlite3LookasideUsed(db, 0)); } -SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3 *db, Table *pTable){ +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; + 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; +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 */ + assert(db != 0); + assert(iDb >= 0 && iDb < db->nDb); + 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); @@ -116096,12 +114821,12 @@ SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3 *db, int iDb, const char ** 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 ){ +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{ + } else { zName = 0; } return zName; @@ -116111,11 +114836,11 @@ SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3 *db, const Token *pName){ ** 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); +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 ){ + if (p->nTab == 0) { p->nTab = 1; } } @@ -116126,15 +114851,17 @@ SQLITE_PRIVATE void sqlite3OpenSchemaTable(Parse *p, int iDb){ ** 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; +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; + if (i == 0 && 0 == sqlite3_stricmp("main", zName)) + break; } } return i; @@ -116146,9 +114873,9 @@ SQLITE_PRIVATE int sqlite3FindDbName(sqlite3 *db, const char *zName){ ** 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 */ +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); @@ -116171,30 +114898,28 @@ SQLITE_PRIVATE int sqlite3FindDb(sqlite3 *db, Token *pName){ ** 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; +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 ) { + 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 ){ + 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); + } else { + assert(db->init.iDb == 0 || db->init.busy || IN_SPECIAL_PARSE || (db->mDbFlags & DBFLAG_Vacuum) != 0); iDb = db->init.iDb; *pUnqual = pName1; } @@ -116204,15 +114929,12 @@ SQLITE_PRIVATE int sqlite3TwoPartName( /* ** 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; +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; } /* @@ -116226,37 +114948,28 @@ SQLITE_PRIVATE int sqlite3WritableSchema(sqlite3 *db){ ** 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 - ){ +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]) - ){ + 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); + } 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; } @@ -116264,9 +114977,10 @@ SQLITE_PRIVATE int sqlite3CheckObjectName( /* ** 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){} +SQLITE_PRIVATE Index* sqlite3PrimaryKeyIndex(Table* pTab) { + Index* p; + for (p = pTab->pIndex; p && !IsPrimaryKeyIndex(p); p = p->pNext) { + } return p; } @@ -116276,10 +114990,11 @@ SQLITE_PRIVATE Index *sqlite3PrimaryKeyIndex(Table *pTab){ ** 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){ +SQLITE_PRIVATE i16 sqlite3TableColumnToIndex(Index* pIdx, i16 iCol) { int i; - for(i=0; inColumn; i++){ - if( iCol==pIdx->aiColumn[i] ) return i; + for (i = 0; i < pIdx->nColumn; i++) { + if (iCol == pIdx->aiColumn[i]) + return i; } return -1; } @@ -116296,11 +115011,12 @@ SQLITE_PRIVATE i16 sqlite3TableColumnToIndex(Index *pIdx, i16 iCol){ ** ** 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 ){ +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++; + for (i = 0; i <= iCol; i++) { + if (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL) + iCol++; } } return iCol; @@ -116344,18 +115060,20 @@ SQLITE_PRIVATE i16 sqlite3StorageColumnToTable(Table *pTab, i16 iCol){ ** 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){ +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++; + assert(iCol < pTab->nCol); + if ((pTab->tabFlags & TF_HasVirtual) == 0 || iCol < 0) + return iCol; + for (i = 0, n = 0; i < iCol; i++) { + if ((pTab->aCol[i].colFlags & COLFLAG_VIRTUAL) == 0) + n++; } - if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ){ + if (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL) { /* iCol is a virtual column itself */ return pTab->nNVCol + i - n; - }else{ + } else { /* iCol is a normal or stored column */ return n; } @@ -116370,10 +115088,10 @@ SQLITE_PRIVATE i16 sqlite3TableColumnToStorage(Table *pTab, i16 iCol){ ** will return false for sqlite3_stmt_readonly() even if that statement ** is a read-only no-op. */ -static void sqlite3ForceNotReadOnly(Parse *pParse){ +static void sqlite3ForceNotReadOnly(Parse* pParse) { int iReg = ++pParse->nMem; - Vdbe *v = sqlite3GetVdbe(pParse); - if( v ){ + Vdbe* v = sqlite3GetVdbe(pParse); + if (v) { sqlite3VdbeAddOp3(v, OP_JournalMode, 0, iReg, PAGER_JOURNALMODE_QUERY); sqlite3VdbeUsesBtree(v, 0); } @@ -116395,65 +115113,62 @@ static void sqlite3ForceNotReadOnly(Parse *pParse){ ** 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 ){ +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{ + } else { /* The common case */ iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName); - if( iDb<0 ) return; - if( !OMIT_TEMPDB && isTemp && pName2->n>0 && iDb!=1 ){ + 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; + if (!OMIT_TEMPDB && isTemp) + iDb = 1; zName = sqlite3NameFromToken(db, pName); - if( IN_RENAME_OBJECT ){ + if (IN_RENAME_OBJECT) { sqlite3RenameTokenMap(pParse, (void*)zName, pName); } } pParse->sNameToken = *pName; - if( zName==0 ) return; - if( sqlite3CheckObjectName(pParse, zName, isView?"view":"table", zName) ){ + if (zName == 0) + return; + if (sqlite3CheckObjectName(pParse, zName, isView ? "view" : "table", zName)) { goto begin_table_error; } - if( db->init.iDb==1 ) isTemp = 1; + if (db->init.iDb == 1) + isTemp = 1; #ifndef SQLITE_OMIT_AUTHORIZATION - assert( isTemp==0 || isTemp==1 ); - assert( isView==0 || isView==1 ); + 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) ){ + 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) ){ + if (!isVirtual && sqlite3AuthCheck(pParse, (int)aCode[isTemp + 2 * isView], zName, 0, zDb)) { goto begin_table_error; } } @@ -116466,32 +115181,31 @@ SQLITE_PRIVATE void sqlite3StartTable( ** 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) ){ + 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 ); + 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 ){ + 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 ); + if (pTable == 0) { + assert(db->mallocFailed); pParse->rc = SQLITE_NOMEM_BKPT; pParse->nErr++; goto begin_table_error; @@ -116503,9 +115217,10 @@ SQLITE_PRIVATE void sqlite3StartTable( #ifdef SQLITE_DEFAULT_ROWEST pTable->nRowLogEst = sqlite3LogEst(SQLITE_DEFAULT_ROWEST); #else - pTable->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); + pTable->nRowLogEst = 200; + assert(200 == sqlite3LogEst(1048576)); #endif - assert( pParse->pNewTable==0 ); + assert(pParse->pNewTable == 0); pParse->pNewTable = pTable; /* Begin generating the code that will insert the table record into @@ -116516,16 +115231,16 @@ SQLITE_PRIVATE void sqlite3StartTable( ** indices. Hence, the record number for the table must be allocated ** now. */ - if( !db->init.busy && (v = sqlite3GetVdbe(pParse))!=0 ){ + 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 }; + static const char nullRow[] = {6, 0, 0, 0, 0, 0}; sqlite3BeginWriteOperation(pParse, 1, iDb); #ifndef SQLITE_OMIT_VIRTUALTABLE - if( isVirtual ){ + if (isVirtual) { sqlite3VdbeAddOp0(v, OP_VBegin); } #endif @@ -116538,9 +115253,9 @@ SQLITE_PRIVATE void sqlite3StartTable( 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; + 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); @@ -116555,14 +115270,13 @@ SQLITE_PRIVATE void sqlite3StartTable( ** sqlite3EndTable will generate. */ #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) - if( isView || isVirtual ){ + if (isView || isVirtual) { sqlite3VdbeAddOp2(v, OP_Integer, 0, reg2); - }else + } else #endif { - assert( !pParse->bReturning ); - pParse->u1.addrCrTab = - sqlite3VdbeAddOp3(v, OP_CreateBtree, iDb, reg2, BTREE_INTKEY); + assert(!pParse->bReturning); + pParse->u1.addrCrTab = sqlite3VdbeAddOp3(v, OP_CreateBtree, iDb, reg2, BTREE_INTKEY); } sqlite3OpenSchemaTable(pParse, iDb); sqlite3VdbeAddOp2(v, OP_NewRowid, 0, reg1); @@ -116586,11 +115300,12 @@ SQLITE_PRIVATE void sqlite3StartTable( ** 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 ){ +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) ){ + if (pTab) + pTab->tabFlags |= TF_HasHidden; + } else if (pTab && pCol != pTab->aCol && (pCol[-1].colFlags & COLFLAG_HIDDEN)) { pTab->tabFlags |= TF_OOOHidden; } } @@ -116601,13 +115316,13 @@ SQLITE_PRIVATE void sqlite3ColumnPropertiesFromName(Table *pTab, Column *pCol){ ** name begins with "sqlite_" so that it is guaranteed not to collide ** with any application-generated triggers. */ -#define RETURNING_TRIGGER_NAME "sqlite_returning" +#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; +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); @@ -116630,28 +115345,28 @@ static void sqlite3DeleteReturning(sqlite3 *db, Returning *pRet){ ** 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 ){ +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 ); + } else { + assert(pParse->bReturning == 0); } pParse->bReturning = 1; pRet = sqlite3DbMallocZero(db, sizeof(*pRet)); - if( pRet==0 ){ + 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; + 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; @@ -116663,9 +115378,8 @@ SQLITE_PRIVATE void sqlite3AddReturning(Parse *pParse, ExprList *pList){ 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 ){ + assert(sqlite3HashFind(pHash, RETURNING_TRIGGER_NAME) == 0 || pParse->nErr); + if (sqlite3HashInsert(pHash, RETURNING_TRIGGER_NAME, &pRet->retTrig) == &pRet->retTrig) { sqlite3OomFault(db); } } @@ -116678,77 +115392,78 @@ SQLITE_PRIVATE void sqlite3AddReturning(Parse *pParse, ExprList *pList){ ** 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; +SQLITE_PRIVATE void sqlite3AddColumn(Parse* pParse, Token sName, Token sType) { + Table* p; int i; - char *z; - char *zType; - Column *pCol; - sqlite3 *db = pParse->db; + char* z; + char* zType; + Column* pCol; + sqlite3* db = pParse->db; u8 hName; - Column *aNew; + 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] ){ + 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); + 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 - ){ + 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 - ){ + 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--; + 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 ){ + if (sType.n >= 3) { sqlite3DequoteToken(&sType); - for(i=0; i0) ); - if( z==0 ) return; - if( IN_RENAME_OBJECT ) sqlite3RenameTokenMap(pParse, (void*)z, &sName); + for (i = 0; i < SQLITE_N_STDTYPE; i++) { + if (sType.n == sqlite3StdTypeLen[i] && sqlite3_strnicmp(sType.z, sqlite3StdType[i], sType.n) == 0) { + sType.n = 0; + eType = i + 1; + affinity = sqlite3StdTypeAffinity[i]; + if (affinity <= SQLITE_AFF_TEXT) + szEst = 5; + break; + } + } + } + + z = sqlite3DbMallocRaw(db, (i64)sName.n + 1 + (i64)sType.n + (sType.n > 0)); + 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 ){ + for (i = 0; i < p->nCol; 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 ){ + aNew = sqlite3DbRealloc(db, p->aCol, ((i64)p->nCol + 1) * sizeof(p->aCol[0])); + if (aNew == 0) { sqlite3DbFree(db, z); return; } @@ -116759,20 +115474,20 @@ SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){ pCol->hName = hName; sqlite3ColumnPropertiesFromName(p, pCol); - if( sType.n==0 ){ + 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 ){ + if (affinity == SQLITE_AFF_BLOB) { + if (4 >= sqlite3GlobalConfig.szSorterRef) { pCol->colFlags |= COLFLAG_SORTERREF; } } #endif - }else{ + } else { zType = z + sqlite3Strlen30(z) + 1; memcpy(zType, sType.z, sType.n); zType[sType.n] = 0; @@ -116791,22 +115506,23 @@ SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){ ** 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; +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]; + 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 ){ + 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; } } @@ -116838,38 +115554,39 @@ SQLITE_PRIVATE void sqlite3AddNotNull(Parse *pParse, int onError){ ** 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){ +SQLITE_PRIVATE char sqlite3AffinityType(const char* zIn, Column* pCol) { u32 h = 0; char aff = SQLITE_AFF_NUMERIC; - const char *zChar = 0; + const char* zChar = 0; - assert( zIn!=0 ); - while( zIn[0] ){ - h = (h<<8) + sqlite3UpperToLower[(*zIn)&0xff]; + assert(zIn != 0); + while (zIn[0]) { + h = (h << 8) + sqlite3UpperToLower[(*zIn) & 0xff]; zIn++; - if( h==(('c'<<24)+('h'<<16)+('a'<<8)+'r') ){ /* CHAR */ + 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 */ + } 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 */ + } 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) ){ + } 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; + 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 ){ + } 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 ){ + } 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 ){ + } 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 */ + } else if ((h & 0x00FFFFFF) == (('i' << 16) + ('n' << 8) + 't')) { /* INT */ aff = SQLITE_AFF_INTEGER; break; } @@ -116877,29 +115594,30 @@ SQLITE_PRIVATE char sqlite3AffinityType(const char *zIn, Column *pCol){ /* 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)*/ + } else { + v = 16; /* BLOB, TEXT, CLOB -> r=5 (approx 20 bytes)*/ } } #ifdef SQLITE_ENABLE_SORTER_REFERENCES - if( v>=sqlite3GlobalConfig.szSorterRef ){ + if (v >= sqlite3GlobalConfig.szSorterRef) { pCol->colFlags |= COLFLAG_SORTERREF; } #endif - v = v/4 + 1; - if( v>255 ) v = 255; + v = v / 4 + 1; + if (v > 255) + v = 255; pCol->szEst = v; } return aff; @@ -116915,29 +115633,27 @@ SQLITE_PRIVATE char sqlite3AffinityType(const char *zIn, Column *pCol){ ** 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; +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); + 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 ); + } 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{ + } else { /* A copy of pExpr is used instead of the original, as pExpr contains ** tokens that point to volatile memory. */ @@ -116952,7 +115668,7 @@ SQLITE_PRIVATE void sqlite3AddDefaultValue( sqlite3ColumnSetExpr(pParse, p, pCol, pDfltExpr); } } - if( IN_RENAME_OBJECT ){ + if (IN_RENAME_OBJECT) { sqlite3RenameExprUnmap(pParse, pExpr); } sqlite3ExprDelete(db, pExpr); @@ -116974,10 +115690,10 @@ SQLITE_PRIVATE void sqlite3AddDefaultValue( ** If the expression is anything other than TK_STRING, the expression is ** unchanged. */ -static void sqlite3StringToId(Expr *p){ - if( p->op==TK_STRING ){ +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 ){ + } else if (p->op == TK_COLLATE && p->pLeft->op == TK_STRING) { p->pLeft->op = TK_ID; } } @@ -116985,14 +115701,13 @@ static void sqlite3StringToId(Expr *p){ /* ** Tag the given column as being part of the PRIMARY KEY */ -static void makeColumnPartOfPrimaryKey(Parse *pParse, Column *pCol){ +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"); + 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 } @@ -117015,41 +115730,40 @@ static void makeColumnPartOfPrimaryKey(Parse *pParse, Column *pCol){ ** 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; +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); + 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 ){ + if (pList == 0) { iCol = pTab->nCol - 1; pCol = &pTab->aCol[iCol]; makeColumnPartOfPrimaryKey(pParse, pCol); nTerm = 1; - }else{ + } else { nTerm = pList->nExpr; - for(i=0; ia[i].pExpr); - assert( pCExpr!=0 ); + for (i = 0; i < nTerm; i++) { + Expr* pCExpr = sqlite3ExprSkipCollate(pList->a[i].pExpr); + assert(pCExpr != 0); sqlite3StringToId(pCExpr); - if( pCExpr->op==TK_ID ){ - const char *zCName; - assert( !ExprHasProperty(pCExpr, EP_IntValue) ); + 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 ){ + for (iCol = 0; iCol < pTab->nCol; iCol++) { + if (sqlite3StrICmp(zCName, pTab->aCol[iCol].zCnName) == 0) { pCol = &pTab->aCol[iCol]; makeColumnPartOfPrimaryKey(pParse, pCol); break; @@ -117058,29 +115772,25 @@ SQLITE_PRIVATE void sqlite3AddPrimaryKey( } } } - if( nTerm==1 - && pCol - && pCol->eCType==COLTYPE_INTEGER - && sortOrder!=SQLITE_SO_DESC - ){ - if( IN_RENAME_OBJECT && pList ){ - Expr *pCExpr = sqlite3ExprSkipCollate(pList->a[0].pExpr); + 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; + 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 ){ + } else if (autoInc) { #ifndef SQLITE_OMIT_AUTOINCREMENT sqlite3ErrorMsg(pParse, "AUTOINCREMENT is only allowed on an " - "INTEGER PRIMARY KEY"); + "INTEGER PRIMARY KEY"); #endif - }else{ - sqlite3CreateIndex(pParse, 0, 0, 0, pList, onError, 0, - 0, sortOrder, 0, SQLITE_IDXTYPE_PRIMARYKEY); + } else { + sqlite3CreateIndex(pParse, 0, 0, 0, pList, onError, 0, 0, sortOrder, 0, SQLITE_IDXTYPE_PRIMARYKEY); pList = 0; } @@ -117092,30 +115802,30 @@ SQLITE_PRIVATE void sqlite3AddPrimaryKey( /* ** 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 ")" */ -){ +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) - ){ + 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 ){ + if (pParse->constraintName.n) { sqlite3ExprListSetName(pParse, pTab->pCheck, &pParse->constraintName, 1); - }else{ + } else { Token t; - for(zStart++; sqlite3Isspace(zStart[0]); zStart++){} - while( sqlite3Isspace(zEnd[-1]) ){ zEnd--; } + 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 + } else #endif { sqlite3ExprDelete(pParse->db, pCheckExpr); @@ -117126,29 +115836,31 @@ SQLITE_PRIVATE void sqlite3AddCheckConstraint( ** 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; +SQLITE_PRIVATE void sqlite3AddCollateType(Parse* pParse, Token* pToken) { + Table* p; int i; - char *zColl; /* Dequoted name of collation sequence */ - sqlite3 *db; + char* zColl; /* Dequoted name of collation sequence */ + sqlite3* db; - if( (p = pParse->pNewTable)==0 || IN_RENAME_OBJECT ) return; - i = p->nCol-1; + if ((p = pParse->pNewTable) == 0 || IN_RENAME_OBJECT) + return; + i = p->nCol - 1; db = pParse->db; zColl = sqlite3NameFromToken(db, pToken); - if( !zColl ) return; + if (!zColl) + return; - if( sqlite3LocateCollSeq(pParse, zColl) ){ - Index *pIdx; + 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 ){ + for (pIdx = p->pIndex; pIdx; pIdx = pIdx->pNext) { + assert(pIdx->nKeyCol == 1); + if (pIdx->aiColumn[0] == i) { pIdx->azColl[0] = sqlite3ColumnColl(&p->aCol[i]); } } @@ -117159,36 +115871,38 @@ SQLITE_PRIVATE void sqlite3AddCollateType(Parse *pParse, Token *pToken){ /* Change the most recently parsed column to be a GENERATED ALWAYS AS ** column. */ -SQLITE_PRIVATE void sqlite3AddGenerated(Parse *pParse, Expr *pExpr, Token *pType){ +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 ){ + 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 ){ + 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 ){ + 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 ){ + } else if (pType->n == 6 && sqlite3StrNICmp("stored", pType->z, 6) == 0) { eType = COLFLAG_STORED; - }else{ + } else { goto generated_error; } } - if( eType==COLFLAG_VIRTUAL ) pTab->nNVCol--; + if (eType == COLFLAG_VIRTUAL) + pTab->nNVCol--; pCol->colFlags |= eType; - assert( TF_HasVirtual==COLFLAG_VIRTUAL ); - assert( TF_HasStored==COLFLAG_STORED ); + assert(TF_HasVirtual == COLFLAG_VIRTUAL); + assert(TF_HasStored == COLFLAG_STORED); pTab->tabFlags |= eType; - if( pCol->colFlags & COLFLAG_PRIMKEY ){ + if (pCol->colFlags & COLFLAG_PRIMKEY) { makeColumnPartOfPrimaryKey(pParse, pCol); /* For the error message */ } sqlite3ColumnSetExpr(pParse, pTab, pCol, pExpr); @@ -117196,8 +115910,7 @@ SQLITE_PRIVATE void sqlite3AddGenerated(Parse *pParse, Expr *pExpr, Token *pType goto generated_done; generated_error: - sqlite3ErrorMsg(pParse, "error in generated column \"%s\"", - pCol->zCnName); + sqlite3ErrorMsg(pParse, "error in generated column \"%s\"", pCol->zCnName); generated_done: sqlite3ExprDelete(pParse->db, pExpr); #else @@ -117227,12 +115940,11 @@ SQLITE_PRIVATE void sqlite3AddGenerated(Parse *pParse, Expr *pExpr, Token *pType ** 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)); +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)); } /* @@ -117243,10 +115955,12 @@ SQLITE_PRIVATE void sqlite3ChangeCookie(Parse *pParse, int iDb){ ** The estimate is conservative. It might be larger that what is ** really needed. */ -static int identLength(const char *z){ +static int identLength(const char* z) { int n; - for(n=0; *z; n++, z++){ - if( *z=='"' ){ n++; } + for (n = 0; *z; n++, z++) { + if (*z == '"') { + n++; + } } return n + 2; } @@ -117264,25 +115978,26 @@ static int identLength(const char *z){ ** 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; +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; + 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; + needQuote = sqlite3Isdigit(zIdent[0]) || sqlite3KeywordCode(zIdent, j) != TK_ID || zIdent[j] != 0 || j == 0; - if( needQuote ) z[i++] = '"'; - for(j=0; zIdent[j]; j++){ + if (needQuote) + z[i++] = '"'; + for (j = 0; zIdent[j]; j++) { z[i++] = zIdent[j]; - if( zIdent[j]=='"' ) z[i++] = '"'; + if (zIdent[j] == '"') + z[i++] = '"'; } - if( needQuote ) z[i++] = '"'; + if (needQuote) + z[i++] = '"'; z[i] = 0; *pIdx = i; } @@ -117292,28 +116007,28 @@ static void identPut(char *z, int *pIdx, char *zSignedIdent){ ** 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){ +static char* createTableStmt(sqlite3* db, Table* p) { int i, k, n; - char *zStmt; + char* zStmt; char *zSep, *zSep2, *zEnd; - Column *pCol; + Column* pCol; n = 0; - for(pCol = p->aCol, i=0; inCol; i++, pCol++){ + for (pCol = p->aCol, i = 0; i < p->nCol; i++, pCol++) { n += identLength(pCol->zCnName) + 5; } n += identLength(p->zName); - if( n<50 ){ + if (n < 50) { zSep = ""; zSep2 = ","; zEnd = ")"; - }else{ + } else { zSep = "\n "; zSep2 = ",\n "; zEnd = "\n)"; } - n += 35 + 6*p->nCol; + n += 35 + 6 * p->nCol; zStmt = sqlite3DbMallocRaw(0, n); - if( zStmt==0 ){ + if (zStmt == 0) { sqlite3OomFault(db); return 0; } @@ -117321,38 +116036,35 @@ static char *createTableStmt(sqlite3 *db, Table *p){ 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" - }; + for (pCol = p->aCol, i = 0; i < p->nCol; 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; + const char* zType; - sqlite3_snprintf(n-k, &zStmt[k], zSep); + 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 ); + 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) ); + assert(pCol->affinity == SQLITE_AFF_BLOB || pCol->affinity == sqlite3AffinityType(zType, 0)); memcpy(&zStmt[k], zType, len); k += len; - assert( k<=n ); + assert(k <= n); } - sqlite3_snprintf(n-k, &zStmt[k], "%s", zEnd); + sqlite3_snprintf(n - k, &zStmt[k], "%s", zEnd); return zStmt; } @@ -117360,23 +116072,25 @@ static char *createTableStmt(sqlite3 *db, Table *p){ ** 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; +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; + 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); + 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)); + 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); + zExtra += sizeof(LogEst) * N; + memcpy(zExtra, pIdx->aiColumn, sizeof(i16) * pIdx->nColumn); pIdx->aiColumn = (i16*)zExtra; - zExtra += sizeof(i16)*N; + zExtra += sizeof(i16) * N; memcpy(zExtra, pIdx->aSortOrder, pIdx->nColumn); pIdx->aSortOrder = (u8*)zExtra; pIdx->nColumn = N; @@ -117387,39 +116101,40 @@ static int resizeIndexObject(sqlite3 *db, Index *pIdx, int N){ /* ** Estimate the total row width for a table. */ -static void estimateTableWidth(Table *pTab){ +static void estimateTableWidth(Table* pTab) { unsigned wTable = 0; - const Column *pTabCol; + const Column* pTabCol; int i; - for(i=pTab->nCol, pTabCol=pTab->aCol; i>0; i--, pTabCol++){ + for (i = pTab->nCol, pTabCol = pTab->aCol; i > 0; i--, pTabCol++) { wTable += pTabCol->szEst; } - if( pTab->iPKey<0 ) wTable++; - pTab->szTabRow = sqlite3LogEst(wTable*4); + 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){ +static void estimateIndexWidth(Index* pIdx) { unsigned wIndex = 0; int i; - const Column *aCol = pIdx->pTable->aCol; - for(i=0; inColumn; i++){ + const Column* aCol = pIdx->pTable->aCol; + for (i = 0; i < pIdx->nColumn; i++) { i16 x = pIdx->aiColumn[i]; - assert( xpTable->nCol ); - wIndex += x<0 ? 1 : aCol[pIdx->aiColumn[i]].szEst; + assert(x < pIdx->pTable->nCol); + wIndex += x < 0 ? 1 : aCol[pIdx->aiColumn[i]].szEst; } - pIdx->szIdxRow = sqlite3LogEst(wIndex*4); + 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++) ){ +static int hasColumn(const i16* aiCol, int nCol, int x) { + while (nCol-- > 0) { + if (x == *(aiCol++)) { return 1; } } @@ -117439,21 +116154,19 @@ static int hasColumn(const i16 *aiCol, int nCol, int x){ ** 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){ +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 ); + assert(nKey <= pIdx->nColumn); + assert(iCol < MAX(pPk->nColumn, 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 - ){ + assert(j != XN_ROWID && j != XN_EXPR); + for (i = 0; i < nKey; i++) { + assert(pIdx->aiColumn[i] >= 0 || j >= 0); + if (pIdx->aiColumn[i] == j && sqlite3StrICmp(pIdx->azColl[i], pPk->azColl[iCol]) == 0) { return 1; } } @@ -117478,20 +116191,21 @@ static int isDupColumn(Index *pIdx, int nKey, Index *pPk, int iCol){ ** 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){ +static void recomputeColumnsNotIndexed(Index* pIdx) { Bitmask m = 0; int j; - Table *pTab = pIdx->pTable; - for(j=pIdx->nColumn-1; j>=0; 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( x= 0 && (pTab->aCol[x].colFlags & COLFLAG_VIRTUAL) == 0) { + testcase(x == BMS - 1); + testcase(x == BMS - 2); + if (x < BMS - 1) + m |= MASKBIT(x); } } pIdx->colNotIdxed = ~m; - assert( (pIdx->colNotIdxed>>63)==1 ); + assert((pIdx->colNotIdxed >> 63) == 1); } /* @@ -117518,22 +116232,20 @@ static void recomputeColumnsNotIndexed(Index *pIdx){ ** ** For virtual tables, only (1) is performed. */ -static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ - Index *pIdx; - Index *pPk; +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; + 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) - ){ + */ + if (!db->init.imposterTable) { + for (i = 0; i < pTab->nCol; i++) { + if ((pTab->aCol[i].colFlags & COLFLAG_PRIMKEY) != 0 && (pTab->aCol[i].notNull == OE_None)) { pTab->aCol[i].notNull = OE_Abort; } } @@ -117543,54 +116255,52 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ /* Convert the P3 operand of the OP_CreateBtree opcode from BTREE_INTKEY ** into BTREE_BLOBKEY. */ - assert( !pParse->bReturning ); - if( pParse->u1.addrCrTab ){ - assert( v ); + 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; + 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 ){ + pList = sqlite3ExprListAppend(pParse, 0, sqlite3ExprAlloc(db, TK_ID, &ipkToken, 0)); + if (pList == 0) { pTab->tabFlags &= ~TF_WithoutRowid; return; } - if( IN_RENAME_OBJECT ){ + if (IN_RENAME_OBJECT) { sqlite3RenameTokenRemap(pParse, pList->a[0].pExpr, &pTab->iPKey); } pList->a[0].fg.sortFlags = pParse->iPkSortOrder; - assert( pParse->pNewTable==pTab ); + 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 ){ + 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 ); + assert(db->mallocFailed == 0); pPk = sqlite3PrimaryKeyIndex(pTab); - assert( pPk->nKeyCol==1 ); - }else{ + assert(pPk->nKeyCol == 1); + } else { pPk = sqlite3PrimaryKeyIndex(pTab); - assert( pPk!=0 ); + 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) ){ + for (i = j = 1; i < pPk->nKeyCol; i++) { + if (isDupColumn(pPk, j, pPk, i)) { pPk->nColumn--; - }else{ - testcase( hasColumn(pPk->aiColumn, j, pPk->aiColumn[i]) ); + } 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]; @@ -117598,17 +116308,18 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ } pPk->nKeyCol = j; } - assert( pPk!=0 ); + assert(pPk != 0); pPk->isCovering = 1; - if( !db->init.imposterTable ) pPk->uniqNotNull = 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 ); + if (v && pPk->tnum > 0) { + assert(db->init.busy == 0); sqlite3VdbeChangeOpcode(v, (int)pPk->tnum, OP_Goto); } @@ -117618,79 +116329,85 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ /* 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){ + 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]) ); + if (IsPrimaryKeyIndex(pIdx)) + continue; + for (i = n = 0; i < nPk; i++) { + if (!isDupColumn(pIdx, pIdx->nKeyCol, pPk, i)) { + testcase(hasColumn(pIdx->aiColumn, pIdx->nKeyCol, pPk->aiColumn[i])); n++; } } - if( n==0 ){ + 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]) ); + if (resizeIndexObject(db, pIdx, pIdx->nKeyCol + n)) + return; + for (i = 0, j = pIdx->nKeyCol; i < nPk; i++) { + if (!isDupColumn(pIdx, pIdx->nKeyCol, 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] ){ + 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 ); + 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 ); + for (i = 0; i < pTab->nCol; 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; i < pTab->nCol; i++) { + if (!hasColumn(pPk->aiColumn, j, i) && (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL) == 0) { + assert(j < pPk->nColumn); pPk->aiColumn[j] = i; pPk->azColl[j] = sqlite3StrBINARY; j++; } } - assert( pPk->nColumn==j ); - assert( pTab->nNVCol<=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 */ +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; + if (!IsVirtual(pTab)) + return 0; nName = sqlite3Strlen30(pTab->zName); - if( sqlite3_strnicmp(zName, pTab->zName, nName)!=0 ) return 0; - if( zName[nName]!='_' ) return 0; + 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); + 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 */ @@ -117701,28 +116418,32 @@ SQLITE_PRIVATE int sqlite3IsShadowTableOf(sqlite3 *db, Table *pTab, const char * ** 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 */ +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) ); + 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 ); + 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) - ){ + 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; } } @@ -117737,21 +116458,23 @@ SQLITE_PRIVATE void sqlite3MarkAllShadowTablesOf(sqlite3 *db, Table *pTab){ ** 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 */ +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; + if (zTail == 0) + return 0; *zTail = 0; pTab = sqlite3FindTable(db, zName, 0); *zTail = '_'; - if( pTab==0 ) return 0; - if( !IsVirtual(pTab) ) return 0; + 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 @@ -117759,12 +116482,12 @@ SQLITE_PRIVATE int sqlite3ShadowTableName(sqlite3 *db, const char *zName){ ** 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){ +static int markImmutableExprStep(Walker* pWalker, Expr* pExpr) { ExprSetVVAProperty(pExpr, EP_Immutable); return WRC_Continue; } -static void markExprListImmutable(ExprList *pList){ - if( pList ){ +static void markExprListImmutable(ExprList* pList) { + if (pList) { Walker w; memset(&w, 0, sizeof(w)); w.xExprCallback = markImmutableExprStep; @@ -117774,9 +116497,8 @@ static void markExprListImmutable(ExprList *pList){ } } #else -#define markExprListImmutable(X) /* no-op */ -#endif /* SQLITE_DEBUG */ - +#define markExprListImmutable(X) /* no-op */ +#endif /* SQLITE_DEBUG */ /* ** This routine is called to report the final ")" that terminates @@ -117798,25 +116520,25 @@ static void markExprListImmutable(ExprList *pList){ ** "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 */ +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 */ + Index* pIdx; /* An implied index of the table */ - if( pEnd==0 && pSelect==0 ){ + if (pEnd == 0 && pSelect == 0) { return; } p = pParse->pNewTable; - if( p==0 ) return; + if (p == 0) + return; - if( pSelect==0 && sqlite3ShadowTableName(db, p->zName) ){ + if (pSelect == 0 && sqlite3ShadowTableName(db, p->zName)) { p->tabFlags |= TF_Shadow; } @@ -117829,13 +116551,14 @@ SQLITE_PRIVATE void sqlite3EndTable( ** 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) ){ + 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; + if (p->tnum == 1) + p->tabFlags |= TF_Readonly; } /* Special processing for tables that include the STRICT keyword: @@ -117847,48 +116570,38 @@ SQLITE_PRIVATE void sqlite3EndTable( ** then all columns of the PRIMARY KEY must have a NOT NULL ** constraint. */ - if( tabOpts & TF_Strict ){ + 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); + for (ii = 0; ii < p->nCol; 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 ){ + } else if (pCol->eCType == COLTYPE_ANY) { pCol->affinity = SQLITE_AFF_BLOB; } - if( (pCol->colFlags & COLFLAG_PRIMKEY)!=0 - && p->iPKey!=ii - && pCol->notNull == OE_None - ){ + 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) ); + 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"); + 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 ){ + if ((p->tabFlags & TF_HasPrimaryKey) == 0) { sqlite3ErrorMsg(pParse, "PRIMARY KEY missing on table %s", p->zName); return; } @@ -117899,45 +116612,44 @@ SQLITE_PRIVATE void sqlite3EndTable( #ifndef SQLITE_OMIT_CHECK /* Resolve names in all CHECK constraint expressions. - */ - if( p->pCheck ){ + */ + if (p->pCheck) { sqlite3ResolveSelfReference(pParse, p, NC_IsCheck, 0, p->pCheck); - if( pParse->nErr ){ + 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{ + } else { markExprListImmutable(p->pCheck); } } #endif /* !defined(SQLITE_OMIT_CHECK) */ #ifndef SQLITE_OMIT_GENERATED_COLUMNS - if( p->tabFlags & TF_HasGenerated ){ + if (p->tabFlags & TF_HasGenerated) { int ii, nNG = 0; - testcase( p->tabFlags & TF_HasVirtual ); - testcase( p->tabFlags & TF_HasStored ); - for(ii=0; iinCol; ii++){ + testcase(p->tabFlags & TF_HasVirtual); + testcase(p->tabFlags & TF_HasStored); + for (ii = 0; ii < p->nCol; 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 ((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)); + sqlite3ColumnSetExpr(pParse, p, &p->aCol[ii], sqlite3ExprAlloc(db, TK_NULL, 0, 0)); } - }else{ + } else { nNG++; } } - if( nNG==0 ){ + if (nNG == 0) { sqlite3ErrorMsg(pParse, "must have at least one non-generated column"); return; } @@ -117946,7 +116658,7 @@ SQLITE_PRIVATE void sqlite3EndTable( /* Estimate the average row size for the table and for all implied indices */ estimateTableWidth(p); - for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){ + for (pIdx = p->pIndex; pIdx; pIdx = pIdx->pNext) { estimateIndexWidth(pIdx); } @@ -117956,27 +116668,28 @@ SQLITE_PRIVATE void sqlite3EndTable( ** If this is a TEMPORARY table, write the entry into the auxiliary ** file instead of into the main database file. */ - if( !db->init.busy ){ + 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 */ + 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; + if (NEVER(v == 0)) + return; sqlite3VdbeAddOp1(v, OP_Close, 0); /* ** Initialize zType for the new view or table. */ - if( IsOrdinaryTable(p) ){ + if (IsOrdinaryTable(p)) { /* A regular table */ zType = "table"; zType2 = "TABLE"; #ifndef SQLITE_OMIT_VIEW - }else{ + } else { /* A view */ zType = "view"; zType2 = "VIEW"; @@ -117996,16 +116709,16 @@ SQLITE_PRIVATE void sqlite3EndTable( ** 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 ){ + 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; @@ -118013,17 +116726,19 @@ SQLITE_PRIVATE void sqlite3EndTable( regYield = ++pParse->nMem; regRec = ++pParse->nMem; regRowid = ++pParse->nMem; - assert(pParse->nTab==1); + 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; + if (pParse->nErr) + return; pSelTab = sqlite3ResultSetOfSelect(pParse, pSelect, SQLITE_AFF_BLOB); - if( pSelTab==0 ) return; - assert( p->aCol==0 ); + if (pSelTab == 0) + return; + assert(p->aCol == 0); p->nCol = p->nNVCol = pSelTab->nCol; p->aCol = pSelTab->aCol; pSelTab->nCol = 0; @@ -118031,7 +116746,8 @@ SQLITE_PRIVATE void sqlite3EndTable( sqlite3DeleteTable(db, pSelTab); sqlite3SelectDestInit(&dest, SRT_Coroutine, regYield); sqlite3Select(pParse, pSelect, &dest); - if( pParse->nErr ) return; + if (pParse->nErr) + return; sqlite3VdbeEndCoroutine(v, regYield); sqlite3VdbeJumpHere(v, addrTop - 1); addrInsLoop = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); @@ -118046,15 +116762,14 @@ SQLITE_PRIVATE void sqlite3EndTable( } /* Compute the complete text of the CREATE statement */ - if( pSelect ){ + if (pSelect) { zStmt = createTableStmt(db, p); - }else{ - Token *pEnd2 = tabOpts ? &pParse->sLastToken : pEnd; + } 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 - ); + 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 @@ -118062,17 +116777,9 @@ SQLITE_PRIVATE void sqlite3EndTable( ** 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 - ); + "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); @@ -118080,33 +116787,29 @@ SQLITE_PRIVATE void sqlite3EndTable( /* 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 - ); + 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); + 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 ); + */ + 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() */ + if (pOld) { + assert(p == pOld); /* Malloc must have failed inside HashInsert() */ sqlite3OomFault(db); return; } @@ -118116,19 +116819,19 @@ SQLITE_PRIVATE void sqlite3EndTable( /* 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 ); + assert(!pParse->nested); #ifndef SQLITE_OMIT_AUTOINCREMENT - if( strcmp(p->zName, "sqlite_sequence")==0 ){ - assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + 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 ){ + if (!pSelect && IsOrdinaryTable(p)) { + assert(pCons && pEnd); + if (pCons->z == 0) { pCons = pEnd; } p->u.tab.addColOffset = 13 + (int)(pCons->z - pParse->sNameToken.z); @@ -118140,38 +116843,38 @@ SQLITE_PRIVATE void sqlite3EndTable( /* ** 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; +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; + const char* z; Token sEnd; DbFixer sFix; - Token *pName = 0; + Token* pName = 0; int iDb; - sqlite3 *db = pParse->db; + sqlite3* db = pParse->db; - if( pParse->nVar>0 ){ + 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; + 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. */ + /* 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 @@ -118179,7 +116882,8 @@ SQLITE_PRIVATE void sqlite3CreateView( sqlite3TwoPartName(pParse, pName1, pName2, &pName); iDb = sqlite3SchemaToIndex(db, p->pSchema); sqlite3FixInit(&sFix, pParse, iDb, "view", pName); - if( sqlite3FixSelect(&sFix, pSelect) ) goto create_view_fail; + 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 @@ -118187,30 +116891,33 @@ SQLITE_PRIVATE void sqlite3CreateView( ** they will persist after the current sqlite3_exec() call returns. */ pSelect->selFlags |= SF_View; - if( IN_RENAME_OBJECT ){ + if (IN_RENAME_OBJECT) { p->u.view.pSelect = pSelect; pSelect = 0; - }else{ + } 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; + 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]!=';' ){ + 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 ); + assert(n > 0); z = pBegin->z; - while( sqlite3Isspace(z[n-1]) ){ n--; } - sEnd.z = &z[n-1]; + while (sqlite3Isspace(z[n - 1])) { + n--; + } + sEnd.z = &z[n - 1]; sEnd.n = 1; /* Use sqlite3EndTable() to add the view to the schema table */ @@ -118218,7 +116925,7 @@ SQLITE_PRIVATE void sqlite3CreateView( create_view_fail: sqlite3SelectDelete(db, pSelect); - if( IN_RENAME_OBJECT ){ + if (IN_RENAME_OBJECT) { sqlite3RenameExprlistUnmap(pParse, pCNames); } sqlite3ExprListDelete(db, pCNames); @@ -118232,22 +116939,22 @@ SQLITE_PRIVATE void sqlite3CreateView( ** 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 */ +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 */ + sqlite3_xauth xAuth; /* Saved xAuth pointer */ #endif - assert( pTable ); + assert(pTable); #ifndef SQLITE_OMIT_VIRTUALTABLE - if( IsVirtual(pTable) ){ + if (IsVirtual(pTable)) { db->nSchemaLock++; rc = sqlite3VtabCallConnect(pParse, pTable); db->nSchemaLock--; @@ -118259,7 +116966,8 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ /* A positive nCol means the columns names for this view are ** already known. */ - if( pTable->nCol>0 ) return 0; + 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 @@ -118276,11 +116984,11 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ ** CREATE TEMP VIEW ex1 AS SELECT a FROM ex1; ** SELECT * FROM temp.ex1; */ - if( pTable->nCol<0 ){ + if (pTable->nCol < 0) { sqlite3ErrorMsg(pParse, "view %s is circularly defined", pTable->zName); return 1; } - assert( pTable->nCol>=0 ); + 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 @@ -118289,9 +116997,9 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ ** to be permanent. So the computation is done on a copy of the SELECT ** statement that defines the view. */ - assert( IsView(pTable) ); + assert(IsView(pTable)); pSel = sqlite3SelectDup(db, pTable->u.view.pSelect, 0); - if( pSel ){ + if (pSel) { u8 eParseMode = pParse->eParseMode; int nTab = pParse->nTab; int nSelect = pParse->nSelect; @@ -118309,36 +117017,32 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ #endif pParse->nTab = nTab; pParse->nSelect = nSelect; - if( pSelTab==0 ){ + if (pSelTab == 0) { pTable->nCol = 0; nErr++; - }else if( pTable->pCheck ){ + } 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); + 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{ + } 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 ); + 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) ); + assert(sqlite3SchemaMutexHeld(db, 0, pTable->pSchema)); } pTable->nNVCol = pTable->nCol; sqlite3DeleteTable(db, pSelTab); @@ -118349,7 +117053,7 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ nErr++; } pTable->pSchema->schemaFlags |= DB_UnresetViews; - if( db->mallocFailed ){ + if (db->mallocFailed) { sqlite3DeleteColumnNames(db, pTable); } #endif /* SQLITE_OMIT_VIEW */ @@ -118361,20 +117065,21 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ /* ** 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) ){ +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) +#define sqliteViewResetAll(A, B) #endif /* SQLITE_OMIT_VIEW */ /* @@ -118395,24 +117100,24 @@ static void sqliteViewResetAll(sqlite3 *db, int idx){ ** 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; +SQLITE_PRIVATE void sqlite3RootPageMoved(sqlite3* db, int iDb, Pgno iFrom, Pgno iTo) { + HashElem* pElem; + Hash* pHash; + Db* pDb; - assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + 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 ){ + 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 ){ + for (pElem = sqliteHashFirst(pHash); pElem; pElem = sqliteHashNext(pElem)) { + Index* pIdx = sqliteHashData(pElem); + if (pIdx->tnum == iFrom) { pIdx->tnum = iTo; } } @@ -118425,10 +117130,11 @@ SQLITE_PRIVATE void sqlite3RootPageMoved(sqlite3 *db, int iDb, Pgno iFrom, Pgno ** 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); +static void destroyRootPage(Parse* pParse, int iTable, int iDb) { + Vdbe* v = sqlite3GetVdbe(pParse); int r1 = sqlite3GetTempReg(pParse); - if( iTable<2 ) sqlite3ErrorMsg(pParse, "corrupt schema"); + if (iTable < 2) + sqlite3ErrorMsg(pParse, "corrupt schema"); sqlite3VdbeAddOp3(v, OP_Destroy, iTable, r1, iDb); sqlite3MayAbort(pParse); #ifndef SQLITE_OMIT_AUTOVACUUM @@ -118441,10 +117147,8 @@ static void destroyRootPage(Parse *pParse, int iTable, int iDb){ ** 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); + 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); } @@ -118455,7 +117159,7 @@ static void destroyRootPage(Parse *pParse, int iTable, int iDb){ ** 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){ +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 @@ -118475,25 +117179,25 @@ static void destroyTable(Parse *pParse, Table *pTab){ Pgno iTab = pTab->tnum; Pgno iDestroyed = 0; - while( 1 ){ - Index *pIdx; + while (1) { + Index* pIdx; Pgno iLargest = 0; - if( iDestroyed==0 || iTabpIndex; pIdx; pIdx=pIdx->pNext){ + for (pIdx = pTab->pIndex; pIdx; pIdx = pIdx->pNext) { Pgno iIdx = pIdx->tnum; - assert( pIdx->pSchema==pTab->pSchema ); - if( (iDestroyed==0 || (iIdxiLargest ){ + assert(pIdx->pSchema == pTab->pSchema); + if ((iDestroyed == 0 || (iIdx < iDestroyed)) && iIdx > iLargest) { iLargest = iIdx; } } - if( iLargest==0 ){ + if (iLargest == 0) { return; - }else{ + } else { int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); - assert( iDb>=0 && iDbdb->nDb ); + assert(iDb >= 0 && iDb < pParse->db->nDb); destroyRootPage(pParse, iLargest, iDb); iDestroyed = iLargest; } @@ -118504,22 +117208,18 @@ static void destroyTable(Parse *pParse, Table *pTab){ ** 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 */ -){ +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++){ + 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 - ); + 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); } } } @@ -118527,18 +117227,18 @@ static void sqlite3ClearStatTables( /* ** 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]; +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 ); + assert(v != 0); sqlite3BeginWriteOperation(pParse, 1, iDb); #ifndef SQLITE_OMIT_VIRTUALTABLE - if( IsVirtual(pTab) ){ + if (IsVirtual(pTab)) { sqlite3VdbeAddOp0(v, OP_VBegin); } #endif @@ -118548,9 +117248,8 @@ SQLITE_PRIVATE void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, in ** sqlite_temp_schema if required. */ pTrigger = sqlite3TriggerList(pParse, pTab); - while( pTrigger ){ - assert( pTrigger->pSchema==pTab->pSchema || - pTrigger->pSchema==db->aDb[1].pSchema ); + while (pTrigger) { + assert(pTrigger->pSchema == pTab->pSchema || pTrigger->pSchema == db->aDb[1].pSchema); sqlite3DropTriggerPtr(pParse, pTrigger); pTrigger = pTrigger->pNext; } @@ -118561,11 +117260,8 @@ SQLITE_PRIVATE void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, in ** 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 - ); + if (pTab->tabFlags & TF_Autoincrement) { + sqlite3NestedParse(pParse, "DELETE FROM %Q.sqlite_sequence WHERE name=%Q", pDb->zDbSName, pTab->zName); } #endif @@ -118576,18 +117272,15 @@ SQLITE_PRIVATE void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, in ** 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) ){ + 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) ){ + if (IsVirtual(pTab)) { sqlite3VdbeAddOp4(v, OP_VDestroy, iDb, 0, 0, pTab->zName, 0); sqlite3MayAbort(pParse); } @@ -118600,13 +117293,9 @@ SQLITE_PRIVATE void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, in ** Return TRUE if shadow tables should be read-only in the current ** context. */ -SQLITE_PRIVATE int sqlite3ReadOnlyShadowTables(sqlite3 *db){ +SQLITE_PRIVATE int sqlite3ReadOnlyShadowTables(sqlite3* db) { #ifndef SQLITE_OMIT_VIRTUALTABLE - if( (db->flags & SQLITE_Defensive)!=0 - && db->pVtabCtx==0 - && db->nVdbeExec==0 - && !sqlite3VtabInSync(db) - ){ + if ((db->flags & SQLITE_Defensive) != 0 && db->pVtabCtx == 0 && db->nVdbeExec == 0 && !sqlite3VtabInSync(db)) { return 1; } #endif @@ -118616,16 +117305,18 @@ SQLITE_PRIVATE int sqlite3ReadOnlyShadowTables(sqlite3 *db){ /* ** 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; +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) ){ + if ((pTab->tabFlags & TF_Shadow) != 0 && sqlite3ReadOnlyShadowTables(db)) { return 1; } - if( pTab->tabFlags & TF_Eponymous ){ + if (pTab->tabFlags & TF_Eponymous) { return 1; } return 0; @@ -118635,75 +117326,78 @@ static int tableMayNotBeDropped(sqlite3 *db, Table *pTab){ ** 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; +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 ){ + 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 ); + 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 (noErr) + db->suppressErr--; - if( pTab==0 ){ - if( noErr ){ + 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 ); + assert(iDb >= 0 && iDb < db->nDb); /* If pTab is a virtual table, call ViewGetColumnNames() to ensure ** it is initialized. */ - if( IsVirtual(pTab) && sqlite3ViewGetColumnNames(pParse, pTab) ){ + 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)){ + 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 ){ + if (isView) { + if (!OMIT_TEMPDB && iDb == 1) { code = SQLITE_DROP_TEMP_VIEW; - }else{ + } else { code = SQLITE_DROP_VIEW; } #ifndef SQLITE_OMIT_VIRTUALTABLE - }else if( IsVirtual(pTab) ){ + } else if (IsVirtual(pTab)) { code = SQLITE_DROP_VTABLE; zArg2 = sqlite3GetVTable(db, pTab)->pMod->zName; #endif - }else{ - if( !OMIT_TEMPDB && iDb==1 ){ + } else { + if (!OMIT_TEMPDB && iDb == 1) { code = SQLITE_DROP_TEMP_TABLE; - }else{ + } else { code = SQLITE_DROP_TABLE; } } - if( sqlite3AuthCheck(pParse, code, pTab->zName, zArg2, zDb) ){ + if (sqlite3AuthCheck(pParse, code, pTab->zName, zArg2, zDb)) { goto exit_drop_table; } - if( sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb) ){ + if (sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb)) { goto exit_drop_table; } } #endif - if( tableMayNotBeDropped(db, pTab) ){ + if (tableMayNotBeDropped(db, pTab)) { sqlite3ErrorMsg(pParse, "table %s may not be dropped", pTab->zName); goto exit_drop_table; } @@ -118712,11 +117406,11 @@ SQLITE_PRIVATE void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, /* Ensure DROP TABLE is not used on a view, and DROP VIEW is not used ** on a table. */ - if( isView && !IsView(pTab) ){ + if (isView && !IsView(pTab)) { sqlite3ErrorMsg(pParse, "use DROP TABLE to delete table %s", pTab->zName); goto exit_drop_table; } - if( !isView && IsView(pTab) ){ + if (!isView && IsView(pTab)) { sqlite3ErrorMsg(pParse, "use DROP VIEW to delete view %s", pTab->zName); goto exit_drop_table; } @@ -118726,9 +117420,9 @@ SQLITE_PRIVATE void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, ** on disk. */ v = sqlite3GetVdbe(pParse); - if( v ){ + if (v) { sqlite3BeginWriteOperation(pParse, 1, iDb); - if( !isView ){ + if (!isView) { sqlite3ClearStatTables(pParse, iDb, "tbl", pTab->zName); sqlite3FkDropTable(pParse, pName, pTab); } @@ -118755,121 +117449,118 @@ SQLITE_PRIVATE void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, ** 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; +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; + 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); + 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"); + } 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{ + } else { nCol = pFromCol->nExpr; } - nByte = sizeof(*pFKey) + (nCol-1)*sizeof(pFKey->aCol[0]) + pTo->n + 1; - if( pToCol ){ - for(i=0; inExpr; i++){ + nByte = sizeof(*pFKey) + (nCol - 1) * sizeof(pFKey->aCol[0]) + pTo->n + 1; + if (pToCol) { + for (i = 0; i < pToCol->nExpr; i++) { nByte += sqlite3Strlen30(pToCol->a[i].zEName) + 1; } } - pFKey = sqlite3DbMallocZero(db, nByte ); - if( pFKey==0 ){ + pFKey = sqlite3DbMallocZero(db, nByte); + if (pFKey == 0) { goto fk_end; } pFKey->pFrom = p; - assert( IsOrdinaryTable(p) ); + assert(IsOrdinaryTable(p)); pFKey->pNextFrom = p->u.tab.pFKey; z = (char*)&pFKey->aCol[nCol]; pFKey->zTo = z; - if( IN_RENAME_OBJECT ){ + 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; + z += pTo->n + 1; pFKey->nCol = nCol; - if( pFromCol==0 ){ - pFKey->aCol[0].iFrom = p->nCol-1; - }else{ - for(i=0; iaCol[0].iFrom = p->nCol - 1; + } else { + for (i = 0; i < nCol; i++) { int j; - for(j=0; jnCol; j++){ - if( sqlite3StrICmp(p->aCol[j].zCnName, pFromCol->a[i].zEName)==0 ){ + for (j = 0; j < p->nCol; 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); + if (j >= p->nCol) { + sqlite3ErrorMsg(pParse, "unknown column \"%s\" in foreign key definition", pFromCol->a[i].zEName); goto fk_end; } - if( IN_RENAME_OBJECT ){ + 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 ){ + if (IN_RENAME_OBJECT) { sqlite3RenameTokenRemap(pParse, z, pToCol->a[i].zEName); } memcpy(z, pToCol->a[i].zEName, n); z[n] = 0; - z += n+1; + 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 */ + 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 ){ + 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 ); + 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) ); + */ + assert(IsOrdinaryTable(p)); p->u.tab.pFKey = pFKey; pFKey = 0; @@ -118887,14 +117578,17 @@ SQLITE_PRIVATE void sqlite3CreateForeignKey( ** The behavior of the most recently created foreign key is adjusted ** accordingly. */ -SQLITE_PRIVATE void sqlite3DeferForeignKey(Parse *pParse, int isDeferred){ +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 */ + 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 } @@ -118910,24 +117604,23 @@ SQLITE_PRIVATE void sqlite3DeferForeignKey(Parse *pParse, int isDeferred){ ** 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 */ +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 ) ){ + if (sqlite3AuthCheck(pParse, SQLITE_REINDEX, pIndex->zName, 0, db->aDb[iDb].zDbSName)) { return; } #endif @@ -118936,47 +117629,50 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ sqlite3TableLock(pParse, iDb, pTab->tnum, 1, pTab->zName); v = sqlite3GetVdbe(pParse); - if( v==0 ) return; - if( memRootPage>=0 ){ + if (v == 0) + return; + if (memRootPage >= 0) { tnum = (Pgno)memRootPage; - }else{ + } else { tnum = pIndex->tnum; } pKey = sqlite3KeyInfoOfIndex(pParse, pIndex); - assert( pKey!=0 || pParse->nErr ); + 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); + 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); + addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, 0); + VdbeCoverage(v); regRecord = sqlite3GetTempReg(pParse); sqlite3MultiWrite(pParse); - sqlite3GenerateIndexKey(pParse,pIndex,iTab,regRecord,0,&iPartIdxLabel,0,0); + 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); + 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)); + 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) ){ + 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); + sqlite3VdbeAddOp4Int(v, OP_SorterCompare, iSorter, j2, regRecord, pIndex->nKeyCol); + VdbeCoverage(v); sqlite3UniqueConstraint(pParse, OE_Abort, pIndex); sqlite3VdbeJumpHere(v, j2); - }else{ + } 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 @@ -118988,7 +117684,7 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ addr2 = sqlite3VdbeCurrentAddr(v); } sqlite3VdbeAddOp3(v, OP_SorterData, iSorter, regRecord, iIdx); - if( !pIndex->bAscKeyBug ){ + 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 @@ -119001,7 +117697,8 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ sqlite3VdbeAddOp2(v, OP_IdxInsert, iIdx, regRecord); sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); sqlite3ReleaseTempReg(pParse, regRecord); - sqlite3VdbeAddOp2(v, OP_SorterNext, iSorter, addr2); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_SorterNext, iSorter, addr2); + VdbeCoverage(v); sqlite3VdbeJumpHere(v, addr1); sqlite3VdbeAddOp1(v, OP_Close, iTab); @@ -119016,26 +117713,28 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ ** 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 */ +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 */ + 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; + 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; @@ -119049,15 +117748,13 @@ SQLITE_PRIVATE Index *sqlite3AllocateIndexObject( ** 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 ){ +SQLITE_PRIVATE int sqlite3HasExplicitNulls(Parse* pParse, ExprList* pList) { + if (pList) { int i; - for(i=0; inExpr; i++){ - if( pList->a[i].fg.bNulls ){ + for (i = 0; i < pList->nExpr; 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" - ); + sqlite3ErrorMsg(pParse, "unsupported use of NULLS %s", (sf == 0 || sf == 3) ? "FIRST" : "LAST"); return 1; } } @@ -119077,122 +117774,121 @@ SQLITE_PRIVATE int sqlite3HasExplicitNulls(Parse *pParse, ExprList *pList){ ** 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 */ +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 */ + 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 */ + 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 ){ + assert(db->pParse == pParse); + if (pParse->nErr) { goto exit_create_index; } - assert( db->mallocFailed==0 ); - if( IN_DECLARE_VTAB && idxType!=SQLITE_IDXTYPE_PRIMARYKEY ){ + assert(db->mallocFailed == 0); + if (IN_DECLARE_VTAB && idxType != SQLITE_IDXTYPE_PRIMARYKEY) { goto exit_create_index; } - if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + if (SQLITE_OK != sqlite3ReadSchema(pParse)) { goto exit_create_index; } - if( sqlite3HasExplicitNulls(pParse, pList) ){ + if (sqlite3HasExplicitNulls(pParse, pList)) { goto exit_create_index; } /* ** Find the table that is to be indexed. Return early if not found. */ - if( pTblName!=0 ){ + 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 ); + assert(pName1 && pName2); iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName); - if( iDb<0 ) goto exit_create_index; - assert( pName && pName->z ); + 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 ){ + if (!db->init.busy) { pTab = sqlite3SrcListLookup(pParse, pTblName); - if( pName2->n==0 && pTab && pTab->pSchema==db->aDb[1].pSchema ){ + if (pName2->n == 0 && pTab && pTab->pSchema == db->aDb[1].pSchema) { iDb = 1; } } #endif sqlite3FixInit(&sFix, pParse, iDb, "index", pName); - if( sqlite3FixSrcList(&sFix, pTblName) ){ + 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); + 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 ); + if (!HasRowid(pTab)) + pPk = sqlite3PrimaryKeyIndex(pTab); + } else { + assert(pName == 0); + assert(pStart == 0); pTab = pParse->pNewTable; - if( !pTab ) goto exit_create_index; + 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 + assert(pTab != 0); + if (sqlite3StrNICmp(pTab->zName, "sqlite_", 7) == 0 && db->init.busy == 0 && pTblName != 0 #if SQLITE_USER_AUTHENTICATION - && sqlite3UserAuthTable(pTab->zName)==0 + && 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) ){ + if (IsView(pTab)) { sqlite3ErrorMsg(pParse, "views may not be indexed"); goto exit_create_index; } #endif #ifndef SQLITE_OMIT_VIRTUALTABLE - if( IsVirtual(pTab) ){ + if (IsVirtual(pTab)) { sqlite3ErrorMsg(pParse, "virtual tables may not be indexed"); goto exit_create_index; } @@ -119211,37 +117907,39 @@ SQLITE_PRIVATE void sqlite3CreateIndex( ** dealing with a primary key or UNIQUE constraint. We have to invent our ** own name. */ - if( pName ){ + 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) ){ + 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 ){ + 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 ){ + if (sqlite3FindIndex(db, zName, pDb->zDbSName) != 0) { + if (!ifNotExist) { sqlite3ErrorMsg(pParse, "index %s already exists", zName); - }else{ - assert( !db->init.busy ); + } else { + assert(!db->init.busy); sqlite3CodeVerifySchema(pParse, iDb); sqlite3ForceNotReadOnly(pParse); } goto exit_create_index; } } - }else{ + } else { int n; - Index *pLoop; - for(pLoop=pTab->pIndex, n=1; pLoop; pLoop=pLoop->pNext, 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 ){ + if (zName == 0) { goto exit_create_index; } @@ -119250,20 +117948,22 @@ SQLITE_PRIVATE void sqlite3CreateIndex( ** 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]++; + 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) ){ + 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) ){ + if (!OMIT_TEMPDB && iDb == 1) + i = SQLITE_CREATE_TEMP_INDEX; + if (sqlite3AuthCheck(pParse, i, zName, pTab->zName, zDb)) { goto exit_create_index; } } @@ -119273,29 +117973,30 @@ SQLITE_PRIVATE void sqlite3CreateIndex( ** key out of the last column added to the table under construction. ** So create a fake list to simulate this. */ - if( pList==0 ){ + if (pList == 0) { Token prevCol; - Column *pCol = &pTab->aCol[pTab->nCol-1]; + 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 ); + 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{ + } else { sqlite3ExprListCheckLength(pParse, pList, "index"); - if( pParse->nErr ) goto exit_create_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) ); + for (i = 0; i < pList->nExpr; 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)); } } @@ -119305,36 +118006,35 @@ SQLITE_PRIVATE void sqlite3CreateIndex( */ 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 ){ + 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) ); + assert(EIGHT_BYTE_ALIGNMENT(pIndex->aiRowLogEst)); + assert(EIGHT_BYTE_ALIGNMENT(pIndex->azColl)); pIndex->zName = zExtra; zExtra += nName + 1; - memcpy(pIndex->zName, zName, nName+1); + memcpy(pIndex->zName, zName, nName + 1); pIndex->pTable = pTab; pIndex->onError = (u8)onError; - pIndex->uniqNotNull = onError!=OE_None; + pIndex->uniqNotNull = onError != OE_None; pIndex->idxType = idxType; pIndex->pSchema = db->aDb[iDb].pSchema; pIndex->nKeyCol = pList->nExpr; - if( pPIWhere ){ + if (pPIWhere) { sqlite3ResolveSelfReference(pParse, pTab, NC_PartIdx, pPIWhere, 0); pIndex->pPartIdxWhere = pPIWhere; pPIWhere = 0; } - assert( sqlite3SchemaMutexHeld(db, iDb, 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 */ + */ + 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 @@ -119347,63 +118047,65 @@ SQLITE_PRIVATE void sqlite3CreateIndex( ** index key. */ pListItem = pList->a; - if( IN_RENAME_OBJECT ){ + 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 */ + for (i = 0; i < pIndex->nKeyCol; 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; + if (pParse->nErr) + goto exit_create_index; pCExpr = sqlite3ExprSkipCollate(pListItem->pExpr); - if( pCExpr->op!=TK_COLUMN ){ - if( pTab==pParse->pNewTable ){ + 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 ){ + if (pIndex->aColExpr == 0) { pIndex->aColExpr = pList; pList = 0; } j = XN_EXPR; pIndex->aiColumn[i] = XN_EXPR; pIndex->uniqNotNull = 0; - }else{ + } else { j = pCExpr->iColumn; - assert( j<=0x7fff ); - if( j<0 ){ + assert(j <= 0x7fff); + if (j < 0) { j = pTab->iPKey; - }else{ - if( pTab->aCol[j].notNull==0 ){ + } else { + if (pTab->aCol[j].notNull == 0) { pIndex->uniqNotNull = 0; } - if( pTab->aCol[j].colFlags & COLFLAG_VIRTUAL ){ + if (pTab->aCol[j].colFlags & COLFLAG_VIRTUAL) { pIndex->bHasVCol = 1; } } pIndex->aiColumn[i] = (i16)j; } zColl = 0; - if( pListItem->pExpr->op==TK_COLLATE ){ + if (pListItem->pExpr->op == TK_COLLATE) { int nColl; - assert( !ExprHasProperty(pListItem->pExpr, EP_IntValue) ); + assert(!ExprHasProperty(pListItem->pExpr, EP_IntValue)); zColl = pListItem->pExpr->u.zToken; nColl = sqlite3Strlen30(zColl) + 1; - assert( nExtra>=nColl ); + assert(nExtra >= nColl); memcpy(zExtra, zColl, nColl); zColl = zExtra; zExtra += nColl; nExtra -= nColl; - }else if( j>=0 ){ + } else if (j >= 0) { zColl = sqlite3ColumnColl(&pTab->aCol[j]); } - if( !zColl ) zColl = sqlite3StrBINARY; - if( !db->init.busy && !sqlite3LocateCollSeq(pParse, zColl) ){ + if (!zColl) + zColl = sqlite3StrBINARY; + if (!db->init.busy && !sqlite3LocateCollSeq(pParse, zColl)) { goto exit_create_index; } pIndex->azColl[i] = zColl; @@ -119415,44 +118117,46 @@ SQLITE_PRIVATE void sqlite3CreateIndex( ** 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++){ + if (pPk) { + for (j = 0; j < pPk->nKeyCol; j++) { int x = pPk->aiColumn[j]; - assert( x>=0 ); - if( isDupColumn(pIndex, pIndex->nKeyCol, pPk, j) ){ + assert(x >= 0); + if (isDupColumn(pIndex, pIndex->nKeyCol, pPk, j)) { pIndex->nColumn--; - }else{ - testcase( hasColumn(pIndex->aiColumn,pIndex->nKeyCol,x) ); + } 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{ + assert(i == pIndex->nColumn); + } else { pIndex->aiColumn[i] = XN_ROWID; pIndex->azColl[i] = sqlite3StrBINARY; } sqlite3DefaultRowEst(pIndex); - if( pParse->pNewTable==0 ) estimateIndexWidth(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 ); + assert(HasRowid(pTab) || pTab->iPKey < 0 || sqlite3TableColumnToIndex(pIndex, pTab->iPKey) >= 0); recomputeColumnsNotIndexed(pIndex); - if( pTblName!=0 && pIndex->nColumn>=pTab->nCol ){ + 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; + for (j = 0; j < pTab->nCol; j++) { + if (j == pTab->iPKey) + continue; + if (sqlite3TableColumnToIndex(pIndex, j) >= 0) + continue; pIndex->isCovering = 0; break; } } - if( pTab==pParse->pNewTable ){ + 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. @@ -119474,25 +118178,28 @@ SQLITE_PRIVATE void sqlite3CreateIndex( ** 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){ + 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; + assert(IsUniqueIndex(pIdx)); + assert(pIdx->idxType != SQLITE_IDXTYPE_APPDEF); + assert(IsUniqueIndex(pIndex)); + + if (pIdx->nKeyCol != pIndex->nKeyCol) + continue; + for (k = 0; k < pIdx->nKeyCol; 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 (sqlite3StrICmp(z1, z2)) + break; } - if( k==pIdx->nKeyCol ){ - if( pIdx->onError!=pIndex->onError ){ + 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 @@ -119500,16 +118207,16 @@ SQLITE_PRIVATE void sqlite3CreateIndex( ** 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 || pIndex->onError == OE_Default)) { + sqlite3ErrorMsg(pParse, "conflicting ON CONFLICT clauses specified", 0); } - if( pIdx->onError==OE_Default ){ + if (pIdx->onError == OE_Default) { pIdx->onError = pIndex->onError; } } - if( idxType==SQLITE_IDXTYPE_PRIMARYKEY ) pIdx->idxType = idxType; - if( IN_RENAME_OBJECT ){ + if (idxType == SQLITE_IDXTYPE_PRIMARYKEY) + pIdx->idxType = idxType; + if (IN_RENAME_OBJECT) { pIndex->pNext = pParse->pNewIndex; pParse->pNewIndex = pIndex; pIndex = 0; @@ -119519,28 +118226,27 @@ SQLITE_PRIVATE void sqlite3CreateIndex( } } - if( !IN_RENAME_OBJECT ){ + 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 ){ + 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) ){ + 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 */ + p = sqlite3HashInsert(&pIndex->pSchema->idxHash, pIndex->zName, pIndex); + if (p) { + assert(p == pIndex); /* Malloc must have failed */ sqlite3OomFault(db); goto exit_create_index; } @@ -119560,13 +118266,14 @@ SQLITE_PRIVATE void sqlite3CreateIndex( ** 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; + else if (HasRowid(pTab) || pTblName != 0) { + Vdbe* v; + char* zStmt; int iMem = ++pParse->nMem; v = sqlite3GetVdbe(pParse); - if( v==0 ) goto exit_create_index; + if (v == 0) + goto exit_create_index; sqlite3BeginWriteOperation(pParse, 1, iDb); @@ -119582,70 +118289,64 @@ SQLITE_PRIVATE void sqlite3CreateIndex( /* Gather the complete text of the CREATE INDEX statement into ** the zStmt variable */ - assert( pName!=0 || pStart==0 ); - if( pStart ){ + assert(pName != 0 || pStart == 0); + if (pStart) { int n = (int)(pParse->sLastToken.z - pName->z) + pParse->sLastToken.n; - if( pName->z[n-1]==';' ) 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{ + 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 - ); + */ + 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 ){ + if (pTblName) { sqlite3RefillIndex(pParse, pIndex, iMem); sqlite3ChangeCookie(pParse, iDb); - sqlite3VdbeAddParseSchemaOp(v, iDb, - sqlite3MPrintf(db, "name='%q' AND type='index'", pIndex->zName), 0); + 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 ){ + if (db->init.busy || pTblName == 0) { pIndex->pNext = pTab->pIndex; pTab->pIndex = pIndex; pIndex = 0; - } - else if( IN_RENAME_OBJECT ){ - assert( pParse->pNewIndex==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 ){ + 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 ){ + 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; @@ -119657,10 +118358,8 @@ SQLITE_PRIVATE void sqlite3CreateIndex( /* 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 ); + for (pThis = pTab->pIndex; pThis; pThis = pThis->pNext) { + assert(pThis->onError != OE_Replace || pThis->pNext == 0 || pThis->pNext->onError == OE_Replace); } #endif } @@ -119688,16 +118387,16 @@ SQLITE_PRIVATE void sqlite3CreateIndex( ** 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; +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 ); + 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 @@ -119710,70 +118409,78 @@ SQLITE_PRIVATE void sqlite3DefaultRowEst(Index *pIdx){ ** stat1 data to be ignored by the query planner. */ x = pIdx->pTable->nRowLogEst; - assert( 99==sqlite3LogEst(1000) ); - if( x<99 ){ + assert(99 == sqlite3LogEst(1000)); + if (x < 99) { pIdx->pTable->nRowLogEst = x = 99; } - if( pIdx->pPartIdxWhere!=0 ){ x -= 10; assert( 10==sqlite3LogEst(2) ); } + 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) ); + 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; + 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; +SQLITE_PRIVATE void sqlite3DropIndex(Parse* pParse, SrcList* pName, int ifExists) { + Index* pIndex; + Vdbe* v; + sqlite3* db = pParse->db; int iDb; - if( db->mallocFailed ){ + 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) ){ + 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 ){ + if (pIndex == 0) { + if (!ifExists) { sqlite3ErrorMsg(pParse, "no such index: %S", pName->a); - }else{ + } 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); + 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) ){ + 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) ){ + if (!OMIT_TEMPDB && iDb == 1) + code = SQLITE_DROP_TEMP_INDEX; + if (sqlite3AuthCheck(pParse, code, pIndex->zName, pTab->zName, zDb)) { goto exit_drop_index; } } @@ -119781,12 +118488,10 @@ SQLITE_PRIVATE void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists /* Generate code to remove the index and from the schema table */ v = sqlite3GetVdbe(pParse); - if( v ){ + 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 - ); + 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); @@ -119814,19 +118519,18 @@ SQLITE_PRIVATE void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists ** 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; +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 ){ + 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; } @@ -119844,17 +118548,17 @@ SQLITE_PRIVATE void *sqlite3ArrayAllocate( ** ** A new IdList is returned, or NULL if malloc() fails. */ -SQLITE_PRIVATE IdList *sqlite3IdListAppend(Parse *pParse, IdList *pList, Token *pToken){ - sqlite3 *db = pParse->db; +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 ){ + 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; } @@ -119862,7 +118566,7 @@ SQLITE_PRIVATE IdList *sqlite3IdListAppend(Parse *pParse, IdList *pList, Token * } i = pList->nId++; pList->a[i].zName = sqlite3NameFromToken(db, pToken); - if( IN_RENAME_OBJECT && pList->a[i].zName ){ + if (IN_RENAME_OBJECT && pList->a[i].zName) { sqlite3RenameTokenMap(pParse, (void*)pList->a[i].zName, pToken); } return pList; @@ -119871,11 +118575,12 @@ SQLITE_PRIVATE IdList *sqlite3IdListAppend(Parse *pParse, IdList *pList, Token * /* ** Delete an IdList. */ -SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3 *db, IdList *pList){ +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++){ + if (pList == 0) + return; + assert(pList->eU4 != EU4_EXPR); /* EU4_EXPR mode is not currently used */ + for (i = 0; i < pList->nId; i++) { sqlite3DbFree(db, pList->a[i].zName); } sqlite3DbFreeNN(db, pList); @@ -119885,11 +118590,12 @@ SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3 *db, IdList *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){ +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; + assert(pList != 0); + for (i = 0; i < pList->nId; i++) { + if (sqlite3StrICmp(pList->a[i].zName, zName) == 0) + return i; } return -1; } @@ -119903,7 +118609,7 @@ SQLITE_PRIVATE int sqlite3IdListIndex(IdList *pList, const char *zName){ ** appropriate for small and memory-limited applications. */ #ifndef SQLITE_MAX_SRCLIST -# define SQLITE_MAX_SRCLIST 200 +#define SQLITE_MAX_SRCLIST 200 #endif /* @@ -119926,36 +118632,34 @@ SQLITE_PRIVATE int sqlite3IdListIndex(IdList *pList, const char *zName){ ** 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 */ -){ +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 ); + 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); + 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 ); + 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; @@ -119964,14 +118668,14 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge( /* 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]; + 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[iStart], 0, sizeof(pSrc->a[0]) * nExtra); + for (i = iStart; i < iStart + nExtra; i++) { pSrc->a[i].iCursor = -1; } @@ -119979,7 +118683,6 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge( 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. @@ -120015,42 +118718,42 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge( ** 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 ); +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; + 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 ){ + } else { + SrcList* pNew = sqlite3SrcListEnlarge(pParse, pList, 1, pList->nSrc); + if (pNew == 0) { sqlite3SrcListDelete(db, pList); return 0; - }else{ + } else { pList = pNew; } } - pItem = &pList->a[pList->nSrc-1]; - if( pDatabase && pDatabase->z==0 ){ + pItem = &pList->a[pList->nSrc - 1]; + if (pDatabase && pDatabase->z == 0) { pDatabase = 0; } - if( pDatabase ){ + if (pDatabase) { pItem->zName = sqlite3NameFromToken(db, pDatabase); pItem->zDatabase = sqlite3NameFromToken(db, pTable); - }else{ + } else { pItem->zName = sqlite3NameFromToken(db, pTable); pItem->zDatabase = 0; } @@ -120060,15 +118763,16 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppend( /* ** Assign VdbeCursor index numbers to all tables in a SrcList */ -SQLITE_PRIVATE void sqlite3SrcListAssignCursors(Parse *pParse, SrcList *pList){ +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; + SrcItem* pItem; + assert(pList || pParse->db->mallocFailed); + if (ALWAYS(pList)) { + for (i = 0, pItem = pList->a; i < pList->nSrc; i++, pItem++) { + if (pItem->iCursor >= 0) + continue; pItem->iCursor = pParse->nTab++; - if( pItem->pSelect ){ + if (pItem->pSelect) { sqlite3SrcListAssignCursors(pParse, pItem->pSelect->pSrc); } } @@ -120078,21 +118782,27 @@ SQLITE_PRIVATE void sqlite3SrcListAssignCursors(Parse *pParse, SrcList *pList){ /* ** Delete an entire SrcList including all its substructure. */ -SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3 *db, SrcList *pList){ +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); + SrcItem* pItem; + if (pList == 0) + return; + for (pItem = pList->a, i = 0; i < pList->nSrc; 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); + 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 ){ + if (pItem->pSelect) + sqlite3SelectDelete(db, pItem->pSelect); + if (pItem->fg.isUsing) { sqlite3IdListDelete(db, pItem->u3.pUsing); - }else if( pItem->u3.pOn ){ + } else if (pItem->u3.pOn) { sqlite3ExprDelete(db, pItem->u3.pOn); } } @@ -120115,59 +118825,56 @@ SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3 *db, SrcList *pList){ ** 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") - ); +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 ){ + 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; + 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 ){ + assert(pAlias != 0); + if (pAlias->n) { pItem->zAlias = sqlite3NameFromToken(db, pAlias); } - if( pSubquery ){ + if (pSubquery) { pItem->pSelect = pSubquery; - if( pSubquery->selFlags & SF_NestedFrom ){ + 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 ){ + 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 ){ + } else if (pOnUsing->pUsing) { pItem->fg.isUsing = 1; pItem->u3.pUsing = pOnUsing->pUsing; - }else{ + } else { pItem->u3.pOn = pOnUsing->pOn; } return p; append_from_error: - assert( p==0 ); + assert(p == 0); sqlite3ClearOnOrUsing(db, pOnUsing); sqlite3SelectDelete(db, pSubquery); return 0; @@ -120177,23 +118884,23 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm( ** 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 ){ +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{ + } else { pItem->u1.zIndexedBy = sqlite3NameFromToken(pParse->db, pIndexedBy); pItem->fg.isIndexedBy = 1; - assert( pItem->fg.isCte==0 ); /* No collision on union u2 */ + assert(pItem->fg.isCte == 0); /* No collision on union u2 */ } } } @@ -120203,15 +118910,15 @@ SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *pParse, SrcList *p, Token *pI ** 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 ){ +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{ + } else { p1 = pNew; - memcpy(&p1->a[1], p2->a, p2->nSrc*sizeof(SrcItem)); + 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); } @@ -120223,15 +118930,15 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendList(Parse *pParse, SrcList *p1, Src ** 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 ); +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{ + } else { sqlite3ExprListDelete(pParse->db, pList); } } @@ -120258,25 +118965,26 @@ SQLITE_PRIVATE void sqlite3SrcListFuncArgs(Parse *pParse, SrcList *p, ExprList * ** 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){ +SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(Parse* pParse, SrcList* p) { (void)pParse; - if( p && p->nSrc>1 ){ - int i = p->nSrc-1; + 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 ); + 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--){} + 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{ + assert(i >= 0); + do { p->a[i].fg.jointype |= JT_LTORJ; - }while( (--i)>=0 ); + } while ((--i) >= 0); } } } @@ -120284,29 +118992,30 @@ SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(Parse *pParse, SrcList *p){ /* ** Generate VDBE code for a BEGIN statement. */ -SQLITE_PRIVATE void sqlite3BeginTransaction(Parse *pParse, int type){ - sqlite3 *db; - Vdbe *v; +SQLITE_PRIVATE void sqlite3BeginTransaction(Parse* pParse, int type) { + sqlite3* db; + Vdbe* v; int i; - assert( pParse!=0 ); + assert(pParse != 0); db = pParse->db; - assert( db!=0 ); - if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "BEGIN", 0, 0) ){ + 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++){ + if (!v) + return; + if (type != TK_DEFERRED) { + for (i = 0; i < db->nDb; 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 */ + 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); @@ -120320,20 +119029,19 @@ SQLITE_PRIVATE void sqlite3BeginTransaction(Parse *pParse, int type){ ** 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; +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) ){ + 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 ){ + if (v) { sqlite3VdbeAddOp2(v, OP_AutoCommit, 1, isRollback); } } @@ -120342,15 +119050,15 @@ SQLITE_PRIVATE void sqlite3EndTransaction(Parse *pParse, int eType){ ** 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); +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 ); + 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) ){ + if (!v || sqlite3AuthCheck(pParse, SQLITE_SAVEPOINT, az[op], zName, 0)) { sqlite3DbFree(pParse->db, zName); return; } @@ -120362,28 +119070,24 @@ SQLITE_PRIVATE void sqlite3Savepoint(Parse *pParse, int op, Token *pName){ ** 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 ){ +SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse* pParse) { + sqlite3* db = pParse->db; + if (db->aDb[1].pBt == 0 && !pParse->explain) { int rc; - Btree *pBt; + Btree* pBt; static const int flags = - SQLITE_OPEN_READWRITE | - SQLITE_OPEN_CREATE | - SQLITE_OPEN_EXCLUSIVE | - SQLITE_OPEN_DELETEONCLOSE | - SQLITE_OPEN_TEMP_DB; + 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 ){ + if (rc != SQLITE_OK) { sqlite3ErrorMsg(pParse, "unable to open a temporary database " - "file for storing temporary tables"); + "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) ){ + assert(db->aDb[1].pSchema); + if (SQLITE_NOMEM == sqlite3BtreeSetPageSize(pBt, db->nextPagesize, 0, 0)) { sqlite3OomFault(db); return 1; } @@ -120397,33 +119101,32 @@ SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *pParse){ ** 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 ){ +static void sqlite3CodeVerifySchemaAtToplevel(Parse* pToplevel, int iDb) { + assert(iDb >= 0 && iDb < pToplevel->db->nDb); + assert(pToplevel->db->aDb[iDb].pBt != 0 || iDb == 1); + assert(iDb < SQLITE_MAX_DB); + assert(sqlite3SchemaMutexHeld(pToplevel->db, iDb, 0)); + if (DbMaskTest(pToplevel->cookieMask, iDb) == 0) { DbMaskSet(pToplevel->cookieMask, iDb); - if( !OMIT_TEMPDB && iDb==1 ){ + if (!OMIT_TEMPDB && iDb == 1) { sqlite3OpenTempDatabase(pToplevel); } } } -SQLITE_PRIVATE void sqlite3CodeVerifySchema(Parse *pParse, int iDb){ +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; +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)) ){ + for (i = 0; i < db->nDb; i++) { + Db* pDb = &db->aDb[i]; + if (pDb->pBt && (!zDb || 0 == sqlite3StrICmp(zDb, pDb->zDbSName))) { sqlite3CodeVerifySchema(pParse, i); } } @@ -120442,8 +119145,8 @@ SQLITE_PRIVATE void sqlite3CodeVerifyNamedSchema(Parse *pParse, const char *zDb) ** 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); +SQLITE_PRIVATE void sqlite3BeginWriteOperation(Parse* pParse, int setStatement, int iDb) { + Parse* pToplevel = sqlite3ParseToplevel(pParse); sqlite3CodeVerifySchemaAtToplevel(pToplevel, iDb); DbMaskSet(pToplevel->writeMask, iDb); pToplevel->isMultiWrite |= setStatement; @@ -120456,8 +119159,8 @@ SQLITE_PRIVATE void sqlite3BeginWriteOperation(Parse *pParse, int setStatement, ** 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); +SQLITE_PRIVATE void sqlite3MultiWrite(Parse* pParse) { + Parse* pToplevel = sqlite3ParseToplevel(pParse); pToplevel->isMultiWrite = 1; } @@ -120477,8 +119180,8 @@ SQLITE_PRIVATE void sqlite3MultiWrite(Parse *pParse){ ** 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); +SQLITE_PRIVATE void sqlite3MayAbort(Parse* pParse) { + Parse* pToplevel = sqlite3ParseToplevel(pParse); pToplevel->mayAbort = 1; } @@ -120487,19 +119190,18 @@ SQLITE_PRIVATE void sqlite3MayAbort(Parse *pParse){ ** 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 ); +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 ){ + assert((errCode & 0xff) == SQLITE_CONSTRAINT || pParse->nested); + if (onError == OE_Abort) { sqlite3MayAbort(pParse); } sqlite3VdbeAddOp4(v, OP_Halt, errCode, onError, 0, p4, p4type); @@ -120509,59 +119211,52 @@ SQLITE_PRIVATE void sqlite3HaltConstraint( /* ** 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; +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; + Table* pTab = pIdx->pTable; - sqlite3StrAccumInit(&errMsg, pParse->db, 0, 0, - pParse->db->aLimit[SQLITE_LIMIT_LENGTH]); - if( pIdx->aColExpr ){ + 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 ); + } else { + for (j = 0; j < pIdx->nKeyCol; j++) { + char* zCol; + assert(pIdx->aiColumn[j] >= 0); zCol = pTab->aCol[pIdx->aiColumn[j]].zCnName; - if( j ) sqlite3_str_append(&errMsg, ", ", 2); + 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); + 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; +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); + if (pTab->iPKey >= 0) { + zMsg = sqlite3MPrintf(pParse->db, "%s.%s", pTab->zName, pTab->aCol[pTab->iPKey].zCnName); rc = SQLITE_CONSTRAINT_PRIMARYKEY; - }else{ + } else { zMsg = sqlite3MPrintf(pParse->db, "%s.rowid", pTab->zName); rc = SQLITE_CONSTRAINT_ROWID; } - sqlite3HaltConstraint(pParse, rc, onError, zMsg, P4_DYNAMIC, - P5_ConstraintUnique); + sqlite3HaltConstraint(pParse, rc, onError, zMsg, P4_DYNAMIC, P5_ConstraintUnique); } /* @@ -120569,13 +119264,13 @@ SQLITE_PRIVATE void sqlite3RowidConstraint( ** true if it does and false if it does not. */ #ifndef SQLITE_OMIT_REINDEX -static int collationMatch(const char *zColl, Index *pIndex){ +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) ){ + assert(zColl != 0); + for (i = 0; i < pIndex->nColumn; 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; } } @@ -120588,12 +119283,12 @@ static int collationMatch(const char *zColl, Index *pIndex){ ** 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 */ +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) ){ + 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); @@ -120609,17 +119304,17 @@ static void reindexTable(Parse *pParse, Table *pTab, char const *zColl){ ** 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)){ +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; iDb < db->nDb; iDb++, pDb++) { + assert(pDb != 0); + for (k = sqliteHashFirst(&pDb->pSchema->tblHash); k; k = sqliteHashNext(k)) { pTab = (Table*)sqliteHashData(k); reindexTable(pParse, pTab, zColl); } @@ -120641,32 +119336,33 @@ static void reindexDatabases(Parse *pParse, char const *zColl){ ** 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 */ +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) ){ + if (SQLITE_OK != sqlite3ReadSchema(pParse)) { return; } - if( pName1==0 ){ + if (pName1 == 0) { reindexDatabases(pParse, 0); return; - }else if( NEVER(pName2==0) || pName2->z==0 ){ - char *zColl; - assert( pName1->z ); + } else if (NEVER(pName2 == 0) || pName2->z == 0) { + char* zColl; + assert(pName1->z); zColl = sqlite3NameFromToken(pParse->db, pName1); - if( !zColl ) return; + if (!zColl) + return; pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0); - if( pColl ){ + if (pColl) { reindexDatabases(pParse, zColl); sqlite3DbFree(db, zColl); return; @@ -120674,19 +119370,21 @@ SQLITE_PRIVATE void sqlite3Reindex(Parse *pParse, Token *pName1, Token *pName2){ sqlite3DbFree(db, zColl); } iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pObjName); - if( iDb<0 ) return; + if (iDb < 0) + return; z = sqlite3NameFromToken(db, pObjName); - if( z==0 ) return; + if (z == 0) + return; zDb = db->aDb[iDb].zDbSName; pTab = sqlite3FindTable(db, z, zDb); - if( pTab ){ + if (pTab) { reindexTable(pParse, pTab, 0); sqlite3DbFree(db, z); return; } pIndex = sqlite3FindIndex(db, z, zDb); sqlite3DbFree(db, z); - if( pIndex ){ + if (pIndex) { sqlite3BeginWriteOperation(pParse, 0, iDb); sqlite3RefillIndex(pParse, pIndex, -1); return; @@ -120701,29 +119399,29 @@ SQLITE_PRIVATE void sqlite3Reindex(Parse *pParse, Token *pName1, Token *pName2){ ** The caller should invoke sqlite3KeyInfoUnref() on the returned object ** when it has finished using it. */ -SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoOfIndex(Parse *pParse, Index *pIdx){ +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{ + 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); + if (pKey) { + assert(sqlite3KeyInfoIsWriteable(pKey)); + for (i = 0; i < nCol; i++) { + const char* zColl = pIdx->azColl[i]; + pKey->aColl[i] = zColl == sqlite3StrBINARY ? 0 : sqlite3LocateCollSeq(pParse, zColl); pKey->aSortFlags[i] = pIdx->aSortOrder[i]; - assert( 0==(pKey->aSortFlags[i] & KEYINFO_ORDER_BIGNULL) ); + assert(0 == (pKey->aSortFlags[i] & KEYINFO_ORDER_BIGNULL)); } - if( pParse->nErr ){ - assert( pParse->rc==SQLITE_ERROR_MISSING_COLLSEQ ); - if( pIdx->bNoQuery==0 ){ + 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 @@ -120745,23 +119443,22 @@ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoOfIndex(Parse *pParse, Index *pIdx){ /* ** 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; +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 ); + assert(pNew != 0 || db->mallocFailed); - if( db->mallocFailed ){ + if (db->mallocFailed) { sqlite3ExprListDelete(db, pArglist); sqlite3SelectDelete(db, pQuery); - }else{ + } else { pNew->pSelect = pQuery; pNew->pCols = pArglist; pNew->zName = sqlite3NameFromToken(pParse->db, pName); @@ -120774,8 +119471,8 @@ SQLITE_PRIVATE Cte *sqlite3CteNew( ** 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 ); +static void cteClear(sqlite3* db, Cte* pCte) { + assert(pCte != 0); sqlite3ExprListDelete(db, pCte->pCols); sqlite3SelectDelete(db, pCte->pSelect); sqlite3DbFree(db, pCte->zName); @@ -120784,8 +119481,8 @@ static void cteClear(sqlite3 *db, Cte *pCte){ /* ** Free the contents of the CTE object passed as the second argument. */ -SQLITE_PRIVATE void sqlite3CteDelete(sqlite3 *db, Cte *pCte){ - assert( pCte!=0 ); +SQLITE_PRIVATE void sqlite3CteDelete(sqlite3* db, Cte* pCte) { + assert(pCte != 0); cteClear(db, pCte); sqlite3DbFree(db, pCte); } @@ -120796,43 +119493,42 @@ SQLITE_PRIVATE void sqlite3CteDelete(sqlite3 *db, Cte *pCte){ ** 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; +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 ){ + 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 ){ + if (zName && pWith) { int i; - for(i=0; inCte; i++){ - if( sqlite3StrICmp(zName, pWith->a[i].zName)==0 ){ + for (i = 0; i < pWith->nCte; i++) { + if (sqlite3StrICmp(zName, pWith->a[i].zName) == 0) { sqlite3ErrorMsg(pParse, "duplicate WITH table name: %s", zName); } } } - if( pWith ){ + if (pWith) { sqlite3_int64 nByte = sizeof(*pWith) + (sizeof(pWith->a[1]) * pWith->nCte); pNew = sqlite3DbRealloc(db, pWith, nByte); - }else{ + } else { pNew = sqlite3DbMallocZero(db, sizeof(*pWith)); } - assert( (pNew!=0 && zName!=0) || db->mallocFailed ); + assert((pNew != 0 && zName != 0) || db->mallocFailed); - if( db->mallocFailed ){ + if (db->mallocFailed) { sqlite3CteDelete(db, pCte); pNew = pWith; - }else{ + } else { pNew->a[pNew->nCte++] = *pCte; sqlite3DbFree(db, pCte); } @@ -120843,10 +119539,10 @@ SQLITE_PRIVATE With *sqlite3WithAdd( /* ** Free the contents of the With object passed as the second argument. */ -SQLITE_PRIVATE void sqlite3WithDelete(sqlite3 *db, With *pWith){ - if( pWith ){ +SQLITE_PRIVATE void sqlite3WithDelete(sqlite3* db, With* pWith) { + if (pWith) { int i; - for(i=0; inCte; i++){ + for (i = 0; i < pWith->nCte; i++) { cteClear(db, &pWith->a[i]); } sqlite3DbFree(db, pWith); @@ -120878,21 +119574,22 @@ SQLITE_PRIVATE void sqlite3WithDelete(sqlite3 *db, With *pWith){ ** 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; +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); + 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 ){ + if (zExternal) { db->xCollNeeded16(db->pCollNeededArg, db, (int)ENC(db), zExternal); } sqlite3ValueFree(pTmp); @@ -120907,16 +119604,16 @@ static void callCollNeeded(sqlite3 *db, int enc, const char *zName){ ** 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; +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++){ + 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 ){ + if (pColl2->xCmp != 0) { memcpy(pColl, pColl2, sizeof(CollSeq)); - pColl->xDel = 0; /* Do not copy the destructor */ + pColl->xDel = 0; /* Do not copy the destructor */ return SQLITE_OK; } } @@ -120934,21 +119631,19 @@ static int synthCollSeq(sqlite3 *db, CollSeq *pColl){ ** 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 ){ +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 ); + 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 @@ -120962,19 +119657,18 @@ SQLITE_PRIVATE int sqlite3CheckCollSeq(Parse *pParse, CollSeq *pColl){ ** 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; +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 ){ + if (0 == pColl && create) { int nName = sqlite3Strlen30(zName) + 1; - pColl = sqlite3DbMallocZero(db, 3*sizeof(*pColl) + nName); - if( pColl ){ - CollSeq *pDel = 0; + 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]; @@ -120988,8 +119682,8 @@ static CollSeq *findCollSeqEntry( ** return the pColl pointer to be deleted (because it wasn't added ** to the hash table). */ - assert( pDel==0 || pDel==pColl ); - if( pDel!=0 ){ + assert(pDel == 0 || pDel == pColl); + if (pDel != 0) { sqlite3OomFault(db); sqlite3DbFree(db, pDel); pColl = 0; @@ -121014,19 +119708,19 @@ static CollSeq *findCollSeqEntry( ** ** 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 ){ +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{ + if (pColl) + pColl += enc - 1; + } else { pColl = db->pDfltColl; } return pColl; @@ -121036,8 +119730,8 @@ SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq( ** 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 ); +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. @@ -121059,31 +119753,30 @@ SQLITE_PRIVATE void sqlite3SetTextEncoding(sqlite3 *db, u8 enc){ ** ** 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; +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 ){ + if (!p) { p = sqlite3FindCollSeq(db, enc, zName, 0); } - if( !p || !p->xCmp ){ + 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) ){ + if (p && !p->xCmp && synthCollSeq(db, p)) { p = 0; } - assert( !p || p->xCmp ); - if( p==0 ){ + assert(!p || p->xCmp); + if (p == 0) { sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName); pParse->rc = SQLITE_ERROR_MISSING_COLLSEQ; } @@ -121110,14 +119803,14 @@ SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq( ** ** See also: sqlite3FindCollSeq(), sqlite3GetCollSeq() */ -SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char *zName){ - sqlite3 *db = pParse->db; +SQLITE_PRIVATE CollSeq* sqlite3LocateCollSeq(Parse* pParse, const char* zName) { + sqlite3* db = pParse->db; u8 enc = ENC(db); u8 initbusy = db->init.busy; - CollSeq *pColl; + CollSeq* pColl; pColl = sqlite3FindCollSeq(db, enc, zName, initbusy); - if( !initbusy && (!pColl || !pColl->xCmp) ){ + if (!initbusy && (!pColl || !pColl->xCmp)) { pColl = sqlite3GetCollSeq(pParse, enc, pColl, zName); } @@ -121152,34 +119845,35 @@ SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char *zName){ ** 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 */ -){ +#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 ); + 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; + 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 ){ + if (p->nArg == nArg) { match = 4; - }else{ + } 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 */ + 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; @@ -121189,14 +119883,13 @@ static int matchQuality( ** 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 ){ +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; } } @@ -121206,23 +119899,22 @@ SQLITE_PRIVATE FuncDef *sqlite3FunctionSearch( /* ** 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 */ -){ +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] ); + if (pOther) { + assert(pOther != &aDef[i] && pOther->pNext != &aDef[i]); aDef[i].pNext = pOther->pNext; pOther->pNext = &aDef[i]; - }else{ + } else { aDef[i].pNext = 0; aDef[i].u.pHash = sqlite3BuiltinFunctions.a[h]; sqlite3BuiltinFunctions.a[h] = &aDef[i]; @@ -121230,8 +119922,6 @@ SQLITE_PRIVATE void sqlite3InsertBuiltinFuncs( } } - - /* ** 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 @@ -121251,29 +119941,28 @@ SQLITE_PRIVATE void sqlite3InsertBuiltinFuncs( ** 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 */ +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 ); + 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 ){ + while (p) { int score = matchQuality(p, nArg, enc); - if( score>bestScore ){ + if (score > bestScore) { pBest = p; bestScore = score; } @@ -121292,13 +119981,13 @@ SQLITE_PRIVATE FuncDef *sqlite3FindFunction( ** 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) ){ + 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 ){ + while (p) { int score = matchQuality(p, nArg, enc); - if( score>bestScore ){ + if (score > bestScore) { pBest = p; bestScore = score; } @@ -121310,26 +119999,26 @@ SQLITE_PRIVATE FuncDef *sqlite3FindFunction( ** 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]; + 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 ){ + if (pOther == pBest) { sqlite3DbFree(db, pBest); sqlite3OomFault(db); return 0; - }else{ + } else { pBest->pNext = pOther; } } - if( pBest && (pBest->xSFunc || createFlag) ){ + if (pBest && (pBest->xSFunc || createFlag)) { return pBest; } return 0; @@ -121343,48 +120032,48 @@ SQLITE_PRIVATE FuncDef *sqlite3FindFunction( ** ** The Schema.cache_size variable is not cleared. */ -SQLITE_PRIVATE void sqlite3SchemaClear(void *p){ +SQLITE_PRIVATE void sqlite3SchemaClear(void* p) { Hash temp1; Hash temp2; - HashElem *pElem; - Schema *pSchema = (Schema *)p; + 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)){ + 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); + 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 ){ + if (pSchema->schemaFlags & DB_SchemaLoaded) { pSchema->iGeneration++; } - pSchema->schemaFlags &= ~(DB_SchemaLoaded|DB_ResetWanted); + 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)); +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 ){ + if (!p) { sqlite3OomFault(db); - }else if ( 0==p->file_format ){ + } else if (0 == p->file_format) { sqlite3HashInit(&p->tblHash); sqlite3HashInit(&p->idxHash); sqlite3HashInit(&p->trigHash); @@ -121426,16 +120115,16 @@ SQLITE_PRIVATE Schema *sqlite3SchemaGet(sqlite3 *db, Btree *pBt){ ** 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 ); +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 ){ + if (pTab) { pTab->nTabRef++; - if( pItem->fg.isIndexedBy && sqlite3IndexedByLookup(pParse, pItem) ){ + if (pItem->fg.isIndexedBy && sqlite3IndexedByLookup(pParse, pItem)) { pTab = 0; } } @@ -121445,7 +120134,7 @@ SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){ /* 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){ +SQLITE_PRIVATE void sqlite3CodeChangeCount(Vdbe* v, int regCounter, const char* zColName) { sqlite3VdbeAddOp0(v, OP_FkCheck); sqlite3VdbeAddOp2(v, OP_ResultRow, regCounter, 1); sqlite3VdbeSetNumCols(v, 1); @@ -121467,17 +120156,18 @@ SQLITE_PRIVATE void sqlite3CodeChangeCount(Vdbe *v, int regCounter, const char * ** 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; +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; + 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; + if ((pTab->tabFlags & TF_Readonly) != 0) { + return sqlite3WritableSchema(db) == 0 && pParse->nested == 0; } - assert( pTab->tabFlags & TF_Shadow ); + assert(pTab->tabFlags & TF_Shadow); return sqlite3ReadOnlyShadowTables(db); } @@ -121486,51 +120176,48 @@ static int tabIsReadOnly(Parse *pParse, Table *pTab){ ** 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) ){ +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); + 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 */ -){ +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; + 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 ); + 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 ); + 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); + pSel = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, pOrderBy, SF_IncludeHidden, pLimit); sqlite3SelectDestInit(&dest, SRT_EphemTab, iCur); sqlite3Select(pParse, pSel, &dest); sqlite3SelectDelete(db, pSel); @@ -121546,25 +120233,24 @@ SQLITE_PRIVATE void sqlite3MaterializeView( ** \__________________________/ ** 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; +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 ) { + */ + if (pOrderBy && pLimit == 0) { sqlite3ErrorMsg(pParse, "ORDER BY without LIMIT on %s", zStmtType); sqlite3ExprDelete(pParse->db, pWhere); sqlite3ExprListDelete(pParse->db, pOrderBy); @@ -121574,7 +120260,7 @@ SQLITE_PRIVATE Expr *sqlite3LimitWhere( /* We only need to generate a select expression if there ** is a limit/offset term to enforce. */ - if( pLimit == 0 ) { + if (pLimit == 0) { return pWhere; } @@ -121588,25 +120274,23 @@ SQLITE_PRIVATE Expr *sqlite3LimitWhere( */ pTab = pSrc->a[0].pTab; - if( HasRowid(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; + 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{ + } else { int i; - for(i=0; inKeyCol; i++){ - Expr *p = sqlite3Expr(db, TK_ID, pTab->aCol[pPk->aiColumn[i]].zCnName); + for (i = 0; i < pPk->nKeyCol; 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 ){ + if (pLhs) { pLhs->x.pList = sqlite3ExprListDup(db, pEList, 0); } } @@ -121617,19 +120301,17 @@ SQLITE_PRIVATE Expr *sqlite3LimitWhere( 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 ); + 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 ){ + } 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 - ); + 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); @@ -121646,57 +120328,56 @@ SQLITE_PRIVATE Expr *sqlite3LimitWhere( ** \________/ \________________/ ** 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 */ +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 */ + 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 ){ + assert(db->pParse == pParse); + if (pParse->nErr) { goto delete_from_cleanup; } - assert( db->mallocFailed==0 ); - assert( pTabList->nSrc==1 ); + 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 @@ -121704,92 +120385,88 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( ** an SrcList* parameter instead of just a Table* parameter. */ pTab = sqlite3SrcListLookup(pParse, pTabList); - if( pTab==0 ) goto delete_from_cleanup; + if (pTab == 0) + goto delete_from_cleanup; - /* Figure out if we have any triggers and if the table being - ** deleted from is a view - */ + /* 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 +#define pTrigger 0 +#define isView 0 #endif bComplex = pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0); #ifdef SQLITE_OMIT_VIEW -# undef isView -# define isView 0 +#undef isView +#define isView 0 #endif #if TREETRACE_ENABLED - if( sqlite3TreeTrace & 0x10000 ){ + if (sqlite3TreeTrace & 0x10000) { sqlite3TreeViewLine(0, "In sqlite3Delete() at %s:%d", __FILE__, __LINE__); - sqlite3TreeViewDelete(pParse->pWith, pTabList, pWhere, - pOrderBy, pLimit, pTrigger); + 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" - ); + 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) ){ + */ + if (sqlite3ViewGetColumnNames(pParse, pTab)) { goto delete_from_cleanup; } - if( sqlite3IsReadOnly(pParse, pTab, (pTrigger?1:0)) ){ + 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 ){ + assert(iDb < db->nDb); + 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 ); + */ + assert(pTabList->nSrc == 1); iTabCur = pTabList->a[0].iCursor = pParse->nTab++; - for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){ + for (nIdx = 0, pIdx = pTab->pIndex; pIdx; pIdx = pIdx->pNext, nIdx++) { pParse->nTab++; } /* Start the view context - */ - if( isView ){ + */ + if (isView) { sqlite3AuthContextPush(pParse, &sContext, pTab->zName); } /* Begin generating code. - */ + */ v = sqlite3GetVdbe(pParse); - if( v==0 ){ + if (v == 0) { goto delete_from_cleanup; } - if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); + 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 - ); + if (isView) { + sqlite3MaterializeView(pParse, pTab, pWhere, pOrderBy, pLimit, iTabCur); iDataCur = iIdxCur = iTabCur; pOrderBy = 0; pLimit = 0; @@ -121797,22 +120474,18 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( #endif /* Resolve the column names in the WHERE clause. - */ + */ memset(&sNC, 0, sizeof(sNC)); sNC.pParse = pParse; sNC.pSrcList = pTabList; - if( sqlite3ResolveExprNames(&sNC, pWhere) ){ + 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 - ){ + if ((db->flags & SQLITE_CountRows) != 0 && !pParse->nested && !pParse->pTriggerTab && !pParse->bReturning) { memCnt = ++pParse->nMem; sqlite3VdbeAddOp2(v, OP_Integer, 0, memCnt); } @@ -121829,46 +120502,43 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( ** the truncate optimization is disabled and all rows are deleted ** individually. */ - if( rcauth==SQLITE_OK - && pWhere==0 - && !bComplex - && !IsVirtual(pTab) + if (rcauth == SQLITE_OK && pWhere == 0 && !bComplex && !IsVirtual(pTab) #ifdef SQLITE_ENABLE_PREUPDATE_HOOK - && db->xPreUpdateCallback==0 + && db->xPreUpdateCallback == 0 #endif - ){ - assert( !isView ); + ) { + 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); + 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 ); + 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) ){ + if (IsPrimaryKeyIndex(pIdx) && !HasRowid(pTab)) { sqlite3VdbeChangeP3(v, -1, memCnt ? memCnt : -1); } } - }else + } else #endif /* SQLITE_OMIT_TRUNCATE_OPTIMIZATION */ { - u16 wcf = WHERE_ONEPASS_DESIRED|WHERE_DUPLICATES_OK; - if( sNC.ncFlags & NC_VarSelect ) bComplex = 1; + u16 wcf = WHERE_ONEPASS_DESIRED | WHERE_DUPLICATES_OK; + if (sNC.ncFlags & NC_VarSelect) + bComplex = 1; wcf |= (bComplex ? 0 : WHERE_ONEPASS_MULTIROW); - if( HasRowid(pTab) ){ + 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{ + } 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 ); + assert(pPk != 0); nPk = pPk->nKeyCol; - iPk = pParse->nMem+1; + iPk = pParse->nMem + 1; pParse->nMem += nPk; iEphCur = pParse->nTab++; addrEphOpen = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEphCur, nPk); @@ -121883,61 +120553,64 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( ** 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; + 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) ){ + 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 ){ + 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); + if (pPk) { + for (i = 0; i < nPk; i++) { + assert(pPk->aiColumn[i] >= 0); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iTabCur, pPk->aiColumn[i], iPk + i); } iKey = iPk; - }else{ + } else { iKey = ++pParse->nMem; sqlite3ExprCodeGetColumnOfTable(v, pTab, iTabCur, -1, iKey); } - if( eOnePass!=ONEPASS_OFF ){ + 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 ){ + 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); + 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 ){ + } 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); + 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{ + } else { /* Add the rowid of the row to be deleted to the RowSet */ - nKey = 1; /* OP_DeferredSeek always uses a single rowid */ + nKey = 1; /* OP_DeferredSeek always uses a single rowid */ sqlite3VdbeAddOp2(v, OP_RowSetAdd, iRowSet, iKey); } sqlite3WhereEnd(pWInfo); @@ -121948,17 +120621,17 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( ** only effect this statement has is to fire the INSTEAD OF ** triggers. */ - if( !isView ){ + 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 ){ + 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); } } @@ -121966,58 +120639,59 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( /* 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) ); + 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) ){ + } else if (pPk) { + addrLoop = sqlite3VdbeAddOp1(v, OP_Rewind, iEphCur); + VdbeCoverage(v); + if (IsVirtual(pTab)) { sqlite3VdbeAddOp3(v, OP_Column, iEphCur, 0, iKey); - }else{ + } else { sqlite3VdbeAddOp2(v, OP_RowData, iEphCur, iKey); } - assert( nKey==0 ); /* OP_Found will use a composite key */ - }else{ + assert(nKey == 0); /* OP_Found will use a composite key */ + } else { addrLoop = sqlite3VdbeAddOp3(v, OP_RowSetRead, iRowSet, 0, iKey); VdbeCoverage(v); - assert( nKey==1 ); + assert(nKey == 1); } /* Delete the row */ #ifndef SQLITE_OMIT_VIRTUALTABLE - if( IsVirtual(pTab) ){ - const char *pVTab = (const char *)sqlite3GetVTable(db, pTab); + if (IsVirtual(pTab)) { + const char* pVTab = (const char*)sqlite3GetVTable(db, pTab); sqlite3VtabMakeWritable(pParse, pTab); - assert( eOnePass==ONEPASS_OFF || eOnePass==ONEPASS_SINGLE ); + assert(eOnePass == ONEPASS_OFF || eOnePass == ONEPASS_SINGLE); sqlite3MayAbort(pParse); - if( eOnePass==ONEPASS_SINGLE ){ + if (eOnePass == ONEPASS_SINGLE) { sqlite3VdbeAddOp1(v, OP_Close, iTabCur); - if( sqlite3IsToplevel(pParse) ){ + if (sqlite3IsToplevel(pParse)) { pParse->isMultiWrite = 0; } } sqlite3VdbeAddOp4(v, OP_VUpdate, 0, 1, iKey, pVTab, P4_VTAB); sqlite3VdbeChangeP5(v, OE_Abort); - }else + } 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]); + 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 ){ + if (eOnePass != ONEPASS_OFF) { sqlite3VdbeResolveLabel(v, addrBypass); sqlite3WhereEnd(pWInfo); - }else if( pPk ){ - sqlite3VdbeAddOp2(v, OP_Next, iEphCur, addrLoop+1); VdbeCoverage(v); + } else if (pPk) { + sqlite3VdbeAddOp2(v, OP_Next, iEphCur, addrLoop + 1); + VdbeCoverage(v); sqlite3VdbeJumpHere(v, addrLoop); - }else{ + } else { sqlite3VdbeGoto(v, addrLoop); sqlite3VdbeJumpHere(v, addrLoop); } @@ -122027,7 +120701,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( ** maximum rowid counter values recorded while inserting into ** autoincrement tables. */ - if( pParse->nested==0 && pParse->pTriggerTab==0 ){ + if (pParse->nested == 0 && pParse->pTriggerTab == 0) { sqlite3AutoincrementEnd(pParse); } @@ -122035,7 +120709,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( ** generating code because of a call to sqlite3NestedParse(), do not ** invoke the callback function. */ - if( memCnt ){ + if (memCnt) { sqlite3CodeChangeCount(v, memCnt, "rows deleted"); } @@ -122054,10 +120728,10 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( ** 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 +#undef isView #endif #ifdef pTrigger - #undef pTrigger +#undef pTrigger #endif /* @@ -122101,73 +120775,67 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( ** 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 */ +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)); + 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 ){ + if (eMode == ONEPASS_OFF) { sqlite3VdbeAddOp4Int(v, opSeek, iDataCur, iLabel, iPk, nPk); - VdbeCoverageIf(v, opSeek==OP_NotExists); - VdbeCoverageIf(v, opSeek==OP_NotFound); + 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 */ + 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 = sqlite3TriggerColmask(pParse, pTrigger, 0, 0, TRIGGER_BEFORE | TRIGGER_AFTER, pTab, onconf); mask |= sqlite3FkOldmask(pParse, pTab); - iOld = pParse->nMem+1; + 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) ){ + for (iCol = 0; iCol < pTab->nCol; 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); + 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 - ); + 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 @@ -122177,11 +120845,11 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( ** Also disable the iIdxNoSeek optimization since the BEFORE trigger ** may have moved that cursor. */ - if( addrStart=0 ); + VdbeCoverageIf(v, opSeek == OP_NotExists); + VdbeCoverageIf(v, opSeek == OP_NotFound); + testcase(iIdxNoSeek >= 0); iIdxNoSeek = -1; } @@ -122201,20 +120869,21 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( ** the update-hook is not invoked for rows removed by REPLACE, but the ** pre-update-hook is. */ - if( !IsView(pTab) ){ + 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") ){ + 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 ){ + if (eMode != ONEPASS_OFF) { sqlite3VdbeChangeP5(v, OPFLAG_AUXDELETE); } - if( iIdxNoSeek>=0 && iIdxNoSeek!=iDataCur ){ + if (iIdxNoSeek >= 0 && iIdxNoSeek != iDataCur) { sqlite3VdbeAddOp1(v, OP_Delete, iIdxNoSeek); } - if( eMode==ONEPASS_MULTI ) p5 |= OPFLAG_SAVEPOSITION; + if (eMode == ONEPASS_MULTI) + p5 |= OPFLAG_SAVEPOSITION; sqlite3VdbeChangeP5(v, p5); } @@ -122224,9 +120893,7 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( sqlite3FkActions(pParse, pTab, 0, iOld, 0, 0); /* Invoke AFTER DELETE trigger programs. */ - sqlite3CodeRowTrigger(pParse, pTrigger, - TK_DELETE, 0, TRIGGER_AFTER, pTab, iOld, onconf, iLabel - ); + 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 @@ -122253,35 +120920,35 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( ** 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 */ -){ +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 */ + 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; + 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 */ + 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; } @@ -122318,47 +120985,43 @@ SQLITE_PRIVATE void sqlite3GenerateRowIndexDelete( ** 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; +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 ){ + if (piPartIdxLabel) { + if (pIdx->pPartIdxWhere) { *piPartIdxLabel = sqlite3VdbeMakeLabel(pParse); pParse->iSelfTab = iDataCur + 1; - sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel, - SQLITE_JUMPIFNULL); + sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel, SQLITE_JUMPIFNULL); pParse->iSelfTab = 0; pPrior = 0; /* Ticket a9efb42811fa41ee 2019-11-02; ** pPartIdxWhere may have corrupted regPrior registers */ - }else{ + } 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 - ){ + if (pPrior && (regBase != regPrior || pPrior->pPartIdxWhere)) + pPrior = 0; + for (j = 0; j < nCol; j++) { + if (pPrior && pPrior->aiColumn[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 ){ + 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. @@ -122368,7 +121031,7 @@ SQLITE_PRIVATE int sqlite3GenerateIndexKey( sqlite3VdbeDeletePriorOpcode(v, OP_RealAffinity); } } - if( regOut ){ + if (regOut) { sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regOut); } sqlite3ReleaseTempRange(pParse, regBase, nCol); @@ -122380,8 +121043,8 @@ SQLITE_PRIVATE int sqlite3GenerateIndexKey( ** 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 ){ +SQLITE_PRIVATE void sqlite3ResolvePartIdxLabel(Parse* pParse, int iLabel) { + if (iLabel) { sqlite3VdbeResolveLabel(pParse->pVdbe, iLabel); } } @@ -122414,12 +121077,12 @@ SQLITE_PRIVATE void sqlite3ResolvePartIdxLabel(Parse *pParse, int iLabel){ /* ** 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 ); +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; } @@ -122427,8 +121090,8 @@ static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){ ** 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 ); +static void sqlite3SkipAccumulatorLoad(sqlite3_context* context) { + assert(context->isError <= 0); context->isError = -1; context->skipFlag = 1; } @@ -122436,27 +121099,25 @@ static void sqlite3SkipAccumulatorLoad(sqlite3_context *context){ /* ** Implementation of the non-aggregate min() and max() functions */ -static void minmaxFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ +static void minmaxFunc(sqlite3_context* context, int argc, sqlite3_value** argv) { int i; - int mask; /* 0 for min() or 0xffffffff for max() */ + int mask; /* 0 for min() or 0xffffffff for max() */ int iBest; - CollSeq *pColl; + CollSeq* pColl; - assert( argc>1 ); - mask = sqlite3_user_data(context)==0 ? 0 : -1; + assert(argc > 1); + mask = sqlite3_user_data(context) == 0 ? 0 : -1; pColl = sqlite3GetFuncCollSeq(context); - assert( pColl ); - assert( mask==-1 || mask==0 ); + 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 ); + if (sqlite3_value_type(argv[0]) == SQLITE_NULL) + return; + for (i = 1; i < argc; i++) { + if (sqlite3_value_type(argv[i]) == SQLITE_NULL) + return; + if ((sqlite3MemCompare(argv[iBest], argv[i], pColl) ^ mask) >= 0) { + testcase(mask == 0); iBest = i; } } @@ -122466,20 +121127,16 @@ static void minmaxFunc( /* ** 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" }; +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= 0 && i < ArraySize(azType)); + assert(SQLITE_INTEGER == 1); + assert(SQLITE_FLOAT == 2); + assert(SQLITE_TEXT == 3); + assert(SQLITE_BLOB == 4); + assert(SQLITE_NULL == 5); /* EVIDENCE-OF: R-01470-60482 The sqlite3_value_type(V) interface returns ** the datatype code for the initial datatype of the sqlite3_value object ** V. The returned value is one of SQLITE_INTEGER, SQLITE_FLOAT, @@ -122491,11 +121148,7 @@ static void typeofFunc( ** ** Return the subtype of X */ -static void subtypeFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ +static void subtypeFunc(sqlite3_context* context, int argc, sqlite3_value** argv) { UNUSED_PARAMETER(argc); sqlite3_result_int(context, sqlite3_value_subtype(argv[0])); } @@ -122503,14 +121156,10 @@ static void subtypeFunc( /* ** Implementation of the length() function */ -static void lengthFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - assert( argc==1 ); +static void lengthFunc(sqlite3_context* context, int argc, sqlite3_value** argv) { + assert(argc == 1); UNUSED_PARAMETER(argc); - switch( sqlite3_value_type(argv[0]) ){ + switch (sqlite3_value_type(argv[0])) { case SQLITE_BLOB: case SQLITE_INTEGER: case SQLITE_FLOAT: { @@ -122518,18 +121167,22 @@ static void lengthFunc( break; } case SQLITE_TEXT: { - const unsigned char *z = sqlite3_value_text(argv[0]); - const unsigned char *z0; + const unsigned char* z = sqlite3_value_text(argv[0]); + const unsigned char* z0; unsigned char c; - if( z==0 ) return; + if (z == 0) + return; z0 = z; - while( (c = *z)!=0 ){ + while ((c = *z) != 0) { z++; - if( c>=0xc0 ){ - while( (*z & 0xc0)==0x80 ){ z++; z0++; } + if (c >= 0xc0) { + while ((*z & 0xc0) == 0x80) { + z++; + z0++; + } } } - sqlite3_result_int(context, (int)(z-z0)); + sqlite3_result_int(context, (int)(z - z0)); break; } default: { @@ -122545,14 +121198,14 @@ static void lengthFunc( ** 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 ); +static void absFunc(sqlite3_context* context, int argc, sqlite3_value** argv) { + assert(argc == 1); UNUSED_PARAMETER(argc); - switch( sqlite3_value_type(argv[0]) ){ + switch (sqlite3_value_type(argv[0])) { case SQLITE_INTEGER: { i64 iVal = sqlite3_value_int64(argv[0]); - if( iVal<0 ){ - if( iVal==SMALLEST_INT64 ){ + 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. */ @@ -122576,7 +121229,8 @@ static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ ** that cannot be converted to a numeric value. */ double rVal = sqlite3_value_double(argv[0]); - if( rVal<0 ) rVal = -rVal; + if (rVal < 0) + rVal = -rVal; sqlite3_result_double(context, rVal); break; } @@ -122594,60 +121248,59 @@ static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ ** 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; +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; + 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; + 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 ){ + 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 ){ + } else if (typeHaystack != SQLITE_BLOB && typeNeedle != SQLITE_BLOB) { zHaystack = sqlite3_value_text(argv[0]); zNeedle = sqlite3_value_text(argv[1]); isText = 1; - }else{ + } else { pC1 = sqlite3_value_dup(argv[0]); zHaystack = sqlite3_value_text(pC1); - if( zHaystack==0 ) goto endInstrOOM; + 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; + if (zNeedle == 0) + goto endInstrOOM; nNeedle = sqlite3_value_bytes(pC2); isText = 1; } - if( zNeedle==0 || (nHaystack && zHaystack==0) ) goto endInstrOOM; + if (zNeedle == 0 || (nHaystack && zHaystack == 0)) + goto endInstrOOM; firstChar = zNeedle[0]; - while( nNeedle<=nHaystack - && (zHaystack[0]!=firstChar || memcmp(zHaystack, zNeedle, nNeedle)!=0) - ){ + while (nNeedle <= nHaystack && (zHaystack[0] != firstChar || memcmp(zHaystack, zNeedle, nNeedle) != 0)) { N++; - do{ + do { nHaystack--; zHaystack++; - }while( isText && (zHaystack[0]&0xc0)==0x80 ); + } while (isText && (zHaystack[0] & 0xc0) == 0x80); } - if( nNeedle>nHaystack ) N = 0; + if (nNeedle > nHaystack) + N = 0; } sqlite3_result_int(context, N); endInstr: @@ -122662,27 +121315,22 @@ static void instrFunc( /* ** Implementation of the printf() (a.k.a. format()) SQL function. */ -static void printfFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ +static void printfFunc(sqlite3_context* context, int argc, sqlite3_value** argv) { PrintfArguments x; StrAccum str; - const char *zFormat; + const char* zFormat; int n; - sqlite3 *db = sqlite3_context_db_handle(context); + sqlite3* db = sqlite3_context_db_handle(context); - if( argc>=1 && (zFormat = (const char*)sqlite3_value_text(argv[0]))!=0 ){ - x.nArg = argc-1; + if (argc >= 1 && (zFormat = (const char*)sqlite3_value_text(argv[0])) != 0) { + x.nArg = argc - 1; x.nUsed = 0; - x.apArg = argv+1; + 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); + sqlite3_result_text(context, sqlite3StrAccumFinish(&str), n, SQLITE_DYNAMIC); } } @@ -122698,37 +121346,33 @@ static void printfFunc( ** ** 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; +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) - ){ + 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 ){ + 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{ + if (z == 0) + return; + assert(len == sqlite3_value_bytes(argv[0])); + } else { z = sqlite3_value_text(argv[0]); - if( z==0 ) return; + if (z == 0) + return; len = 0; - if( p1<0 ){ - for(z2=z; *z2; len++){ + if (p1 < 0) { + for (z2 = z; *z2; len++) { SQLITE_SKIP_UTF8(z2); } } @@ -122739,51 +121383,53 @@ static void substrFunc( ** 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; /* */ + if (p1 == 0) + p1 = 1; /* */ #endif - if( argc==3 ){ + if (argc == 3) { p2 = sqlite3_value_int(argv[2]); - if( p2<0 ){ + if (p2 < 0) { p2 = -p2; negP2 = 1; } - }else{ + } else { p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH]; } - if( p1<0 ){ + if (p1 < 0) { p1 += len; - if( p1<0 ){ + if (p1 < 0) { p2 += p1; - if( p2<0 ) p2 = 0; + if (p2 < 0) + p2 = 0; p1 = 0; } - }else if( p1>0 ){ + } else if (p1 > 0) { p1--; - }else if( p2>0 ){ + } else if (p2 > 0) { p2--; } - if( negP2 ){ + if (negP2) { p1 -= p2; - if( p1<0 ){ + if (p1 < 0) { p2 += p1; p1 = 0; } } - assert( p1>=0 && p2>=0 ); - if( p0type!=SQLITE_BLOB ){ - while( *z && p1 ){ + assert(p1 >= 0 && p2 >= 0); + if (p0type != SQLITE_BLOB) { + while (*z && p1) { SQLITE_SKIP_UTF8(z); p1--; } - for(z2=z; *z2 && p2; p2--){ + 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_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); } @@ -122793,30 +121439,34 @@ static void substrFunc( ** Implementation of the round() function */ #ifndef SQLITE_OMIT_FLOATING_POINT -static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ +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; + 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 (n > 30) + n = 30; + if (n < 0) + n = 0; } - if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + 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 ){ + 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 ){ + } 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; } @@ -122834,18 +121484,18 @@ static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ ** 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] ){ +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{ + } else { z = sqlite3Malloc(nByte); - if( !z ){ + if (!z) { sqlite3_result_error_nomem(context); } } @@ -122855,38 +121505,38 @@ static void *contextMalloc(sqlite3_context *context, i64 nByte){ /* ** Implementation of the upper() and lower() SQL functions. */ -static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ - char *z1; - const char *z2; +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 "*" */ +static int patternCompare(const u8* zPattern, /* The glob pattern */ + const u8* zString, /* The string to compare against the glob */ + const struct compareInfo* pInfo, /* Information about how to do the compare */ + u32 matchOther /* The escape char (LIKE) or '[' (GLOB) */ +) { + u32 c, c2; /* Next pattern and input string chars */ + u32 matchOne = pInfo->matchOne; /* "?" 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 ){ + 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 ){ + 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{ + 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; + 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; @@ -123130,89 +121760,99 @@ static int patternCompare( ** c but in the other case and search the input string for either ** c or cx. */ - if( c<=0x80 ){ + if (c <= 0x80) { char zStop[3]; int bMatch; - if( noCase ){ + if (noCase) { zStop[0] = sqlite3Toupper(c); zStop[1] = sqlite3Tolower(c); zStop[2] = 0; - }else{ + } else { zStop[0] = c; zStop[1] = 0; } - while(1){ + while (1) { zString += strcspn((const char*)zString, zStop); - if( zString[0]==0 ) break; + if (zString[0] == 0) + break; zString++; - bMatch = patternCompare(zPattern,zString,pInfo,matchOther); - if( bMatch!=SQLITE_NOMATCH ) return bMatch; + bMatch = patternCompare(zPattern, zString, pInfo, matchOther); + if (bMatch != SQLITE_NOMATCH) + return bMatch; } - }else{ + } else { int bMatch; - while( (c2 = Utf8Read(zString))!=0 ){ - if( c2!=c ) continue; - bMatch = patternCompare(zPattern,zString,pInfo,matchOther); - if( bMatch!=SQLITE_NOMATCH ) return 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 ){ + if (c == matchOther) { + if (pInfo->matchSet == 0) { c = sqlite3Utf8Read(&zPattern); - if( c==0 ) return SQLITE_NOMATCH; + if (c == 0) + return SQLITE_NOMATCH; zEscaped = zPattern; - }else{ + } else { u32 prior_c = 0; int seen = 0; int invert = 0; c = sqlite3Utf8Read(&zString); - if( c==0 ) return SQLITE_NOMATCH; + if (c == 0) + return SQLITE_NOMATCH; c2 = sqlite3Utf8Read(&zPattern); - if( c2=='^' ){ + if (c2 == '^') { invert = 1; c2 = sqlite3Utf8Read(&zPattern); } - if( c2==']' ){ - if( c==']' ) seen = 1; + if (c2 == ']') { + if (c == ']') + seen = 1; c2 = sqlite3Utf8Read(&zPattern); } - while( c2 && c2!=']' ){ - if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){ + while (c2 && c2 != ']') { + if (c2 == '-' && zPattern[0] != ']' && zPattern[0] != 0 && prior_c > 0) { c2 = sqlite3Utf8Read(&zPattern); - if( c>=prior_c && c<=c2 ) seen = 1; + if (c >= prior_c && c <= c2) + seen = 1; prior_c = 0; - }else{ - if( c==c2 ){ + } else { + if (c == c2) { seen = 1; } prior_c = c2; } c2 = sqlite3Utf8Read(&zPattern); } - if( c2==0 || (seen ^ invert)==0 ){ + 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 ){ + if (c == c2) + continue; + if (noCase && sqlite3Tolower(c) == sqlite3Tolower(c2) && c < 0x80 && c2 < 0x80) { continue; } - if( c==matchOne && zPattern!=zEscaped && c2!=0 ) continue; + if (c == matchOne && zPattern != zEscaped && c2 != 0) + continue; return SQLITE_NOMATCH; } - return *zString==0 ? SQLITE_MATCH : 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){ +SQLITE_API int sqlite3_strglob(const char* zGlobPattern, const char* zString) { return patternCompare((u8*)zGlobPattern, (u8*)zString, &globInfo, '['); } @@ -123220,7 +121860,7 @@ SQLITE_API int sqlite3_strglob(const char *zGlobPattern, const char *zString){ ** 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){ +SQLITE_API int sqlite3_strlike(const char* zPattern, const char* zStr, unsigned int esc) { return patternCompare((u8*)zPattern, (u8*)zStr, &likeInfoNorm, esc); } @@ -123233,7 +121873,6 @@ SQLITE_API int sqlite3_strlike(const char *zPattern, const char *zStr, unsigned 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 @@ -123246,22 +121885,16 @@ SQLITE_API int sqlite3_like_count = 0; ** This same function (with a different compareInfo structure) computes ** the GLOB operator. */ -static void likeFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ +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); + 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 - ){ + if (sqlite3_value_type(argv[0]) == SQLITE_BLOB || sqlite3_value_type(argv[1]) == SQLITE_BLOB) { #ifdef SQLITE_TEST sqlite3_like_count++; #endif @@ -123274,41 +121907,42 @@ static void likeFunc( ** 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] ){ + 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 ){ + 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); + 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 ){ + 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; + if (escape == pInfo->matchAll) + pInfo->matchAll = 0; + if (escape == pInfo->matchOne) + pInfo->matchOne = 0; } - }else{ + } else { escape = pInfo->matchSet; } zB = sqlite3_value_text(argv[0]); zA = sqlite3_value_text(argv[1]); - if( zA && zB ){ + if (zA && zB) { #ifdef SQLITE_TEST sqlite3_like_count++; #endif - sqlite3_result_int(context, - patternCompare(zB, zA, pInfo, escape)==SQLITE_MATCH); + sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape) == SQLITE_MATCH); } } @@ -123317,14 +121951,10 @@ static void likeFunc( ** 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); +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 ){ + if (sqlite3MemCompare(argv[0], argv[1], pColl) != 0) { sqlite3_result_value(context, argv[0]); } } @@ -123333,11 +121963,7 @@ static void nullifFunc( ** 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 -){ +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. */ @@ -123349,11 +121975,7 @@ static void versionFunc( ** that identifies the particular version of the source code used to build ** SQLite. */ -static void sourceidFunc( - sqlite3_context *context, - int NotUsed, - sqlite3_value **NotUsed2 -){ +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. */ @@ -123365,11 +121987,7 @@ static void sourceidFunc( ** 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 -){ +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])); @@ -123381,19 +121999,15 @@ static void errlogFunc( ** 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 ); +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 ){ + if ((zOptName = (const char*)sqlite3_value_text(argv[0])) != 0) { sqlite3_result_int(context, sqlite3_compileoption_used(zOptName)); } } @@ -123405,13 +122019,9 @@ static void compileoptionusedFunc( ** used to build SQLite. */ #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS -static void compileoptiongetFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ +static void compileoptiongetFunc(sqlite3_context* context, int argc, sqlite3_value** argv) { int n; - assert( argc==1 ); + 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. @@ -123423,31 +122033,28 @@ static void compileoptiongetFunc( /* 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' -}; +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){ +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 ); + assert(pStr != 0 && pStr->nChar == 0); - switch( sqlite3_value_type(pValue) ){ + switch (sqlite3_value_type(pValue)) { case SQLITE_FLOAT: { double r1, r2; - const char *zVal; + const char* zVal; r1 = sqlite3_value_double(pValue); sqlite3_str_appendf(pStr, "%!.15g", r1); zVal = sqlite3_str_value(pStr); - if( zVal ){ + if (zVal) { sqlite3AtoF(zVal, &r2, pStr->nChar, SQLITE_UTF8); - if( r1!=r2 ){ + if (r1 != r2) { sqlite3_str_reset(pStr); sqlite3_str_appendf(pStr, "%!.20e", r1); } @@ -123459,32 +122066,32 @@ SQLITE_PRIVATE void sqlite3QuoteValue(StrAccum *pStr, sqlite3_value *pValue){ break; } case SQLITE_BLOB: { - char const *zBlob = sqlite3_value_blob(pValue); + 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; + 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]; + for (i = 0; i < nBlob; i++) { + zText[(i * 2) + 2] = hexdigits[(zBlob[i] >> 4) & 0x0F]; + zText[(i * 2) + 3] = hexdigits[(zBlob[i]) & 0x0F]; } - zText[(nBlob*2)+2] = '\''; - zText[(nBlob*2)+3] = '\0'; + zText[(nBlob * 2) + 2] = '\''; + zText[(nBlob * 2) + 3] = '\0'; zText[0] = 'X'; zText[1] = '\''; - pStr->nChar = nBlob*2 + 3; + pStr->nChar = nBlob * 2 + 3; } break; } case SQLITE_TEXT: { - const unsigned char *zArg = sqlite3_value_text(pValue); + const unsigned char* zArg = sqlite3_value_text(pValue); sqlite3_str_appendf(pStr, "%Q", zArg); break; } default: { - assert( sqlite3_value_type(pValue)==SQLITE_NULL ); + assert(sqlite3_value_type(pValue) == SQLITE_NULL); sqlite3_str_append(pStr, "NULL", 4); break; } @@ -123501,16 +122108,15 @@ SQLITE_PRIVATE void sqlite3QuoteValue(StrAccum *pStr, sqlite3_value *pValue){ ** 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){ +static void quoteFunc(sqlite3_context* context, int argc, sqlite3_value** argv) { sqlite3_str str; - sqlite3 *db = sqlite3_context_db_handle(context); - assert( argc==1 ); + 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 ){ + 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); } @@ -123520,14 +122126,11 @@ static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ ** 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]); +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)); + if (z && z[0]) + sqlite3_result_int(context, sqlite3Utf8Read(&z)); } /* @@ -123535,88 +122138,78 @@ static void unicodeFunc( ** 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 -){ +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 ){ + zOut = z = sqlite3_malloc64(argc * 4 + 1); + if (z == 0) { sqlite3_result_error_nomem(context); return; } - for(i=0; i0x10ffff ) x = 0xfffd; + if (x < 0 || x > 0x10ffff) + x = 0xfffd; c = (unsigned)(x & 0x1fffff); - if( c<0x00080 ){ - *zOut++ = (u8)(c&0xFF); - }else if( c<0x00800 ){ - *zOut++ = 0xC0 + (u8)((c>>6)&0x1F); + 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); + } 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); + } 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); + 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 -){ +static void hexFunc(sqlite3_context* context, int argc, sqlite3_value** argv) { int i, n; - const unsigned char *pBlob; + const unsigned char* pBlob; char *zHex, *z; - assert( argc==1 ); + 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++) = hexdigits[(c >> 4) & 0xf]; + *(z++) = hexdigits[c & 0xf]; } *z = 0; - sqlite3_result_text(context, zHex, n*2, sqlite3_free); + 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 -){ +static void zeroblobFunc(sqlite3_context* context, int argc, sqlite3_value** argv) { i64 n; int rc; - assert( argc==1 ); + assert(argc == 1); UNUSED_PARAMETER(argc); n = sqlite3_value_int64(argv[0]); - if( n<0 ) n = 0; + if (n < 0) + n = 0; rc = sqlite3_result_zeroblob64(context, n); /* IMP: R-00293-64994 */ - if( rc ){ + if (rc) { sqlite3_result_error_code(context, rc); } } @@ -123627,76 +122220,73 @@ static void zeroblobFunc( ** 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 ); +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; + if (zStr == 0) + return; nStr = sqlite3_value_bytes(argv[0]); - assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */ + 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 ); + 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 ); + 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 */ + assert(zPattern == sqlite3_value_text(argv[1])); /* No encoding change */ zRep = sqlite3_value_text(argv[2]); - if( zRep==0 ) return; + if (zRep == 0) + return; nRep = sqlite3_value_bytes(argv[2]); - assert( zRep==sqlite3_value_text(argv[2]) ); + assert(zRep == sqlite3_value_text(argv[2])); nOut = nStr + 1; - assert( nOutnPattern ){ + } else { + if (nRep > nPattern) { 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] ){ + 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 ){ + 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; + u8* zOld; zOld = zOut; zOut = sqlite3Realloc(zOut, (int)nOut + (nOut - nStr - 1)); - if( zOut==0 ){ + if (zOut == 0) { sqlite3_result_error_nomem(context); sqlite3_free(zOld); return; @@ -123705,13 +122295,13 @@ static void replaceFunc( } memcpy(&zOut[j], zRep, nRep); j += nRep; - i += nPattern-1; + i += nPattern - 1; } } - assert( j+nStr-i+1<=nOut ); - memcpy(&zOut[j], &zStr[i], nStr-i); + assert(j + nStr - i + 1 <= nOut); + memcpy(&zOut[j], &zStr[i], nStr - i); j += nStr - i; - assert( j<=nOut ); + assert(j <= nOut); zOut[j] = 0; sqlite3_result_text(context, (char*)zOut, j, sqlite3_free); } @@ -123720,88 +122310,87 @@ static void replaceFunc( ** 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 ){ +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; + 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*)" " }; + 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; + azChar = (unsigned char**)azOne; zCharSet = 0; - }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){ + } else if ((zCharSet = sqlite3_value_text(argv[1])) == 0) { return; - }else{ - const unsigned char *z; - for(z=zCharSet, nChar=0; *z; nChar++){ + } 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 ){ + 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; + 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 ){ + if (nChar > 0) { flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context)); - if( flags & 1 ){ - while( nIn>0 ){ + if (flags & 1) { + while (nIn > 0) { unsigned int len = 0; - for(i=0; i=nChar ) break; + if (i >= nChar) + break; zIn += len; nIn -= len; } } - if( flags & 2 ){ - while( nIn>0 ){ + if (flags & 2) { + while (nIn > 0) { unsigned int len = 0; - for(i=0; i=nChar ) break; + if (i >= nChar) + break; nIn -= len; } } - if( zCharSet ){ + 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 @@ -123812,16 +122401,11 @@ static void trimFunc( ** involving application-defined functions to be examined in a generic ** sqlite3 shell. */ -static void unknownFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ +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. @@ -123833,48 +122417,41 @@ static void unknownFunc( ** 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 -){ +static void soundexFunc(sqlite3_context* context, int argc, sqlite3_value** argv) { char zResult[8]; - const u8 *zIn; + 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, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 ); + 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]; + 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 ){ + 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{ + } else { prevcode = 0; } } - while( j<4 ){ + while (j < 4) { zResult[j++] = '0'; } zResult[j] = 0; sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT); - }else{ + } 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); @@ -123886,44 +122463,43 @@ static void soundexFunc( /* ** 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; +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 ){ + 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{ + if (argc == 2) { + zProc = (const char*)sqlite3_value_text(argv[1]); + } else { zProc = 0; } - if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){ + 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 */ + 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 */ }; /* @@ -123936,75 +122512,75 @@ struct SumCtx { ** 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; +static void sumStep(sqlite3_context* context, int argc, sqlite3_value** argv) { + SumCtx* p; int type; - assert( argc==1 ); + 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 ){ + if (p && type != SQLITE_NULL) { p->cnt++; - if( type==SQLITE_INTEGER ){ + if (type == SQLITE_INTEGER) { i64 v = sqlite3_value_int64(argv[0]); p->rSum += v; - if( (p->approx|p->overflow)==0 && sqlite3AddInt64(&p->iSum, v) ){ + if ((p->approx | p->overflow) == 0 && sqlite3AddInt64(&p->iSum, v)) { p->approx = p->overflow = 1; } - }else{ + } 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; +static void sumInverse(sqlite3_context* context, int argc, sqlite3_value** argv) { + SumCtx* p; int type; - assert( argc==1 ); + 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 ); + 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 ){ + 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{ + } else { p->rSum -= sqlite3_value_double(argv[0]); } } } #else -# define sumInverse 0 +#define sumInverse 0 #endif /* SQLITE_OMIT_WINDOWFUNC */ -static void sumFinalize(sqlite3_context *context){ - SumCtx *p; +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 ){ + 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{ + } else { sqlite3_result_int64(context, p->iSum); } } } -static void avgFinalize(sqlite3_context *context){ - SumCtx *p; +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); + if (p && p->cnt > 0) { + sqlite3_result_double(context, p->rSum / (double)p->cnt); } } -static void totalFinalize(sqlite3_context *context){ - SumCtx *p; +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); @@ -124018,17 +122594,17 @@ typedef struct CountCtx CountCtx; struct CountCtx { i64 n; #ifdef SQLITE_DEBUG - int bInverse; /* True if xInverse() ever called */ + 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; +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 ){ + if ((argc == 0 || SQLITE_NULL != sqlite3_value_type(argv[0])) && p) { p->n++; } @@ -124037,21 +122613,20 @@ static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){ ** 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) ); + 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; +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; +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) ){ + if ((argc == 0 || SQLITE_NULL != sqlite3_value_type(argv[0])) && ALWAYS(p)) { p->n--; #ifdef SQLITE_DEBUG p->bInverse = 1; @@ -124059,30 +122634,28 @@ static void countInverse(sqlite3_context *ctx, int argc, sqlite3_value **argv){ } } #else -# define countInverse 0 +#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; +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; + 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 ){ + if (sqlite3_value_type(pArg) == SQLITE_NULL) { + if (pBest->flags) + sqlite3SkipAccumulatorLoad(context); + } else if (pBest->flags) { int max; int cmp; - CollSeq *pColl = sqlite3GetFuncCollSeq(context); + 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 @@ -124091,36 +122664,37 @@ static void minmaxStep( ** Therefore the next statement sets variable 'max' to 1 for the max() ** aggregate, or 0 for min(). */ - max = sqlite3_user_data(context)!=0; + max = sqlite3_user_data(context) != 0; cmp = sqlite3MemCompare(pBest, pArg, pColl); - if( (max && cmp<0) || (!max && cmp>0) ){ + if ((max && cmp < 0) || (!max && cmp > 0)) { sqlite3VdbeMemCopy(pBest, pArg); - }else{ + } else { sqlite3SkipAccumulatorLoad(context); } - }else{ + } 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 ){ +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); + if (bValue == 0) + sqlite3VdbeMemRelease(pRes); } } #ifndef SQLITE_OMIT_WINDOWFUNC -static void minMaxValue(sqlite3_context *context){ +static void minMaxValue(sqlite3_context* context) { minMaxValueFinalize(context, 1); } #else -# define minMaxValue 0 +#define minMaxValue 0 #endif /* SQLITE_OMIT_WINDOWFUNC */ -static void minMaxFinalize(sqlite3_context *context){ +static void minMaxFinalize(sqlite3_context* context) { minMaxValueFinalize(context, 0); } @@ -124134,127 +122708,122 @@ static void minMaxFinalize(sqlite3_context *context){ ** around for so long that we dare not, for fear of breaking something. */ typedef struct { - StrAccum str; /* The accumulated concatenation */ + StrAccum str; /* The accumulated concatenation */ #ifndef SQLITE_OMIT_WINDOWFUNC - int nAccum; /* Number of strings presently concatenated */ - int nFirstSepLength; /* Used to detect separator length change */ + 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; + int* pnSepLengths; #endif } GroupConcatCtx; -static void groupConcatStep( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - const char *zVal; - GroupConcatCtx *pGCC; - const char *zSep; +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; + 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; + 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 ){ + if (argc == 1) { + if (!firstTerm) { sqlite3_str_appendchar(&pGCC->str, 1, ','); } #ifndef SQLITE_OMIT_WINDOWFUNC - else{ + else { pGCC->nFirstSepLength = 1; } #endif - }else if( !firstTerm ){ + } else if (!firstTerm) { zSep = (char*)sqlite3_value_text(argv[1]); nSep = sqlite3_value_bytes(argv[1]); - if( zSep ){ + if (zSep) { sqlite3_str_append(&pGCC->str, zSep, nSep); } #ifndef SQLITE_OMIT_WINDOWFUNC - else{ + else { nSep = 0; } - if( nSep != pGCC->nFirstSepLength || pGCC->pnSepLengths != 0 ){ - int *pnsl = pGCC->pnSepLengths; - if( pnsl == 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; + pnsl = (int*)sqlite3_malloc64((pGCC->nAccum + 1) * sizeof(int)); + if (pnsl != 0) { + int i = 0, nA = pGCC->nAccum - 1; + while (i < nA) + pnsl[i++] = pGCC->nFirstSepLength; } - }else{ + } else { pnsl = (int*)sqlite3_realloc64(pnsl, pGCC->nAccum * sizeof(int)); } - if( pnsl!=0 ){ - if( ALWAYS(pGCC->nAccum>0) ){ - pnsl[pGCC->nAccum-1] = nSep; + if (pnsl != 0) { + if (ALWAYS(pGCC->nAccum > 0)) { + pnsl[pGCC->nAccum - 1] = nSep; } pGCC->pnSepLengths = pnsl; - }else{ + } else { sqlite3StrAccumSetError(&pGCC->str, SQLITE_NOMEM); } } #endif } #ifndef SQLITE_OMIT_WINDOWFUNC - else{ + 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); + 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; +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) ){ + 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 ){ + if (pGCC->pnSepLengths != 0) { assert(pGCC->nAccum >= 0); - if( pGCC->nAccum>0 ){ + if (pGCC->nAccum > 0) { nVS += *pGCC->pnSepLengths; - memmove(pGCC->pnSepLengths, pGCC->pnSepLengths+1, - (pGCC->nAccum-1)*sizeof(int)); + memmove(pGCC->pnSepLengths, pGCC->pnSepLengths + 1, (pGCC->nAccum - 1) * sizeof(int)); } - }else{ + } else { /* If removing single accumulated string, harmlessly over-do. */ nVS += pGCC->nFirstSepLength; } - if( nVS>=(int)pGCC->str.nChar ){ + if (nVS >= (int)pGCC->str.nChar) { pGCC->str.nChar = 0; - }else{ + } else { pGCC->str.nChar -= nVS; memmove(pGCC->str.zText, &pGCC->str.zText[nVS], pGCC->str.nChar); } - if( pGCC->str.nChar==0 ){ + if (pGCC->str.nChar == 0) { pGCC->str.mxAlloc = 0; sqlite3_free(pGCC->pnSepLengths); pGCC->pnSepLengths = 0; @@ -124262,12 +122831,11 @@ static void groupConcatInverse( } } #else -# define groupConcatInverse 0 +#define groupConcatInverse 0 #endif /* SQLITE_OMIT_WINDOWFUNC */ -static void groupConcatFinalize(sqlite3_context *context){ - GroupConcatCtx *pGCC - = (GroupConcatCtx*)sqlite3_aggregate_context(context, 0); - if( pGCC ){ +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); @@ -124275,23 +122843,22 @@ static void groupConcatFinalize(sqlite3_context *context){ } } #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 ){ +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 ){ + } else if (pAccum->accError == SQLITE_NOMEM) { sqlite3_result_error_nomem(context); - }else{ - const char *zText = sqlite3_str_value(pAccum); + } else { + const char* zText = sqlite3_str_value(pAccum); sqlite3_result_text(context, zText, pAccum->nChar, SQLITE_TRANSIENT); } } } #else -# define groupConcatValue 0 +#define groupConcatValue 0 #endif /* SQLITE_OMIT_WINDOWFUNC */ /* @@ -124299,10 +122866,10 @@ static void groupConcatValue(sqlite3_context *context){ ** 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){ +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 ){ + assert(rc == SQLITE_NOMEM || rc == SQLITE_OK); + if (rc == SQLITE_NOMEM) { sqlite3OomFault(db); } } @@ -124312,13 +122879,13 @@ SQLITE_PRIVATE void sqlite3RegisterPerConnectionBuiltinFunctions(sqlite3 *db){ ** parameter determines whether or not the LIKE operator is case ** sensitive. */ -SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){ - struct compareInfo *pInfo; +SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3* db, int caseSensitive) { + struct compareInfo* pInfo; int flags; - if( caseSensitive ){ + if (caseSensitive) { pInfo = (struct compareInfo*)&likeInfoAlt; flags = SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE; - }else{ + } else { pInfo = (struct compareInfo*)&likeInfoNorm; flags = SQLITE_FUNC_LIKE; } @@ -124345,22 +122912,23 @@ SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive) ** 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; +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 ){ + 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) ); + 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; + if (pDef == 0) + return 0; #endif - if( NEVER(pDef==0) || (pDef->funcFlags & SQLITE_FUNC_LIKE)==0 ){ + if (NEVER(pDef == 0) || (pDef->funcFlags & SQLITE_FUNC_LIKE) == 0) { return 0; } @@ -124369,42 +122937,45 @@ SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocas ** 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 ); + assert((char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll); + assert(&((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne); + assert(&((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet); - if( nExpr<3 ){ + 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) ); + } 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; + 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; + *pIsNocase = (pDef->funcFlags & SQLITE_FUNC_CASE) == 0; return 1; } /* Mathematical Constants */ #ifndef M_PI -# define M_PI 3.141592653589793238462643383279502884 +#define M_PI 3.141592653589793238462643383279502884 #endif #ifndef M_LN10 -# define M_LN10 2.302585092994045684017991454684364208 +#define M_LN10 2.302585092994045684017991454684364208 #endif #ifndef M_LN2 -# define M_LN2 0.693147180559945309417232121458176568 +#define M_LN2 0.693147180559945309417232121458176568 #endif - /* Extra math functions that require linking with -lm -*/ + */ #ifdef SQLITE_ENABLE_MATH_FUNCTIONS /* ** Implementation SQL functions: @@ -124416,24 +122987,20 @@ SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocas ** 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]) ){ +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; + 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; + double (*x)(double) = (double (*)(double))sqlite3_user_data(context); + sqlite3_result_double(context, x(sqlite3_value_double(argv[0]))); + break; } default: { - break; + break; } } } @@ -124443,8 +123010,12 @@ static void ceilingFunc( ** 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); } +static double xCeil(double x) { + return ceil(x); +} +static double xFloor(double x) { + return floor(x); +} /* ** Implementation of SQL functions: @@ -124454,38 +123025,37 @@ static double xFloor(double x){ return floor(x); } ** log10(X) - log X base 10 ** log(B,X) - log X base B */ -static void logFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ +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]) ){ + 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; + if (x <= 0.0) + return; break; default: return; } - if( argc==2 ){ - switch( sqlite3_value_numeric_type(argv[0]) ){ + if (argc == 2) { + switch (sqlite3_value_numeric_type(argv[0])) { case SQLITE_INTEGER: case SQLITE_FLOAT: b = log(x); - if( b<=0.0 ) return; + if (b <= 0.0) + return; x = sqlite3_value_double(argv[1]); - if( x<=0.0 ) return; + if (x <= 0.0) + return; break; - default: + default: return; } - ans = log(x)/b; - }else{ + ans = log(x) / b; + } else { ans = log(x); - switch( SQLITE_PTR_TO_INT(sqlite3_user_data(context)) ){ + switch (SQLITE_PTR_TO_INT(sqlite3_user_data(context))) { case 1: /* Convert from natural logarithm to log base 10 */ ans /= M_LN10; @@ -124504,27 +123074,28 @@ static void logFunc( /* ** 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); } +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 -){ +static void math1Func(sqlite3_context* context, int argc, sqlite3_value** argv) { int type0; double v0, ans; double (*x)(double); - assert( argc==1 ); + assert(argc == 1); type0 = sqlite3_value_numeric_type(argv[0]); - if( type0!=SQLITE_INTEGER && type0!=SQLITE_FLOAT ) return; + if (type0 != SQLITE_INTEGER && type0 != SQLITE_FLOAT) + return; v0 = sqlite3_value_double(argv[0]); - x = (double(*)(double))sqlite3_user_data(context); + x = (double (*)(double))sqlite3_user_data(context); ans = x(v0); sqlite3_result_double(context, ans); } @@ -124534,22 +123105,20 @@ static void math1Func( ** ** power(X,Y) - Compute X to the Y-th power */ -static void math2Func( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ +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 ); + double (*x)(double, double); + assert(argc == 2); type0 = sqlite3_value_numeric_type(argv[0]); - if( type0!=SQLITE_INTEGER && type0!=SQLITE_FLOAT ) return; + if (type0 != SQLITE_INTEGER && type0 != SQLITE_FLOAT) + return; type1 = sqlite3_value_numeric_type(argv[1]); - if( type1!=SQLITE_INTEGER && type1!=SQLITE_FLOAT ) return; + 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); + x = (double (*)(double, double))sqlite3_user_data(context); ans = x(v0, v1); sqlite3_result_double(context, ans); } @@ -124557,12 +123126,8 @@ static void math2Func( /* ** Implementation of 0-argument pi() function. */ -static void piFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - assert( argc==0 ); +static void piFunc(sqlite3_context* context, int argc, sqlite3_value** argv) { + assert(argc == 0); sqlite3_result_double(context, M_PI); } @@ -124571,19 +123136,16 @@ static void piFunc( /* ** Implementation of sign(X) function. */ -static void signFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ +static void signFunc(sqlite3_context* context, int argc, sqlite3_value** argv) { int type0; double x; UNUSED_PARAMETER(argc); - assert( argc==1 ); + assert(argc == 1); type0 = sqlite3_value_numeric_type(argv[0]); - if( type0!=SQLITE_INTEGER && type0!=SQLITE_FLOAT ) return; + 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); + sqlite3_result_int(context, x < 0.0 ? -1 : x > 0.0 ? +1 : 0); } /* @@ -124593,7 +123155,7 @@ static void signFunc( ** ** After this routine runs */ -SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ +SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void) { /* ** The following array holds FuncDef structures for all of the functions ** defined in this file. @@ -124607,144 +123169,137 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ 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), + 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 ), + 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 ), + 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 ), + 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 ), + 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), + 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 ), + 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), + 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), + 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), + 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 ), + FUNCTION(unknown, -1, 0, 0, unknownFunc), #endif - FUNCTION(coalesce, 1, 0, 0, 0 ), - FUNCTION(coalesce, 0, 0, 0, 0 ), + 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 ), + 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 ), + 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 ), + 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 ), + 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(); @@ -124754,7 +123309,7 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ sqlite3RegisterJsonFunctions(); sqlite3InsertBuiltinFuncs(aBuiltinFunc, ArraySize(aBuiltinFunc)); -#if 0 /* Enable to print out how the built-in functions are hashed */ +#if 0 /* Enable to print out how the built-in functions are hashed */ { int i; FuncDef *p; @@ -124956,22 +123511,21 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ ** 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 */ +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 ); + 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 @@ -124981,7 +123535,7 @@ SQLITE_PRIVATE int sqlite3FkLocateIndex( ** space for the aiCol array (returned via output parameter *paiCol). ** Non-composite foreign keys do not require the aiCol array. */ - if( nCol==1 ){ + 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 @@ -124989,75 +123543,82 @@ SQLITE_PRIVATE int sqlite3FkLocateIndex( ** 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) ){ + 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; + } 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 ){ + 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 == 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 ){ + if (IsPrimaryKeyIndex(pIdx)) { + if (aiCol) { int i; - for(i=0; iaCol[i].iFrom; + for (i = 0; i < nCol; i++) + aiCol[i] = pFKey->aCol[i].iFrom; } break; } - }else{ + } 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 */ + for (i = 0; i < nCol; i++) { + i16 iCol = pIdx->aiColumn[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 (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; + 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; + for (j = 0; j < nCol; j++) { + if (sqlite3StrICmp(pFKey->aCol[j].zCol, zIdxCol) == 0) { + if (aiCol) + aiCol[i] = pFKey->aCol[j].iFrom; break; } } - if( j==nCol ) break; + if (j == nCol) + break; } - if( i==nCol ) break; /* pIdx is usable */ + 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); + if (!pIdx) { + if (!pParse->disableTriggers) { + sqlite3ErrorMsg(pParse, "foreign key mismatch - \"%w\" referencing \"%w\"", pFKey->pFrom->zName, pFKey->zTo); } sqlite3DbFree(pParse->db, aiCol); return 1; @@ -125093,27 +123654,24 @@ SQLITE_PRIVATE int sqlite3FkLocateIndex( ** 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 */ +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); + 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 @@ -125122,20 +123680,21 @@ static void fkLookupParent( ** 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 ){ + 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); + for (i = 0; i < pFKey->nCol; 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 (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 iMustBeInt; /* Address of MustBeInt instruction */ int regTemp = sqlite3GetTempReg(pParse); /* Invoke MustBeInt to coerce the child key value to an integer (i.e. @@ -125143,8 +123702,7 @@ static void fkLookupParent( ** 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); + sqlite3VdbeAddOp2(v, OP_SCopy, sqlite3TableColumnToStorage(pFKey->pFrom, aiCol[0]) + 1 + regData, regTemp); iMustBeInt = sqlite3VdbeAddOp2(v, OP_MustBeInt, regTemp, 0); VdbeCoverage(v); @@ -125152,27 +123710,27 @@ static void fkLookupParent( ** 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); + 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); + sqlite3VdbeAddOp3(v, OP_NotExists, iCur, 0, regTemp); + VdbeCoverage(v); sqlite3VdbeGoto(v, iOk); - sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2); + sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v) - 2); sqlite3VdbeJumpHere(v, iMustBeInt); sqlite3ReleaseTempReg(pParse, regTemp); - }else{ + } 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); + for (i = 0; i < nCol; i++) { + sqlite3VdbeAddOp2(v, OP_Copy, sqlite3TableColumnToStorage(pFKey->pFrom, aiCol[i]) + 1 + regData, regTemp + i); } /* If the parent table is the same as the child table, and we are about @@ -125185,47 +123743,41 @@ static void fkLookupParent( ** 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 ){ + 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 ){ + for (i = 0; i < nCol; i++) { + int iChild = sqlite3TableColumnToStorage(pFKey->pFrom, 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); + 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); + 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 - ){ + 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 ){ + 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); @@ -125235,7 +123787,6 @@ static void fkLookupParent( sqlite3VdbeAddOp1(v, OP_Close, iCur); } - /* ** Return an Expr object that refers to a memory register corresponding ** to column iCol of table pTab. @@ -125244,27 +123795,27 @@ static void fkLookupParent( ** 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; +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 ){ + if (pExpr) { + if (iCol >= 0 && iCol != pTab->iPKey) { pCol = &pTab->aCol[iCol]; - pExpr->iTable = regBase + sqlite3TableColumnToStorage(pTab,iCol) + 1; + pExpr->iTable = regBase + sqlite3TableColumnToStorage(pTab, iCol) + 1; pExpr->affExpr = pCol->affinity; zColl = sqlite3ColumnColl(pCol); - if( zColl==0 ) zColl = db->pDfltColl->zName; + if (zColl == 0) + zColl = db->pDfltColl->zName; pExpr = sqlite3ExprAddCollateString(pParse, pExpr, zColl); - }else{ + } else { pExpr->iTable = regBase; pExpr->affExpr = SQLITE_AFF_INTEGER; } @@ -125276,15 +123827,14 @@ static Expr *exprTableRegister( ** 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) ); +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; @@ -125320,30 +123870,29 @@ static Expr *exprTableColumn( ** 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 ){ +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); } @@ -125356,17 +123905,17 @@ static void fkScanChildren( ** 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 */ + for (i = 0; i < pFKey->nCol; 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 ); + assert(iCol >= 0); zCol = pFKey->pFrom->aCol[iCol].zCnName; pRight = sqlite3Expr(db, TK_ID, zCol); pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight); @@ -125387,20 +123936,20 @@ static void fkScanChildren( ** 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) ){ + 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{ + } else { Expr *pEq, *pAll = 0; - assert( pIdx!=0 ); - for(i=0; inKeyCol; i++){ + assert(pIdx != 0); + for (i = 0; i < pIdx->nKeyCol; i++) { i16 iCol = pIdx->aiColumn[i]; - assert( iCol>=0 ); + 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); @@ -125420,17 +123969,17 @@ static void fkScanChildren( /* 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 ){ + if (pParse->nErr == 0) { pWInfo = sqlite3WhereBegin(pParse, pSrc, pWhere, 0, 0, 0, 0, 0); sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, nIncr); - if( pWInfo ){ + if (pWInfo) { sqlite3WhereEnd(pWInfo); } } /* Clean up the WHERE clause constructed above. */ sqlite3ExprDelete(db, pWhere); - if( iFkIfZero ){ + if (iFkIfZero) { sqlite3VdbeJumpHereOrPopInst(v, iFkIfZero); } } @@ -125449,8 +123998,8 @@ static void fkScanChildren( ** 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); +SQLITE_PRIVATE FKey* sqlite3FkReferences(Table* pTab) { + return (FKey*)sqlite3HashFind(&pTab->pSchema->fkeyHash, pTab->zName); } /* @@ -125461,9 +124010,9 @@ SQLITE_PRIVATE FKey *sqlite3FkReferences(Table *pTab){ ** 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; +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); @@ -125477,16 +124026,19 @@ static void fkTriggerDelete(sqlite3 *dbMem, Trigger *p){ ** 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; +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; } } } @@ -125508,27 +124060,30 @@ SQLITE_PRIVATE void sqlite3FkClearTriggerCache(sqlite3 *db, int iDb){ ** 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) ){ +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); + Vdbe* v = sqlite3GetVdbe(pParse); - assert( v ); /* VDBE has already been allocated */ - assert( IsOrdinaryTable(pTab) ); - if( sqlite3FkReferences(pTab)==0 ){ + 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; + FKey* p; + for (p = pTab->u.tab.pFKey; p; p = p->pNextFrom) { + if (p->isDeferred || (db->flags & SQLITE_DeferFKs)) + break; } - if( !p ) return; + if (!p) + return; iSkip = sqlite3VdbeMakeLabel(pParse); - sqlite3VdbeAddOp2(v, OP_FkIfZero, 1, iSkip); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_FkIfZero, 1, iSkip); + VdbeCoverage(v); } pParse->disableTriggers = 1; @@ -125544,21 +124099,19 @@ SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTa ** the statement transaction will not be rolled back even if FK ** constraints are violated. */ - if( (db->flags & SQLITE_DeferFKs)==0 ){ + if ((db->flags & SQLITE_DeferFKs) == 0) { sqlite3VdbeVerifyAbortable(v, OE_Abort); - sqlite3VdbeAddOp2(v, OP_FkIfZero, 0, sqlite3VdbeCurrentAddr(v)+2); + sqlite3VdbeAddOp2(v, OP_FkIfZero, 0, sqlite3VdbeCurrentAddr(v) + 2); VdbeCoverage(v); - sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_FOREIGNKEY, - OE_Abort, 0, P4_STATIC, P5_ConstraintFK); + sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_FOREIGNKEY, OE_Abort, 0, P4_STATIC, P5_ConstraintFK); } - if( iSkip ){ + 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 @@ -125571,17 +124124,18 @@ SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTa ** 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 */ -){ +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++){ + for (i = 0; i < p->nCol; i++) { int iChildKey = p->aCol[i].iFrom; - if( aChange[iChildKey]>=0 ) return 1; - if( iChildKey==pTab->iPKey && bChngRowid ) return 1; + if (aChange[iChildKey] >= 0) + return 1; + if (iChildKey == pTab->iPKey && bChngRowid) + return 1; } return 0; } @@ -125598,22 +124152,18 @@ static int fkChildIsModified( ** 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 -){ +static int fkParentIsModified(Table* pTab, FKey* p, int* aChange, int bChngRowid) { int i; - for(i=0; inCol; i++){ - char *zKey = p->aCol[i].zCol; + for (i = 0; i < p->nCol; 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 ){ + for (iKey = 0; iKey < pTab->nCol; 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; } } @@ -125627,13 +124177,11 @@ static int fkParentIsModified( ** 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) - ){ +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; } } @@ -125660,45 +124208,43 @@ static int isSetNullAction(Parse *pParse, FKey *pFKey){ ** 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 */ +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) ); + 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; + 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; + 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 - ){ + if (aChange && sqlite3_stricmp(pTab->zName, pFKey->zTo) != 0 && fkChildIsModified(pTab, pFKey, aChange, bChngRowid) == 0) { continue; } @@ -125706,15 +124252,16 @@ SQLITE_PRIVATE void sqlite3FkCheck( ** 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 ){ + if (pParse->disableTriggers) { pTo = sqlite3FindTable(db, pFKey->zTo, zDb); - }else{ + } 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 (!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. @@ -125722,40 +124269,41 @@ SQLITE_PRIVATE void sqlite3FkCheck( ** 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); + Vdbe* v = sqlite3GetVdbe(pParse); int iJump = sqlite3VdbeCurrentAddr(v) + pFKey->nCol + 1; - for(i=0; inCol; i++){ + for (i = 0; i < pFKey->nCol; i++) { int iFromCol, iReg; iFromCol = pFKey->aCol[i].iFrom; - iReg = sqlite3TableColumnToStorage(pFKey->pFrom,iFromCol) + regOld+1; - sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iJump); VdbeCoverage(v); + 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) ); + assert(pFKey->nCol == 1 || (aiFree && pIdx)); - if( aiFree ){ + if (aiFree) { aiCol = aiFree; - }else{ + } else { iCol = pFKey->aCol[0].iFrom; aiCol = &iCol; } - for(i=0; inCol; i++){ - if( aiCol[i]==pTab->iPKey ){ + for (i = 0; i < pFKey->nCol; i++) { + if (aiCol[i] == pTab->iPKey) { aiCol[i] = -1; } - assert( pIdx==0 || pIdx->aiColumn[i]>=0 ); + 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 ){ + if (db->xAuth) { int rcauth; - char *zCol = pTo->aCol[pIdx ? pIdx->aiColumn[i] : pTo->iPKey].zCnName; + char* zCol = pTo->aCol[pIdx ? pIdx->aiColumn[i] : pTo->iPKey].zCnName; rcauth = sqlite3AuthReadCol(pParse, pTo->zName, zCol, iDb); - bIgnore = (rcauth==SQLITE_IGNORE); + bIgnore = (rcauth == SQLITE_IGNORE); } #endif } @@ -125766,13 +124314,13 @@ SQLITE_PRIVATE void sqlite3FkCheck( sqlite3TableLock(pParse, iDb, pTo->tnum, 0, pTo->zName); pParse->nTab++; - if( regOld!=0 ){ + 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) ){ + 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. ** @@ -125789,45 +124337,44 @@ SQLITE_PRIVATE void sqlite3FkCheck( /* 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; + 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 ){ + 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 ); + 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; + if (sqlite3FkLocateIndex(pParse, pTab, pFKey, &pIdx, &aiCol)) { + if (!isIgnoreErrors || db->mallocFailed) + return; continue; } - assert( aiCol || pFKey->nCol==1 ); + 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; + 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 ){ + if (regNew != 0) { fkScanChildren(pParse, pSrc, pTab, pIdx, pFKey, aiCol, regNew, -1); } - if( regOld!=0 ){ - int eAction = pFKey->aAction[aChange!=0]; + 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 @@ -125846,7 +124393,7 @@ SQLITE_PRIVATE void sqlite3FkCheck( ** 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 ){ + if (!pFKey->isDeferred && eAction != OE_Cascade && eAction != OE_SetNull) { sqlite3MayAbort(pParse); } } @@ -125857,29 +124404,29 @@ SQLITE_PRIVATE void sqlite3FkCheck( } } -#define COLUMN_MASK(x) (((x)>31) ? 0xffffffff : ((u32)1<<(x))) +#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 */ -){ +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; + 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 = pTab->u.tab.pFKey; p; p = p->pNextFrom) { + for (i = 0; i < p->nCol; i++) + mask |= COLUMN_MASK(p->aCol[i].iFrom); } - for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){ - Index *pIdx = 0; + 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 ); + if (pIdx) { + for (i = 0; i < pIdx->nKeyCol; i++) { + assert(pIdx->aiColumn[i] >= 0); mask |= COLUMN_MASK(pIdx->aiColumn[i]); } } @@ -125888,7 +124435,6 @@ SQLITE_PRIVATE u32 sqlite3FkOldmask( 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 @@ -125913,37 +124459,38 @@ SQLITE_PRIVATE u32 sqlite3FkOldmask( ** ** 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 ){ +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{ + } 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; + 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; + 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; + for (p = sqlite3FkReferences(pTab); p; p = p->pNextTo) { + if (fkParentIsModified(pTab, p, aChange, chngRowid)) { + if (p->aAction[1] != OE_None) + return 2; bHaveFK = 1; } } @@ -125981,52 +124528,51 @@ SQLITE_PRIVATE int sqlite3FkRequired( ** 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 */ +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) ){ + 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 */ + 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; i < pFKey->nCol; 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); + assert(iFromCol >= 0); + assert(pIdx != 0 || (pTab->iPKey >= 0 && pTab->iPKey < pTab->nCol)); + 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 @@ -126034,11 +124580,8 @@ static Trigger *fkActionTrigger( ** 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) - ); + 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. @@ -126046,40 +124589,33 @@ static Trigger *fkActionTrigger( ** ** WHEN NOT(old.col1 IS new.col1 AND ... AND old.colN IS new.colN) */ - if( pChanges ){ + 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)) - ); + 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 ); + 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{ + } else { pDflt = sqlite3ColumnExpr(pFKey->pFrom, pCol); } - if( pDflt ){ + if (pDflt) { pNew = sqlite3ExprDup(db, pDflt, 0); - }else{ + } else { pNew = sqlite3ExprAlloc(db, TK_NULL, 0, 0); } - }else{ + } else { pNew = sqlite3ExprAlloc(db, TK_NULL, 0, 0); } pList = sqlite3ExprListAppend(pParse, pList, pNew); @@ -126091,11 +124627,11 @@ static Trigger *fkActionTrigger( zFrom = pFKey->pFrom->zName; nFrom = sqlite3Strlen30(zFrom); - if( action==OE_Restrict ){ + if (action == OE_Restrict) { int iDb = sqlite3SchemaToIndex(db, pTab->pSchema); Token tFrom; Token tDb; - Expr *pRaise; + Expr* pRaise; tFrom.z = zFrom; tFrom.n = nFrom; @@ -126103,35 +124639,30 @@ static Trigger *fkActionTrigger( tDb.n = sqlite3Strlen30(tDb.z); pRaise = sqlite3Expr(db, TK_RAISE, "FOREIGN KEY constraint failed"); - if( pRaise ){ + if (pRaise) { pRaise->affExpr = OE_Abort; } - pSelect = sqlite3SelectNew(pParse, - sqlite3ExprListAppend(pParse, 0, pRaise), - sqlite3SrcListAppend(pParse, 0, &tDb, &tFrom), - pWhere, - 0, 0, 0, 0, 0 - ); + 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 */ + 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); + 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 ){ + if (pWhen) { pWhen = sqlite3PExpr(pParse, TK_NOT, pWhen, 0); pTrigger->pWhen = sqlite3ExprDup(db, pWhen, EXPRDUP_REDUCE); } @@ -126144,25 +124675,23 @@ static Trigger *fkActionTrigger( sqlite3ExprDelete(db, pWhen); sqlite3ExprListDelete(db, pList); sqlite3SelectDelete(db, pSelect); - if( db->mallocFailed==1 ){ + if (db->mallocFailed == 1) { fkTriggerDelete(db, pTrigger); return 0; } - assert( pStep!=0 ); - assert( pTrigger!=0 ); + assert(pStep != 0); + assert(pTrigger != 0); - switch( action ){ + switch (action) { case OE_Restrict: pStep->op = TK_SELECT; break; case OE_Cascade: - if( !pChanges ){ + if (!pChanges) { pStep->op = TK_DELETE; break; } - /* no break */ deliberate_fall_through - default: - pStep->op = TK_UPDATE; + /* no break */ deliberate_fall_through default : pStep->op = TK_UPDATE; } pStep->pTrig = pTrigger; pTrigger->pSchema = pTab->pSchema; @@ -126178,24 +124707,23 @@ static Trigger *fkActionTrigger( ** 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 */ -){ +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 ){ + 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); } } @@ -126210,24 +124738,24 @@ SQLITE_PRIVATE void sqlite3FkActions( ** 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 */ +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) ); + 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 ){ + 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); + } else { + void* p = (void*)pFKey->pNextTo; + const char* z = (p ? pFKey->pNextTo->zTo : pFKey->zTo); sqlite3HashInsert(&pTab->pSchema->fkeyHash, z, p); } - if( pFKey->pNextTo ){ + if (pFKey->pNextTo) { pFKey->pNextTo->pPrevTo = pFKey->pPrevTo; } } @@ -126235,7 +124763,7 @@ SQLITE_PRIVATE void sqlite3FkDelete(sqlite3 *db, Table *pTab){ /* EV: R-30323-21917 Each foreign key constraint in SQLite is ** classified as either immediate or deferred. */ - assert( pFKey->isDeferred==0 || pFKey->isDeferred==1 ); + assert(pFKey->isDeferred == 0 || pFKey->isDeferred == 1); /* Delete any triggers created to implement actions for this FK. */ #ifndef SQLITE_OMIT_TRIGGER @@ -126276,27 +124804,25 @@ SQLITE_PRIVATE void sqlite3FkDelete(sqlite3 *db, Table *pTab){ ** 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 ); +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) ){ + 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 ); + } 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)); @@ -126323,8 +124849,8 @@ SQLITE_PRIVATE void sqlite3OpenTable( ** 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 ){ +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. @@ -126334,26 +124860,28 @@ SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){ ** up. */ int n; - Table *pTab = pIdx->pTable; - pIdx->zColAff = (char *)sqlite3DbMallocRaw(0, pIdx->nColumn+1); - if( !pIdx->zColAff ){ + Table* pTab = pIdx->pTable; + pIdx->zColAff = (char*)sqlite3DbMallocRaw(0, pIdx->nColumn + 1); + if (!pIdx->zColAff) { sqlite3OomFault(db); return 0; } - for(n=0; nnColumn; n++){ + for (n = 0; n < pIdx->nColumn; n++) { i16 x = pIdx->aiColumn[n]; char aff; - if( x>=0 ){ + if (x >= 0) { aff = pTab->aCol[x].affinity; - }else if( x==XN_ROWID ){ + } else if (x == XN_ROWID) { aff = SQLITE_AFF_INTEGER; - }else{ - assert( x==XN_EXPR ); - assert( pIdx->aColExpr!=0 ); + } else { + assert(x == XN_EXPR); + assert(pIdx->aColExpr != 0); aff = sqlite3ExprAffinity(pIdx->aColExpr->a[n].pExpr); } - if( affSQLITE_AFF_NUMERIC) aff = SQLITE_AFF_NUMERIC; + if (aff < SQLITE_AFF_BLOB) + aff = SQLITE_AFF_BLOB; + if (aff > SQLITE_AFF_NUMERIC) + aff = SQLITE_AFF_NUMERIC; pIdx->zColAff[n] = aff; } pIdx->zColAff[n] = 0; @@ -126402,22 +124930,22 @@ SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){ ** 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){ +SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe* v, Table* pTab, int iReg) { int i, j; - char *zColAff; - if( pTab->tabFlags & TF_Strict ){ - if( iReg==0 ){ + 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; + VdbeOp* pPrev; sqlite3VdbeAppendP4(v, pTab, P4_TABLE); pPrev = sqlite3VdbeGetOp(v, -1); - assert( pPrev!=0 ); - assert( pPrev->opcode==OP_MakeRecord || sqlite3VdbeDb(v)->mallocFailed ); + 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{ + } else { /* Insert an isolated OP_Typecheck */ sqlite3VdbeAddOp2(v, OP_TypeCheck, iReg, pTab->nNVCol); sqlite3VdbeAppendP4(v, pTab, P4_TABLE); @@ -126425,33 +124953,32 @@ SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ return; } zColAff = pTab->zColAff; - if( zColAff==0 ){ - sqlite3 *db = sqlite3VdbeDb(v); - zColAff = (char *)sqlite3DbMallocRaw(0, pTab->nCol+1); - if( !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 ){ + for (i = j = 0; i < pTab->nCol; 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{ + do { zColAff[j--] = 0; - }while( j>=0 && zColAff[j]<=SQLITE_AFF_BLOB ); + } while (j >= 0 && zColAff[j] <= SQLITE_AFF_BLOB); pTab->zColAff = zColAff; } - assert( zColAff!=0 ); + assert(zColAff != 0); i = sqlite3Strlen30NN(zColAff); - if( i ){ - if( iReg ){ + if (i) { + if (iReg) { sqlite3VdbeAddOp4(v, OP_Affinity, iReg, i, 0, zColAff, i); - }else{ - assert( sqlite3VdbeGetOp(v, -1)->opcode==OP_MakeRecord - || sqlite3VdbeDb(v)->mallocFailed ); + } else { + assert(sqlite3VdbeGetOp(v, -1)->opcode == OP_MakeRecord || sqlite3VdbeDb(v)->mallocFailed); sqlite3VdbeChangeP4(v, -1, zColAff, i); } } @@ -126463,33 +124990,33 @@ SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ ** 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); +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; + VTable* pVTab = IsVirtual(pTab) ? sqlite3GetVTable(p->db, pTab) : 0; #endif - for(i=1; iopcode==OP_OpenRead && pOp->p3==iDb ){ - Index *pIndex; + for (i = 1; i < iEnd; i++) { + VdbeOp* pOp = sqlite3VdbeGetOp(v, i); + assert(pOp != 0); + if (pOp->opcode == OP_OpenRead && pOp->p3 == iDb) { + Index* pIndex; Pgno tnum = pOp->p2; - if( tnum==pTab->tnum ){ + if (tnum == pTab->tnum) { return 1; } - for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){ - if( tnum==pIndex->tnum ){ + 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 ); + if (pOp->opcode == OP_VOpen && pOp->p4.pVtab == pVTab) { + assert(pOp->p4.pVtab != 0); + assert(pOp->p4type == P4_VTAB); return 1; } #endif @@ -126500,9 +125027,9 @@ static int readsTable(Parse *p, int iDb, Table *pTab){ /* 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 ); +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; @@ -126516,45 +125043,44 @@ static int exprColumnFlagUnion(Walker *pWalker, Expr *pExpr){ ** 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 */ -){ +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; + Column* pRedo; int eProgress; - VdbeOp *pOp; + VdbeOp* pOp; - assert( pTab->tabFlags & TF_HasGenerated ); - testcase( pTab->tabFlags & TF_HasVirtual ); - testcase( pTab->tabFlags & TF_HasStored ); + 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 ){ + 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 ){ + 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 ){ + if (pTab->aCol[ii].colFlags & COLFLAG_STORED) { zP4[jj] = SQLITE_AFF_NONE; } jj++; } - }else if( pOp->opcode==OP_TypeCheck ){ + } 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 */ @@ -126566,10 +125092,10 @@ SQLITE_PRIVATE void sqlite3ComputeGeneratedColumns( ** 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 ); + for (i = 0; i < pTab->nCol; 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; } } @@ -126585,37 +125111,36 @@ SQLITE_PRIVATE void sqlite3ComputeGeneratedColumns( ** they are needed. */ pParse->iSelfTab = -iRegStore; - do{ + do { eProgress = 0; pRedo = 0; - for(i=0; inCol; i++){ - Column *pCol = pTab->aCol + i; - if( (pCol->colFlags & COLFLAG_NOTAVAIL)!=0 ){ + for (i = 0; i < pTab->nCol; 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 ){ + if (w.eCode & COLFLAG_NOTAVAIL) { pRedo = pCol; continue; } eProgress = 1; - assert( pCol->colFlags & COLFLAG_GENERATED ); + assert(pCol->colFlags & COLFLAG_GENERATED); x = sqlite3TableColumnToStorage(pTab, i) + iRegStore; sqlite3ExprCodeGeneratedColumn(pParse, pTab, pCol, x); pCol->colFlags &= ~COLFLAG_NOTAVAIL; } } - }while( pRedo && eProgress ); - if( pRedo ){ + } 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 @@ -126640,47 +125165,43 @@ SQLITE_PRIVATE void sqlite3ComputeGeneratedColumns( ** 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; +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 - ){ + 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 ){ + 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; + 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 */ + 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; } @@ -126691,56 +125212,56 @@ static int autoIncBegin( ** 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 */ +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(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){ + 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; + 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) ); + assert(sqlite3SchemaMutexHeld(db, 0, pDb->pSchema)); sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenRead); - sqlite3VdbeLoadString(v, memId-1, p->pTab->zName); + sqlite3VdbeLoadString(v, memId - 1, p->pTab->zName); aOp = sqlite3VdbeAddOpList(v, ArraySize(autoInc), autoInc, iLn); - if( aOp==0 ) break; + if (aOp == 0) + break; aOp[0].p2 = memId; - aOp[0].p3 = memId+2; + aOp[0].p3 = memId + 2; aOp[2].p3 = memId; - aOp[3].p1 = memId-1; + aOp[3].p1 = memId - 1; aOp[3].p3 = memId; aOp[3].p5 = SQLITE_JUMPIFNULL; - aOp[4].p2 = memId+1; + aOp[4].p2 = memId + 1; aOp[5].p3 = memId; aOp[6].p1 = memId; - aOp[7].p2 = memId+2; + aOp[7].p2 = memId + 2; aOp[7].p1 = memId; aOp[10].p2 = memId; - if( pParse->nTab==0 ) pParse->nTab = 1; + if (pParse->nTab == 0) + pParse->nTab = 1; } } @@ -126752,8 +125273,8 @@ SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse){ ** 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 ){ +static void autoIncStep(Parse* pParse, int memId, int regRowid) { + if (memId > 0) { sqlite3VdbeAddOp2(pParse->pVdbe, OP_MemMax, memId, regRowid); } } @@ -126765,63 +125286,61 @@ static void autoIncStep(Parse *pParse, int memId, int regRowid){ ** 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; +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){ + 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]; + 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); + 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; + 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].p3 = memId + 1; aOp[3].p5 = OPFLAG_APPEND; sqlite3ReleaseTempReg(pParse, iRec); } } -SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse){ - if( pParse->pAinc ) autoIncrementEnd(pParse); +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) +#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 */ +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 */ ); /* @@ -126921,65 +125440,64 @@ static int xferOptimization( ** 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 */ +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 */ + 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 */ + 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 ){ + assert(db->pParse == pParse); + if (pParse->nErr) { goto insert_cleanup; } - assert( db->mallocFailed==0 ); - dest.iSDParm = 0; /* Suppress a harmless compiler warning */ + 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 ){ + if (pSelect && (pSelect->selFlags & SF_Values) != 0 && pSelect->pPrior == 0) { pList = pSelect->pEList; pSelect->pEList = 0; sqlite3SelectDelete(db, pSelect); @@ -126987,16 +125505,15 @@ SQLITE_PRIVATE void sqlite3Insert( } /* Locate the table into which we will be inserting new information. - */ - assert( pTabList->nSrc==1 ); + */ + assert(pTabList->nSrc == 1); pTab = sqlite3SrcListLookup(pParse, pTabList); - if( pTab==0 ){ + 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) ){ + assert(iDb < db->nDb); + if (sqlite3AuthCheck(pParse, SQLITE_INSERT, pTab->zName, 0, db->aDb[iDb].zDbSName)) { goto insert_cleanup; } withoutRowid = !HasRowid(pTab); @@ -127008,42 +125525,43 @@ SQLITE_PRIVATE void sqlite3Insert( pTrigger = sqlite3TriggersExist(pParse, pTab, TK_INSERT, 0, &tmask); isView = IsView(pTab); #else -# define pTrigger 0 -# define tmask 0 -# define isView 0 +#define pTrigger 0 +#define tmask 0 +#define isView 0 #endif #ifdef SQLITE_OMIT_VIEW -# undef isView -# define isView 0 +#undef isView +#define isView 0 #endif - assert( (pTrigger && tmask) || (pTrigger==0 && tmask==0) ); + assert((pTrigger && tmask) || (pTrigger == 0 && tmask == 0)); #if TREETRACE_ENABLED - if( sqlite3TreeTrace & 0x10000 ){ + if (sqlite3TreeTrace & 0x10000) { sqlite3TreeViewLine(0, "In sqlite3Insert() at %s:%d", __FILE__, __LINE__); - sqlite3TreeViewInsert(pParse->pWith, pTabList, pColumn, pSelect, pList, - onError, pUpsert, pTrigger); + 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) ){ + if (sqlite3ViewGetColumnNames(pParse, pTab)) { goto insert_cleanup; } /* Cannot insert into a read-only table. - */ - if( sqlite3IsReadOnly(pParse, pTab, tmask) ){ + */ + 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); + if (v == 0) + goto insert_cleanup; + if (pParse->nested == 0) + sqlite3VdbeCountChanges(v); sqlite3BeginWriteOperation(pParse, pSelect || pTrigger, iDb); #ifndef SQLITE_OMIT_XFER_OPT @@ -127056,13 +125574,9 @@ SQLITE_PRIVATE void sqlite3Insert( ** ** This is the 2nd template. */ - if( pColumn==0 - && pSelect!=0 - && pTrigger==0 - && xferOptimization(pParse, pTab, pSelect, onError, iDb) - ){ - assert( !pTrigger ); - assert( pList==0 ); + 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 */ @@ -127075,13 +125589,13 @@ SQLITE_PRIVATE void sqlite3Insert( /* Allocate a block registers to hold the rowid and the values ** for all columns of the new row. */ - regRowid = regIns = pParse->nMem+1; + regRowid = regIns = pParse->nMem + 1; pParse->nMem += pTab->nCol + 1; - if( IsVirtual(pTab) ){ + if (IsVirtual(pTab)) { regRowid++; pParse->nMem++; } - regData = regRowid+1; + 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 @@ -127102,39 +125616,38 @@ SQLITE_PRIVATE void sqlite3Insert( ** 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 ); + bIdListInOrder = (pTab->tabFlags & (TF_OOOHidden | TF_HasStored)) == 0; + if (pColumn) { + assert(pColumn->eU4 != EU4_EXPR); pColumn->eU4 = EU4_IDX; - for(i=0; inId; i++){ + for (i = 0; i < pColumn->nId; 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 ){ + for (i = 0; i < pColumn->nId; i++) { + for (j = 0; j < pTab->nCol; 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 ); + 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); + 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 ){ + 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); + } else { + sqlite3ErrorMsg(pParse, "table %S has no column named %s", pTabList->a, pColumn->a[i].zName); pParse->checkSchema = 1; goto insert_cleanup; } @@ -127147,12 +125660,12 @@ SQLITE_PRIVATE void sqlite3Insert( ** 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 ){ + 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 */ + 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; @@ -127162,12 +125675,13 @@ SQLITE_PRIVATE void sqlite3Insert( 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 ); + 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 ); + sqlite3VdbeJumpHere(v, addrTop - 1); /* label B: */ + assert(pSelect->pEList); nColumn = pSelect->pEList->nExpr; /* Set useTempTable to TRUE if the result of the SELECT statement @@ -127179,11 +125693,11 @@ SQLITE_PRIVATE void sqlite3Insert( ** 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) ){ + if (pTrigger || readsTable(pParse, iDb, pTab)) { useTempTable = 1; } - if( useTempTable ){ + 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: @@ -127194,15 +125708,16 @@ SQLITE_PRIVATE void sqlite3Insert( ** goto L ** M: ... */ - int regRec; /* Register to hold packed record */ - int regTempRowid; /* Register to hold temp table ROWID */ - int addrL; /* Label "L" */ + 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); + 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); @@ -127211,7 +125726,7 @@ SQLITE_PRIVATE void sqlite3Insert( sqlite3ReleaseTempReg(pParse, regRec); sqlite3ReleaseTempReg(pParse, regTempRowid); } - }else{ + } else { /* This is the case if the data for the INSERT is coming from a ** single-row VALUES clause */ @@ -127219,13 +125734,13 @@ SQLITE_PRIVATE void sqlite3Insert( memset(&sNC, 0, sizeof(sNC)); sNC.pParse = pParse; srcTab = -1; - assert( useTempTable==0 ); - if( pList ){ + assert(useTempTable == 0); + if (pList) { nColumn = pList->nExpr; - if( sqlite3ResolveExprListNames(&sNC, pList) ){ + if (sqlite3ResolveExprListNames(&sNC, pList)) { goto insert_cleanup; } - }else{ + } else { nColumn = 0; } } @@ -127234,16 +125749,16 @@ SQLITE_PRIVATE void sqlite3Insert( ** key, the set the ipkColumn variable to the integer primary key ** column index in the original table definition. */ - if( pColumn==0 && nColumn>0 ){ + 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 ); + 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--; } } @@ -127253,88 +125768,80 @@ SQLITE_PRIVATE void sqlite3Insert( /* 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++; + 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; i < pTab->nCol; 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 (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 ){ + 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 - ){ + */ + 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 ){ + 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 ){ + 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 ); + for (i = 0, pIdx = pTab->pIndex; i < nIdx; pIdx = pIdx->pNext, i++) { + assert(pIdx); aRegIdx[i] = ++pParse->nMem; pParse->nMem += pIdx->nColumn; } - aRegIdx[i] = ++pParse->nMem; /* Register to store the table record */ + 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); + if (pUpsert) { + Upsert* pNx; + if (IsVirtual(pTab)) { + sqlite3ErrorMsg(pParse, "UPSERT not implemented for virtual table \"%s\"", pTab->zName); goto insert_cleanup; } - if( IsView(pTab) ){ + if (IsView(pTab)) { sqlite3ErrorMsg(pParse, "cannot UPSERT a view"); goto insert_cleanup; } - if( sqlite3HasExplicitNulls(pParse, pUpsert->pUpsertTarget) ){ + if (sqlite3HasExplicitNulls(pParse, pUpsert->pUpsertTarget)) { goto insert_cleanup; } pTabList->a[0].iCursor = iDataCur; pNx = pUpsert; - do{ + do { pNx->pUpsertSrc = pTabList; pNx->regData = regData; pNx->iDataCur = iDataCur; pNx->iIdxCur = iIdxCur; - if( pNx->pUpsertTarget ){ - if( sqlite3UpsertAnalyzeTarget(pParse, pTabList, pNx) ){ + if (pNx->pUpsertTarget) { + if (sqlite3UpsertAnalyzeTarget(pParse, pTabList, pNx)) { goto insert_cleanup; } } pNx = pNx->pNextUpsert; - }while( pNx!=0 ); + } while (pNx != 0); } #endif - /* This is the top of the main insertion loop */ - if( useTempTable ){ + if (useTempTable) { /* This block codes the top of loop only. The complete loop is the ** following pseudocode (template 4): ** @@ -127344,9 +125851,10 @@ SQLITE_PRIVATE void sqlite3Insert( ** end loop ** D: ... */ - addrInsTop = sqlite3VdbeAddOp1(v, OP_Rewind, srcTab); VdbeCoverage(v); + addrInsTop = sqlite3VdbeAddOp1(v, OP_Rewind, srcTab); + VdbeCoverage(v); addrCont = sqlite3VdbeCurrentAddr(v); - }else if( pSelect ){ + } else if (pSelect) { /* This block codes the top of loop only. The complete loop is the ** following pseudocode (template 3): ** @@ -127358,11 +125866,11 @@ SQLITE_PRIVATE void sqlite3Insert( sqlite3VdbeReleaseRegisters(pParse, regData, pTab->nCol, 0, 0); addrInsTop = addrCont = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); VdbeCoverage(v); - if( ipkColumn>=0 ){ + 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); + sqlite3VdbeAddOp2(v, OP_Copy, regFromSelect + ipkColumn, regRowid); } } @@ -127374,12 +125882,13 @@ SQLITE_PRIVATE void sqlite3Insert( ** of the rowid. */ nHidden = 0; - iRegStore = regData; assert( regData==regRowid+1 ); - for(i=0; inCol; i++, iRegStore++){ + iRegStore = regData; + assert(regData == regRowid + 1); + for (i = 0; i < pTab->nCol; i++, iRegStore++) { int k; u32 colFlags; - assert( i>=nHidden ); - if( i==pTab->iPKey ){ + 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 @@ -127387,71 +125896,65 @@ SQLITE_PRIVATE void sqlite3Insert( sqlite3VdbeAddOp1(v, OP_SoftNull, iRegStore); continue; } - if( ((colFlags = pTab->aCol[i].colFlags) & COLFLAG_NOINSERT)!=0 ){ + if (((colFlags = pTab->aCol[i].colFlags) & COLFLAG_NOINSERT) != 0) { nHidden++; - if( (colFlags & COLFLAG_VIRTUAL)!=0 ){ + 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 ){ + } 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 ){ + if (tmask & TRIGGER_BEFORE) { sqlite3VdbeAddOp1(v, OP_SoftNull, iRegStore); } continue; - }else if( pColumn==0 ){ + } 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); + 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 ){ + if (pColumn) { + assert(pColumn->eU4 == EU4_IDX); + for (j = 0; j < pColumn->nId && 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); + sqlite3ExprCodeFactorable(pParse, sqlite3ColumnExpr(pTab, &pTab->aCol[i]), iRegStore); continue; } k = j; - }else if( nColumn==0 ){ + } else if (nColumn == 0) { /* This is INSERT INTO ... DEFAULT VALUES. Load the default value. */ - sqlite3ExprCodeFactorable(pParse, - sqlite3ColumnExpr(pTab, &pTab->aCol[i]), - iRegStore); + sqlite3ExprCodeFactorable(pParse, sqlite3ColumnExpr(pTab, &pTab->aCol[i]), iRegStore); continue; - }else{ + } else { k = i - nHidden; } - if( useTempTable ){ + if (useTempTable) { sqlite3VdbeAddOp3(v, OP_Column, srcTab, k, iRegStore); - }else if( pSelect ){ - if( regFromSelect!=regData ){ - sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect+k, iRegStore); + } else if (pSelect) { + if (regFromSelect != regData) { + sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect + k, iRegStore); } - }else{ + } 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); + 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 @@ -127459,36 +125962,38 @@ SQLITE_PRIVATE void sqlite3Insert( ** 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 ){ + if (ipkColumn < 0) { sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols); - }else{ + } else { int addr1; - assert( !withoutRowid ); - if( useTempTable ){ + assert(!withoutRowid); + if (useTempTable) { sqlite3VdbeAddOp3(v, OP_Column, srcTab, ipkColumn, regCols); - }else{ - assert( pSelect==0 ); /* Otherwise useTempTable is true */ + } else { + assert(pSelect == 0); /* Otherwise useTempTable is true */ sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regCols); } - addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regCols); VdbeCoverage(v); + addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regCols); + VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols); sqlite3VdbeJumpHere(v, addr1); - sqlite3VdbeAddOp1(v, OP_MustBeInt, regCols); VdbeCoverage(v); + 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); + 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); + if (pTab->tabFlags & TF_HasGenerated) { + testcase(pTab->tabFlags & TF_HasVirtual); + testcase(pTab->tabFlags & TF_HasStored); + sqlite3ComputeGeneratedColumns(pParse, regCols + 1, pTab); } #endif @@ -127497,55 +126002,57 @@ SQLITE_PRIVATE void sqlite3Insert( ** If this is a real table, attempt conversions as required by the ** table column affinities. */ - if( !isView ){ - sqlite3TableAffinity(v, pTab, regCols+1); + 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); + sqlite3CodeRowTrigger(pParse, pTrigger, TK_INSERT, 0, TRIGGER_BEFORE, pTab, regCols - pTab->nCol - 1, onError, endOfLoop); - sqlite3ReleaseTempRange(pParse, regCols, pTab->nCol+1); + sqlite3ReleaseTempRange(pParse, regCols, pTab->nCol + 1); } - if( !isView ){ - if( IsVirtual(pTab) ){ + if (!isView) { + if (IsVirtual(pTab)) { /* The row that the VUpdate opcode will delete: none */ sqlite3VdbeAddOp2(v, OP_Null, 0, regIns); } - if( ipkColumn>=0 ){ + if (ipkColumn >= 0) { /* Compute the new rowid */ - if( useTempTable ){ + if (useTempTable) { sqlite3VdbeAddOp3(v, OP_Column, srcTab, ipkColumn, regRowid); - }else if( pSelect ){ + } else if (pSelect) { /* Rowid already initialized at tag-20191021-001 */ - }else{ - Expr *pIpk = pList->a[ipkColumn].pExpr; - if( pIpk->op==TK_NULL && !IsVirtual(pTab) ){ + } else { + Expr* pIpk = pList->a[ipkColumn].pExpr; + if (pIpk->op == TK_NULL && !IsVirtual(pTab)) { sqlite3VdbeAddOp3(v, OP_NewRowid, iDataCur, regRowid, regAutoinc); appendFlag = 1; - }else{ + } 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 ){ + if (!appendFlag) { int addr1; - if( !IsVirtual(pTab) ){ - addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regRowid); VdbeCoverage(v); + if (!IsVirtual(pTab)) { + addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regRowid); + VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_NewRowid, iDataCur, regRowid, regAutoinc); sqlite3VdbeJumpHere(v, addr1); - }else{ + } else { addr1 = sqlite3VdbeCurrentAddr(v); - sqlite3VdbeAddOp2(v, OP_IsNull, regRowid, addr1+2); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_IsNull, regRowid, addr1 + 2); + VdbeCoverage(v); } - sqlite3VdbeAddOp1(v, OP_MustBeInt, regRowid); VdbeCoverage(v); + sqlite3VdbeAddOp1(v, OP_MustBeInt, regRowid); + VdbeCoverage(v); } - }else if( IsVirtual(pTab) || withoutRowid ){ + } else if (IsVirtual(pTab) || withoutRowid) { sqlite3VdbeAddOp2(v, OP_Null, 0, regRowid); - }else{ + } else { sqlite3VdbeAddOp3(v, OP_NewRowid, iDataCur, regRowid, regAutoinc); appendFlag = 1; } @@ -127556,8 +126063,8 @@ SQLITE_PRIVATE void sqlite3Insert( ** 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); + if (pTab->tabFlags & TF_HasGenerated) { + sqlite3ComputeGeneratedColumns(pParse, regRowid + 1, pTab); } #endif @@ -127565,20 +126072,19 @@ SQLITE_PRIVATE void sqlite3Insert( ** do the insertion. */ #ifndef SQLITE_OMIT_VIRTUALTABLE - if( IsVirtual(pTab) ){ - const char *pVTab = (const char *)sqlite3GetVTable(db, pTab); + 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); + sqlite3VdbeAddOp4(v, OP_VUpdate, 1, pTab->nCol + 2, regIns, pVTab, P4_VTAB); + sqlite3VdbeChangeP5(v, onError == OE_Default ? OE_Abort : onError); sqlite3MayAbort(pParse); - }else + } 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 - ); + 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 @@ -127589,13 +126095,11 @@ SQLITE_PRIVATE void sqlite3Insert( ** 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 - ); + 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 ){ + } 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. */ @@ -127604,33 +126108,33 @@ SQLITE_PRIVATE void sqlite3Insert( } /* Update the count of rows that are inserted - */ - if( regRowCount ){ + */ + if (regRowCount) { sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1); } - if( pTrigger ){ + if (pTrigger) { /* Code AFTER triggers */ - sqlite3CodeRowTrigger(pParse, pTrigger, TK_INSERT, 0, TRIGGER_AFTER, - pTab, regData-2-pTab->nCol, onError, endOfLoop); + 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); + if (useTempTable) { + sqlite3VdbeAddOp2(v, OP_Next, srcTab, addrCont); + VdbeCoverage(v); sqlite3VdbeJumpHere(v, addrInsTop); sqlite3VdbeAddOp1(v, OP_Close, srcTab); - }else if( pSelect ){ + } 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 ); + if (sqlite3VdbeGetOp(v, addrCont - 1)->opcode == OP_ReleaseReg) { + assert(sqlite3VdbeGetOp(v, addrCont)->opcode == OP_Yield); sqlite3VdbeChangeP5(v, 1); } #endif @@ -127644,7 +126148,7 @@ SQLITE_PRIVATE void sqlite3Insert( ** maximum rowid counter values recorded while inserting into ** autoincrement tables. */ - if( pParse->nested==0 && pParse->pTriggerTab==0 ){ + if (pParse->nested == 0 && pParse->pTriggerTab == 0) { sqlite3AutoincrementEnd(pParse); } @@ -127653,7 +126157,7 @@ SQLITE_PRIVATE void sqlite3Insert( ** generating code because of a call to sqlite3NestedParse(), do not ** invoke the callback function. */ - if( regRowCount ){ + if (regRowCount) { sqlite3CodeChangeCount(v, regRowCount, "rows inserted"); } @@ -127670,35 +126174,35 @@ SQLITE_PRIVATE void sqlite3Insert( ** 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 +#undef isView #endif #ifdef pTrigger - #undef pTrigger +#undef pTrigger #endif #ifdef tmask - #undef 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 */ +#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 ){ + * 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{ + } else { pWalker->eCode |= CKCNSTRNT_ROWID; } } @@ -127720,26 +126224,25 @@ static int checkConstraintExprNode(Walker *pWalker, Expr *pExpr){ ** 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 */ -){ +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 ); + 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; + 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; } /* @@ -127756,15 +126259,15 @@ SQLITE_PRIVATE int sqlite3ExprReferencesUpdatedColumn( 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 */ + 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 */ + 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 */ + struct { /* Use this object for eType==1; Array of IndexListTerm */ + int nIdx; /* Size of the array */ + IndexListTerm* aIdx; /* Array of IndexListTerms */ } ax; } u; }; @@ -127773,33 +126276,33 @@ struct IndexIterator { ** of the following object */ struct IndexListTerm { - Index *p; /* The index */ - int ix; /* Which entry in the original Table.pIndex list is this index*/ + 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 ){ +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{ + } 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 ){ +static Index* indexIteratorNext(IndexIterator* pIter, int* pIx) { + if (pIter->eType) { int i = ++pIter->i; - if( i>=pIter->u.ax.nIdx ){ + 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{ + } else { ++(*pIx); pIter->u.lx.pIdx = pIter->u.lx.pIdx->pNext; return pIter->u.lx.pIdx; @@ -127897,209 +126400,201 @@ static Index *indexIteratorNext(IndexIterator *pIter, int *pIx){ ** 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 */ +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; + 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 */ + 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) ){ + if (HasRowid(pTab)) { pPk = 0; nPkField = 1; - }else{ + } 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)); + 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 */ + */ + 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; i < nCol; i++) { + int iReg; /* Register holding column value */ + Column* pCol = &pTab->aCol[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 */ + 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 ){ + if (isGenerated && !b2ndPass) { nGenerated++; - continue; /* Generated columns processed on 2nd pass */ + continue; /* Generated columns processed on 2nd pass */ } - if( aiChng && aiChng[i]<0 && !isGenerated ){ + if (aiChng && aiChng[i] < 0 && !isGenerated) { /* Do not check NOT NULL on columns that do not change */ continue; } - if( overrideError!=OE_Default ){ + if (overrideError != OE_Default) { onError = overrideError; - }else if( onError==OE_Default ){ + } 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 ); + 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 { + assert(!isGenerated); } - }else if( b2ndPass && !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) ); + 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 ){ + switch (onError) { case OE_Replace: { int addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, iReg); VdbeCoverage(v); - assert( (pCol->colFlags & COLFLAG_GENERATED)==0 ); + assert((pCol->colFlags & COLFLAG_GENERATED) == 0); nSeenReplace++; - sqlite3ExprCodeCopy(pParse, - sqlite3ColumnExpr(pTab, pCol), iReg); + sqlite3ExprCodeCopy(pParse, sqlite3ColumnExpr(pTab, pCol), iReg); sqlite3VdbeJumpHere(v, addr1); break; } case OE_Abort: sqlite3MayAbort(pParse); - /* no break */ deliberate_fall_through - case OE_Rollback: + /* 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); + 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 ); + 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 (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 */ + 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 (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); + 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++){ + 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; i < pCheck->nExpr; i++) { int allOk; - Expr *pCopy; - Expr *pExpr = pCheck->a[i].pExpr; - if( aiChng - && !sqlite3ExprReferencesUpdatedColumn(pExpr, aiChng, pkChng) - ){ + 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); + if (bAffinityDone == 0) { + sqlite3TableAffinity(v, pTab, regNewData + 1); bAffinityDone = 1; } allOk = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeVerifyAbortable(v, onError); pCopy = sqlite3ExprDup(db, pExpr, 0); - if( !db->mallocFailed ){ + if (!db->mallocFailed) { sqlite3ExprIfTrue(pParse, pCopy, allOk, SQLITE_JUMPIFNULL); } sqlite3ExprDelete(db, pCopy); - if( onError==OE_Ignore ){ + 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); + } 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); } @@ -128137,61 +126632,66 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( */ sIdxIter.eType = 0; sIdxIter.i = 0; - sIdxIter.u.ax.aIdx = 0; /* Silence harmless compiler warning */ + sIdxIter.u.ax.aIdx = 0; /* Silence harmless compiler warning */ sIdxIter.u.lx.pIdx = pTab->pIndex; - if( pUpsert ){ - if( pUpsert->pUpsertTarget==0 ){ + 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 ){ + 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{ + } else { /* A single ON CONFLICT DO UPDATE. Make all resolutions OE_Update */ overrideError = OE_Update; } - }else if( pTab->pIndex!=0 ){ + } 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 ); + 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; + nByte = (sizeof(IndexListTerm) + 1) * nIdx + nIdx; sIdxIter.u.ax.aIdx = sqlite3DbMallocZero(db, nByte); - if( sIdxIter.u.ax.aIdx==0 ) return; /* OOM */ + 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 */ + 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++; + while (ALWAYS(pIdx != 0) && pIdx != pTerm->pUpsertIdx) { + pIdx = pIdx->pNext; + jj++; } - if( bUsed[jj] ) continue; /* Duplicate ON CONFLICT clause ignored */ + 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; + 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 ); + assert(i == nIdx); } } @@ -128215,20 +126715,20 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( ** used to link together these tests which are separated from each other ** in the generate bytecode. */ - if( (db->flags & (SQLITE_RecTriggers|SQLITE_ForeignKeys))==0 ){ + 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 ){ + } else { + if (db->flags & SQLITE_RecTriggers) { pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0); - regTrigCnt = pTrigger!=0 || sqlite3FkRequired(pParse, pTab, 0, 0); - }else{ + regTrigCnt = pTrigger != 0 || sqlite3FkRequired(pParse, pTab, 0, 0); + } else { pTrigger = 0; regTrigCnt = sqlite3FkRequired(pParse, pTab, 0, 0); } - if( regTrigCnt ){ + if (regTrigCnt) { /* Replace triggers might exist. Allocate the counter and ** initialize it to zero. */ regTrigCnt = ++pParse->nMem; @@ -128242,28 +126742,28 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( /* If rowid is changing, make sure the new rowid does not previously ** exist in the table. */ - if( pkChng && pPk==0 ){ + 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 ){ + if (overrideError != OE_Default) { onError = overrideError; - }else if( onError==OE_Default ){ + } 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 (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 ){ + 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 */ @@ -128276,16 +126776,16 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( ** 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; + 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 ){ + 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. */ @@ -128301,7 +126801,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, addrRowidOk, regNewData); VdbeCoverage(v); - switch( onError ){ + switch (onError) { default: { onError = OE_Abort; /* no break */ deliberate_fall_through @@ -128309,9 +126809,9 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( case OE_Rollback: case OE_Abort: case OE_Fail: { - testcase( onError==OE_Rollback ); - testcase( onError==OE_Abort ); - testcase( onError==OE_Fail ); + testcase(onError == OE_Rollback); + testcase(onError == OE_Abort); + testcase(onError == OE_Fail); sqlite3RowidConstraint(pParse, onError, pTab); break; } @@ -128338,15 +126838,14 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( ** to run without a statement journal if there are no indexes on the ** table. */ - if( regTrigCnt ){ + if (regTrigCnt) { sqlite3MultiWrite(pParse); - sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, - regNewData, 1, 0, OE_Replace, 1, -1); + sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, regNewData, 1, 0, OE_Replace, 1, -1); sqlite3VdbeAddOp2(v, OP_AddImm, regTrigCnt, 1); /* incr trigger cnt */ nReplaceTrig++; - }else{ + } else { #ifdef SQLITE_ENABLE_PREUPDATE_HOOK - assert( HasRowid(pTab) ); + 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 @@ -128354,9 +126853,9 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, OPFLAG_ISNOOP); sqlite3VdbeAppendP4(v, pTab, P4_TABLE); #endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ - if( pTab->pIndex ){ + if (pTab->pIndex) { sqlite3MultiWrite(pParse); - sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur,0,-1); + sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur, 0, -1); } } seenReplace = 1; @@ -128369,17 +126868,17 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( } #endif case OE_Ignore: { - testcase( onError==OE_Ignore ); + testcase(onError == OE_Ignore); sqlite3VdbeGoto(v, ignoreDest); break; } } sqlite3VdbeResolveLabel(v, addrRowidOk); - if( pUpsert && pUpsertClause!=pUpsert ){ + if (pUpsert && pUpsertClause != pUpsert) { upsertIpkReturn = sqlite3VdbeAddOp0(v, OP_Goto); - }else if( ipkTop ){ + } else if (ipkTop) { ipkBottom = sqlite3VdbeAddOp0(v, OP_Goto); - sqlite3VdbeJumpHere(v, ipkTop-1); + sqlite3VdbeJumpHere(v, ipkTop - 1); } } @@ -128390,68 +126889,64 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( ** 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 ){ + 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 ){ + if (upsertIpkDelay && pUpsertClause == pUpsert) { sqlite3VdbeJumpHere(v, upsertIpkDelay); } } addrUniqueOk = sqlite3VdbeMakeLabel(pParse); - if( bAffinityDone==0 ){ - sqlite3TableAffinity(v, pTab, regNewData+1); + if (bAffinityDone == 0) { + sqlite3TableAffinity(v, pTab, regNewData + 1); bAffinityDone = 1; } VdbeNoopComment((v, "prep index %s", pIdx->zName)); - iThisCur = iIdxCur+ix; - + iThisCur = iIdxCur + ix; /* Skip partial indices for which the WHERE clause is not true */ - if( pIdx->pPartIdxWhere ){ + if (pIdx->pPartIdxWhere) { sqlite3VdbeAddOp2(v, OP_Null, 0, aRegIdx[ix]); - pParse->iSelfTab = -(regNewData+1); - sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, addrUniqueOk, - SQLITE_JUMPIFNULL); + 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++){ + regIdx = aRegIdx[ix] + 1; + for (i = 0; i < pIdx->nColumn; 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); + 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 ){ + } else if (iField == XN_ROWID || iField == pTab->iPKey) { x = regNewData; - sqlite3VdbeAddOp2(v, OP_IntCopy, x, regIdx+i); + sqlite3VdbeAddOp2(v, OP_IntCopy, x, regIdx + i); VdbeComment((v, "rowid")); - }else{ - testcase( sqlite3TableColumnToStorage(pTab, iField)!=iField ); + } else { + testcase(sqlite3TableColumnToStorage(pTab, iField) != iField); x = sqlite3TableColumnToStorage(pTab, iField) + regNewData + 1; - sqlite3VdbeAddOp2(v, OP_SCopy, x, regIdx+i); + 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 ){ + if (pIdx->idxType == SQLITE_IDXTYPE_PRIMARYKEY) { sqlite3SetMakeRecordP5(v, pIdx->pTable); } #endif @@ -128461,29 +126956,29 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( ** 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 ){ + 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 ){ + if (onError == OE_None) { sqlite3VdbeResolveLabel(v, addrUniqueOk); - continue; /* pIdx is not a UNIQUE index */ + continue; /* pIdx is not a UNIQUE index */ } - if( overrideError!=OE_Default ){ + if (overrideError != OE_Default) { onError = overrideError; - }else if( onError==OE_Default ){ + } 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 */ + if (pUpsertClause) { + if (pUpsertClause->isDoUpdate == 0) { + onError = OE_Ignore; /* DO NOTHING is the same as INSERT OR IGNORE */ + } else { + onError = OE_Update; /* DO UPDATE */ } } @@ -128497,16 +126992,15 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( ** 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) ); + 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))) - ){ + 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; } @@ -128514,36 +127008,34 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( /* 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); + 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) ){ + 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 ){ + if (isUpdate) { sqlite3VdbeAddOp3(v, OP_Eq, regR, addrUniqueOk, regOldData); sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); VdbeCoverage(v); } - }else{ + } 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 ); + if (pIdx != pPk) { + for (i = 0; i < pPk->nKeyCol; 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)); + sqlite3VdbeAddOp3(v, OP_Column, iThisCur, x, regR + i); + VdbeComment((v, "%s.%s", pTab->zName, pTab->aCol[pPk->aiColumn[i]].zCnName)); } } - if( isUpdate ){ + 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. @@ -128551,80 +127043,77 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( ** 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 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]); + for (i = 0; i < pPk->nKeyCol; i++) { + char* p4 = (char*)sqlite3LocateCollSeq(pParse, pPk->azColl[i]); x = pPk->aiColumn[i]; - assert( x>=0 ); - if( i==(pPk->nKeyCol-1) ){ + 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 - ); + 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); + 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 ){ + 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 ); + 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); + sqlite3UpsertDoUpdate(pParse, pUpsert, pTab, pIdx, iIdxCur + ix); /* no break */ deliberate_fall_through } #endif case OE_Ignore: { - testcase( onError==OE_Ignore ); + testcase(onError == OE_Ignore); sqlite3VdbeGoto(v, ignoreDest); break; } default: { - int nConflictCk; /* Number of opcodes in conflict check logic */ + int nConflictCk; /* Number of opcodes in conflict check logic */ - assert( onError==OE_Replace ); + assert(onError == OE_Replace); nConflictCk = sqlite3VdbeCurrentAddr(v) - addrConflictCk; - assert( nConflictCk>0 || db->mallocFailed ); - testcase( nConflictCk<=0 ); - testcase( nConflictCk>1 ); - if( regTrigCnt ){ + assert(nConflictCk > 0 || db->mallocFailed); + testcase(nConflictCk <= 0); + testcase(nConflictCk > 1); + if (regTrigCnt) { sqlite3MultiWrite(pParse); nReplaceTrig++; } - if( pTrigger && isUpdate ){ + 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 ){ + 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 */ + 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 */ + addrBypass = sqlite3VdbeAddOp0(v, OP_Goto); /* Bypass recheck */ VdbeComment((v, "bypass recheck")); /* Here we insert code that will be invoked after all constraint @@ -128632,33 +127121,33 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( ** fired. */ sqlite3VdbeResolveLabel(v, lblRecheckOk); lblRecheckOk = sqlite3VdbeMakeLabel(pParse); - if( pIdx->pPartIdxWhere ){ + if (pIdx->pPartIdxWhere) { /* Bypass the recheck if this partial index is not defined ** for the current row */ - sqlite3VdbeAddOp2(v, OP_IsNull, regIdx-1, lblRecheckOk); + 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 */ + 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 ){ + 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{ + } else { p2 = x.p2; } - zP4 = x.p4type==P4_INT32 ? SQLITE_INT_TO_PTR(x.p4.i) : x.p4.z; + 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); + VdbeCoverageIf(v, p2 != x.p2); } nConflictCk--; addrConflictCk++; @@ -128673,32 +127162,31 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( } } sqlite3VdbeResolveLabel(v, addrUniqueOk); - if( regR!=regIdx ) sqlite3ReleaseTempRange(pParse, regR, nPkField); - if( pUpsertClause - && upsertIpkReturn - && sqlite3UpsertNextIsIPK(pUpsertClause) - ){ - sqlite3VdbeGoto(v, upsertIpkDelay+1); + 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 ){ + if (ipkTop) { sqlite3VdbeGoto(v, ipkTop); VdbeComment((v, "Do IPK REPLACE")); - assert( ipkBottom>0 ); + 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 ){ + 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); @@ -128706,18 +127194,18 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, addrRecheck, regNewData); VdbeCoverage(v); sqlite3RowidConstraint(pParse, OE_Abort, pTab); - }else{ + } else { sqlite3VdbeGoto(v, addrRecheck); } sqlite3VdbeResolveLabel(v, lblRecheckOk); } /* Generate the table record */ - if( HasRowid(pTab) ){ + if (HasRowid(pTab)) { int regRec = aRegIdx[ix]; - sqlite3VdbeAddOp3(v, OP_MakeRecord, regNewData+1, pTab->nNVCol, regRec); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regNewData + 1, pTab->nNVCol, regRec); sqlite3SetMakeRecordP5(v, pTab); - if( !bAffinityDone ){ + if (!bAffinityDone) { sqlite3TableAffinity(v, pTab, 0); } } @@ -128733,18 +127221,21 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( ** ** Or if no columns of pTab may be NULL-trimmed, leave P5 at zero. */ -SQLITE_PRIVATE void sqlite3SetMakeRecordP5(Vdbe *v, Table *pTab){ +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; + 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; + 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); + sqlite3VdbeChangeP5(v, i + 1); } #endif @@ -128755,23 +127246,22 @@ SQLITE_PRIVATE void sqlite3SetMakeRecordP5(Vdbe *v, Table *pTab){ ** 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; +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 ); + 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) +#define codeWithoutRowidPreupdate(a, b, c, d) #endif /* @@ -128783,68 +127273,62 @@ static void codeWithoutRowidPreupdate( ** 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 */ +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) - ); + 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++){ + 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); + 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) ){ + 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]); + 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); + 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 ){ + if (!HasRowid(pTab)) + return; + if (pParse->nested) { pik_flags = 0; - }else{ + } else { pik_flags = OPFLAG_NCHANGE; - pik_flags |= (update_flags?update_flags:OPFLAG_LASTROWID); + pik_flags |= (update_flags ? update_flags : OPFLAG_LASTROWID); } - if( appendBias ){ + if (appendBias) { pik_flags |= OPFLAG_APPEND; } - if( useSeekResult ){ + if (useSeekResult) { pik_flags |= OPFLAG_USESEEKRESULT; } sqlite3VdbeAddOp3(v, OP_Insert, iDataCur, aRegIdx[i], regNewData); - if( !pParse->nested ){ + if (!pParse->nested) { sqlite3VdbeAppendP4(v, pTab, P4_TABLE); } sqlite3VdbeChangeP5(v, pik_flags); @@ -128871,25 +127355,24 @@ SQLITE_PRIVATE void sqlite3CompleteInsertion( ** 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 */ -){ +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; + Index* pIdx; + Vdbe* v; - assert( op==OP_OpenRead || op==OP_OpenWrite ); - assert( op==OP_OpenWrite || p5==0 ); - if( IsVirtual(pTab) ){ + 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. */ @@ -128898,35 +127381,39 @@ SQLITE_PRIVATE int sqlite3OpenTableAndIndices( } iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); v = pParse->pVdbe; - assert( v!=0 ); - if( iBase<0 ) iBase = pParse->nTab; + assert(v != 0); + if (iBase < 0) + iBase = pParse->nTab; iDataCur = iBase++; - if( piDataCur ) *piDataCur = iDataCur; - if( HasRowid(pTab) && (aToOpen==0 || aToOpen[0]) ){ + 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); + } 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++){ + 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; + assert(pIdx->pSchema == pTab->pSchema); + if (IsPrimaryKeyIndex(pIdx) && !HasRowid(pTab)) { + if (piDataCur) + *piDataCur = iIdxCur; p5 = 0; } - if( aToOpen==0 || aToOpen[i+1] ){ + 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; + if (iBase > pParse->nTab) + pParse->nTab = iBase; return i; } - #ifdef SQLITE_TEST /* ** The following global variable is incremented whenever the @@ -128937,7 +127424,6 @@ SQLITE_PRIVATE int sqlite3OpenTableAndIndices( 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 @@ -128950,36 +127436,35 @@ SQLITE_API int sqlite3_xferopt_count; ** * The same collating sequence on each column ** * The index has the exact same WHERE clause */ -static int xferCompatibleIndex(Index *pDest, Index *pSrc){ +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 */ + 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 */ + 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 */ + for (i = 0; i < pSrc->nKeyCol; 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->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 (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 (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 (sqlite3ExprCompare(0, pSrc->pPartIdxWhere, pDest->pPartIdxWhere, -1)) { + return 0; /* Different WHERE clauses */ } /* If no test above fails then the indices must be compatible */ @@ -129011,80 +127496,81 @@ static int xferCompatibleIndex(Index *pDest, Index *pSrc){ ** ** 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 ){ +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 */ + 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; + 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 */ + 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->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->pWhere) { + return 0; /* SELECT may not have a WHERE clause */ } - if( pSelect->pOrderBy ){ - return 0; /* SELECT may not have an ORDER BY 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->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->pLimit) { + return 0; /* SELECT may not have a LIMIT clause */ } - if( pSelect->pPrior ){ - return 0; /* SELECT may not be a compound query */ + if (pSelect->pPrior) { + return 0; /* SELECT may not be a compound query */ } - if( pSelect->selFlags & SF_Distinct ){ - return 0; /* SELECT may not be DISTINCT */ + 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 != 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 "*" */ + 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 @@ -129093,36 +127579,34 @@ static int xferOptimization( */ pItem = pSelect->pSrc->a; pSrc = sqlite3LocateTableItem(pParse, 0, pItem); - if( pSrc==0 ){ - return 0; /* FROM clause does not contain a real table */ + 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 (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 (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 (!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->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->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 */ + 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]; + for (i = 0; i < pDest->nCol; 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 */ + 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 @@ -129142,71 +127626,64 @@ static int xferOptimization( ** 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 */ + 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 */ + 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 (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 (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 */ + 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 */ + 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) ){ + 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; + 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 == 0) { + return 0; /* pDestIdx has no corresponding index in pSrc */ } - if( pSrcIdx->tnum==pDestIdx->tnum && pSrc->pSchema==pDest->pSchema - && sqlite3FaultSim(411)==SQLITE_OK ){ + 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 */ + 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 */ + if (pDest->pCheck && sqlite3ExprListCompare(pSrc->pCheck, pDest->pCheck, -1)) { + return 0; /* Tables have different CHECK constraints. Ticket #2252 */ } #endif #ifndef SQLITE_OMIT_FOREIGN_KEY @@ -129217,13 +127694,13 @@ static int xferOptimization( ** 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 ){ + 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 ((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 @@ -129243,12 +127720,11 @@ static int xferOptimization( 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) */ - )){ + 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 @@ -129266,17 +127742,19 @@ static int xferOptimization( ** ** (3) onError is something other than OE_Abort and OE_Rollback. */ - addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iDest, 0); VdbeCoverage(v); + addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iDest, 0); + VdbeCoverage(v); emptyDestTest = sqlite3VdbeAddOp0(v, OP_Goto); sqlite3VdbeJumpHere(v, addr1); } - if( HasRowid(pSrc) ){ + 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 ){ + 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 ){ + if ((db->mDbFlags & DBFLAG_Vacuum) == 0) { sqlite3VdbeVerifyAbortable(v, onError); addr2 = sqlite3VdbeAddOp3(v, OP_NotExists, iDest, 0, regRowid); VdbeCoverage(v); @@ -129284,47 +127762,49 @@ static int xferOptimization( sqlite3VdbeJumpHere(v, addr2); } autoIncStep(pParse, regAutoinc, regRowid); - }else if( pDest->pIndex==0 && !(db->mDbFlags & DBFLAG_VacuumInto) ){ + } else if (pDest->pIndex == 0 && !(db->mDbFlags & DBFLAG_VacuumInto)) { addr1 = sqlite3VdbeAddOp2(v, OP_NewRowid, iDest, regRowid); - }else{ + } else { addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid); - assert( (pDest->tabFlags & TF_Autoincrement)==0 ); + assert((pDest->tabFlags & TF_Autoincrement) == 0); } - if( db->mDbFlags & DBFLAG_Vacuum ){ + 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; + 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 ){ + if ((db->mDbFlags & DBFLAG_Vacuum) == 0) { sqlite3VdbeAddOp3(v, OP_RowData, iSrc, regData, 1); insFlags &= ~OPFLAG_PREFORMAT; - }else + } else #endif { sqlite3VdbeAddOp3(v, OP_RowCell, iDest, iSrc, regRowid); } sqlite3VdbeAddOp3(v, OP_Insert, iDest, regData, regRowid); - if( (db->mDbFlags & DBFLAG_Vacuum)==0 ){ + 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_Next, iSrc, addr1); + VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Close, iSrc, 0); sqlite3VdbeAddOp2(v, OP_Close, iDest, 0); - }else{ + } 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){ + 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; + for (pSrcIdx = pSrc->pIndex; ALWAYS(pSrcIdx); pSrcIdx = pSrcIdx->pNext) { + if (xferCompatibleIndex(pDestIdx, pSrcIdx)) + break; } - assert( pSrcIdx ); + assert(pSrcIdx); sqlite3VdbeAddOp3(v, OP_OpenRead, iSrc, pSrcIdx->tnum, iDbSrc); sqlite3VdbeSetP4KeyInfo(pParse, pSrcIdx); VdbeComment((v, "%s", pSrcIdx->zName)); @@ -129332,8 +127812,9 @@ static int xferOptimization( 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 ){ + 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 @@ -129348,44 +127829,44 @@ static int xferOptimization( ** 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; + for (i = 0; i < pSrcIdx->nColumn; i++) { + const char* zColl = pSrcIdx->azColl[i]; + if (sqlite3_stricmp(sqlite3StrBINARY, zColl)) + break; } - if( i==pSrcIdx->nColumn ){ - idxInsFlags = OPFLAG_USESEEKRESULT|OPFLAG_PREFORMAT; + 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 ){ + } else if (!HasRowid(pSrc) && pDestIdx->idxType == SQLITE_IDXTYPE_PRIMARYKEY) { idxInsFlags |= OPFLAG_NCHANGE; } - if( idxInsFlags!=(OPFLAG_USESEEKRESULT|OPFLAG_PREFORMAT) ){ + if (idxInsFlags != (OPFLAG_USESEEKRESULT | OPFLAG_PREFORMAT)) { sqlite3VdbeAddOp3(v, OP_RowData, iSrc, regData, 1); - if( (db->mDbFlags & DBFLAG_Vacuum)==0 - && !HasRowid(pDest) - && IsPrimaryKeyIndex(pDestIdx) - ){ + 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); + 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); + if (emptySrcTest) + sqlite3VdbeJumpHere(v, emptySrcTest); sqlite3ReleaseTempReg(pParse, regRowid); sqlite3ReleaseTempReg(pParse, regData); - if( emptyDestTest ){ + if (emptyDestTest) { sqlite3AutoincrementEnd(pParse); sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_OK, 0); sqlite3VdbeJumpHere(v, emptyDestTest); sqlite3VdbeAddOp2(v, OP_Close, iDest, 0); return 0; - }else{ + } else { return 1; } } @@ -129422,91 +127903,91 @@ static int xferOptimization( ** 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 */ +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 = ""; + 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] ){ + while (rc == SQLITE_OK && zSql[0]) { int nCol = 0; - char **azVals = 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 ){ + assert(rc == SQLITE_OK || pStmt == 0); + if (rc != SQLITE_OK) { continue; } - if( !pStmt ){ + if (!pStmt) { /* this happens for a comment or white-space */ zSql = zLeftover; continue; } callbackIsInit = 0; - while( 1 ){ + 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 ){ + 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 ){ + azCols = sqlite3DbMallocRaw(db, (2 * nCol + 1) * sizeof(const char*)); + if (azCols == 0) { goto exec_out; } - for(i=0; ierrMask)==rc ); + assert((rc & db->errMask) == rc); sqlite3_mutex_leave(db->mutex); return rc; } @@ -129553,7 +128035,7 @@ SQLITE_API int sqlite3_exec( */ #ifndef SQLITE_CORE - #define SQLITE_CORE 1 /* Disable the API redefinition in sqlite3ext.h */ +#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 **************************************/ @@ -129589,343 +128071,311 @@ SQLITE_API int sqlite3_exec( ** 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); + 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); + 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 (*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 *)); + 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 (*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*); + 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); + 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 (*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); + 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); + 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); + 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*); + 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 (*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 (*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*,...); + 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,...); + 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*); + const char* (*db_filename)(sqlite3*, const char*); + int (*db_readonly)(sqlite3*, const char*); int (*db_release_memory)(sqlite3*); - const char *(*errstr)(int); + 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*); + 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); + 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* (*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*); + 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*); + sqlite3_value* (*value_dup)(const sqlite3_value*); void (*value_free)(sqlite3_value*); - int (*result_zeroblob64)(sqlite3_context*,sqlite3_uint64); + 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); + 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 (*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*); + 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); + 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 (*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); + 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); + 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*); + 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*)); + 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*); + 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**); + 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*); + 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**); + char* (*create_filename)(const char*, const char*, const char*, int, const char**); void (*free_filename)(char*); - sqlite3_file *(*database_file_object)(const char*); + sqlite3_file* (*database_file_object)(const char*); /* Version 3.34.0 and later */ - int (*txn_state)(sqlite3*,const char*); + 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*)); + 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_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**); + 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); + 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. */ +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. */ ); /* @@ -129940,321 +128390,320 @@ typedef int (*sqlite3_loadext_entry)( ** SQLITE_CORE macros is undefined. */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) -#define sqlite3_aggregate_context sqlite3_api->aggregate_context +#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_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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#define sqlite3_deserialize sqlite3_api->deserialize +#define sqlite3_serialize sqlite3_api->serialize #endif -#define sqlite3_db_name sqlite3_api->db_name +#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; +/* 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*/ +/* 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 */ @@ -130270,93 +128719,93 @@ typedef int (*sqlite3_loadext_entry)( ** 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 +#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 +#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 +#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 +#define sqlite3_complete 0 +#define sqlite3_complete16 0 #endif #ifdef SQLITE_OMIT_DECLTYPE -# define sqlite3_column_decltype16 0 -# define sqlite3_column_decltype 0 +#define sqlite3_column_decltype16 0 +#define sqlite3_column_decltype 0 #endif #ifdef SQLITE_OMIT_PROGRESS_CALLBACK -# define sqlite3_progress_handler 0 +#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 +#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 +#define sqlite3_enable_shared_cache 0 #endif #if defined(SQLITE_OMIT_TRACE) || defined(SQLITE_OMIT_DEPRECATED) -# define sqlite3_profile 0 -# define sqlite3_trace 0 +#define sqlite3_profile 0 +#define sqlite3_trace 0 #endif #ifdef SQLITE_OMIT_GET_TABLE -# define sqlite3_free_table 0 -# define sqlite3_get_table 0 +#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 +#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 +#define sqlite3_trace_v2 0 #endif /* @@ -130375,392 +128824,188 @@ typedef int (*sqlite3_loadext_entry)( ** not NULL before calling it. */ static const sqlite3_api_routines sqlite3Apis = { - sqlite3_aggregate_context, + 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, + 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, + 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, + sqlite3_thread_cleanup, #else - 0, + 0, #endif - sqlite3_total_changes, - sqlite3_trace, + 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, + 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 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.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, + /* + ** 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, + 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.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.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, + /* + ** 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, + 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, + sqlite3_unlock_notify, #else - 0, + 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 */ + 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, + sqlite3_normalized_sql, #else - 0, + 0, #endif - /* Version 3.28.0 and later */ - sqlite3_stmt_isexplain, - sqlite3_value_frombind, - /* Version 3.30.0 and later */ + /* 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, + sqlite3_drop_modules, #else - 0, + 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, + /* 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, + 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 */ +/* Version 3.39.0 and later */ #ifndef SQLITE_OMIT_DESERIALIZE - sqlite3_deserialize, - sqlite3_serialize, + sqlite3_deserialize, sqlite3_serialize, #else - 0, - 0, + 0, 0, #endif - sqlite3_db_name -}; + sqlite3_db_name}; /* True if x is the directory separator character -*/ + */ #if SQLITE_OS_WIN -# define DirSep(X) ((X)=='/'||(X)=='\\') +#define DirSep(X) ((X) == '/' || (X) == '\\') #else -# define DirSep(X) ((X)=='/') +#define DirSep(X) ((X) == '/') #endif /* @@ -130775,36 +129020,35 @@ static const sqlite3_api_routines sqlite3Apis = { ** 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; +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; + 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[] = { + static const char* azEndings[] = { #if SQLITE_OS_WIN - "dll" + "dll" #elif defined(__APPLE__) - "dylib" + "dylib" #else - "so" + "so" #endif }; - - if( pzErrMsg ) *pzErrMsg = 0; + if (pzErrMsg) + *pzErrMsg = 0; /* Ticket #1863. To avoid a creating security problems for older ** applications that relink against newer versions of SQLite, the @@ -130813,8 +129057,8 @@ static int sqlite3LoadExtension( ** sqlite3_db_config(db, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, 1, 0) ** to turn on extension loading. */ - if( (db->flags & SQLITE_LoadExtension)==0 ){ - if( pzErrMsg ){ + if ((db->flags & SQLITE_LoadExtension) == 0) { + if (pzErrMsg) { *pzErrMsg = sqlite3_mprintf("not authorized"); } return SQLITE_ERROR; @@ -130826,18 +129070,21 @@ static int sqlite3LoadExtension( ** 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; + 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 ){ + if (xInit == 0 && zProc == 0) { int iFile, iEntry, c; int ncFile = sqlite3Strlen30(zFile); - zAltEntry = sqlite3_malloc64(ncFile+30); - if( zAltEntry==0 ){ + 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--){} + 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) ){ + 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); + memcpy(zAltEntry + iEntry, "_init", 6); zEntry = zAltEntry; xInit = (sqlite3_loadext_entry)sqlite3OsDlSym(pVfs, handle, zEntry); } - if( xInit==0 ){ - if( pzErrMsg ){ + 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); + 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); @@ -130889,9 +129137,10 @@ static int sqlite3LoadExtension( } sqlite3_free(zAltEntry); rc = xInit(db, &zErrmsg, &sqlite3Apis); - if( rc ){ - if( rc==SQLITE_OK_LOAD_PERMANENTLY ) return SQLITE_OK; - if( pzErrMsg ){ + if (rc) { + if (rc == SQLITE_OK_LOAD_PERMANENTLY) + return SQLITE_OK; + if (pzErrMsg) { *pzErrMsg = sqlite3_mprintf("error during initialization: %s", zErrmsg); } sqlite3_free(zErrmsg); @@ -130900,12 +129149,12 @@ static int sqlite3LoadExtension( } /* Append the new shared library handle to the db->aExtension array. */ - aHandle = sqlite3DbMallocZero(db, sizeof(handle)*(db->nExtension+1)); - if( aHandle==0 ){ + 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); + if (db->nExtension > 0) { + memcpy(aHandle, db->aExtension, sizeof(handle) * db->nExtension); } sqlite3DbFree(db, db->aExtension); db->aExtension = aHandle; @@ -130914,24 +129163,22 @@ static int sqlite3LoadExtension( return SQLITE_OK; extension_not_found: - if( pzErrMsg ){ + 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); + 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 */ -){ +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); @@ -130944,10 +129191,10 @@ SQLITE_API int sqlite3_load_extension( ** Call this routine when the database connection is closing in order ** to clean up loaded extensions */ -SQLITE_PRIVATE void sqlite3CloseExtensions(sqlite3 *db){ +SQLITE_PRIVATE void sqlite3CloseExtensions(sqlite3* db) { int i; - assert( sqlite3_mutex_held(db->mutex) ); - for(i=0; inExtension; i++){ + assert(sqlite3_mutex_held(db->mutex)); + for (i = 0; i < db->nExtension; i++) { sqlite3OsDlClose(db->pVfs, db->aExtension[i]); } sqlite3DbFree(db, db->aExtension); @@ -130957,12 +129204,12 @@ SQLITE_PRIVATE void sqlite3CloseExtensions(sqlite3 *db){ ** 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){ +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); + if (onoff) { + db->flags |= SQLITE_LoadExtension | SQLITE_LoadExtFunc; + } else { + db->flags &= ~(u64)(SQLITE_LoadExtension | SQLITE_LoadExtFunc); } sqlite3_mutex_leave(db->mutex); return SQLITE_OK; @@ -130979,9 +129226,9 @@ SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff){ */ 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 }; + 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, @@ -130990,53 +129237,50 @@ static SQLITE_WSD struct sqlite3AutoExtList { ** to the "sqlite3Autoext" state vector declared above. */ #ifdef SQLITE_OMIT_WSD -# define wsdAutoextInit \ - sqlite3AutoExtList *x = &GLOBAL(sqlite3AutoExtList,sqlite3Autoext) -# define wsdAutoext x[0] +#define wsdAutoextInit sqlite3AutoExtList* x = &GLOBAL(sqlite3AutoExtList, sqlite3Autoext) +#define wsdAutoext x[0] #else -# define wsdAutoextInit -# define wsdAutoext sqlite3Autoext +#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) -){ +SQLITE_API int sqlite3_auto_extension(void (*xInit)(void)) { int rc = SQLITE_OK; #ifndef SQLITE_OMIT_AUTOINIT rc = sqlite3_initialize(); - if( rc ){ + if (rc) { return rc; - }else + } else #endif { u32 i; #if SQLITE_THREADSAFE - sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); + 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 ){ + for (i = (int)wsdAutoext.nExt - 1; i >= 0; i--) { + if (wsdAutoext.aExt[i] == xInit) { wsdAutoext.nExt--; wsdAutoext.aExt[i] = wsdAutoext.aExt[wsdAutoext.nExt]; n++; @@ -131075,13 +129317,13 @@ SQLITE_API int sqlite3_cancel_auto_extension( /* ** Reset the automatic extension loading mechanism. */ -SQLITE_API void sqlite3_reset_auto_extension(void){ +SQLITE_API void sqlite3_reset_auto_extension(void) { #ifndef SQLITE_OMIT_AUTOINIT - if( sqlite3_initialize()==SQLITE_OK ) + if (sqlite3_initialize() == SQLITE_OK) #endif { #if SQLITE_THREADSAFE - sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); + sqlite3_mutex* mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); #endif wsdAutoextInit; sqlite3_mutex_enter(mutex); @@ -131097,39 +129339,38 @@ SQLITE_API void sqlite3_reset_auto_extension(void){ ** ** If anything goes wrong, set an error in the database connection. */ -SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){ +SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3* db) { u32 i; int go = 1; int rc; sqlite3_loadext_entry xInit; wsdAutoextInit; - if( wsdAutoext.nExt==0 ){ + if (wsdAutoext.nExt == 0) { /* Common case: early out without every having to acquire a mutex */ return; } - for(i=0; go; i++){ - char *zErrmsg; + for (i = 0; go; i++) { + char* zErrmsg; #if SQLITE_THREADSAFE - sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); + sqlite3_mutex* mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); #endif #ifdef SQLITE_OMIT_LOAD_EXTENSION - const sqlite3_api_routines *pThunk = 0; + const sqlite3_api_routines* pThunk = 0; #else - const sqlite3_api_routines *pThunk = &sqlite3Apis; + const sqlite3_api_routines* pThunk = &sqlite3Apis; #endif sqlite3_mutex_enter(mutex); - if( i>=wsdAutoext.nExt ){ + if (i >= wsdAutoext.nExt) { xInit = 0; go = 0; - }else{ + } 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); + if (xInit && (rc = xInit(db, &zErrmsg, pThunk)) != 0) { + sqlite3ErrorWithMsg(db, rc, "automatic extension loading failed: %s", zErrmsg); go = 0; } sqlite3_free(zErrmsg); @@ -131154,11 +129395,11 @@ SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){ /* #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 +#if defined(__APPLE__) +#define SQLITE_ENABLE_LOCKING_STYLE 1 +#else +#define SQLITE_ENABLE_LOCKING_STYLE 0 +#endif #endif /*************************************************************************** @@ -131177,134 +129418,134 @@ SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){ */ /* The various pragma types */ -#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 +#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_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 */ +#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 */ +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 */ + 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[] */ @@ -131313,520 +129554,520 @@ typedef struct PragmaName { } 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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}, #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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - {/* zName: */ "legacy_alter_table", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, - /* ColNames: */ 0, 0, - /* iArg: */ SQLITE_LegacyAlter }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, - {/* zName: */ "reverse_unordered_selects", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, - /* ColNames: */ 0, 0, - /* iArg: */ SQLITE_ReverseOrder }, + {/* 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}, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 - {/* zName: */ "threads", - /* ePragTyp: */ PragTyp_THREADS, - /* ePragFlg: */ PragFlg_Result0, - /* ColNames: */ 0, 0, - /* iArg: */ 0 }, + {/* 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 + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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 }, + {/* 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. */ @@ -131845,22 +130086,20 @@ static const PragmaName aPragmaName[] = { ** 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 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 */ + 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) ){ + if (sqlite3Isdigit(*z)) { return (u8)sqlite3Atoi(z); } n = sqlite3Strlen30(z); - for(i=0; i=0&&i<=2)?i:0); + return (u8)((i >= 0 && i <= 2) ? i : 0); } #endif /* ifndef SQLITE_OMIT_AUTOVACUUM */ @@ -131914,14 +130158,14 @@ static int getAutoVacuum(const char *z){ ** 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' ){ +static int getTempStore(const char* z) { + if (z[0] >= '0' && z[0] <= '2') { return z[0] - '0'; - }else if( sqlite3StrICmp(z, "file")==0 ){ + } else if (sqlite3StrICmp(z, "file") == 0) { return 1; - }else if( sqlite3StrICmp(z, "memory")==0 ){ + } else if (sqlite3StrICmp(z, "memory") == 0) { return 2; - }else{ + } else { return 0; } } @@ -131932,14 +130176,12 @@ static int getTempStore(const char *z){ ** 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 - ){ +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"); + "from within a transaction"); return SQLITE_ERROR; } sqlite3BtreeClose(db->aDb[1].pBt); @@ -131956,11 +130198,12 @@ static int invalidateTempStorage(Parse *pParse){ ** 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){ +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 ){ + 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; @@ -131971,17 +130214,16 @@ static int changeTempStorage(Parse *pParse, const char *zStorageType){ /* ** Set result column names for a pragma. */ -static void setPragmaResultColumnNames( - Vdbe *v, /* The query under construction */ - const PragmaName *pPragma /* The 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 ){ + sqlite3VdbeSetNumCols(v, n == 0 ? 1 : n); + if (n == 0) { sqlite3VdbeSetColName(v, 0, COLNAME_NAME, pPragma->zName, SQLITE_STATIC); - }else{ + } else { int i, j; - for(i=0, j=pPragma->iPragCName; iiPragCName; i < n; i++, j++) { sqlite3VdbeSetColName(v, i, COLNAME_NAME, pragCName[j], SQLITE_STATIC); } } @@ -131990,7 +130232,7 @@ static void setPragmaResultColumnNames( /* ** Generate code to return a single integer value. */ -static void returnSingleInt(Vdbe *v, i64 value){ +static void returnSingleInt(Vdbe* v, i64 value) { sqlite3VdbeAddOp4Dup8(v, OP_Int64, 0, 1, 0, (const u8*)&value, P4_INT64); sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); } @@ -131998,159 +130240,157 @@ static void returnSingleInt(Vdbe *v, i64 value){ /* ** Generate code to return a single text value. */ -static void returnSingleText( - Vdbe *v, /* Prepared statement under construction */ - const char *zValue /* Value to be returned */ -){ - if( zValue ){ +static void returnSingleText(Vdbe* v, /* Prepared statement under construction */ + const char* zValue /* Value to be returned */ +) { + if (zValue) { sqlite3VdbeLoadString(v, 1, (const char*)zValue); sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); } } - /* ** Set the safety_level and pager flags for pager iDb. Or if iDb<0 ** set these values for all pagers. */ #ifndef SQLITE_OMIT_PAGER_PRAGMAS -static void setAllPagerFlags(sqlite3 *db){ - if( db->autoCommit ){ - Db *pDb = db->aDb; +static void setAllPagerFlags(sqlite3* db) { + if (db->autoCommit) { + 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) ); + 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 */ +#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; +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" +SQLITE_PRIVATE const char* sqlite3JournalModename(int eMode) { + static char* const azModeName[] = {"delete", + "persist", + "off", + "truncate", + "memory" #ifndef SQLITE_OMIT_WAL - , "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; + 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){ +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; + 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 ){ + if (rc == 0) + break; + if (rc < 0) { upr = mid - 1; - }else{ + } else { lwr = mid + 1; } } - return lwr>upr ? 0 : &aPragmaName[mid]; + 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 - ){ +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 ){ + if (p->xValue != 0) { zType = "w"; - }else if( p->xFinalize!=0 ){ + } else if (p->xFinalize != 0) { zType = "a"; - }else{ + } else { zType = "s"; } - sqlite3VdbeMultiLoad(v, 1, "sissii", - p->zName, isBuiltin, - zType, azEnc[p->funcFlags&SQLITE_FUNC_ENCMASK], - p->nArg, - (p->funcFlags & mask) ^ SQLITE_INNOCUOUS - ); + 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: ** @@ -132158,10 +130398,10 @@ static void pragmaFunclistLine( ** 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){ +static int integrityCheckResultRow(Vdbe* v) { int addr; sqlite3VdbeAddOp2(v, OP_ResultRow, 3, 1); - addr = sqlite3VdbeAddOp3(v, OP_IfPos, 1, sqlite3VdbeCurrentAddr(v)+2, 1); + addr = sqlite3VdbeAddOp3(v, OP_IfPos, 1, sqlite3VdbeCurrentAddr(v) + 2, 1); VdbeCoverage(v); sqlite3VdbeAddOp0(v, OP_Halt); return addr; @@ -132182,53 +130422,54 @@ static int integrityCheckResultRow(Vdbe *v){ ** 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 */ - - if( v==0 ) return; +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 */ + + 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; + 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) ){ + if (iDb == 1 && sqlite3OpenTempDatabase(pParse)) { return; } zLeft = sqlite3NameFromToken(db, pId); - if( !zLeft ) return; - if( minusFlag ){ + if (!zLeft) + return; + if (minusFlag) { zRight = sqlite3MPrintf(db, "-%T", pValue); - }else{ + } else { zRight = sqlite3NameFromToken(db, pValue); } - assert( pId2 ); - zDb = pId2->n>0 ? pDb->zDbSName : 0; - if( sqlite3AuthCheck(pParse, SQLITE_PRAGMA, zLeft, zRight, zDb) ){ + assert(pId2); + zDb = pId2->n > 0 ? pDb->zDbSName : 0; + if (sqlite3AuthCheck(pParse, SQLITE_PRAGMA, zLeft, zRight, zDb)) { goto pragma_out; } @@ -132253,15 +130494,15 @@ SQLITE_PRIVATE void sqlite3Pragma( aFcntl[3] = 0; db->busyHandler.nBusy = 0; rc = sqlite3_file_control(db, zDb, SQLITE_FCNTL_PRAGMA, (void*)aFcntl); - if( rc==SQLITE_OK ){ + 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] ){ + if (rc != SQLITE_NOTFOUND) { + if (aFcntl[0]) { sqlite3ErrorMsg(pParse, "%s", aFcntl[0]); sqlite3_free(aFcntl[0]); } @@ -132272,1931 +130513,1905 @@ SQLITE_PRIVATE void sqlite3Pragma( /* Locate the pragma in the lookup table */ pPragma = pragmaLocate(zLeft); - if( pPragma==0 ){ + 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; + 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) - ){ + 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 ){ + 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); + /* + ** 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; } - 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); + /* + ** 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; } - 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); + /* + ** 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); + if (pId2->n == 0 && b >= 0) { + int ii; + for (ii = 0; ii < db->nDb; ii++) { + sqlite3BtreeSecureDelete(db->aDb[ii].pBt, b); + } } + b = sqlite3BtreeSecureDelete(pBt, b); + returnSingleInt(v, b); + break; } - 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; + /* + ** 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); } - sqlite3VdbeAddOp3(v, OP_MaxPgcnt, iDb, iReg, (int)x); + sqlite3VdbeAddOp2(v, OP_ResultRow, iReg, 1); + break; } - 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. + /* + ** 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). */ - int ii; - assert(pDb==&db->aDb[0]); - for(ii=2; iinDb; ii++){ - pPager = sqlite3BtreePager(db->aDb[ii].pBt); - sqlite3PagerLockingMode(pPager, eMode); + 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; ii < db->nDb; ii++) { + pPager = sqlite3BtreePager(db->aDb[ii].pBt); + sqlite3PagerLockingMode(pPager, eMode); + } + db->dfltLockMode = (u8)eMode; } - db->dfltLockMode = (u8)eMode; + pPager = sqlite3BtreePager(pDb->pBt); + eMode = sqlite3PagerLockingMode(pPager, 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"; + assert(eMode == PAGER_LOCKINGMODE_NORMAL || eMode == PAGER_LOCKINGMODE_EXCLUSIVE); + if (eMode == PAGER_LOCKINGMODE_EXCLUSIVE) { + zRet = "exclusive"; + } + returnSingleText(v, zRet); + break; } - 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 */ + /* + ** 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_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; } - } - 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); + 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; } - 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; + /* + ** 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; } - 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 - */ + /* + ** 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. + 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. */ - 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); + 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; } - break; - } #endif - /* - ** PRAGMA [schema.]incremental_vacuum(N) - ** - ** Do N steps of incremental vacuuming on a database. - */ + /* + ** 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; + 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; } - 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); + /* + ** 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; } - 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; + /* + ** 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); } - setAllPagerFlags(db); + break; } - 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); + /* + ** 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); + sz = -1; + rc = sqlite3_file_control(db, zDb, SQLITE_FCNTL_MMAP_SIZE, &sz); #else - sz = 0; - rc = SQLITE_OK; + sz = 0; + rc = SQLITE_OK; #endif - if( rc==SQLITE_OK ){ - returnSingleInt(v, sz); - }else if( rc!=SQLITE_NOTFOUND ){ - pParse->nErr++; - pParse->rc = rc; + if (rc == SQLITE_OK) { + returnSingleInt(v, sz); + } else if (rc != SQLITE_NOTFOUND) { + pParse->nErr++; + pParse->rc = rc; + } + break; } - 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); + /* + ** 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; } - 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: { - sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); - if( !zRight ){ - returnSingleText(v, sqlite3_temp_directory); - }else{ + /* + ** 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: { + sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); + 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"); - sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); - goto pragma_out; + 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"); + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); + 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; } - } - 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 */ + } + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); + break; } - sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); - 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: { - sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); - if( !zRight ){ - returnSingleText(v, sqlite3_data_directory); - }else{ + /* + ** 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: { + sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); + 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"); - sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); - goto pragma_out; + 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"); + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); + goto pragma_out; + } + } + sqlite3_free(sqlite3_data_directory); + if (zRight[0]) { + sqlite3_data_directory = sqlite3_mprintf("%s", zRight); + } else { + sqlite3_data_directory = 0; } - } - sqlite3_free(sqlite3_data_directory); - if( zRight[0] ){ - sqlite3_data_directory = sqlite3_mprintf("%s", zRight); - }else{ - sqlite3_data_directory = 0; - } #endif /* SQLITE_OMIT_WSD */ + } + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); + break; } - sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); - 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); + /* + ** 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 { - res=sqlite3OsFileControl(pFile, SQLITE_SET_LOCKPROXYFILE, - NULL); - } - if( res!=SQLITE_OK ){ - sqlite3ErrorMsg(pParse, "failed to set lock proxy file"); - goto pragma_out; + 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; } - 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); + /* + ** 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; } - 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); - } + 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); - } + 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); + 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); + /* 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; } - 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 */ + /* + ** 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; i < pTab->nCol; 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); } } - 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; + 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); + /* + ** 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; ii < db->nDb; 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; } - if( db->mallocFailed ){ - sqlite3ErrorMsg(db->pParse, "out of memory"); - db->pParse->rc = SQLITE_NOMEM_BKPT; + 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; } - 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 - ); + 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; + } 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); + 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; i < mx; i++) { + i16 cnum = pIdx->aiColumn[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], i < pIdx->nKeyCol); + } + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, pParse->nMem); + } } - sqlite3VdbeAddOp2(v, OP_ResultRow, 1, pParse->nMem); } - } - } - break; + 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); + 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; + 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_DATABASE_LIST: { + int i; + pParse->nMem = 3; + for (i = 0; i < db->nDb; 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; + 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); + case PragTyp_FUNCTION_LIST: { + int i; + HashElem* j; + FuncDef* p; + int showInternFunc = (db->mDbFlags & DBFLAG_InternalFunc) != 0; + pParse->nMem = 6; + for (i = 0; i < SQLITE_FUNC_HASH_SZ; i++) { + for (p = sqlite3BuiltinFunctions.a[i]; p; p = p->u.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; + 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; + 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"); + case PragTyp_FOREIGN_KEY_LIST: + if (zRight) { + FKey* pFK; + Table* pTab; + pTab = sqlite3FindTable(db, zRight, zDb); + if (pTab && IsOrdinaryTable(pTab)) { + pFK = pTab->u.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; j < pFK->nCol; 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; + } } - ++i; - pFK = pFK->pNextFrom; } } - } - } - break; + 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{ + 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; - break; + } else { + pTab = (Table*)sqliteHashData(k); + k = sqliteHashNext(k); } - } - 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 ); + 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->nTab < i) + pParse->nTab = 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; j < pFK->nCol; 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); + /* 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); } - 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); } - sqlite3VdbeAddOp2(v, OP_Next, 0, addrTop+1); VdbeCoverage(v); - sqlite3VdbeJumpHere(v, addrTop); - } - } - break; + } 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; + /* 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 +#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 */ + /* 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'); + 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; + /* 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); } - }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 */ + 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 */ + /* Do an integrity check on each database file */ + for (i = 0; i < db->nDb; 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; + if (OMIT_TEMPDB && i == 1) + continue; + if (iDb >= 0 && i != iDb) + continue; - sqlite3CodeVerifySchema(pParse, i); + 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 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; - /* 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 sufficient number of registers have been allocated */ + pParse->nMem = MAX(pParse->nMem, 8 + mxIdx); + sqlite3ClearTempRegCache(pParse); - /* 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 ){ + /* 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)")); } - 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{ + /* 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; j < pTab->nCol; 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); } - 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); + /* 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); } - 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); + 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; kk < pIdx->nKeyCol; kk++) { + int iCol = pIdx->aiColumn[kk]; + assert(iCol != XN_ROWID && iCol < pTab->nCol); + 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); } - 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); } - 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; + { + 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); + 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); } - sqlite3VdbeChangeP3(v, 0, sqlite3VdbeCurrentAddr(v)-2); - } - } - break; + } 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; + /* + ** 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); } - } - if( !pEnc->zName ){ - sqlite3ErrorMsg(pParse, "unsupported encoding: %s", zRight); } } - } - } - break; + } 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; + /* + ** 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; + /* + ** 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; + /* + ** 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)); } - } - pParse->nMem = 3; - sqlite3VdbeAddOp3(v, OP_Checkpoint, iBt, eMode, 1); - sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3); - } - break; + returnSingleInt(v, db->xWalCallback == sqlite3WalDefaultHook ? SQLITE_PTR_TO_INT(db->pWalArg) : 0); + } break; +#endif - /* - ** 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)); + /* + ** 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; } - 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); - /* - ** 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 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); } - } - 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; } - 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)); + /* + ** 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; } - 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 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 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 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; - } + /* + ** 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]; + /* + ** 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; i < db->nDb; 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); } - sqlite3VdbeMultiLoad(v, 1, "ss", db->aDb[i].zDbSName, zState); + break; } - break; - } #endif #if defined(SQLITE_ENABLE_CEROD) - case PragTyp_ACTIVATE_EXTENSIONS: if( zRight ){ - if( sqlite3StrNICmp(zRight, "cerod-", 6)==0 ){ - sqlite3_activate_cerod(&zRight[6]); - } - } - break; + case PragTyp_ACTIVATE_EXTENSIONS: + if (zRight) { + if (sqlite3StrNICmp(zRight, "cerod-", 6) == 0) { + sqlite3_activate_cerod(&zRight[6]); + } + } + break; #endif } /* End of the PRAGMA switch */ @@ -134206,7 +132421,7 @@ SQLITE_PRIVATE void sqlite3Pragma( ** 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 ){ + if ((pPragma->mPragFlg & PragFlg_NoColumns1) && zRight) { sqlite3VdbeVerifyNoResultRow(v); } @@ -134222,31 +132437,25 @@ SQLITE_PRIVATE void sqlite3Pragma( 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 */ + 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 */ + sqlite3_stmt* pPragma; /* The pragma statement to run */ sqlite_int64 iRowid; /* Current rowid */ - char *azArg[2]; /* Value of the argument and schema */ + 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; +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 = '('; @@ -134257,39 +132466,39 @@ static int pragmaVtabConnect( 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++){ + for (i = 0, j = pPragma->iPragCName; i < pPragma->nPragCName; i++, j++) { sqlite3_str_appendf(&acc, "%c\"%s\"", cSep, pragCName[j]); cSep = ','; } - if( i==0 ){ + if (i == 0) { sqlite3_str_appendf(&acc, "(\"%s\"", pPragma->zName); i++; } j = 0; - if( pPragma->mPragFlg & PragFlg_Result1 ){ + if (pPragma->mPragFlg & PragFlg_Result1) { sqlite3_str_appendall(&acc, ",arg HIDDEN"); j++; } - if( pPragma->mPragFlg & (PragFlg_SchemaOpt|PragFlg_SchemaReq) ){ + 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 ); + assert(strlen(zBuf) < sizeof(zBuf) - 1); rc = sqlite3_declare_vtab(db, zBuf); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pTab = (PragmaVtab*)sqlite3_malloc(sizeof(PragmaVtab)); - if( pTab==0 ){ + if (pTab == 0) { rc = SQLITE_NOMEM; - }else{ + } else { memset(pTab, 0, sizeof(PragmaVtab)); pTab->pName = pPragma; pTab->db = db; pTab->iHidden = i; pTab->nHidden = j; } - }else{ + } else { *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); } @@ -134300,8 +132509,8 @@ static int pragmaVtabConnect( /* ** Pragma virtual table module xDisconnect method. */ -static int pragmaVtabDisconnect(sqlite3_vtab *pVtab){ - PragmaVtab *pTab = (PragmaVtab*)pVtab; +static int pragmaVtabDisconnect(sqlite3_vtab* pVtab) { + PragmaVtab* pTab = (PragmaVtab*)pVtab; sqlite3_free(pTab); return SQLITE_OK; } @@ -134313,47 +132522,54 @@ static int pragmaVtabDisconnect(sqlite3_vtab *pVtab){ ** 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; +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; } + 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; + for (i = 0; i < pIdxInfo->nConstraint; 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; + assert(j < 2); + seen[j] = i + 1; } - if( seen[0]==0 ){ + if (seen[0] == 0) { pIdxInfo->estimatedCost = (double)2147483647; pIdxInfo->estimatedRows = 2147483647; return SQLITE_OK; } - j = seen[0]-1; + j = seen[0] - 1; pIdxInfo->aConstraintUsage[j].argvIndex = 1; pIdxInfo->aConstraintUsage[j].omit = 1; - if( seen[1]==0 ) return SQLITE_OK; + if (seen[1] == 0) + return SQLITE_OK; pIdxInfo->estimatedCost = (double)20; pIdxInfo->estimatedRows = 20; - j = seen[1]-1; + 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; +static int pragmaVtabOpen(sqlite3_vtab* pVtab, sqlite3_vtab_cursor** ppCursor) { + PragmaVtabCursor* pCsr; pCsr = (PragmaVtabCursor*)sqlite3_malloc(sizeof(*pCsr)); - if( pCsr==0 ) return SQLITE_NOMEM; + if (pCsr == 0) + return SQLITE_NOMEM; memset(pCsr, 0, sizeof(PragmaVtabCursor)); pCsr->base.pVtab = pVtab; *ppCursor = &pCsr->base; @@ -134361,33 +132577,33 @@ static int pragmaVtabOpen(sqlite3_vtab *pVtab, sqlite3_vtab_cursor **ppCursor){ } /* Clear all content from pragma virtual table cursor. */ -static void pragmaVtabCursorClear(PragmaVtabCursor *pCsr){ +static void pragmaVtabCursorClear(PragmaVtabCursor* pCsr) { int i; sqlite3_finalize(pCsr->pPragma); pCsr->pPragma = 0; - for(i=0; iazArg); i++){ + for (i = 0; i < ArraySize(pCsr->azArg); 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; +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; +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) ){ + assert(pCsr->pPragma); + if (SQLITE_ROW != sqlite3_step(pCsr->pPragma)) { rc = sqlite3_finalize(pCsr->pPragma); pCsr->pPragma = 0; pragmaVtabCursorClear(pCsr); @@ -134398,47 +132614,44 @@ static int pragmaVtabNext(sqlite3_vtab_cursor *pVtabCursor){ /* ** 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); +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; + 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 ){ + j = (pTab->pName->mPragFlg & PragFlg_Result1) != 0 ? 0 : 1; + for (i = 0; i < argc; i++, j++) { + const char* zText = (const char*)sqlite3_value_text(argv[i]); + assert(j < ArraySize(pCsr->azArg)); + assert(pCsr->azArg[j] == 0); + if (zText) { pCsr->azArg[j] = sqlite3_mprintf("%s", zText); - if( pCsr->azArg[j]==0 ){ + 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] ){ + if (pCsr->azArg[1]) { sqlite3_str_appendf(&acc, "%Q.", pCsr->azArg[1]); } sqlite3_str_appendall(&acc, pTab->pName->zName); - if( pCsr->azArg[0] ){ + if (pCsr->azArg[0]) { sqlite3_str_appendf(&acc, "=%Q", pCsr->azArg[0]); } zSql = sqlite3StrAccumFinish(&acc); - if( zSql==0 ) return SQLITE_NOMEM; + if (zSql == 0) + return SQLITE_NOMEM; rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pCsr->pPragma, 0); sqlite3_free(zSql); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { pTab->base.zErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pTab->db)); return rc; } @@ -134448,25 +132661,21 @@ static int pragmaVtabFilter( /* ** Pragma virtual table module xEof method. */ -static int pragmaVtabEof(sqlite3_vtab_cursor *pVtabCursor){ - PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; - return (pCsr->pPragma==0); +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 ){ +static int pragmaVtabColumn(sqlite3_vtab_cursor* pVtabCursor, sqlite3_context* ctx, int i) { + PragmaVtabCursor* pCsr = (PragmaVtabCursor*)pVtabCursor; + PragmaVtab* pTab = (PragmaVtab*)(pVtabCursor->pVtab); + if (i < pTab->iHidden) { sqlite3_result_value(ctx, sqlite3_column_value(pCsr->pPragma, i)); - }else{ - sqlite3_result_text(ctx, pCsr->azArg[i-pTab->iHidden],-1,SQLITE_TRANSIENT); + } else { + sqlite3_result_text(ctx, pCsr->azArg[i - pTab->iHidden], -1, SQLITE_TRANSIENT); } return SQLITE_OK; } @@ -134474,38 +132683,38 @@ static int pragmaVtabColumn( /* ** Pragma virtual table module xRowid method. */ -static int pragmaVtabRowid(sqlite3_vtab_cursor *pVtabCursor, sqlite_int64 *p){ - PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; +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 */ + 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 */ }; /* @@ -134513,13 +132722,15 @@ static const sqlite3_module pragmaVtabModule = { ** 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 ); +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); } @@ -134550,35 +132761,28 @@ SQLITE_PRIVATE Module *sqlite3PragmaVtabRegister(sqlite3 *db, const char *zName) ** 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 ){ +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 ){ + } 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 - ); + } 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 ){ + } else if (db->flags & SQLITE_WriteSchema) { pData->rc = SQLITE_CORRUPT_BKPT; - }else{ - char *z; - const char *zObj = azObj[1] ? azObj[1] : "?"; + } 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); + if (zExtra && zExtra[0]) + z = sqlite3MPrintf(db, "%z - %s", z, zExtra); *pData->pzErrMsg = z; pData->rc = SQLITE_CORRUPT_BKPT; } @@ -134589,26 +132793,25 @@ static void corruptSchema( ** 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; +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 */ +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. @@ -134623,28 +132826,27 @@ static int sqlite3Prepare( ** 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; +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 ); + assert(argc == 5); UNUSED_PARAMETER2(NotUsed, argc); - assert( sqlite3_mutex_held(db->mutex) ); + assert(sqlite3_mutex_held(db->mutex)); db->mDbFlags |= DBFLAG_EncodingFixed; - if( argv==0 ) return 0; /* Might happen if EMPTY_RESULT_CALLBACKS are on */ + if (argv == 0) + return 0; /* Might happen if EMPTY_RESULT_CALLBACKS are on */ pData->nInitRow++; - if( db->mallocFailed ){ + if (db->mallocFailed) { corruptSchema(pData, argv, 0); return 1; } - assert( iDb>=0 && iDbnDb ); - if( argv[3]==0 ){ + assert(iDb >= 0 && iDb < db->nDb); + 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]] ){ + } 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 @@ -134657,60 +132859,55 @@ SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char */ int rc; u8 saved_iDb = db->init.iDb; - sqlite3_stmt *pStmt; - TESTONLY(int rcp); /* Return code from sqlite3_prepare() */ + sqlite3_stmt* pStmt; + TESTONLY(int rcp); /* Return code from sqlite3_prepare() */ - assert( db->init.busy ); + 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 ){ + 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); + TESTONLY(rcp =) sqlite3Prepare(db, argv[4], -1, 0, 0, &pStmt, 0); rc = db->errCode; - assert( (rc&0xFF)==(rcp&0xFF) ); + 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 ){ + 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 ){ + } 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) ){ + } else if (argv[1] == 0 || (argv[4] != 0 && argv[4][0] != 0)) { corruptSchema(pData, argv, 0); - }else{ + } 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; + Index* pIndex; pIndex = sqlite3FindIndex(db, argv[1], db->aDb[iDb].zDbSName); - if( pIndex==0 ){ + 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 ){ + } 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"); } } @@ -134726,25 +132923,25 @@ SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char ** 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){ +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]; + Db* pDb; + char const* azArg[6]; int meta[5]; InitData initData; - const char *zSchemaTabName; + 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) ); + assert((db->mDbFlags & DBFLAG_SchemaKnownOk) == 0); + assert(iDb >= 0 && iDb < db->nDb); + assert(db->aDb[iDb].pSchema); + assert(sqlite3_mutex_held(db->mutex)); + assert(iDb == 1 || sqlite3BtreeHoldsMutex(db->aDb[iDb].pBt)); db->init.busy = 1; @@ -134758,7 +132955,7 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl azArg[2] = azArg[1]; azArg[3] = "1"; azArg[4] = "CREATE TABLE x(type text,name text,tbl_name text," - "rootpage int,sql text)"; + "rootpage int,sql text)"; azArg[5] = 0; initData.db = db; initData.iDb = iDb; @@ -134767,18 +132964,18 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl initData.mInitFlags = mFlags; initData.nInitRow = 0; initData.mxPage = 0; - sqlite3InitCallback(&initData, 5, (char **)azArg, 0); + sqlite3InitCallback(&initData, 5, (char**)azArg, 0); db->mDbFlags &= mask; - if( initData.rc ){ + 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 ); + if (pDb->pBt == 0) { + assert(iDb == 1); DbSetProperty(db, 1, DB_SchemaLoaded); rc = SQLITE_OK; goto error_out; @@ -134788,9 +132985,9 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl ** 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 ){ + if (sqlite3BtreeTxnState(pDb->pBt) == SQLITE_TXN_NONE) { rc = sqlite3BtreeBeginTrans(pDb->pBt, 0, 0); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { sqlite3SetString(pzErrMsg, db, sqlite3ErrStr(rc)); goto initone_error_out; } @@ -134814,35 +133011,37 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl ** 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]); + for (i = 0; i < ArraySize(meta); i++) { + sqlite3BtreeGetMeta(pDb->pBt, i + 1, (u32*)&meta[i]); } - if( (db->flags & SQLITE_ResetDatabase)!=0 ){ + if ((db->flags & SQLITE_ResetDatabase) != 0) { memset(meta, 0, sizeof(meta)); } - pDb->pSchema->schema_cookie = meta[BTREE_SCHEMA_VERSION-1]; + 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 ){ + 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; + encoding = (u8)meta[BTREE_TEXT_ENCODING - 1] & 3; + if (encoding == 0) + encoding = SQLITE_UTF8; #else encoding = SQLITE_UTF8; #endif sqlite3SetTextEncoding(db, encoding); - }else{ + } 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"); + 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; } @@ -134850,10 +133049,12 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl } pDb->pSchema->enc = ENC(db); - if( pDb->pSchema->cache_size==0 ){ + 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; } + 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; @@ -134867,11 +133068,11 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl ** 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 = (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 ){ + if (pDb->pSchema->file_format > SQLITE_MAX_FILE_FORMAT) { sqlite3SetString(pzErrMsg, db, "unsupported file format"); rc = SQLITE_ERROR; goto initone_error_out; @@ -134882,19 +133083,17 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl ** 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 ){ + 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 ); + */ + 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); + char* zSql; + zSql = sqlite3MPrintf(db, "SELECT*FROM\"%w\".%s ORDER BY rowid", db->aDb[iDb].zDbSName, zSchemaTabName); #ifndef SQLITE_OMIT_AUTHORIZATION { sqlite3_xauth xAuth; @@ -134906,21 +133105,21 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl db->xAuth = xAuth; } #endif - if( rc==SQLITE_OK ) rc = initData.rc; + if (rc == SQLITE_OK) + rc = initData.rc; sqlite3DbFree(db, zSql); #ifndef SQLITE_OMIT_ANALYZE - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { sqlite3AnalysisLoad(db, iDb); } #endif } - assert( pDb == &(db->aDb[iDb]) ); - if( db->mallocFailed ){ + 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)){ + } 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, @@ -134940,14 +133139,14 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl ** before that point, jump to error_out. */ initone_error_out: - if( openedTransaction ){ + if (openedTransaction) { sqlite3BtreeCommit(pDb->pBt); } sqlite3BtreeLeave(pDb->pBt); error_out: - if( rc ){ - if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ + if (rc) { + if (rc == SQLITE_NOMEM || rc == SQLITE_IOERR_NOMEM) { sqlite3OomFault(db); } sqlite3ResetOneSchema(db, iDb); @@ -134965,29 +133164,31 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl ** 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){ +SQLITE_PRIVATE int sqlite3Init(sqlite3* db, char** pzErrMsg) { int i, rc; - int commit_internal = !(db->mDbFlags&DBFLAG_SchemaChange); + int commit_internal = !(db->mDbFlags & DBFLAG_SchemaChange); - assert( sqlite3_mutex_held(db->mutex) ); - assert( sqlite3BtreeHoldsMutex(db->aDb[0].pBt) ); - assert( db->init.busy==0 ); + 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 ); + assert(db->nDb > 0); /* Do the main schema first */ - if( !DbHasProperty(db, 0, DB_SchemaLoaded) ){ + if (!DbHasProperty(db, 0, DB_SchemaLoaded)) { rc = sqlite3InitOne(db, 0, pzErrMsg, 0); - if( rc ) return rc; + 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) ){ + 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 (rc) + return rc; } } - if( commit_internal ){ + if (commit_internal) { sqlite3CommitInternalChanges(db); } return SQLITE_OK; @@ -134997,66 +133198,67 @@ SQLITE_PRIVATE int sqlite3Init(sqlite3 *db, char **pzErrMsg){ ** 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){ +SQLITE_PRIVATE int sqlite3ReadSchema(Parse* pParse) { int rc = SQLITE_OK; - sqlite3 *db = pParse->db; - assert( sqlite3_mutex_held(db->mutex) ); - if( !db->init.busy ){ + sqlite3* db = pParse->db; + assert(sqlite3_mutex_held(db->mutex)); + if (!db->init.busy) { rc = sqlite3Init(db, &pParse->zErrMsg); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { pParse->rc = rc; pParse->nErr++; - }else if( db->noSharedCache ){ + } 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; +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; + assert(pParse->checkSchema); + assert(sqlite3_mutex_held(db->mutex)); + for (iDb = 0; iDb < db->nDb; 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 ){ + if (sqlite3BtreeTxnState(pBt) == SQLITE_TXN_NONE) { rc = sqlite3BtreeBeginTrans(pBt, 0, 0); - if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ + if (rc == SQLITE_NOMEM || rc == SQLITE_IOERR_NOMEM) { sqlite3OomFault(db); pParse->rc = SQLITE_NOMEM; } - if( rc!=SQLITE_OK ) return; + 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 ){ + 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 ){ + if (openedTransaction) { sqlite3BtreeCommit(pBt); } } @@ -135069,7 +133271,7 @@ static void schemaIsValid(Parse *pParse){ ** If the same database is attached more than once, the first ** attached database is returned. */ -SQLITE_PRIVATE int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){ +SQLITE_PRIVATE int sqlite3SchemaToIndex(sqlite3* db, Schema* pSchema) { int i = -32768; /* If pSchema is NULL, then return -32768. This happens when code in @@ -135083,15 +133285,15 @@ SQLITE_PRIVATE int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){ ** 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 ){ + assert(sqlite3_mutex_held(db->mutex)); + if (pSchema) { + for (i = 0; 1; i++) { + assert(i < db->nDb); + if (db->aDb[i].pSchema == pSchema) { break; } } - assert( i>=0 && inDb ); + assert(i >= 0 && i < db->nDb); } return i; } @@ -135099,28 +133301,28 @@ SQLITE_PRIVATE int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){ /* ** 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 ); +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; + 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 ){ + if (pParse->pConstExpr) { sqlite3ExprListDelete(db, pParse->pConstExpr); } - assert( db->lookaside.bDisable >= pParse->disableLookaside ); + 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 ); + assert(pParse->db->pParse == pParse); db->pParse = pParse->pOuterParse; pParse->db = 0; pParse->disableLookaside = 0; @@ -135154,18 +133356,17 @@ SQLITE_PRIVATE void sqlite3ParseObjectReset(Parse *pParse){ ** ** 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 ){ +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{ + } else { xCleanup(pParse->db, pPtr); pPtr = 0; #if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) @@ -135184,14 +133385,15 @@ SQLITE_PRIVATE void *sqlite3ParserAddCleanup( ** Caution: Do not confuse this routine with sqlite3ParseObjectInit() which ** is generated by Lemon. */ -SQLITE_PRIVATE void sqlite3ParseObjectInit(Parse *pParse, sqlite3 *db){ +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 ); + assert(db->pParse != pParse); pParse->pOuterParse = db->pParse; db->pParse = pParse; pParse->db = db; - if( db->mallocFailed ) sqlite3ErrorMsg(pParse, "out of memory"); + if (db->mallocFailed) + sqlite3ErrorMsg(pParse, "out of memory"); } /* @@ -135199,24 +133401,23 @@ SQLITE_PRIVATE void sqlite3ParseObjectInit(Parse *pParse, sqlite3 *db){ ** that returns SQLITE_ERROR_RETRY. */ #ifndef SQLITE_MAX_PREPARE_RETRY -# define SQLITE_MAX_PREPARE_RETRY 25 +#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 */ +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); @@ -135225,18 +133426,19 @@ static int sqlite3Prepare( 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) ); + 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 ){ + if (prepFlags & SQLITE_PREPARE_PERSISTENT) { sParse.disableLookaside++; DisableLookaside; } - sParse.disableVtab = (prepFlags & SQLITE_PREPARE_NO_VTAB)!=0; + 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 @@ -135261,16 +133463,16 @@ static int sqlite3Prepare( ** 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) ); + if (!db->noSharedCache) { + for (i = 0; i < db->nDb; i++) { + Btree* pBt = db->aDb[i].pBt; + if (pBt) { + assert(sqlite3BtreeHoldsMutex(pBt)); rc = sqlite3BtreeSchemaLocked(pBt); - if( rc ){ - const char *zDb = db->aDb[i].zDbSName; + if (rc) { + const char* zDb = db->aDb[i].zDbSName; sqlite3ErrorWithMsg(db, rc, "database schema is locked: %s", zDb); - testcase( db->flags & SQLITE_ReadUncommit ); + testcase(db->flags & SQLITE_ReadUncommit); goto end_prepare; } } @@ -135279,66 +133481,65 @@ static int sqlite3Prepare( sqlite3VtabUnlockList(db); - if( nBytes>=0 && (nBytes==0 || zSql[nBytes-1]!=0) ){ - char *zSqlCopy; + 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 ){ + 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 ){ + if (zSqlCopy) { sqlite3RunParser(&sParse, zSqlCopy); - sParse.zTail = &zSql[sParse.zTail-zSqlCopy]; + sParse.zTail = &zSql[sParse.zTail - zSqlCopy]; sqlite3DbFree(db, zSqlCopy); - }else{ + } else { sParse.zTail = &zSql[nBytes]; } - }else{ + } else { sqlite3RunParser(&sParse, zSql); } - assert( 0==sParse.nQueryLoop ); + assert(0 == sParse.nQueryLoop); - if( pzTail ){ + if (pzTail) { *pzTail = sParse.zTail; } - if( db->init.busy==0 ){ - sqlite3VdbeSetSql(sParse.pVdbe, zSql, (int)(sParse.zTail-zSql), prepFlags); + if (db->init.busy == 0) { + sqlite3VdbeSetSql(sParse.pVdbe, zSql, (int)(sParse.zTail - zSql), prepFlags); } - if( db->mallocFailed ){ + 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 ){ + if (sParse.rc != SQLITE_OK && sParse.rc != SQLITE_DONE) { + if (sParse.checkSchema && db->init.busy == 0) { schemaIsValid(&sParse); } - if( sParse.pVdbe ){ + if (sParse.pVdbe) { sqlite3VdbeFinalize(sParse.pVdbe); } - assert( 0==(*ppStmt) ); + assert(0 == (*ppStmt)); rc = sParse.rc; - if( sParse.zErrMsg ){ + if (sParse.zErrMsg) { sqlite3ErrorWithMsg(db, rc, "%s", sParse.zErrMsg); sqlite3DbFree(db, sParse.zErrMsg); - }else{ + } else { sqlite3Error(db, rc); } - }else{ - assert( sParse.zErrMsg==0 ); + } 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; + while (sParse.pTriggerPrg) { + TriggerPrg* pT = sParse.pTriggerPrg; sParse.pTriggerPrg = pT->pNext; sqlite3DbFree(db, pT); } @@ -135348,45 +133549,45 @@ static int sqlite3Prepare( 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 */ -){ +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; + if (ppStmt == 0) + return SQLITE_MISUSE_BKPT; #endif *ppStmt = 0; - if( !sqlite3SafetyCheckOk(db)||zSql==0 ){ + if (!sqlite3SafetyCheckOk(db) || zSql == 0) { return SQLITE_MISUSE_BKPT; } sqlite3_mutex_enter(db->mutex); sqlite3BtreeEnterAll(db); - do{ + 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++)mallocFailed) + break; + } while ((rc == SQLITE_ERROR_RETRY && (cnt++) < SQLITE_MAX_PREPARE_RETRY) || + (rc == SQLITE_SCHEMA && (sqlite3ResetOneSchema(db, -1), cnt++) == 0)); sqlite3BtreeLeaveAll(db); rc = sqlite3ApiExit(db, rc); - assert( (rc&db->errMask)==rc ); + assert((rc & db->errMask) == rc); db->busyHandler.nBusy = 0; sqlite3_mutex_leave(db->mutex); return rc; } - /* ** Rerun the compilation of a statement after a schema change. ** @@ -135395,28 +133596,28 @@ static int sqlite3LockAndPrepare( ** locked the sqlite3_schema table, return SQLITE_LOCKED. If any other error ** occurs, return SQLITE_SCHEMA. */ -SQLITE_PRIVATE int sqlite3Reprepare(Vdbe *p){ +SQLITE_PRIVATE int sqlite3Reprepare(Vdbe* p) { int rc; - sqlite3_stmt *pNew; - const char *zSql; - sqlite3 *db; + 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 */ + 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) ); + assert(sqlite3_mutex_held(db->mutex)); prepFlags = sqlite3VdbePrepareFlags(p); rc = sqlite3LockAndPrepare(db, zSql, -1, prepFlags, p, &pNew, 0); - if( rc ){ - if( rc==SQLITE_NOMEM ){ + if (rc) { + if (rc == SQLITE_NOMEM) { sqlite3OomFault(db); } - assert( pNew==0 ); + assert(pNew == 0); return rc; - }else{ - assert( pNew!=0 ); + } else { + assert(pNew != 0); } sqlite3VdbeSwap((Vdbe*)pNew, p); sqlite3TransferBindings(pNew, (sqlite3_stmt*)p); @@ -135425,7 +133626,6 @@ SQLITE_PRIVATE int sqlite3Reprepare(Vdbe *p){ 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 @@ -135434,44 +133634,40 @@ SQLITE_PRIVATE int sqlite3Reprepare(Vdbe *p){ ** 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 */ -){ +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 */ + 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 */ -){ +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 */ -){ + 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, @@ -135480,61 +133676,59 @@ SQLITE_API int sqlite3_prepare_v3( ** ** 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 ); + 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 */ -){ +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; + char* zSql8; + const char* zTail8 = 0; int rc = SQLITE_OK; #ifdef SQLITE_ENABLE_API_ARMOR - if( ppStmt==0 ) return SQLITE_MISUSE_BKPT; + if (ppStmt == 0) + return SQLITE_MISUSE_BKPT; #endif *ppStmt = 0; - if( !sqlite3SafetyCheckOk(db)||zSql==0 ){ + if (!sqlite3SafetyCheckOk(db) || zSql == 0) { return SQLITE_MISUSE_BKPT; } - if( nBytes>=0 ){ + if (nBytes >= 0) { int sz; - const char *z = (const char*)zSql; - for(sz=0; szmutex); zSql8 = sqlite3Utf16to8(db, zSql, nBytes, SQLITE_UTF16NATIVE); - if( zSql8 ){ + if (zSql8) { rc = sqlite3LockAndPrepare(db, zSql8, -1, prepFlags, 0, ppStmt, &zTail8); } - if( zTail8 && pzTail ){ + 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); + int chars_parsed = sqlite3Utf8CharLen(zSql8, (int)(zTail8 - zSql8)); + *pzTail = (u8*)zSql + sqlite3Utf16ByteLen(zSql, chars_parsed); } sqlite3DbFree(db, zSql8); rc = sqlite3ApiExit(db, rc); @@ -135550,43 +133744,38 @@ static int sqlite3Prepare16( ** 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 */ -){ +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 */ + 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 */ -){ +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 */ + 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 */ -){ +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 */ + 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; } @@ -135617,10 +133806,10 @@ SQLITE_API int sqlite3_prepare16_v3( */ 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 */ + 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 */ }; /* @@ -135643,26 +133832,26 @@ struct DistinctCtx { */ 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 */ + 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[] */ + 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) */ + 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 */ + struct RowLoadInfo* pDeferredRowLoad; /* Deferred row loading info or NULL */ }; -#define SORTFLAG_UseSorter 0x01 /* Use SorterOpen instead of OpenEphemeral */ +#define SORTFLAG_UseSorter 0x01 /* Use SorterOpen instead of OpenEphemeral */ /* ** Delete all the content of a Select structure. Deallocate the structure @@ -135671,9 +133860,9 @@ struct SortCtx { ** 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; +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); @@ -135681,17 +133870,19 @@ static void clearSelect(sqlite3 *db, Select *p, int bFree){ sqlite3ExprDelete(db, p->pHaving); sqlite3ExprListDelete(db, p->pOrderBy); sqlite3ExprDelete(db, p->pLimit); - if( OK_IF_ALWAYS_TRUE(p->pWith) ) sqlite3WithDelete(db, p->pWith); + if (OK_IF_ALWAYS_TRUE(p->pWith)) + sqlite3WithDelete(db, p->pWith); #ifndef SQLITE_OMIT_WINDOWFUNC - if( OK_IF_ALWAYS_TRUE(p->pWinDefn) ){ + if (OK_IF_ALWAYS_TRUE(p->pWinDefn)) { sqlite3WindowListDelete(db, p->pWinDefn); } - while( p->pWin ){ - assert( p->pWin->ppThis==&p->pWin ); + while (p->pWin) { + assert(p->pWin->ppThis == &p->pWin); sqlite3WindowUnlinkFromSelect(p->pWin); } #endif - if( bFree ) sqlite3DbFreeNN(db, p); + if (bFree) + sqlite3DbFreeNN(db, p); p = pPrior; bFree = 1; } @@ -135700,7 +133891,7 @@ static void clearSelect(sqlite3 *db, Select *p, int bFree){ /* ** Initialize a SelectDest structure. */ -SQLITE_PRIVATE void sqlite3SelectDestInit(SelectDest *pDest, int eDest, int iParm){ +SQLITE_PRIVATE void sqlite3SelectDestInit(SelectDest* pDest, int eDest, int iParm) { pDest->eDest = (u8)eDest; pDest->iSDParm = iParm; pDest->iSDParm2 = 0; @@ -135709,32 +133900,29 @@ SQLITE_PRIVATE void sqlite3SelectDestInit(SelectDest *pDest, int eDest, int iPar 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 */ -){ +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 ); + 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)); + if (pEList == 0) { + pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(pParse->db, TK_ASTERISK, 0)); } pNew->pEList = pEList; pNew->op = TK_SELECT; @@ -135745,7 +133933,8 @@ SQLITE_PRIVATE Select *sqlite3SelectNew( pNew->addrOpenEphm[0] = -1; pNew->addrOpenEphm[1] = -1; pNew->nSelectRow = 0; - if( pSrc==0 ) pSrc = sqlite3DbMallocZero(pParse->db, sizeof(*pSrc)); + if (pSrc == 0) + pSrc = sqlite3DbMallocZero(pParse->db, sizeof(*pSrc)); pNew->pSrc = pSrc; pNew->pWhere = pWhere; pNew->pGroupBy = pGroupBy; @@ -135759,28 +133948,29 @@ SQLITE_PRIVATE Select *sqlite3SelectNew( pNew->pWin = 0; pNew->pWinDefn = 0; #endif - if( pParse->db->mallocFailed ) { - clearSelect(pParse->db, pNew, pNew!=&standin); + if (pParse->db->mallocFailed) { + clearSelect(pParse->db, pNew, pNew != &standin); pAllocated = 0; - }else{ - assert( pNew->pSrc!=0 || pParse->nErr>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); +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; +static Select* findRightmost(Select* p) { + while (p->pNext) + p = p->pNext; return p; } @@ -135847,55 +134037,57 @@ static Select *findRightmost(Select *p){ ** * 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){ +SQLITE_PRIVATE int sqlite3JoinType(Parse* pParse, Token* pA, Token* pB, Token* pC) { int jointype = 0; - Token *apAll[3]; - Token *p; - /* 0123456789 123456789 123456789 123 */ + 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 */ + 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 }, + /* (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++){ + 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 ){ + for (j = 0; j < ArraySize(aKeyword); j++) { + if (p->n == 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) ){ + 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); + 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; @@ -135905,12 +134097,13 @@ SQLITE_PRIVATE int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *p ** 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){ +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; + Column* pCol; + for (pCol = pTab->aCol, i = 0; i < pTab->nCol; pCol++, i++) { + if (pCol->hName == h && sqlite3StrICmp(pCol->zCnName, zCol) == 0) + return i; } return -1; } @@ -135918,15 +134111,15 @@ SQLITE_PRIVATE int sqlite3ColumnIndex(Table *pTab, const char *zCol){ /* ** 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 ); +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 ); + assert(pResults != 0); + assert(iCol >= 0 && iCol < pResults->nExpr); pResults->a[iCol].fg.bUsed = 1; } } @@ -135941,28 +134134,25 @@ SQLITE_PRIVATE void sqlite3SrcItemColumnUsed(SrcItem *pItem, int iCol){ ** ** 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 */ +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 */ + assert(iEnd < pSrc->nSrc); + assert(iStart >= 0); + assert((piTab == 0) == (piCol == 0)); /* Both or neither are NULL */ - for(i=iStart; i<=iEnd; i++){ + 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 ){ + if (iCol >= 0 && (bIgnoreHidden == 0 || IsHiddenColumn(&pSrc->a[i].pTab->aCol[iCol]) == 0)) { + if (piTab) { sqlite3SrcItemColumnUsed(&pSrc->a[i], iCol); *piTab = i; *piCol = iCol; @@ -135999,18 +134189,18 @@ static int tableAndColumnIndex( ** 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 ){ +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) ); + 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 ){ + if (p->op == TK_FUNCTION) { + assert(ExprUseXList(p)); + if (p->x.pList) { int i; - for(i=0; ix.pList->nExpr; i++){ + for (i = 0; i < p->x.pList->nExpr; i++) { sqlite3SetJoinExpr(p->x.pList->a[i].pExpr, iTable, joinFlag); } } @@ -136034,20 +134224,21 @@ SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr *p, int iTable, u32 joinFlag){ ** 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); +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 ){ + 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 ){ + if (p->op == TK_FUNCTION) { + assert(ExprUseXList(p)); + if (p->x.pList) { int i; - for(i=0; ix.pList->nExpr; i++){ + for (i = 0; i < p->x.pList->nExpr; i++) { unsetJoinExpr(p->x.pList->a[i].pExpr, iTable, nullable); } } @@ -136078,52 +134269,57 @@ static void unsetJoinExpr(Expr *p, int iTable, int nullable){ ** ** 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 */ +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; + for (i = 0; i < pSrc->nSrc - 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 (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); + 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 */ + for (j = 0; j < pRightTab->nCol; j++) { + char* zName; /* Name of column in the right table */ - if( IsHiddenColumn(&pRightTab->aCol[j]) ) continue; + if (IsHiddenColumn(&pRightTab->aCol[j])) + continue; zName = pRightTab->aCol[j].zCnName; - if( tableAndColumnIndex(pSrc, 0, i, zName, 0, 0, 1) ){ + 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) { + assert(pUsing->nId > 0); + assert(pUsing->a[pUsing->nId - 1].zName == 0); + pUsing->a[pUsing->nId - 1].zName = sqlite3DbStrDup(pParse->db, zName); } } } - if( pUsing ){ + if (pUsing) { pRight->fg.isUsing = 1; pRight->fg.isSynthUsing = 1; pRight->u3.pUsing = pUsing; } - if( pParse->nErr ) return 1; + if (pParse->nErr) + return 1; } /* Create extra terms on the WHERE clause for each column named @@ -136133,32 +134329,31 @@ static int sqlite3ProcessJoin(Parse *pParse, Select *p){ ** 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 */ + if (pRight->fg.isUsing) { + IdList* pList = pRight->u3.pUsing; + sqlite3* db = pParse->db; + assert(pList != 0); + for (j = 0; j < pList->nId; 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); + 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 ){ + 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. @@ -136172,33 +134367,29 @@ static int sqlite3ProcessJoin(Parse *pParse, Select *p){ ** 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); + 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 ){ + if (pFuncArgs) { pFuncArgs = sqlite3ExprListAppend(pParse, pFuncArgs, pE1); pE1 = sqlite3ExprFunction(pParse, pFuncArgs, &tkCoalesce, 0); } } - pE2 = sqlite3CreateColumnExpr(db, pSrc, i+1, iRightCol); + pE2 = sqlite3CreateColumnExpr(db, pSrc, i + 1, iRightCol); sqlite3SrcItemColumnUsed(pRight, iRightCol); pEq = sqlite3PExpr(pParse, TK_EQ, pE1, pE2); - assert( pE2!=0 || pEq==0 ); - if( pEq ){ + assert(pE2 != 0 || pEq == 0); + if (pEq) { ExprSetProperty(pEq, joinType); - assert( !ExprHasProperty(pEq, EP_TokenOnly|EP_Reduced) ); + assert(!ExprHasProperty(pEq, EP_TokenOnly | EP_Reduced)); ExprSetVVAProperty(pEq, EP_NoReduce); pEq->w.iJoin = pE2->iTable; } @@ -136209,7 +134400,7 @@ static int sqlite3ProcessJoin(Parse *pParse, Select *p){ /* Add the ON clause to the end of the WHERE clause, connected by ** an AND operator. */ - else if( pRight->u3.pOn ){ + 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; @@ -136225,11 +134416,11 @@ static int sqlite3ProcessJoin(Parse *pParse, Select *p){ */ typedef struct RowLoadInfo RowLoadInfo; struct RowLoadInfo { - int regResult; /* Store results in array of registers here */ - u8 ecelFlags; /* Flag argument to ExprCodeExprList() */ + 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 */ + ExprList* pExtra; /* Extra columns needed by sorter refs */ + int regExtraResult; /* Where to load the extra columns */ #endif }; @@ -136237,15 +134428,13 @@ struct RowLoadInfo { ** 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); +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 ){ + if (pInfo->pExtra) { sqlite3ExprCodeExprList(pParse, pInfo->pExtra, pInfo->regExtraResult, 0, 0); sqlite3ExprListDelete(pParse->db, pInfo->pExtra); } @@ -136258,20 +134447,14 @@ static void innerLoopLoadRow( ** ** Return the register in which the result is stored. */ -static int makeSorterRecord( - Parse *pParse, - SortCtx *pSort, - Select *pSelect, - int regBase, - int nBase -){ +static int makeSorterRecord(Parse* pParse, SortCtx* pSort, Select* pSelect, int regBase, int nBase) { int nOBSat = pSort->nOBSat; - Vdbe *v = pParse->pVdbe; + Vdbe* v = pParse->pVdbe; int regOut = ++pParse->nMem; - if( pSort->pDeferredRowLoad ){ + if (pSort->pDeferredRowLoad) { innerLoopLoadRow(pParse, pSelect, pSort->pDeferredRowLoad); } - sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase+nOBSat, nBase-nOBSat, regOut); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase + nOBSat, nBase - nOBSat, regOut); return regOut; } @@ -136279,27 +134462,26 @@ static int makeSorterRecord( ** 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 ); +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 @@ -136314,62 +134496,62 @@ static void pushOntoSorter( ** regOrigData is 0 to prevent this routine from trying to copy ** values that might not yet exist. */ - assert( nData==1 || regData==regOrigData || regOrigData==0 ); + assert(nData == 1 || regData == regOrigData || regOrigData == 0); - if( nPrefixReg ){ - assert( nPrefixReg==nExpr+bSeq ); + if (nPrefixReg) { + assert(nPrefixReg == nExpr + bSeq); regBase = regData - nPrefixReg; - }else{ + } else { regBase = pParse->nMem + 1; pParse->nMem += nBase; } - assert( pSelect->iOffset==0 || pSelect->iLimit!=0 ); - iLimit = pSelect->iOffset ? pSelect->iOffset+1 : pSelect->iLimit; + 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 */ + 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; + regPrevKey = pParse->nMem + 1; pParse->nMem += pSort->nOBSat; nKey = nExpr - pSort->nOBSat + bSeq; - if( bSeq ){ - addrFirst = sqlite3VdbeAddOp1(v, OP_IfNot, regBase+nExpr); - }else{ + 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; + 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); + 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); + 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 ){ + if (iLimit) { sqlite3VdbeAddOp2(v, OP_IfNot, iLimit, pSort->labelDone); VdbeCoverage(v); } @@ -136377,7 +134559,7 @@ static void pushOntoSorter( sqlite3ExprCodeMove(pParse, regBase, regPrevKey, pSort->nOBSat); sqlite3VdbeJumpHere(v, addrJmp); } - if( iLimit ){ + 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 @@ -136394,40 +134576,37 @@ static void pushOntoSorter( ** sqlite3WhereOrderByLimitOptLabel() function for additional info. */ int iCsr = pSort->iECursor; - sqlite3VdbeAddOp2(v, OP_IfNotZero, iLimit, sqlite3VdbeCurrentAddr(v)+4); + 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); + iSkip = sqlite3VdbeAddOp4Int(v, OP_IdxLE, iCsr, 0, regBase + nOBSat, nExpr - nOBSat); VdbeCoverage(v); sqlite3VdbeAddOp1(v, OP_Delete, iCsr); } - if( regRecord==0 ){ + if (regRecord == 0) { regRecord = makeSorterRecord(pParse, pSort, pSelect, regBase, nBase); } - if( pSort->sortFlags & SORTFLAG_UseSorter ){ + if (pSort->sortFlags & SORTFLAG_UseSorter) { op = OP_SorterInsert; - }else{ + } 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)); + 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); +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")); } } @@ -136475,43 +134654,42 @@ static void codeOffset( ** 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 */ -){ +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; + Vdbe* v = pParse->pVdbe; - switch( eTnctType ){ + switch (eTnctType) { case WHERE_DISTINCT_ORDERED: { int i; - int iJump; /* Jump destination */ - int regPrev; /* Previous row content */ + int iJump; /* Jump destination */ + int regPrev; /* Previous row content */ /* Allocate space for the previous row */ - iRet = regPrev = pParse->nMem+1; + iRet = regPrev = pParse->nMem + 1; pParse->nMem += nResultCol; iJump = sqlite3VdbeCurrentAddr(v) + nResultCol; - for(i=0; ia[i].pExpr); - if( ia[i].pExpr); + if (i < nResultCol - 1) { + sqlite3VdbeAddOp3(v, OP_Ne, regElem + i, iJump, regPrev + i); VdbeCoverage(v); - }else{ - sqlite3VdbeAddOp3(v, OP_Eq, regElem+i, addrRepeat, regPrev+i); + } else { + sqlite3VdbeAddOp3(v, OP_Eq, regElem + i, addrRepeat, regPrev + i); VdbeCoverage(v); - } - sqlite3VdbeChangeP4(v, -1, (const char *)pColl, P4_COLLSEQ); + } + sqlite3VdbeChangeP4(v, -1, (const char*)pColl, P4_COLLSEQ); sqlite3VdbeChangeP5(v, SQLITE_NULLEQ); } - assert( sqlite3VdbeCurrentAddr(v)==iJump || pParse->db->mallocFailed ); - sqlite3VdbeAddOp3(v, OP_Copy, regElem, regPrev, nResultCol-1); + assert(sqlite3VdbeCurrentAddr(v) == iJump || pParse->db->mallocFailed); + sqlite3VdbeAddOp3(v, OP_Copy, regElem, regPrev, nResultCol - 1); break; } @@ -136559,26 +134737,23 @@ static int codeDistinct( ** 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; +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 (sqlite3VdbeGetOp(v, iOpenEphAddr + 1)->opcode == OP_Explain) { + sqlite3VdbeChangeToNoop(v, iOpenEphAddr + 1); } - if( eTnctType==WHERE_DISTINCT_ORDERED ){ + 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); + VdbeOp* pOp = sqlite3VdbeGetOp(v, iOpenEphAddr); pOp->opcode = OP_Null; pOp->p1 = 1; pOp->p2 = iVal; @@ -136611,47 +134786,42 @@ static void fixDistinctOpenEph( ** 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 */ -){ +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 - ){ + ExprList* pExtra = 0; + for (i = 0; i < pEList->nExpr; 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; + for (j = 0; j < nDefer; j++) { + if (pSort->aDefer[j].iCsr == pExpr->iTable) + break; } - if( j==nDefer ){ - if( nDefer==ArraySize(pSort->aDefer) ){ + if (j == nDefer) { + if (nDefer == ArraySize(pSort->aDefer)) { continue; - }else{ + } else { int nKey = 1; int k; - Index *pPk = 0; - if( !HasRowid(pTab) ){ + Index* pPk = 0; + if (!HasRowid(pTab)) { pPk = sqlite3PrimaryKeyIndex(pTab); nKey = pPk->nKeyCol; } - for(k=0; kiTable = pExpr->iTable; - assert( ExprUseYTab(pNew) ); + assert(ExprUseYTab(pNew)); pNew->y.pTab = pExpr->y.pTab; pNew->iColumn = pPk ? pPk->aiColumn[k] : -1; pExtra = sqlite3ExprListAppend(pParse, pExtra, pNew); @@ -136681,17 +134851,16 @@ static void selectExprDefer( ** 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; +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 */ @@ -136705,31 +134874,33 @@ static void selectInnerLoop( ** 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) */ + int regResult; /* Start of memory holding current results */ + int regOrig; /* Start of memory holding full result (or 0) */ - assert( v ); - assert( p->pEList!=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 ); + 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 ){ + if (pDest->iSdst == 0) { + if (pSort) { nPrefixReg = pSort->pOrderBy->nExpr; - if( !(pSort->sortFlags & SORTFLAG_UseSorter) ) nPrefixReg++; + if (!(pSort->sortFlags & SORTFLAG_UseSorter)) + nPrefixReg++; pParse->nMem += nPrefixReg; } - pDest->iSdst = pParse->nMem+1; + pDest->iSdst = pParse->nMem + 1; pParse->nMem += nResultCol; - }else if( pDest->iSdst+nResultCol > pParse->nMem ){ + } 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 @@ -136739,49 +134910,49 @@ static void selectInnerLoop( } pDest->nSdst = nResultCol; regOrig = regResult = pDest->iSdst; - if( srcTab>=0 ){ - for(i=0; i= 0) { + for (i = 0; i < nResultCol; i++) { + sqlite3VdbeAddOp3(v, OP_Column, srcTab, i, regResult + i); VdbeComment((v, "%s", p->pEList->a[i].zEName)); } - }else if( eDest!=SRT_Exists ){ + } else if (eDest != SRT_Exists) { #ifdef SQLITE_ENABLE_SORTER_REFERENCES - ExprList *pExtra = 0; + 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 ){ + 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{ + } else { ecelFlags = 0; } - if( pSort && hasDistinct==0 && eDest!=SRT_EphemTab && eDest!=SRT_Table ){ + 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); + ecelFlags |= (SQLITE_ECEL_OMITREF | SQLITE_ECEL_REF); - for(i=pSort->nOBSat; ipOrderBy->nExpr; i++){ + for (i = pSort->nOBSat; i < pSort->pOrderBy->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; + 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 (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); + VdbeOp* pOp = sqlite3VdbeGetOp(v, pSort->addrSortIndex); pOp->p2 += (pExtra->nExpr - pSort->nDefer); pOp->p4.pKeyInfo->nAllField += (pExtra->nExpr - pSort->nDefer); pParse->nMem += pExtra->nExpr; @@ -136791,42 +134962,38 @@ static void selectInnerLoop( /* 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 + for (i = 0; i < pEList->nExpr; i++) { + if (pEList->a[i].u.x.iOrderByCol > 0 #ifdef SQLITE_ENABLE_SORTER_REFERENCES - || pEList->a[i].fg.bSorterRef + || 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 ); + 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 ); + 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{ + } else { innerLoopLoadRow(pParse, p, &sRowLoadInfo); } } @@ -136835,18 +135002,18 @@ static void selectInnerLoop( ** and this row has been seen before, then do not make this row ** part of the result. */ - if( hasDistinct ){ + if (hasDistinct) { int eType = pDistinct->eTnctType; int iTab = pDistinct->tabTnct; - assert( nResultCol==p->pEList->nExpr ); + assert(nResultCol == p->pEList->nExpr); iTab = codeDistinct(pParse, eType, iTab, iContinue, p->pEList, regResult); fixDistinctOpenEph(pParse, eType, iTab, pDistinct->addrTnct); - if( pSort==0 ){ + if (pSort == 0) { codeOffset(v, p->iOffset, iContinue); } } - switch( eDest ){ + switch (eDest) { /* In this mode, write each query result to the key of the temporary ** table iParm. */ @@ -136871,63 +135038,62 @@ static void selectInnerLoop( #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); + 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 (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); + sqlite3VdbeAddOp4Int(v, OP_Found, iParm + 1, addr, r1, 0); VdbeCoverage(v); - sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm+1, r1,regResult,nResultCol); - assert( pSort==0 ); + 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{ + 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); + sqlite3ReleaseTempRange(pParse, r1, nPrefixReg + 1); break; } case SRT_Upfrom: { - if( pSort ){ - pushOntoSorter( - pParse, pSort, p, regResult, regOrig, nResultCol, nPrefixReg); - }else{ + 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); + 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_MakeRecord, regResult + (i2 < 0), nResultCol - (i2 < 0), r1); + if (i2 < 0) { sqlite3VdbeAddOp3(v, OP_Insert, iParm, r1, regResult); - }else{ + } else { sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regResult, i2); } } @@ -136940,27 +135106,24 @@ static void selectInnerLoop( ** item into the set table with bogus data. */ case SRT_Set: { - if( pSort ){ + 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{ + 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); + 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 */ @@ -136972,29 +135135,27 @@ static void selectInnerLoop( ** 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 ); + 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 ){ + 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{ + } else { sqlite3VdbeAddOp2(v, OP_ResultRow, regResult, nResultCol); } break; @@ -137012,43 +135173,39 @@ static void selectInnerLoop( int nKey; int r1, r2, r3; int addrTest = 0; - ExprList *pSO; + ExprList* pSO; pSO = pDest->pOrderBy; - assert( pSO ); + assert(pSO); nKey = pSO->nExpr; r1 = sqlite3GetTempReg(pParse); - r2 = sqlite3GetTempRange(pParse, nKey+2); - r3 = r2+nKey+1; - if( eDest==SRT_DistQueue ){ + 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); + 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); + 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); + for (i = 0; i < nKey; i++) { + sqlite3VdbeAddOp2(v, OP_SCopy, regResult + pSO->a[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); + 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); + 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 @@ -137056,7 +135213,7 @@ static void selectInnerLoop( ** about the actual results of the select. */ default: { - assert( eDest==SRT_Discard ); + assert(eDest == SRT_Discard); break; } #endif @@ -137066,8 +135223,9 @@ static void selectInnerLoop( ** 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); + if (pSort == 0 && p->iLimit) { + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, p->iLimit, iBreak); + VdbeCoverage(v); } } @@ -137075,18 +135233,18 @@ static void selectInnerLoop( ** 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]; +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->nAllField = (u16)(N + X); p->enc = ENC(db); p->db = db; p->nRef = 1; memset(&p[1], 0, nExtra); - }else{ + } else { return (KeyInfo*)sqlite3OomFault(db); } return p; @@ -137095,20 +135253,21 @@ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoAlloc(sqlite3 *db, int N, int X){ /* ** Deallocate a KeyInfo object */ -SQLITE_PRIVATE void sqlite3KeyInfoUnref(KeyInfo *p){ - if( p ){ - assert( p->nRef>0 ); +SQLITE_PRIVATE void sqlite3KeyInfoUnref(KeyInfo* p) { + if (p) { + assert(p->nRef > 0); p->nRef--; - if( p->nRef==0 ) sqlite3DbFreeNN(p->db, p); + 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 ); +SQLITE_PRIVATE KeyInfo* sqlite3KeyInfoRef(KeyInfo* p) { + if (p) { + assert(p->nRef > 0); p->nRef++; } return p; @@ -137121,7 +135280,9 @@ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoRef(KeyInfo *p){ ** ** This routine is used only inside of assert() statements. */ -SQLITE_PRIVATE int sqlite3KeyInfoIsWriteable(KeyInfo *p){ return p->nRef==1; } +SQLITE_PRIVATE int sqlite3KeyInfoIsWriteable(KeyInfo* p) { + return p->nRef == 1; +} #endif /* SQLITE_DEBUG */ /* @@ -137138,25 +135299,24 @@ SQLITE_PRIVATE int sqlite3KeyInfoIsWriteable(KeyInfo *p){ return p->nRef==1; } ** 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 */ -){ +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; + 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; + pInfo = sqlite3KeyInfoAlloc(db, nExpr - iStart, nExtra + 1); + if (pInfo) { + assert(sqlite3KeyInfoIsWriteable(pInfo)); + for (i = iStart, pItem = pList->a + iStart; i < nExpr; i++, pItem++) { + pInfo->aColl[i - iStart] = sqlite3ExprNNCollSeq(pParse, pItem->pExpr); + pInfo->aSortFlags[i - iStart] = pItem->fg.sortFlags; } } return pInfo; @@ -137165,13 +135325,21 @@ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoFromExprList( /* ** 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; +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; } @@ -137187,7 +135355,7 @@ SQLITE_PRIVATE const char *sqlite3SelectOpName(int id){ ** 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){ +static void explainTempTable(Parse* pParse, const char* zUsage) { ExplainQueryPlan((pParse, 0, "USE TEMP B-TREE FOR %s", zUsage)); } @@ -137198,49 +135366,47 @@ static void explainTempTable(Parse *pParse, const char *zUsage){ ** only exist if SQLITE_OMIT_EXPLAIN is not defined without polluting the ** code with #ifndef directives. */ -# define explainSetInteger(a, b) a = b +#define explainSetInteger(a, b) a = b #else /* No-op versions of the explainXXX() functions and macros. */ -# define explainTempTable(y,z) -# define explainSetInteger(y,z) +#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. */ +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; + 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 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 bSeq; /* True if sorter record includes seq. no. */ int nRefKey = 0; - struct ExprList_item *aOutEx = p->pEList->a; + struct ExprList_item* aOutEx = p->pEList->a; - assert( addrBreak<0 ); - if( pSort->labelBkOut ){ + assert(addrBreak < 0); + if (pSort->labelBkOut) { sqlite3VdbeAddOp2(v, OP_Gosub, pSort->regReturn, pSort->labelBkOut); sqlite3VdbeGoto(v, addrBreak); sqlite3VdbeResolveLabel(v, pSort->labelBkOut); @@ -137248,8 +135414,8 @@ static void generateSortTail( #ifdef SQLITE_ENABLE_SORTER_REFERENCES /* Open any cursors needed for sorter-reference expressions */ - for(i=0; inDefer; i++){ - Table *pTab = pSort->aDefer[i].pTab; + for (i = 0; i < pSort->nDefer; 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); @@ -137257,103 +135423,106 @@ static void generateSortTail( #endif iTab = pSort->iECursor; - if( eDest==SRT_Output || eDest==SRT_Coroutine || eDest==SRT_Mem ){ - if( eDest==SRT_Mem && p->iOffset ){ + 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{ + } else { regRowid = sqlite3GetTempReg(pParse); - if( eDest==SRT_EphemTab || eDest==SRT_Table ){ + if (eDest == SRT_EphemTab || eDest == SRT_Table) { regRow = sqlite3GetTempReg(pParse); nColumn = 0; - }else{ + } else { regRow = sqlite3GetTempRange(pParse, nColumn); } } nKey = pOrderBy->nExpr - pSort->nOBSat; - if( pSort->sortFlags & SORTFLAG_UseSorter ){ + if (pSort->sortFlags & SORTFLAG_UseSorter) { int regSortOut = ++pParse->nMem; iSortTab = pParse->nTab++; - if( pSort->labelBkOut ){ - addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + 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); + 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); - assert( p->iLimit==0 && p->iOffset==0 ); + assert(p->iLimit == 0 && p->iOffset == 0); sqlite3VdbeAddOp3(v, OP_SorterData, iTab, regSortOut, iSortTab); bSeq = 0; - }else{ - addr = 1 + sqlite3VdbeAddOp2(v, OP_Sort, iTab, addrBreak); VdbeCoverage(v); + } else { + addr = 1 + sqlite3VdbeAddOp2(v, OP_Sort, iTab, addrBreak); + VdbeCoverage(v); codeOffset(v, p->iOffset, addrContinue); iSortTab = iTab; bSeq = 1; - if( p->iOffset>0 ){ + if (p->iOffset > 0) { sqlite3VdbeAddOp2(v, OP_AddImm, p->iLimit, -1); } } - for(i=0, iCol=nKey+bSeq-1; inDefer ){ - int iKey = iCol+1; + if (pSort->nDefer) { + int iKey = iCol + 1; int regKey = sqlite3GetTempRange(pParse, nRefKey); - for(i=0; inDefer; i++){ + for (i = 0; i < pSort->nDefer; i++) { int iCsr = pSort->aDefer[i].iCsr; - Table *pTab = pSort->aDefer[i].pTab; + Table* pTab = pSort->aDefer[i].pTab; int nKey = pSort->aDefer[i].nKey; sqlite3VdbeAddOp1(v, OP_NullRow, iCsr); - if( HasRowid(pTab) ){ + if (HasRowid(pTab)) { sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iKey++, regKey); - sqlite3VdbeAddOp3(v, OP_SeekRowid, iCsr, - sqlite3VdbeCurrentAddr(v)+1, regKey); - }else{ + sqlite3VdbeAddOp3(v, OP_SeekRowid, iCsr, sqlite3VdbeCurrentAddr(v) + 1, regKey); + } else { int k; int iJmp; - assert( sqlite3PrimaryKeyIndex(pTab)->nKeyCol==nKey ); - for(k=0; knKeyCol == nKey); + for (k = 0; k < nKey; k++) { + sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iKey++, regKey + k); } iJmp = sqlite3VdbeCurrentAddr(v); - sqlite3VdbeAddOp4Int(v, OP_SeekGE, iCsr, iJmp+2, regKey, nKey); - sqlite3VdbeAddOp4Int(v, OP_IdxLE, iCsr, iJmp+3, regKey, nKey); + sqlite3VdbeAddOp4Int(v, OP_SeekGE, iCsr, iJmp + 2, regKey, nKey); + sqlite3VdbeAddOp4Int(v, OP_IdxLE, iCsr, iJmp + 3, regKey, nKey); sqlite3VdbeAddOp1(v, OP_NullRow, iCsr); } } sqlite3ReleaseTempRange(pParse, regKey, nRefKey); } #endif - for(i=nColumn-1; i>=0; i--){ + for (i = nColumn - 1; i >= 0; i--) { #ifdef SQLITE_ENABLE_SORTER_REFERENCES - if( aOutEx[i].fg.bSorterRef ){ - sqlite3ExprCode(pParse, aOutEx[i].pExpr, regRow+i); - }else + 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{ + if (aOutEx[i].u.x.iOrderByCol) { + iRead = aOutEx[i].u.x.iOrderByCol - 1; + } else { iRead = iCol--; } - sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iRead, regRow+i); + sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iRead, regRow + i); VdbeComment((v, "%s", aOutEx[i].zEName)); } } - switch( eDest ){ + switch (eDest) { case SRT_Table: case SRT_EphemTab: { - sqlite3VdbeAddOp3(v, OP_Column, iSortTab, nKey+bSeq, regRow); + 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); @@ -137361,9 +135530,8 @@ static void generateSortTail( } #ifndef SQLITE_OMIT_SUBQUERY case SRT_Set: { - assert( nColumn==sqlite3Strlen30(pDest->zAffSdst) ); - sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, nColumn, regRowid, - pDest->zAffSdst, nColumn); + assert(nColumn == sqlite3Strlen30(pDest->zAffSdst)); + sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, nColumn, regRowid, pDest->zAffSdst, nColumn); sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, regRowid, regRow, nColumn); break; } @@ -137375,43 +135543,46 @@ static void generateSortTail( 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_MakeRecord, regRow + (i2 < 0), nColumn - (i2 < 0), r1); + if (i2 < 0) { sqlite3VdbeAddOp3(v, OP_Insert, iParm, r1, regRow); - }else{ + } 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 ){ + 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{ + } else { sqlite3VdbeAddOp1(v, OP_Yield, pDest->iSDParm); } break; } } - if( regRowid ){ - if( eDest==SRT_Set ){ + if (regRowid) { + if (eDest == SRT_Set) { sqlite3ReleaseTempRange(pParse, regRow, nColumn); - }else{ + } 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->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); + if (pSort->regReturn) + sqlite3VdbeAddOp1(v, OP_Return, pSort->regReturn); sqlite3VdbeResolveLabel(v, addrBreak); } @@ -137440,52 +135611,49 @@ static void generateSortTail( ** 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) +#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) +#define columnType(A, B, C, D, E) columnTypeImpl(A, B) #endif -static const char *columnTypeImpl( - NameContext *pNC, +static const char* columnTypeImpl(NameContext* pNC, #ifndef SQLITE_ENABLE_COLUMN_METADATA - Expr *pExpr + Expr* pExpr #else - Expr *pExpr, - const char **pzOrigDb, - const char **pzOrigTab, - const char **pzOrigCol + Expr* pExpr, const char** pzOrigDb, const char** pzOrigTab, const char** pzOrigCol #endif -){ - char const *zType = 0; +) { + char const* zType = 0; int j; #ifdef SQLITE_ENABLE_COLUMN_METADATA - char const *zOrigDb = 0; - char const *zOrigTab = 0; - char const *zOrigCol = 0; + char const* zOrigDb = 0; + char const* zOrigTab = 0; + char const* zOrigCol = 0; #endif - assert( pExpr!=0 ); - assert( pNC->pSrcList!=0 ); - switch( pExpr->op ){ + 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 ){ + 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; j < pTabList->nSrc && pTabList->a[j].iCursor != pExpr->iTable; j++) + ; + if (j < pTabList->nSrc) { pTab = pTabList->a[j].pTab; pS = pTabList->a[j].pSelect; - }else{ + } else { pNC = pNC->pNext; } } - if( pTab==0 ){ + 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 @@ -137506,54 +135674,55 @@ static const char *columnTypeImpl( break; } - assert( pTab && ExprUseYTab(pExpr) && pExpr->y.pTab==pTab ); - if( pS ){ + 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 + if (iCol < pS->pEList->nExpr #ifdef SQLITE_ALLOW_ROWID_IN_VIEW - && iCol>=0 + && iCol >= 0 #else - && ALWAYS(iCol>=0) + && 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; + 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); + zType = columnType(&sNC, p, &zOrigDb, &zOrigTab, &zOrigCol); } - }else{ + } else { /* A real table or a CTE table */ - assert( !pS ); + assert(!pS); #ifdef SQLITE_ENABLE_COLUMN_METADATA - if( iCol<0 ) iCol = pTab->iPKey; - assert( iCol==XN_ROWID || (iCol>=0 && iColnCol) ); - if( iCol<0 ){ + if (iCol < 0) + iCol = pTab->iPKey; + assert(iCol == XN_ROWID || (iCol >= 0 && iCol < pTab->nCol)); + if (iCol < 0) { zType = "INTEGER"; zOrigCol = "rowid"; - }else{ + } else { zOrigCol = pTab->aCol[iCol].zCnName; - zType = sqlite3ColumnType(&pTab->aCol[iCol],0); + zType = sqlite3ColumnType(&pTab->aCol[iCol], 0); } zOrigTab = pTab->zName; - if( pNC->pParse && pTab->pSchema ){ + 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 ){ + assert(iCol == XN_ROWID || (iCol >= 0 && iCol < pTab->nCol)); + if (iCol < 0) { zType = "INTEGER"; - }else{ - zType = sqlite3ColumnType(&pTab->aCol[iCol],0); + } else { + zType = sqlite3ColumnType(&pTab->aCol[iCol], 0); } #endif } @@ -137566,9 +135735,9 @@ static const char *columnTypeImpl( ** statement. */ NameContext sNC; - Select *pS; - Expr *p; - assert( ExprUseXSelect(pExpr) ); + Select* pS; + Expr* p; + assert(ExprUseXSelect(pExpr)); pS = pExpr->x.pSelect; p = pS->pEList->a[0].pExpr; sNC.pSrcList = pS->pSrc; @@ -137581,8 +135750,8 @@ static const char *columnTypeImpl( } #ifdef SQLITE_ENABLE_COLUMN_METADATA - if( pzOrigDb ){ - assert( pzOrigTab && pzOrigCol ); + if (pzOrigDb) { + assert(pzOrigTab && pzOrigCol); *pzOrigDb = zOrigDb; *pzOrigTab = zOrigTab; *pzOrigCol = zOrigCol; @@ -137595,25 +135764,24 @@ static const char *columnTypeImpl( ** 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 */ -){ +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; + 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; + for (i = 0; i < pEList->nExpr; 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; + 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 @@ -137631,7 +135799,6 @@ static void generateColumnTypes( #endif /* !defined(SQLITE_OMIT_DECLTYPE) */ } - /* ** Compute the column names for a SELECT statement. ** @@ -137662,71 +135829,72 @@ static void generateColumnTypes( ** 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; +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 */ + 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 ){ + if (pParse->explain) { return; } #endif - if( pParse->colNamesSet ) return; + 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")); + 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 ); + assert(v != 0); + assert(pTabList != 0); pParse->colNamesSet = 1; - fullName = (db->flags & SQLITE_FullColNames)!=0; - srcName = (db->flags & SQLITE_ShortColNames)!=0 || fullName; + 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 ){ + for (i = 0; i < pEList->nExpr; 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; + char* zName = pEList->a[i].zEName; sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_TRANSIENT); - }else if( srcName && p->op==TK_COLUMN ){ - char *zCol; + } 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 ){ + assert(pTab != 0); + if (iCol < 0) + iCol = pTab->iPKey; + assert(iCol == -1 || (iCol >= 0 && iCol < pTab->nCol)); + if (iCol < 0) { zCol = "rowid"; - }else{ + } else { zCol = pTab->aCol[iCol].zCnName; } - if( fullName ){ - char *zName = 0; + if (fullName) { + char* zName = 0; zName = sqlite3MPrintf(db, "%s.%s", pTab->zName, zCol); sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_DYNAMIC); - }else{ + } 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); + } 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); } } @@ -137755,101 +135923,102 @@ SQLITE_PRIVATE void sqlite3GenerateColumnNames( ** ** 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; +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 ){ + if (pEList) { nCol = pEList->nExpr; - aCol = sqlite3DbMallocZero(db, sizeof(aCol[0])*nCol); - testcase( aCol==0 ); - if( NEVER(nCol>32767) ) nCol = 32767; - }else{ + 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 ); + 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; + for (i = 0, pCol = aCol; i < nCol && !db->mallocFailed; 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 ((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 ){ + } else { + Expr* pColExpr = sqlite3ExprSkipCollateAndLikely(pX->pExpr); + while (ALWAYS(pColExpr != 0) && pColExpr->op == TK_DOT) { pColExpr = pColExpr->pRight; - assert( pColExpr!=0 ); + assert(pColExpr != 0); } - if( pColExpr->op==TK_COLUMN - && ALWAYS( ExprUseYTab(pColExpr) ) - && ALWAYS( pColExpr->y.pTab!=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) ); + 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{ + } else { /* Use the original text of the column expression as its name */ - assert( zName==pX->zEName ); /* pointer comparison intended */ + assert(zName == pX->zEName); /* pointer comparison intended */ } } - if( zName && !sqlite3IsTrueOrFalse(zName) ){ + if (zName && !sqlite3IsTrueOrFalse(zName)) { zName = sqlite3DbStrDup(db, zName); - }else{ - zName = sqlite3MPrintf(db,"column%d",i+1); + } 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 ){ + 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; + 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); + if (cnt > 3) + sqlite3_randomness(sizeof(cnt), &cnt); } pCol->zCnName = zName; pCol->hName = sqlite3StrIHash(zName); - if( pX->fg.bNoExpand ){ + if (pX->fg.bNoExpand) { pCol->colFlags |= COLFLAG_NOEXPAND; } sqlite3ColumnPropertiesFromName(0, pCol); - if( zName && sqlite3HashInsert(&ht, zName, pX)==pX ){ + if (zName && sqlite3HashInsert(&ht, zName, pX) == pX) { sqlite3OomFault(db); } } sqlite3HashClear(&ht); - if( db->mallocFailed ){ - for(j=0; jmallocFailed) { + for (j = 0; j < i; j++) { sqlite3DbFree(db, aCol[j].zCnName); } sqlite3DbFree(db, aCol); @@ -137871,51 +136040,52 @@ SQLITE_PRIVATE int sqlite3ColumnsFromExprList( ** This routine requires that all identifiers in the SELECT ** statement be resolved. */ -SQLITE_PRIVATE void sqlite3SelectAddColumnTypeAndCollation( - Parse *pParse, /* Parsing contexts */ - Table *pTab, /* Add column type information to this table */ - Select *pSelect, /* SELECT used to determine types and collations */ - char aff /* Default affinity for columns */ -){ - sqlite3 *db = pParse->db; +SQLITE_PRIVATE void sqlite3SelectAddColumnTypeAndCollation(Parse* pParse, /* Parsing contexts */ + Table* pTab, /* Add column type information to this table */ + Select* pSelect, /* SELECT used to determine types and collations */ + char aff /* Default affinity for columns */ +) { + sqlite3* db = pParse->db; NameContext sNC; - Column *pCol; - CollSeq *pColl; + Column* pCol; + CollSeq* pColl; int i; - Expr *p; - struct ExprList_item *a; + 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; + 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; + for (i = 0, pCol = pTab->aCol; i < pTab->nCol; 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 ){ + 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->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); + } else { + testcase(pCol->colFlags & COLFLAG_HASTYPE); + pCol->colFlags &= ~(COLFLAG_HASTYPE | COLFLAG_HASCOLL); } } - if( pCol->affinity<=SQLITE_AFF_NONE ) pCol->affinity = aff; + if (pCol->affinity <= SQLITE_AFF_NONE) + pCol->affinity = aff; pColl = sqlite3ExprCollSeq(pParse, p); - if( pColl ){ - assert( pTab->pIndex==0 ); + if (pColl) { + assert(pTab->pIndex == 0); sqlite3ColumnSetColl(db, pCol, pColl->zName); } } @@ -137926,9 +136096,9 @@ SQLITE_PRIVATE void sqlite3SelectAddColumnTypeAndCollation( ** 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; +SQLITE_PRIVATE Table* sqlite3ResultSetOfSelect(Parse* pParse, Select* pSelect, char aff) { + Table* pTab; + sqlite3* db = pParse->db; u64 savedFlags; savedFlags = db->flags; @@ -137936,19 +136106,22 @@ SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect, c 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 ){ + 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) ); + 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 ){ + if (db->mallocFailed) { sqlite3DeleteTable(db, pTab); return 0; } @@ -137959,19 +136132,16 @@ SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect, c ** 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 ){ +SQLITE_PRIVATE Vdbe* sqlite3GetVdbe(Parse* pParse) { + if (pParse->pVdbe) { return pParse->pVdbe; } - if( pParse->pToplevel==0 - && OptimizationEnabled(pParse->db,SQLITE_FactorOutConst) - ){ + 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 @@ -137995,14 +136165,15 @@ SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse *pParse){ ** 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; +static void computeLimitRegisters(Parse* pParse, Select* p, int iBreak) { + Vdbe* v = 0; int iLimit = 0; int iOffset; int n; - Expr *pLimit = p->pLimit; + Expr* pLimit = p->pLimit; - if( p->iLimit ) return; + if (p->iLimit) + return; /* ** "LIMIT -1" always shows all rows. There is some @@ -138010,34 +136181,37 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){ ** The current implementation interprets "LIMIT 0" to mean ** no rows. */ - if( pLimit ){ - assert( pLimit->op==TK_LIMIT ); - assert( pLimit->pLeft!=0 ); + 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) ){ + assert(v != 0); + if (sqlite3ExprIsInteger(pLimit->pLeft, &n)) { sqlite3VdbeAddOp2(v, OP_Integer, n, iLimit); VdbeComment((v, "LIMIT counter")); - if( n==0 ){ + if (n == 0) { sqlite3VdbeGoto(v, iBreak); - }else if( n>=0 && p->nSelectRow>sqlite3LogEst((u64)n) ){ + } else if (n >= 0 && p->nSelectRow > sqlite3LogEst((u64)n)) { p->nSelectRow = sqlite3LogEst((u64)n); p->selFlags |= SF_FixedLimit; } - }else{ + } else { sqlite3ExprCode(pParse, pLimit->pLeft, iLimit); - sqlite3VdbeAddOp1(v, OP_MustBeInt, iLimit); VdbeCoverage(v); + sqlite3VdbeAddOp1(v, OP_MustBeInt, iLimit); + VdbeCoverage(v); VdbeComment((v, "LIMIT counter")); - sqlite3VdbeAddOp2(v, OP_IfNot, iLimit, iBreak); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_IfNot, iLimit, iBreak); + VdbeCoverage(v); } - if( pLimit->pRight ){ + if (pLimit->pRight) { p->iOffset = iOffset = ++pParse->nMem; - pParse->nMem++; /* Allocate an extra register for limit+offset */ + pParse->nMem++; /* Allocate an extra register for limit+offset */ sqlite3ExprCode(pParse, pLimit->pRight, iOffset); - sqlite3VdbeAddOp1(v, OP_MustBeInt, iOffset); VdbeCoverage(v); + sqlite3VdbeAddOp1(v, OP_MustBeInt, iOffset); + VdbeCoverage(v); VdbeComment((v, "OFFSET counter")); - sqlite3VdbeAddOp3(v, OP_OffsetLimit, iLimit, iOffset+1, iOffset); + sqlite3VdbeAddOp3(v, OP_OffsetLimit, iLimit, iOffset + 1, iOffset); VdbeComment((v, "LIMIT+OFFSET")); } } @@ -138052,18 +136226,18 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){ ** 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 ){ +static CollSeq* multiSelectCollSeq(Parse* pParse, Select* p, int iCol) { + CollSeq* pRet; + if (p->pPrior) { pRet = multiSelectCollSeq(pParse, p->pPrior, iCol); - }else{ + } else { pRet = 0; } - assert( iCol>=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) ){ + if (pRet == 0 && ALWAYS(iCol < p->pEList->nExpr)) { pRet = sqlite3ExprCollSeq(pParse, p->pEList->a[iCol].pExpr); } return pRet; @@ -138078,27 +136252,27 @@ static CollSeq *multiSelectCollSeq(Parse *pParse, Select *p, int iCol){ ** 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 ){ +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; + for (i = 0; i < nOrderBy; i++) { + struct ExprList_item* pItem = &pOrderBy->a[i]; + Expr* pTerm = pItem->pExpr; + CollSeq* pColl; - if( pTerm->flags & EP_Collate ){ + 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); + } 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) ); + assert(sqlite3KeyInfoIsWriteable(pRet)); pRet->aColl[i] = pColl; pRet->aSortFlags[i] = pOrderBy->a[i].fg.sortFlags; } @@ -138144,43 +136318,43 @@ static KeyInfo *multiSelectOrderByKeyInfo(Parse *pParse, Select *p, int nExtra){ ** 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 */ +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 ){ + 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; + 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 */ + p->nSelectRow = 320; /* 4 billion rows */ computeLimitRegisters(pParse, p, addrBreak); pLimit = p->pLimit; regLimit = p->iLimit; @@ -138190,8 +136364,8 @@ static void generateWithRecursiveQuery( pOrderBy = p->pOrderBy; /* Locate the cursor number of the Current table */ - for(i=0; ALWAYS(inSrc); i++){ - if( pSrc->a[i].fg.isRecursive ){ + for (i = 0; ALWAYS(i < pSrc->nSrc); i++) { + if (pSrc->a[i].fg.isRecursive) { iCurrent = pSrc->a[i].iCursor; break; } @@ -138201,10 +136375,10 @@ static void generateWithRecursiveQuery( ** 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 ){ + if (p->op == TK_UNION) { eDest = pOrderBy ? SRT_DistQueue : SRT_DistFifo; iDistinct = pParse->nTab++; - }else{ + } else { eDest = pOrderBy ? SRT_Queue : SRT_Fifo; } sqlite3SelectDestInit(&destQueue, eDest, iQueue); @@ -138212,16 +136386,15 @@ static void generateWithRecursiveQuery( /* 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); + 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{ + } else { sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iQueue, nCol); } VdbeComment((v, "Queue table")); - if( iDistinct ){ + if (iDistinct) { p->addrOpenEphm[0] = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iDistinct, 0); p->selFlags |= SF_UsesEphemeral; } @@ -138236,13 +136409,14 @@ static void generateWithRecursiveQuery( ** 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 ){ + 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; + if ((pFirstRec->pPrior->selFlags & SF_Recursive) == 0) + break; } /* Store the results of the setup-query in Queue. */ @@ -138251,16 +136425,18 @@ static void generateWithRecursiveQuery( ExplainQueryPlan((pParse, 1, "SETUP")); rc = sqlite3Select(pParse, pSetup, &destQueue); pSetup->pNext = p; - if( rc ) goto end_of_recursive_query; + 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); + 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{ + if (pOrderBy) { + sqlite3VdbeAddOp3(v, OP_Column, iQueue, pOrderBy->nExpr + 1, regCurrent); + } else { sqlite3VdbeAddOp2(v, OP_RowData, iQueue, regCurrent); } sqlite3VdbeAddOp1(v, OP_Delete, iQueue); @@ -138268,9 +136444,8 @@ static void generateWithRecursiveQuery( /* Output the single row in Current */ addrCont = sqlite3VdbeMakeLabel(pParse); codeOffset(v, regOffset, addrCont); - selectInnerLoop(pParse, p, iCurrent, - 0, 0, pDest, addrCont, addrBreak); - if( regLimit ){ + selectInnerLoop(pParse, p, iCurrent, 0, 0, pDest, addrCont, addrBreak); + if (regLimit) { sqlite3VdbeAddOp2(v, OP_DecrJumpZero, regLimit, addrBreak); VdbeCoverage(v); } @@ -138282,7 +136457,7 @@ static void generateWithRecursiveQuery( pFirstRec->pPrior = 0; ExplainQueryPlan((pParse, 1, "RECURSIVE STEP")); sqlite3Select(pParse, p, &destQueue); - assert( pFirstRec->pPrior==0 ); + assert(pFirstRec->pPrior == 0); pFirstRec->pPrior = pSetup; /* Keep running the loop until the Queue is empty */ @@ -138298,10 +136473,9 @@ static void generateWithRecursiveQuery( #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 */ +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 */ ); /* @@ -138320,32 +136494,33 @@ static int multiSelectOrderBy( ** 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 */ -){ +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 ); + 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; + if (p->pWin) + return -1; #endif - if( p->pPrior==0 ) break; - assert( p->pPrior->pNext==p ); + 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 ){ + } 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; + if (!bShowAll) + break; p->nSelectRow = nRow; p = p->pNext; } @@ -138357,9 +136532,11 @@ static int multiSelectValues( ** 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; +static int hasAnchor(Select* p) { + while (p && (p->selFlags & SF_Recursive) != 0) { + p = p->pPrior; + } + return p != 0; } /* @@ -138393,296 +136570,296 @@ static int hasAnchor(Select *p){ ** 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 */ +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 ); + 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 ); + assert(pPrior->pOrderBy == 0); + assert(pPrior->pLimit == 0); v = sqlite3GetVdbe(pParse); - assert( v!=0 ); /* The VDBE already created by calling function */ + 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 ); + */ + 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 ){ + */ + if (p->selFlags & SF_MultiValue) { rc = multiSelectValues(pParse, p, &dest); - if( rc>=0 ) goto multi_select_end; + 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 ); + assert(p->pEList && pPrior->pEList); + assert(p->pEList->nExpr == pPrior->pEList->nExpr); #ifndef SQLITE_OMIT_CTE - if( (p->selFlags & SF_Recursive)!=0 && hasAnchor(p) ){ + if ((p->selFlags & SF_Recursive) != 0 && hasAnchor(p)) { generateWithRecursiveQuery(pParse, p, &dest); - }else + } else #endif - /* Compound SELECTs that have an ORDER BY clause are handled separately. - */ - if( p->pOrderBy ){ - return multiSelectOrderBy(pParse, p, pDest); - }else{ + /* 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; + if (pPrior->pPrior == 0) { + ExplainQueryPlan((pParse, 1, "COMPOUND QUERY")); + ExplainQueryPlan((pParse, 1, "LEFT-MOST SUBQUERY")); } - 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; - } +#endif - /* 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 ){ + /* 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; } - sqlite3ExprDelete(db, p->pLimit); - p->pLimit = pLimit; - p->iLimit = 0; - p->iOffset = 0; + 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); + } - /* 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 ); + /* 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; + } - 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 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; - /* 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; + /* 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; + /* 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); +#ifndef SQLITE_OMIT_EXPLAIN + if (p->pNext == 0) { + ExplainQueryPlanPop(pParse); + } +#endif } - #endif - } - if( pParse->nErr ) goto multi_select_end; + if (pParse->nErr) + goto multi_select_end; /* Compute collating sequences used by ** temporary tables needed to implement the compound select. @@ -138693,40 +136870,39 @@ static int multiSelect( ** 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 */ + 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 ); + assert(p->pNext == 0); + assert(p->pEList != 0); nCol = p->pEList->nExpr; pKeyInfo = sqlite3KeyInfoAlloc(db, nCol, 1); - if( !pKeyInfo ){ + if (!pKeyInfo) { rc = SQLITE_NOMEM_BKPT; goto multi_select_end; } - for(i=0, apColl=pKeyInfo->aColl; iaColl; i < nCol; i++, apColl++) { *apColl = multiSelectCollSeq(pParse, p, i); - if( 0==*apColl ){ + if (0 == *apColl) { *apColl = db->pDfltColl; } } - for(pLoop=p; pLoop; pLoop=pLoop->pPrior){ - for(i=0; i<2; i++){ + for (pLoop = p; pLoop; pLoop = pLoop->pPrior) { + for (i = 0; i < 2; i++) { int addr = pLoop->addrOpenEphm[i]; - if( addr<0 ){ + 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 ); + assert(pLoop->addrOpenEphm[1] < 0); break; } sqlite3VdbeChangeP2(v, addr, nCol); - sqlite3VdbeChangeP4(v, addr, (char*)sqlite3KeyInfoRef(pKeyInfo), - P4_KEYINFO); + sqlite3VdbeChangeP4(v, addr, (char*)sqlite3KeyInfoRef(pKeyInfo), P4_KEYINFO); pLoop->addrOpenEphm[i] = -1; } } @@ -138736,10 +136912,8 @@ static int multiSelect( multi_select_end: pDest->iSdst = dest.iSdst; pDest->nSdst = dest.nSdst; - if( pDelete ){ - sqlite3ParserAddCleanup(pParse, - (void(*)(sqlite3*,void*))sqlite3SelectDelete, - pDelete); + if (pDelete) { + sqlite3ParserAddCleanup(pParse, (void (*)(sqlite3*, void*))sqlite3SelectDelete, pDelete); } return rc; } @@ -138749,13 +136923,14 @@ static int multiSelect( ** 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 ){ +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)); + } else { + sqlite3ErrorMsg(pParse, + "SELECTs to the left and right of %s" + " do not have the same number of result columns", + sqlite3SelectOpName(p->op)); } } @@ -138779,17 +136954,16 @@ SQLITE_PRIVATE void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p){ ** 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; +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; @@ -138797,28 +136971,30 @@ static int generateOutputSubroutine( iContinue = sqlite3VdbeMakeLabel(pParse); /* Suppress duplicates for UNION, EXCEPT, and INTERSECT - */ - if( regPrev ){ + */ + 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); + 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); + sqlite3VdbeAddOp3(v, OP_Copy, pIn->iSdst, regPrev + 1, pIn->nSdst - 1); sqlite3VdbeAddOp2(v, OP_Integer, 1, regPrev); } - if( pParse->db->mallocFailed ) return 0; + 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 ){ + 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); @@ -138833,15 +137009,13 @@ static int generateOutputSubroutine( #ifndef SQLITE_OMIT_SUBQUERY /* If we are creating a set for an "expr IN (SELECT ...)". - */ + */ case SRT_Set: { int r1; - testcase( pIn->nSdst>1 ); + 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); + 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; } @@ -138852,7 +137026,7 @@ static int generateOutputSubroutine( ** if it is the RHS of a row-value IN operator. */ case SRT_Mem: { - testcase( pIn->nSdst>1 ); + testcase(pIn->nSdst > 1); sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSDParm, pIn->nSdst); /* The LIMIT clause will jump out of the loop for us */ break; @@ -138863,7 +137037,7 @@ static int generateOutputSubroutine( ** starting at pDest->iSdst. Then the co-routine yields. */ case SRT_Coroutine: { - if( pDest->iSdst==0 ){ + if (pDest->iSdst == 0) { pDest->iSdst = sqlite3GetTempRange(pParse, pIn->nSdst); pDest->nSdst = pIn->nSdst; } @@ -138881,20 +137055,21 @@ static int generateOutputSubroutine( ** return the next row of result. */ default: { - assert( pDest->eDest==SRT_Output ); + 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); + */ + if (p->iLimit) { + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, p->iLimit, iBreak); + VdbeCoverage(v); } /* Generate the subroutine return - */ + */ sqlite3VdbeResolveLabel(v, iContinue); sqlite3VdbeAddOp1(v, OP_Return, regReturn); @@ -138987,16 +137162,15 @@ static int generateOutputSubroutine( ** 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 */ -){ +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 */ + 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 */ + 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 */ @@ -139022,49 +137196,51 @@ static int multiSelectOrderBy( 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 */ + 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 */ + u32* aPermute; /* Mapping from ORDER BY terms to result set columns */ - assert( p->pOrderBy!=0 ); - assert( pKeyDup==0 ); /* "Managed" code needs this. Ticket #3382. */ + 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 */ + 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 ); + assert(p->pPrior->pOrderBy == 0); pOrderBy = p->pOrderBy; - assert( 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; + 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; j < nOrderBy; j++, pItem++) { + assert(pItem != 0); + assert(pItem->u.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; + if (pOrderBy) + pOrderBy->a[nOrderBy++].u.x.iOrderByCol = (u16)i; } } } @@ -139076,18 +137252,18 @@ static int multiSelectOrderBy( ** 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 = 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 ); + 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{ + } else { pKeyMerge = 0; } @@ -139095,18 +137271,18 @@ static int multiSelectOrderBy( ** for the logic that removes duplicate result rows when the ** operator is UNION, EXCEPT, or INTERSECT (but not UNION ALL). */ - if( op==TK_ALL ){ + if (op == TK_ALL) { regPrev = 0; - }else{ + } else { int nExpr = p->pEList->nExpr; - assert( nOrderBy>=nExpr || db->mallocFailed ); - regPrev = pParse->nMem+1; - pParse->nMem += nExpr+1; + 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; } @@ -139114,41 +137290,40 @@ static int multiSelectOrderBy( } /* 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){ + 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 ); + assert(pSplit->pPrior->pNext == pSplit); } } - if( nSelect<=3 ){ + if (nSelect <= 3) { pSplit = p; - }else{ + } else { pSplit = p; - for(i=2; ipPrior; } + for (i = 2; i < nSelect; i += 2) { + pSplit = pSplit->pPrior; + } } pPrior = pSplit->pPrior; - assert( pPrior!=0 ); + assert(pPrior != 0); pSplit->pPrior = 0; pPrior->pNext = 0; - assert( p->pOrderBy == pOrderBy ); - assert( pOrderBy!=0 || db->mallocFailed ); + 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 ){ + 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, p->iOffset ? p->iOffset + 1 : p->iLimit, regLimitA); sqlite3VdbeAddOp2(v, OP_Copy, regLimitA, regLimitB); - }else{ + } else { regLimitA = regLimitB = 0; } sqlite3ExprDelete(db, p->pLimit); @@ -139195,31 +137370,27 @@ static int multiSelectOrderBy( ** 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); + 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 ){ + if (op == TK_ALL || op == TK_UNION) { VdbeNoopComment((v, "Output routine for B")); - addrOutB = generateOutputSubroutine(pParse, - p, &destB, pDest, regOutB, - regPrev, pKeyDup, labelEnd); + 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 ){ + if (op == TK_EXCEPT || op == TK_INTERSECT) { addrEofA_noB = addrEofA = labelEnd; - }else{ + } else { VdbeNoopComment((v, "eof-A subroutine")); addrEofA = sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB); addrEofA_noB = sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, labelEnd); - VdbeCoverage(v); + VdbeCoverage(v); sqlite3VdbeGoto(v, addrEofA); p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow); } @@ -139227,71 +137398,76 @@ static int multiSelectOrderBy( /* Generate a subroutine to run when the results from select B ** are exhausted and only data in select A remains. */ - if( op==TK_INTERSECT ){ + if (op == TK_INTERSECT) { addrEofB = addrEofA; - if( p->nSelectRow > pPrior->nSelectRow ) p->nSelectRow = pPrior->nSelectRow; - }else{ + 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); + 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 ){ + if (op == TK_ALL || op == TK_UNION) { sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB); } - sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, addrEofB); VdbeCoverage(v); + 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); + 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); + 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); + sqlite3VdbeAddOp3(v, OP_Jump, addrAltB, addrAeqB, addrAgtB); + VdbeCoverage(v); /* Jump to the this point in order to terminate the query. - */ + */ sqlite3VdbeResolveLabel(v, labelEnd); /* Reassemble the compound query so that it will be freed correctly ** by the calling function */ - if( pSplit->pPrior ){ - sqlite3ParserAddCleanup(pParse, - (void(*)(sqlite3*,void*))sqlite3SelectDelete, pSplit->pPrior); + if (pSplit->pPrior) { + sqlite3ParserAddCleanup(pParse, (void (*)(sqlite3*, void*))sqlite3SelectDelete, pSplit->pPrior); } pSplit->pPrior = pPrior; pPrior->pNext = pSplit; @@ -139301,7 +137477,7 @@ static int multiSelectOrderBy( /*** TBD: Insert subroutine calls to close cursors on incomplete **** subqueries ****/ ExplainQueryPlanPop(pParse); - return pParse->nErr!=0; + return pParse->nErr != 0; } #endif @@ -139342,11 +137518,11 @@ static int multiSelectOrderBy( ** 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 */ + 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 */ @@ -139366,37 +137542,32 @@ static void substSelect(SubstContext*, Select*, int); ** 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) ); +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) - ){ + if (pExpr->op == TK_COLUMN && pExpr->iTable == pSubst->iTable && !ExprHasProperty(pExpr, EP_FixedCol)) { #ifdef SQLITE_ALLOW_ROWID_IN_VIEW - if( pExpr->iColumn<0 ){ + if (pExpr->iColumn < 0) { pExpr->op = TK_NULL; - }else + } else #endif { - Expr *pNew; - Expr *pCopy = pSubst->pEList->a[pExpr->iColumn].pExpr; + 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) ){ + assert(pSubst->pEList != 0 && pExpr->iColumn < pSubst->pEList->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 ){ + } 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; @@ -139404,22 +137575,21 @@ static Expr *substExpr( ifNullRow.flags = EP_IfNullRow; pCopy = &ifNullRow; } - testcase( ExprHasProperty(pCopy, EP_Subquery) ); + testcase(ExprHasProperty(pCopy, EP_Subquery)); pNew = sqlite3ExprDup(db, pCopy, 0); - if( db->mallocFailed ){ + if (db->mallocFailed) { sqlite3ExprDelete(db, pNew); return pExpr; } - if( pSubst->isOuterJoin ){ + 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)); + 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 ){ + if (pExpr->op == TK_TRUEFALSE) { pExpr->u.iValue = sqlite3ExprTruthValue(pExpr); pExpr->op = TK_INTEGER; ExprSetProperty(pExpr, EP_IntValue); @@ -139427,29 +137597,27 @@ static Expr *substExpr( /* 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") - ); + 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 ){ + } 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) ){ + if (ExprUseXSelect(pExpr)) { substSelect(pSubst, pExpr->x.pSelect, 1); - }else{ + } else { substExprList(pSubst, pExpr->x.pList); } #ifndef SQLITE_OMIT_WINDOWFUNC - if( ExprHasProperty(pExpr, EP_WinFunc) ){ - Window *pWin = pExpr->y.pWin; + if (ExprHasProperty(pExpr, EP_WinFunc)) { + Window* pWin = pExpr->y.pWin; pWin->pFilter = substExpr(pSubst, pWin->pFilter); substExprList(pSubst, pWin->pPartition); substExprList(pSubst, pWin->pOrderBy); @@ -139458,40 +137626,40 @@ static Expr *substExpr( } return pExpr; } -static void substExprList( - SubstContext *pSubst, /* Description of the substitution */ - ExprList *pList /* List to scan and in which to make substitutes */ -){ +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++){ + if (pList == 0) + return; + for (i = 0; i < pList->nExpr; 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; +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{ + 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++){ + assert(pSrc != 0); + for (i = pSrc->nSrc, pItem = pSrc->a; i > 0; i--, pItem++) { substSelect(pSubst, pItem->pSelect, 1); - if( pItem->fg.isTabFunc ){ + if (pItem->fg.isTabFunc) { substExprList(pSubst, pItem->u1.pFuncArg); } } - }while( doPrior && (p = p->pPrior)!=0 ); + } while (doPrior && (p = p->pPrior) != 0); } #endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ @@ -139503,21 +137671,24 @@ static void substSelect( ** 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; +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; + 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 */ -){ +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; + if (NEVER(pSrcItem->pTab == 0)) + return; memset(&w, 0, sizeof(w)); w.xExprCallback = recomputeColumnsUsedExpr; w.xSelectCallback = sqlite3SelectWalkNoop; @@ -139541,23 +137712,22 @@ static void recomputeColumnsUsed( ** 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 */ -){ +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){ + SrcItem* pItem; + for (i = 0, pItem = pSrc->a; i < pSrc->nSrc; 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); } } @@ -139567,11 +137737,11 @@ static void srclistRenumberCursors( /* ** *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; +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]; + if (iCsr < aCsrMap[0] && aCsrMap[iCsr + 1] > 0) { + *piCursor = aCsrMap[iCsr + 1]; } } @@ -139579,12 +137749,12 @@ static void renumberCursorDoMapping(Walker *pWalker, int *piCursor){ ** Expression walker callback used by renumberCursors() to update ** Expr objects to match newly assigned cursor numbers. */ -static int renumberCursorsCb(Walker *pWalker, Expr *pExpr){ +static int renumberCursorsCb(Walker* pWalker, Expr* pExpr) { int op = pExpr->op; - if( op==TK_COLUMN || op==TK_IF_NULL_ROW ){ + if (op == TK_COLUMN || op == TK_IF_NULL_ROW) { renumberCursorDoMapping(pWalker, &pExpr->iTable); } - if( ExprHasProperty(pExpr, EP_OuterON) ){ + if (ExprHasProperty(pExpr, EP_OuterON)) { renumberCursorDoMapping(pWalker, &pExpr->w.iJoin); } return WRC_Continue; @@ -139608,12 +137778,11 @@ static int renumberCursorsCb(Walker *pWalker, Expr *pExpr){ ** 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 */ -){ +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)); @@ -139800,70 +137969,77 @@ static void renumberCursors( ** 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 */ +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; + 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; + */ + assert(p != 0); + assert(p->pPrior == 0); + if (OptimizationDisabled(db, SQLITE_QueryFlattener)) + return 0; pSrc = p->pSrc; - assert( pSrc && iFrom>=0 && iFromnSrc ); + assert(pSrc && iFrom >= 0 && iFrom < pSrc->nSrc); pSubitem = &pSrc->a[iFrom]; iParent = pSubitem->iCursor; pSub = pSubitem->pSelect; - assert( pSub!=0 ); + assert(pSub != 0); #ifndef SQLITE_OMIT_WINDOWFUNC - if( p->pWin || pSub->pWin ) return 0; /* Restriction (25) */ + if (p->pWin || pSub->pWin) + return 0; /* Restriction (25) */ #endif pSubSrc = pSub->pSrc; - assert( pSubSrc ); + 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) ){ + 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) */ } @@ -139887,19 +138063,19 @@ static int flattenSubquery( ** ** 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) */ - ){ + 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 ){ + 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 @@ -139908,12 +138084,12 @@ static int flattenSubquery( } #endif - assert( pSubSrc->nSrc>0 ); /* True by restriction (7) */ - if( iFrom>0 && (pSubSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ - return 0; /* Restriction (27a) */ + 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) */ + if (pSubitem->fg.isCte && pSubitem->u2.pCteUse->eM10d == M10d_Yes) { + return 0; /* (28) */ } /* Restriction (29): @@ -139933,14 +138109,10 @@ static int flattenSubquery( ** 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 - ){ + 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; } } @@ -139950,64 +138122,68 @@ static int flattenSubquery( ** 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 (pSub->pPrior) { + if (pSub->pOrderBy) { + return 0; /* Restriction (20) */ } - if( isAgg || (p->selFlags & SF_Distinct)!=0 || isOuterJoin>0 ){ + 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) */ + 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) */ + || pSub1->pWin /* (17e) */ #endif - ){ + ) { return 0; } - if( iFrom>0 && (pSub1->pSrc->a[0].fg.jointype & JT_LTORJ)!=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) */ + return 0; /* Restrictions (17g), (27b) */ } - testcase( pSub1->pSrc->nSrc>1 ); + testcase(pSub1->pSrc->nSrc > 1); } /* Restriction (18). */ - if( p->pOrderBy ){ + if (p->pOrderBy) { int ii; - for(ii=0; iipOrderBy->nExpr; ii++){ - if( p->pOrderBy->a[ii].u.x.iOrderByCol==0 ) return 0; + for (ii = 0; ii < p->pOrderBy->nExpr; ii++) { + if (p->pOrderBy->a[ii].u.x.iOrderByCol == 0) + return 0; } } /* Restriction (23) */ - if( (p->selFlags & SF_Recursive) ) return 0; + 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 (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)); + 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 ); + testcase(i == SQLITE_DENY); pParse->zAuthContext = zSavedAuthContext; /* Delete the transient structures associated with thesubquery */ @@ -140019,7 +138195,7 @@ static int flattenSubquery( pSubitem->zName = 0; pSubitem->zAlias = 0; pSubitem->pSelect = 0; - assert( pSubitem->fg.isUsing!=0 || pSubitem->u3.pOn==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 @@ -140054,12 +138230,12 @@ static int flattenSubquery( ** ** 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; + 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; @@ -140069,24 +138245,27 @@ static int flattenSubquery( p->pOrderBy = pOrderBy; p->op = TK_ALL; pSubitem->pTab = pItemTab; - if( pNew==0 ){ + if (pNew == 0) { p->pPrior = pPrior; - }else{ + } else { pNew->selId = ++pParse->nSelect; - if( aCsrMap && ALWAYS(db->mallocFailed==0) ){ + if (aCsrMap && ALWAYS(db->mallocFailed == 0)) { renumberCursors(pParse, pNew, iFrom, aCsrMap); } pNew->pPrior = pPrior; - if( pPrior ) pPrior->pNext = pNew; + 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)); + SELECTTRACE(2, pParse, p, + ("compound-subquery flattener" + " creates %u as peer\n", + pNew->selId)); } - assert( pSubitem->pSelect==0 ); + assert(pSubitem->pSelect == 0); } sqlite3DbFree(db, aCsrMap); - if( db->mallocFailed ){ + if (db->mallocFailed) { pSubitem->pSelect = pSub1; return 1; } @@ -140098,15 +138277,13 @@ static int flattenSubquery( ** ** 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{ + 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; @@ -140126,17 +138303,17 @@ static int flattenSubquery( ** elements we are now copying in. */ pSub = pSub1; - for(pParent=p; pParent; pParent=pParent->pPrior, pSub=pSub->pPrior){ + 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 */ + 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 */ + 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 @@ -140154,19 +138331,21 @@ static int flattenSubquery( ** 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; + 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 ); + for (i = 0; i < nSubSrc; i++) { + SrcItem* pItem = &pSrc->a[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; @@ -140187,7 +138366,7 @@ static int flattenSubquery( ** 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 ){ + 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 @@ -140198,27 +138377,27 @@ static int flattenSubquery( ** 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++){ + ExprList* pOrderBy = pSub->pOrderBy; + for (i = 0; i < pOrderBy->nExpr; i++) { pOrderBy->a[i].u.x.iOrderByCol = 0; } - assert( pParent->pOrderBy==0 ); + assert(pParent->pOrderBy == 0); pParent->pOrderBy = pOrderBy; pSub->pOrderBy = 0; } pWhere = pSub->pWhere; pSub->pWhere = 0; - if( isOuterJoin>0 ){ + if (isOuterJoin > 0) { sqlite3SetJoinExpr(pWhere, iNewParent, EP_OuterON); } - if( pWhere ){ - if( pParent->pWhere ){ + if (pWhere) { + if (pParent->pWhere) { pParent->pWhere = sqlite3PExpr(pParse, TK_AND, pWhere, pParent->pWhere); - }else{ + } else { pParent->pWhere = pWhere; } } - if( db->mallocFailed==0 ){ + if (db->mallocFailed == 0) { SubstContext x; x.pParse = pParse; x.iTable = iParent; @@ -140231,7 +138410,7 @@ static int flattenSubquery( /* 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) */ + assert((pSub->selFlags & SF_Distinct) == 0); /* restriction (17b) */ /* ** SELECT ... FROM (SELECT ... LIMIT a OFFSET b) LIMIT x OFFSET y; @@ -140239,15 +138418,15 @@ static int flattenSubquery( ** 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 ){ + 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]); + for (i = 0; i < nSubSrc; i++) { + recomputeColumnsUsed(pParent, &pSrc->a[i + iFrom]); } } @@ -140255,12 +138434,12 @@ static int flattenSubquery( ** success. */ sqlite3AggInfoPersistWalkerInit(&w, pParse); - sqlite3WalkSelect(&w,pSub1); + sqlite3WalkSelect(&w, pSub1); sqlite3SelectDelete(db, pSub1); #if TREETRACE_ENABLED - if( sqlite3TreeTrace & 0x100 ){ - SELECTTRACE(0x100,pParse,p,("After flattening:\n")); + if (sqlite3TreeTrace & 0x100) { + SELECTTRACE(0x100, pParse, p, ("After flattening:\n")); sqlite3TreeViewSelect(0, p, 0); } #endif @@ -140275,14 +138454,14 @@ static int flattenSubquery( */ typedef struct WhereConst WhereConst; struct WhereConst { - Parse *pParse; /* Parsing context */ - u8 *pOomFault; /* Pointer to pParse->db->mallocFailed */ + 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 */ + Expr** apExpr; /* [i*2] is COLUMN and [i*2+1] is VALUE */ }; /* @@ -140293,45 +138472,43 @@ struct WhereConst { ** 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 */ -){ +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) ); + 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)) ){ + 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. */ + for (i = 0; i < pConst->nConst; 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 ){ + 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->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; + } else { + pConst->apExpr[pConst->nConst * 2 - 2] = pColumn; + pConst->apExpr[pConst->nConst * 2 - 1] = pValue; } } @@ -140341,29 +138518,31 @@ static void constInsert( ** 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){ +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) ); + 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 ){ + if (pExpr->op == TK_AND) { findConstInWhere(pConst, pExpr->pRight); findConstInWhere(pConst, pExpr->pLeft); return; } - if( pExpr->op!=TK_EQ ) 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); + 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); + if (pLeft->op == TK_COLUMN && sqlite3ExprIsConstant(pRight)) { + constInsert(pConst, pLeft, pRight, pExpr); } } @@ -140376,35 +138555,37 @@ static void findConstInWhere(WhereConst *pConst, Expr *pExpr){ ** if argument bIgnoreAffBlob is non-zero and the affinity of pExpr ** is SQLITE_AFF_BLOB. */ -static int propagateConstantExprRewriteOne( - WhereConst *pConst, - Expr *pExpr, - int bIgnoreAffBlob -){ +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) ); + 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 ){ + for (i = 0; i < pConst->nConst; 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; + 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; @@ -140426,19 +138607,18 @@ static int propagateConstantExprRewriteOne( ** 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 - ){ +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 ){ + if (pConst->pOomFault[0]) + return WRC_Prune; + if (sqlite3ExprAffinity(pExpr->pLeft) != SQLITE_AFF_TEXT) { propagateConstantExprRewriteOne(pConst, pExpr->pRight, 0); } } @@ -140497,33 +138677,29 @@ static int propagateConstantExprRewrite(Walker *pWalker, Expr *pExpr){ ** 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 */ -){ +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{ + 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 - ){ + 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{ + } else { /* Do not propagate constants through the ON clause of a LEFT JOIN */ x.mExcludeOn = EP_OuterON; } findConstInWhere(&x, p->pWhere); - if( x.nConst ){ + if (x.nConst) { memset(&w, 0, sizeof(w)); w.pParse = pParse; w.xExprCallback = propagateConstantExprRewrite; @@ -140535,12 +138711,12 @@ static int propagateConstants( sqlite3DbFree(x.pParse->db, x.apExpr); nChng += x.nChng; } - }while( x.nChng ); + } while (x.nChng); return nChng; } #if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) -# if !defined(SQLITE_OMIT_WINDOWFUNC) +#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 @@ -140559,13 +138735,13 @@ static int propagateConstants( ** * 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 ); +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 /* SQLITE_OMIT_WINDOWFUNC */ #endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ #if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) @@ -140637,26 +138813,30 @@ static int pushDownWindowCheck(Parse *pParse, Select *pSubq, Expr *pExpr){ ** 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; +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; + 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) */ + 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; + } else { + if (pSubq->pWin && pSubq->pWin->pPartition == 0) + return 0; } #endif @@ -140666,22 +138846,22 @@ static int pushDownWhereTerms( ** in the future. */ { - Select *pX; - for(pX=pSubq; pX; pX=pX->pPrior){ - assert( (pX->selFlags & (SF_Recursive))==0 ); + Select* pX; + for (pX = pSubq; pX; pX = pX->pPrior) { + assert((pX->selFlags & (SF_Recursive)) == 0); } } #endif - if( pSubq->pLimit!=0 ){ + if (pSubq->pLimit != 0) { return 0; /* restriction (3) */ } - while( pWhere->op==TK_AND ){ + 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 0 /* Legacy code. Checks now done by sqlite3ExprIsTableConstraint() */ if( isLeftJoin && (ExprHasProperty(pWhere,EP_OuterON)==0 || pWhere->w.iJoin!=iCursor) @@ -140695,10 +138875,10 @@ static int pushDownWhereTerms( } #endif - if( sqlite3ExprIsTableConstraint(pWhere, pSrc) ){ + if (sqlite3ExprIsTableConstraint(pWhere, pSrc)) { nChng++; pSubq->selFlags |= SF_PushDown; - while( pSubq ){ + while (pSubq) { SubstContext x; pNew = sqlite3ExprDup(pParse->db, pWhere, 0); unsetJoinExpr(pNew, -1, 1); @@ -140709,16 +138889,16 @@ static int pushDownWhereTerms( x.pEList = pSubq->pEList; pNew = substExpr(&x, pNew); #ifndef SQLITE_OMIT_WINDOWFUNC - if( pSubq->pWin && 0==pushDownWindowCheck(pParse, pSubq, pNew) ){ + 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 ){ + if (pSubq->selFlags & SF_Aggregate) { pSubq->pHaving = sqlite3ExprAnd(pParse, pSubq->pHaving, pNew); - }else{ + } else { pSubq->pWhere = sqlite3ExprAnd(pParse, pSubq->pWhere, pNew); } pSubq = pSubq->pPrior; @@ -140744,41 +138924,38 @@ static int pushDownWhereTerms( ** 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; +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) ); + 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) - ){ + if (pEList == 0 || pEList->nExpr != 1 || ExprHasProperty(pFunc, EP_WinFunc) || OptimizationDisabled(db, SQLITE_MinMaxOpt)) { return eRet; } - assert( !ExprHasProperty(pFunc, EP_IntValue) ); + assert(!ExprHasProperty(pFunc, EP_IntValue)); zFunc = pFunc->u.zToken; - if( sqlite3StrICmp(zFunc, "min")==0 ){ + if (sqlite3StrICmp(zFunc, "min") == 0) { eRet = WHERE_ORDERBY_MIN; - if( sqlite3ExprCanBeNull(pEList->a[0].pExpr) ){ + if (sqlite3ExprCanBeNull(pEList->a[0].pExpr)) { sortFlags = KEYINFO_ORDER_BIGNULL; } - }else if( sqlite3StrICmp(zFunc, "max")==0 ){ + } else if (sqlite3StrICmp(zFunc, "max") == 0) { eRet = WHERE_ORDERBY_MAX; sortFlags = KEYINFO_ORDER_DESC; - }else{ + } else { return eRet; } *ppMinMax = pOrderBy = sqlite3ExprListDup(db, pEList, 0); - assert( pOrderBy!=0 || db->mallocFailed ); - if( pOrderBy ) pOrderBy->a[0].fg.sortFlags = sortFlags; + assert(pOrderBy != 0 || db->mallocFailed); + if (pOrderBy) + pOrderBy->a[0].fg.sortFlags = sortFlags; return eRet; } @@ -140799,34 +138976,33 @@ static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){ ** 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; +static Table* isSimpleCount(Select* p, AggInfo* pAggInfo) { + Table* pTab; + Expr* pExpr; - assert( !p->pGroupBy ); + assert(!p->pGroupBy); - if( p->pWhere - || p->pEList->nExpr!=1 - || p->pSrc->nSrc!=1 - || p->pSrc->a[0].pSelect - || pAggInfo->nFunc!=1 - || p->pHaving - ){ + if (p->pWhere || p->pEList->nExpr != 1 || p->pSrc->nSrc != 1 || p->pSrc->a[0].pSelect || pAggInfo->nFunc != 1 || p->pHaving) { return 0; } pTab = p->pSrc->a[0].pTab; - assert( pTab!=0 ); - assert( !IsView(pTab) ); - if( !IsOrdinaryTable(pTab) ) return 0; + 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; + 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; } @@ -140838,23 +139014,21 @@ static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){ ** 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 ); +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 ){ + 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 ); + assert(pFrom->fg.isCte == 0); pFrom->u2.pIBIndex = pIdx; return SQLITE_OK; } @@ -140880,20 +139054,24 @@ SQLITE_PRIVATE int sqlite3IndexedByLookup(Parse *pParse, SrcItem *pFrom){ ** 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){ +static int convertCompoundSelectToSubquery(Walker* pWalker, Select* p) { int i; - Select *pNew; - Select *pX; - sqlite3 *db; - struct ExprList_item *a; - SrcList *pNewSrc; - Parse *pParse; + 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; + 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 @@ -140901,22 +139079,27 @@ static int convertCompoundSelectToSubquery(Walker *pWalker, Select *p){ ** 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; + 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; + for (i = p->pOrderBy->nExpr - 1; i >= 0; i--) { + if (a[i].pExpr->flags & EP_Collate) + break; } - if( i<0 ) return WRC_Continue; + 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; + 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; + 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)); @@ -140932,9 +139115,9 @@ static int convertCompoundSelectToSubquery(Walker *pWalker, Select *p){ p->pWinDefn = 0; #endif p->selFlags &= ~SF_Compound; - assert( (p->selFlags & SF_Converted)==0 ); + assert((p->selFlags & SF_Converted) == 0); p->selFlags |= SF_Converted; - assert( pNew->pPrior!=0 ); + assert(pNew->pPrior != 0); pNew->pPrior->pNext = pNew; pNew->pLimit = 0; return WRC_Continue; @@ -140945,8 +139128,8 @@ static int convertCompoundSelectToSubquery(Walker *pWalker, Select *p){ ** 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 ){ +static int cannotBeFunction(Parse* pParse, SrcItem* pFrom) { + if (pFrom->fg.isTabFunc) { sqlite3ErrorMsg(pParse, "'%s' is not a function", pFrom->zName); return 1; } @@ -140964,24 +139147,24 @@ static int cannotBeFunction(Parse *pParse, SrcItem *pFrom){ ** 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){ +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 ){ + for (i = 0; i < p->nCte; i++) { + if (sqlite3StrICmp(zName, p->a[i].zName) == 0) { *ppContext = p; return &p->a[i]; } } - if( p->bView ) break; + if (p->bView) + break; } return 0; } @@ -141003,16 +139186,15 @@ static struct Cte *searchWith( ** 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; +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 ); + if (pParse->nErr == 0) { + assert(pParse->pWith != pWith); pWith->pOuter = pParse->pWith; pParse->pWith = pWith; } @@ -141034,30 +139216,29 @@ SQLITE_PRIVATE With *sqlite3WithPush(Parse *pParse, With *pWith, u8 bFree){ ** 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 */ +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 ){ + 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 ){ + if (pParse->nErr) { /* Prior errors might have left pParse->pWith in a goofy state, so ** go no further. */ return 0; } - if( pFrom->zDatabase!=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 ){ + 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(). @@ -141066,37 +139247,37 @@ static int resolveFromTermToCte( 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) { + 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 ){ + if (pCte->zCteErr) { sqlite3ErrorMsg(pParse, pCte->zCteErr, pCte->zName); return 2; } - if( cannotBeFunction(pParse, pFrom) ) return 2; + if (cannotBeFunction(pParse, pFrom)) + return 2; - assert( pFrom->pTab==0 ); + assert(pFrom->pTab == 0); pTab = sqlite3DbMallocZero(db, sizeof(Table)); - if( pTab==0 ) return 2; + if (pTab == 0) + return 2; pCteUse = pCte->pUse; - if( pCteUse==0 ){ + if (pCteUse == 0) { pCte->pUse = pCteUse = sqlite3DbMallocZero(db, sizeof(pCteUse[0])); - if( pCteUse==0 - || sqlite3ParserAddCleanup(pParse,sqlite3DbFree,pCteUse)==0 - ){ + if (pCteUse == 0 || sqlite3ParserAddCleanup(pParse, sqlite3DbFree, pCteUse) == 0) { sqlite3DbFree(db, pTab); return 2; } @@ -141106,86 +139287,84 @@ static int resolveFromTermToCte( pTab->nTabRef = 1; pTab->zName = sqlite3DbStrDup(db, pCte->zName); pTab->iPKey = -1; - pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); + 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; + if (db->mallocFailed) + return 2; pFrom->pSelect->selFlags |= SF_CopyCte; - assert( pFrom->pSelect ); - if( pFrom->fg.isIndexedBy ){ + 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 ){ + 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 ){ + 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) - ){ + SrcList* pSrc = pRecTerm->pSrc; + assert(pRecTerm->pPrior != 0); + for (i = 0; i < pSrc->nSrc; 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 - ); + 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++; + if (iRecTab < 0) + iRecTab = pParse->nTab++; pItem->iCursor = iRecTab; } } - if( (pRecTerm->selFlags & SF_Recursive)==0 ) break; + 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 ){ + 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 ); + 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 ){ + if (rc) { pParse->pWith = pSavedWith; return 2; } - }else{ - if( sqlite3WalkSelect(pWalker, pSel) ){ + } else { + if (sqlite3WalkSelect(pWalker, pSel)) { pParse->pWith = pSavedWith; return 2; } } pParse->pWith = pWith; - for(pLeft=pSel; pLeft->pPrior; pLeft=pLeft->pPrior); + 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 - ); + 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; } @@ -141193,19 +139372,19 @@ static int resolveFromTermToCte( } sqlite3ColumnsFromExprList(pParse, pEList, &pTab->nCol, &pTab->aCol); - if( bMayRecursive ){ - if( pSel->selFlags & SF_Recursive ){ + if (bMayRecursive) { + if (pSel->selFlags & SF_Recursive) { pCte->zCteErr = "multiple recursive references: %s"; - }else{ + } else { pCte->zCteErr = "recursive reference in a subquery: %s"; } sqlite3WalkSelect(pWalker, pSel); } pCte->zCteErr = 0; pParse->pWith = pSavedWith; - return 1; /* Success */ + return 1; /* Success */ } - return 0; /* No match */ + return 0; /* No match */ } #endif @@ -141218,12 +139397,12 @@ static int resolveFromTermToCte( ** 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 ); +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; } } @@ -141237,33 +139416,36 @@ SQLITE_PRIVATE void sqlite3SelectPopWith(Walker *pWalker, Select *p){ ** 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; +SQLITE_PRIVATE int sqlite3ExpandSubquery(Parse* pParse, SrcItem* pFrom) { + Select* pSel = pFrom->pSelect; + Table* pTab; - assert( pSel ); + assert(pSel); pFrom->pTab = pTab = sqlite3DbMallocZero(pParse->db, sizeof(Table)); - if( pTab==0 ) return SQLITE_NOMEM; + if (pTab == 0) + return SQLITE_NOMEM; pTab->nTabRef = 1; - if( pFrom->zAlias ){ + if (pFrom->zAlias) { pTab->zName = sqlite3DbStrDup(pParse->db, pFrom->zAlias); - }else{ + } else { pTab->zName = sqlite3MPrintf(pParse->db, "%!S", pFrom); } - while( pSel->pPrior ){ pSel = pSel->pPrior; } - sqlite3ColumnsFromExprList(pParse, pSel->pEList,&pTab->nCol,&pTab->aCol); + while (pSel->pPrior) { + pSel = pSel->pPrior; + } + sqlite3ColumnsFromExprList(pParse, pSel->pEList, &pTab->nCol, &pTab->aCol); pTab->iPKey = -1; - pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); + 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 */ + 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 @@ -141273,22 +139455,23 @@ SQLITE_PRIVATE int sqlite3ExpandSubquery(Parse *pParse, SrcItem *pFrom){ ** 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 ){ +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; + 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: @@ -141313,35 +139496,35 @@ static int inAnyUsingClause( ** and TABLE.* to be every column in TABLE. ** */ -static int selectExpander(Walker *pWalker, Select *p){ - Parse *pParse = pWalker->pParse; +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; + 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 ){ + if (db->mallocFailed) { return WRC_Abort; } - assert( p->pSrc!=0 ); - if( (selFlags & SF_Expanded)!=0 ){ + assert(p->pSrc != 0); + if ((selFlags & SF_Expanded) != 0) { return WRC_Prune; } - if( pWalker->eCode ){ + 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 ){ + if (pParse->pWith && (p->selFlags & SF_View)) { + if (p->pWith == 0) { p->pWith = (With*)sqlite3DbMallocZero(db, sizeof(With)); - if( p->pWith==0 ){ + if (p->pWith == 0) { return WRC_Abort; } } @@ -141358,70 +139541,68 @@ static int selectExpander(Walker *pWalker, Select *p){ ** 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 ){ + for (i = 0, pFrom = pTabList->a; i < pTabList->nSrc; 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; + 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; + 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; + } else if ((rc = resolveFromTermToCte(pParse, pWalker, pFrom)) != 0) { + if (rc > 1) + return WRC_Abort; pTab = pFrom->pTab; - assert( pTab!=0 ); + assert(pTab != 0); #endif - }else{ + } else { /* An ordinary table or view name in the FROM clause */ - assert( pFrom->pTab==0 ); + 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); + 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) ){ + if (!IsVirtual(pTab) && cannotBeFunction(pParse, pFrom)) { return WRC_Abort; } #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) - if( !IsOrdinaryTable(pTab) ){ + 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); + 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); + 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 ); + assert(SQLITE_VTABRISK_Normal == 1 && SQLITE_VTABRISK_High == 2); #endif nCol = pTab->nCol; pTab->nCol = -1; - pWalker->eCode = 1; /* Turn on Select.selId renumbering */ + pWalker->eCode = 1; /* Turn on Select.selId renumbering */ sqlite3WalkSelect(pWalker, pFrom->pSelect); pWalker->eCode = eCodeOrig; pTab->nCol = nCol; @@ -141430,15 +139611,15 @@ static int selectExpander(Walker *pWalker, Select *p){ } /* Locate the index named by the INDEXED BY clause, if any. */ - if( pFrom->fg.isIndexedBy && sqlite3IndexedByLookup(pParse, pFrom) ){ + 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) ){ + */ + assert(db->mallocFailed == 0 || pParse->nErr != 0); + if (pParse->nErr || sqlite3ProcessJoin(pParse, p)) { return WRC_Abort; } @@ -141453,109 +139634,103 @@ static int selectExpander(Walker *pWalker, Select *p){ ** The first loop just checks to see if there are any "*" operators ** that need expanding. */ - for(k=0; knExpr; k++){ + for (k = 0; k < pEList->nExpr; 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; + 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 (k < pEList->nExpr) { /* ** 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; + struct ExprList_item* a = pEList->a; + ExprList* pNew = 0; int flags = pParse->db->flags; - int longNames = (flags & SQLITE_FullColNames)!=0 - && (flags & SQLITE_ShortColNames)==0; + int longNames = (flags & SQLITE_FullColNames) != 0 && (flags & SQLITE_ShortColNames) == 0; - for(k=0; knExpr; k++){ + for (k = 0; k < pEList->nExpr; 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) - ){ + 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; + 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{ + } 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) ); + 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 */ + for (i = 0, pFrom = pTabList->a; i < pTabList->nSrc; 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] */ + IdList* pUsing; /* USING clause for pFrom[1] */ - if( (zTabName = pFrom->zAlias)==0 ){ + 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 ); + 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 ){ + 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 : "*"; + zSchemaName = iDb >= 0 ? db->aDb[iDb].zDbSName : "*"; } - if( i+1nSrc - && pFrom[1].fg.isUsing - && (selFlags & SF_NestedFrom)!=0 - ){ + if (i + 1 < pTabList->nSrc && 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; + for (ii = 0; ii < pUsing->nId; 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); + 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{ + } else { pUsing = 0; } - for(j=0; jnCol; j++){ - char *zName = pTab->aCol[j].zCnName; - struct ExprList_item *pX; /* Newly added ExprList term */ + for (j = 0; j < pTab->nCol; 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 - ){ + assert(zName); + if (zTName && pNestedFrom && sqlite3MatchEName(&pNestedFrom->a[j], 0, zTName, 0) == 0) { continue; } @@ -141563,86 +139738,70 @@ static int selectExpander(Walker *pWalker, Select *p){ ** result-set list unless the SELECT has the SF_IncludeHidden ** bit set. */ - if( (p->selFlags & SF_IncludeHidden)==0 - && IsHiddenColumn(&pTab->aCol[j]) - ){ + 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 - ){ + 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 - ){ + 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; + 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 ){ + if (IN_RENAME_OBJECT && pE->pLeft) { sqlite3RenameTokenRemap(pParse, pLeft, pE->pLeft); } - if( zSchemaName ){ + if (zSchemaName) { pLeft = sqlite3Expr(db, TK_ID, zSchemaName); pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pExpr); } - }else{ + } else { pExpr = pRight; } pNew = sqlite3ExprListAppend(pParse, pNew, pExpr); - if( pNew==0 ){ - break; /* OOM */ + 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 = &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 ); + 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 - ){ + 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 ){ + } else if (longNames) { pX->zEName = sqlite3MPrintf(db, "%s.%s", zTabName, zName); pX->fg.eEName = ENAME_NAME; - }else{ + } else { pX->zEName = sqlite3DbStrDup(db, zName); pX->fg.eEName = ENAME_NAME; } } } - if( !tableSeen ){ - if( zTName ){ + if (!tableSeen) { + if (zTName) { sqlite3ErrorMsg(pParse, "no such table: %s", zTName); - }else{ + } else { sqlite3ErrorMsg(pParse, "no tables specified"); } } @@ -141651,18 +139810,18 @@ static int selectExpander(Walker *pWalker, Select *p){ sqlite3ExprListDelete(db, pEList); p->pEList = pNew; } - if( p->pEList ){ - if( p->pEList->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ + 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 ){ + 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")); + if (sqlite3TreeTrace & 0x100) { + SELECTTRACE(0x100, pParse, p, ("After result-set wildcard expansion:\n")); sqlite3TreeViewSelect(0, p, 0); } #endif @@ -141674,9 +139833,9 @@ static int selectExpander(Walker *pWalker, Select *p){ ** Always assert. This xSelectCallback2 implementation proves that the ** xSelectCallback2 is never invoked. */ -SQLITE_PRIVATE void sqlite3SelectWalkAssert2(Walker *NotUsed, Select *NotUsed2){ +SQLITE_PRIVATE void sqlite3SelectWalkAssert2(Walker* NotUsed, Select* NotUsed2) { UNUSED_PARAMETER2(NotUsed, NotUsed2); - assert( 0 ); + assert(0); } #endif /* @@ -141692,11 +139851,11 @@ SQLITE_PRIVATE void sqlite3SelectWalkAssert2(Walker *NotUsed, Select *NotUsed2){ ** The calling function can detect the problem by looking at pParse->nErr ** and/or pParse->db->mallocFailed. */ -static void sqlite3SelectExpand(Parse *pParse, Select *pSelect){ +static void sqlite3SelectExpand(Parse* pParse, Select* pSelect) { Walker w; w.xExprCallback = sqlite3ExprWalkNoop; w.pParse = pParse; - if( OK_IF_ALWAYS_TRUE(pParse->hasCompound) ){ + if (OK_IF_ALWAYS_TRUE(pParse->hasCompound)) { w.xSelectCallback = convertCompoundSelectToSubquery; w.xSelectCallback2 = 0; sqlite3WalkSelect(&w, pSelect); @@ -141707,7 +139866,6 @@ static void sqlite3SelectExpand(Parse *pParse, Select *pSelect){ sqlite3WalkSelect(&w, pSelect); } - #ifndef SQLITE_OMIT_SUBQUERY /* ** This is a Walker.xSelectCallback callback for the sqlite3SelectTypeInfo() @@ -141722,34 +139880,34 @@ static void sqlite3SelectExpand(Parse *pParse, Select *pSelect){ ** 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; +static void selectAddSubqueryTypeInfo(Walker* pWalker, Select* p) { + Parse* pParse; int i; - SrcList *pTabList; - SrcItem *pFrom; + SrcList* pTabList; + SrcItem* pFrom; - assert( p->selFlags & SF_Resolved ); - if( p->selFlags & SF_HasTypeInfo ) return; + 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 ){ + for (i = 0, pFrom = pTabList->a; i < pTabList->nSrc; 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); + 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 @@ -141757,7 +139915,7 @@ static void selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){ ** ** Use this routine after name resolution. */ -static void sqlite3SelectAddTypeInfo(Parse *pParse, Select *pSelect){ +static void sqlite3SelectAddTypeInfo(Parse* pParse, Select* pSelect) { #ifndef SQLITE_OMIT_SUBQUERY Walker w; w.xSelectCallback = sqlite3SelectWalkNoop; @@ -141768,7 +139926,6 @@ static void sqlite3SelectAddTypeInfo(Parse *pParse, Select *pSelect){ #endif } - /* ** This routine sets up a SELECT statement for processing. The ** following is accomplished: @@ -141781,19 +139938,22 @@ static void sqlite3SelectAddTypeInfo(Parse *pParse, Select *pSelect){ ** ** 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; +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; + if (pParse->nErr) + return; sqlite3ResolveSelectNames(pParse, p, pOuterNC); - if( pParse->nErr ) return; + if (pParse->nErr) + return; sqlite3SelectAddTypeInfo(pParse, p); } @@ -141805,43 +139965,41 @@ SQLITE_PRIVATE void sqlite3SelectPrep( ** routine generates code that stores NULLs in all of those memory ** cells. */ -static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){ - Vdbe *v = pParse->pVdbe; +static void resetAccumulator(Parse* pParse, AggInfo* pAggInfo) { + Vdbe* v = pParse->pVdbe; int i; - struct AggInfo_func *pFunc; + 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; + 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 ); + assert(nReg == pAggInfo->mxReg - pAggInfo->mnReg + 1); + for (i = 0; i < pAggInfo->nColumn; 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 ); + for (i = 0; i < pAggInfo->nFunc; i++) { + assert(pAggInfo->aFunc[i].iMem >= pAggInfo->mnReg && pAggInfo->aFunc[i].iMem <= pAggInfo->mxReg); } #endif sqlite3VdbeAddOp3(v, OP_Null, 0, pAggInfo->mnReg, pAggInfo->mxReg); - for(pFunc=pAggInfo->aFunc, i=0; inFunc; i++, pFunc++){ - if( pFunc->iDistinct>=0 ){ - Expr *pE = pFunc->pFExpr; - assert( ExprUseXList(pE) ); - if( pE->x.pList==0 || pE->x.pList->nExpr!=1 ){ + for (pFunc = pAggInfo->aFunc, i = 0; i < pAggInfo->nFunc; 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"); + "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)); + } 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)); } } } @@ -141851,20 +140009,19 @@ static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){ ** Invoke the OP_AggFinalize opcode for every aggregate function ** in the AggInfo structure. */ -static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){ - Vdbe *v = pParse->pVdbe; +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) ); + struct AggInfo_func* pF; + for (i = 0, pF = pAggInfo->aFunc; i < pAggInfo->nFunc; 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. @@ -141874,38 +140031,31 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){ ** 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; +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; + struct AggInfo_func* pF; + struct AggInfo_col* pC; pAggInfo->directMode = 1; - for(i=0, pF=pAggInfo->aFunc; inFunc; i++, pF++){ + for (i = 0, pF = pAggInfo->aFunc; i < pAggInfo->nFunc; i++, pF++) { int nArg; int addrNext = 0; int regAgg; - ExprList *pList; - assert( ExprUseXList(pF->pFExpr) ); - assert( !IsWindowFunc(pF->pFExpr) ); + 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 (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 (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 @@ -141918,55 +140068,56 @@ static void updateAccumulator( addrNext = sqlite3VdbeMakeLabel(pParse); sqlite3ExprIfFalse(pParse, pFilter, addrNext, SQLITE_JUMPIFNULL); } - if( pList ){ + if (pList) { nArg = pList->nExpr; regAgg = sqlite3GetTempRange(pParse, nArg); sqlite3ExprCodeExprList(pParse, pList, regAgg, 0, SQLITE_ECEL_DUP); - }else{ + } else { nArg = 0; regAgg = 0; } - if( pF->iDistinct>=0 && pList ){ - if( addrNext==0 ){ + if (pF->iDistinct >= 0 && pList) { + if (addrNext == 0) { addrNext = sqlite3VdbeMakeLabel(pParse); } - pF->iDistinct = codeDistinct(pParse, eDistinctType, - pF->iDistinct, addrNext, pList, regAgg); + pF->iDistinct = codeDistinct(pParse, eDistinctType, pF->iDistinct, addrNext, pList, regAgg); } - if( pF->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ - CollSeq *pColl = 0; - struct ExprList_item *pItem; + 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 && jpFunc has NEEDCOLL */ + for (j = 0, pItem = pList->a; !pColl && j < nArg; j++, pItem++) { pColl = sqlite3ExprCollSeq(pParse, pItem->pExpr); } - if( !pColl ){ + 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); + 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 ){ + if (addrNext) { sqlite3VdbeResolveLabel(v, addrNext); } } - if( regHit==0 && pAggInfo->nAccumulator ){ + if (regHit == 0 && pAggInfo->nAccumulator) { regHit = regAcc; } - if( regHit ){ - addrHitTest = sqlite3VdbeAddOp1(v, OP_If, regHit); VdbeCoverage(v); + if (regHit) { + addrHitTest = sqlite3VdbeAddOp1(v, OP_If, regHit); + VdbeCoverage(v); } - for(i=0, pC=pAggInfo->aCol; inAccumulator; i++, pC++){ + for (i = 0, pC = pAggInfo->aCol; i < pAggInfo->nAccumulator; i++, pC++) { sqlite3ExprCode(pParse, pC->pCExpr, pC->iMem); } pAggInfo->directMode = 0; - if( addrHitTest ){ + if (addrHitTest) { sqlite3VdbeJumpHereOrPopInst(v, addrHitTest); } } @@ -141976,22 +140127,17 @@ static void updateAccumulator( ** 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 : "" - ); +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) +#define explainSimpleCount(a, b, c) #endif /* @@ -142005,9 +140151,9 @@ static void explainSimpleCount( ** 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; +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 @@ -142015,14 +140161,11 @@ static int havingToWhereExprCb(Walker *pWalker, Expr *pExpr){ ** 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; + 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; @@ -142049,7 +140192,7 @@ static int havingToWhereExprCb(Walker *pWalker, Expr *pExpr){ ** entirely of constants and expressions that are also GROUP BY terms that ** use the "BINARY" collation sequence. */ -static void havingToWhere(Parse *pParse, Select *p){ +static void havingToWhere(Parse* pParse, Select* p) { Walker sWalker; memset(&sWalker, 0, sizeof(sWalker)); sWalker.pParse = pParse; @@ -142057,8 +140200,8 @@ static void havingToWhere(Parse *pParse, Select *p){ 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")); + if (sWalker.eCode && (sqlite3TreeTrace & 0x100) != 0) { + SELECTTRACE(0x100, pParse, p, ("Move HAVING terms into WHERE:\n")); sqlite3TreeViewSelect(0, p, 0); } #endif @@ -142069,29 +140212,34 @@ static void havingToWhere(Parse *pParse, Select *p){ ** 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; +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; pItem < pThis; pItem++) { + Select* pS1; + if (pItem->pSelect == 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 ){ + 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 ){ + if (pItem->pSelect->selFlags & SF_PushDown) { /* The view was modified by some other optimization such as ** pushDownWhereTerms() */ continue; @@ -142104,7 +140252,7 @@ static SrcItem *isSelfJoinView( /* ** Deallocate a single AggInfo object */ -static void agginfoFree(sqlite3 *db, AggInfo *p){ +static void agginfoFree(sqlite3* db, AggInfo* p) { sqlite3DbFree(db, p->aCol); sqlite3DbFree(db, p->aFunc); sqlite3DbFreeNN(db, p); @@ -142130,32 +140278,46 @@ static void agginfoFree(sqlite3 *db, AggInfo *p){ ** ** Return TRUE if the optimization is undertaken. */ -static int countOfViewOptimization(Parse *pParse, Select *p){ +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; + 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 */ + 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 (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 */ @@ -142166,8 +140328,8 @@ static int countOfViewOptimization(Parse *pParse, Select *p){ p->pSrc->a[0].pSelect = 0; sqlite3SrcListDelete(db, p->pSrc); p->pSrc = sqlite3DbMallocZero(pParse->db, sizeof(*p->pSrc)); - while( pSub ){ - Expr *pTerm; + while (pSub) { + Expr* pTerm; pPrior = pSub->pPrior; pSub->pPrior = 0; pSub->pNext = 0; @@ -142179,9 +140341,9 @@ static int countOfViewOptimization(Parse *pParse, Select *p){ pSub->pEList = sqlite3ExprListAppend(pParse, 0, pTerm); pTerm = sqlite3PExpr(pParse, TK_SELECT, 0, 0); sqlite3PExprAddSelect(pParse, pTerm, pSub); - if( pExpr==0 ){ + if (pExpr == 0) { pExpr = pTerm; - }else{ + } else { pExpr = sqlite3PExpr(pParse, TK_PLUS, pTerm, pExpr); } pSub = pPrior; @@ -142190,8 +140352,8 @@ static int countOfViewOptimization(Parse *pParse, Select *p){ p->selFlags &= ~SF_Aggregate; #if TREETRACE_ENABLED - if( sqlite3TreeTrace & 0x400 ){ - SELECTTRACE(0x400,pParse,p,("After count-of-view optimization:\n")); + if (sqlite3TreeTrace & 0x400) { + SELECTTRACE(0x400, pParse, p, ("After count-of-view optimization:\n")); sqlite3TreeViewSelect(0, p, 0); } #endif @@ -142204,18 +140366,16 @@ static int countOfViewOptimization(Parse *pParse, Select *p){ ** as pSrcItem but has the same alias as p0, then return true. ** Otherwise return false. */ -static int sameSrcAlias(SrcItem *p0, SrcList *pSrc){ +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) ){ + for (i = 0; i < pSrc->nSrc; 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) - ){ + if (p1->pSelect && (p1->pSelect->selFlags & SF_NestedFrom) != 0 && sameSrcAlias(p0, p1->pSelect->pSrc)) { return 1; } } @@ -142235,82 +140395,78 @@ static int sameSrcAlias(SrcItem *p0, SrcList *pSrc){ ** 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 */ +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 ); + assert(pParse == db->pParse); v = sqlite3GetVdbe(pParse); - if( p==0 || pParse->nErr ){ + if (p == 0 || pParse->nErr) { return 1; } - assert( db->mallocFailed==0 ); - if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) 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__); + 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 ); + 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 (p->pOrderBy) { #if TREETRACE_ENABLED - SELECTTRACE(1,pParse,p, ("dropping superfluous ORDER BY:\n")); - if( sqlite3TreeTrace & 0x100 ){ + 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 ); + 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 ){ + if (pParse->nErr) { goto select_end; } - assert( db->mallocFailed==0 ); - assert( p->pEList!=0 ); + assert(db->mallocFailed == 0); + assert(p->pEList != 0); #if TREETRACE_ENABLED - if( sqlite3TreeTrace & 0x104 ){ - SELECTTRACE(0x104,pParse,p, ("after name resolution:\n")); + if (sqlite3TreeTrace & 0x104) { + SELECTTRACE(0x104, pParse, p, ("after name resolution:\n")); sqlite3TreeViewSelect(0, p, 0); } #endif @@ -142324,13 +140480,10 @@ SQLITE_PRIVATE int sqlite3Select( ** 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 - ); + 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; } @@ -142341,24 +140494,24 @@ SQLITE_PRIVATE int sqlite3Select( p->selFlags &= ~SF_UFSrcCheck; } - if( pDest->eDest==SRT_Output ){ + if (pDest->eDest == SRT_Output) { sqlite3GenerateColumnNames(pParse, p); } #ifndef SQLITE_OMIT_WINDOWFUNC - if( sqlite3WindowRewrite(pParse, p) ){ - assert( pParse->nErr ); + 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")); + 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; + isAgg = (p->selFlags & SF_Aggregate) != 0; memset(&sSort, 0, sizeof(sSort)); sSort.pOrderBy = p->pOrderBy; @@ -142366,39 +140519,35 @@ SQLITE_PRIVATE int sqlite3Select( ** 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; + for (i = 0; !p->pPrior && i < pTabList->nSrc; 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 ); + 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); + 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; + 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); + 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; } @@ -142409,8 +140558,9 @@ SQLITE_PRIVATE int sqlite3Select( ** 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 ((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 @@ -142432,18 +140582,13 @@ SQLITE_PRIVATE int sqlite3Select( ** (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); + 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; } @@ -142465,23 +140610,21 @@ SQLITE_PRIVATE int sqlite3Select( ** ** 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) - ){ + 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; + 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) ){ + if (db->mallocFailed) + goto select_end; + if (!IgnorableOrderby(pDest)) { sSort.pOrderBy = p->pOrderBy; } } @@ -142491,15 +140634,16 @@ SQLITE_PRIVATE int sqlite3Select( /* Handle compound SELECT statements using the separate multiSelect() ** procedure. */ - if( p->pPrior ){ + 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 ){ + 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); + if (p->pNext == 0) + ExplainQueryPlanPop(pParse); return rc; } #endif @@ -142509,26 +140653,21 @@ SQLITE_PRIVATE int sqlite3Select( ** 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 (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")); + 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")); + } 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; + if (OptimizationEnabled(db, SQLITE_QueryFlattener | SQLITE_CountOfView) && countOfViewOptimization(pParse, p)) { + if (db->mallocFailed) + goto select_end; pEList = p->pEList; pTabList = p->pSrc; } @@ -142538,13 +140677,13 @@ SQLITE_PRIVATE int sqlite3Select( ** (1) Authorized unreferenced tables ** (2) Generate code for all sub-queries */ - for(i=0; inSrc; i++){ - SrcItem *pItem = &pTabList->a[i]; - SrcItem *pPrior; + for (i = 0; i < pTabList->nSrc; i++) { + SrcItem* pItem = &pTabList->a[i]; + SrcItem* pPrior; SelectDest dest; - Select *pSub; + Select* pSub; #if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) - const char *zSavedAuthContext; + const char* zSavedAuthContext; #endif /* Issue SQLITE_READ authorizations with a fake column name for any @@ -142563,18 +140702,19 @@ SQLITE_PRIVATE int sqlite3Select( ** 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 ){ + 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; + if (pSub == 0) + continue; /* The code for a subquery should only be generated once. */ - assert( pItem->addrFillSub==0 ); + 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 @@ -142588,21 +140728,18 @@ SQLITE_PRIVATE int sqlite3Select( /* 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 (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)); + 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")); + assert(pItem->pSelect && (pItem->pSelect->selFlags & SF_PushDown) != 0); + } else { + SELECTTRACE(0x100, pParse, p, ("Push-down not possible\n")); } zSavedAuthContext = pParse->zAuthContext; @@ -142618,16 +140755,14 @@ SQLITE_PRIVATE int sqlite3Select( ** (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) */ - ){ + 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; + int addrTop = sqlite3VdbeCurrentAddr(v) + 1; pItem->regReturn = ++pParse->nMem; sqlite3VdbeAddOp3(v, OP_InitCoroutine, pItem->regReturn, 0, addrTop); @@ -142640,29 +140775,29 @@ SQLITE_PRIVATE int sqlite3Select( pItem->fg.viaCoroutine = 1; pItem->regResult = dest.iSdst; sqlite3VdbeEndCoroutine(v, pItem->regReturn); - sqlite3VdbeJumpHere(v, addrTop-1); + sqlite3VdbeJumpHere(v, addrTop - 1); sqlite3ClearTempRegCache(pParse); - }else if( pItem->fg.isCte && pItem->u2.pCteUse->addrM9e>0 ){ + } 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; + CteUse* pCteUse = pItem->u2.pCteUse; sqlite3VdbeAddOp2(v, OP_Gosub, pCteUse->regRtn, pCteUse->addrM9e); - if( pItem->iCursor!=pCteUse->iCur ){ + 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 ){ + } 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 ){ + 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{ + } 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. */ @@ -142671,35 +140806,38 @@ SQLITE_PRIVATE int sqlite3Select( pItem->regReturn = ++pParse->nMem; topAddr = sqlite3VdbeAddOp0(v, OP_Goto); - pItem->addrFillSub = topAddr+1; + pItem->addrFillSub = topAddr + 1; pItem->fg.isMaterialized = 1; - if( pItem->fg.isCorrelated==0 ){ + 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); + onceAddr = sqlite3VdbeAddOp0(v, OP_Once); + VdbeCoverage(v); VdbeComment((v, "materialize %!S", pItem)); - }else{ + } 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); + 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; + 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; + if (db->mallocFailed) + goto select_end; pParse->nHeight -= sqlite3SelectExprHeight(p); pParse->zAuthContext = zSavedAuthContext; #endif @@ -142711,11 +140849,11 @@ SQLITE_PRIVATE int sqlite3Select( pWhere = p->pWhere; pGroupBy = p->pGroupBy; pHaving = p->pHaving; - sDistinct.isTnct = (p->selFlags & SF_Distinct)!=0; + sDistinct.isTnct = (p->selFlags & SF_Distinct) != 0; #if TREETRACE_ENABLED - if( sqlite3TreeTrace & 0x400 ){ - SELECTTRACE(0x400,pParse,p,("After all FROM-clause analysis:\n")); + if (sqlite3TreeTrace & 0x400) { + SELECTTRACE(0x400, pParse, p, ("After all FROM-clause analysis:\n")); sqlite3TreeViewSelect(0, p, 0); } #endif @@ -142735,24 +140873,23 @@ SQLITE_PRIVATE int sqlite3Select( ** 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 + if ((p->selFlags & (SF_Distinct | SF_Aggregate)) == SF_Distinct && sqlite3ExprListCompare(sSort.pOrderBy, pEList, -1) == 0 #ifndef SQLITE_OMIT_WINDOWFUNC - && p->pWin==0 + && 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 ); + assert(sDistinct.isTnct); sDistinct.isTnct = 2; #if TREETRACE_ENABLED - if( sqlite3TreeTrace & 0x400 ){ - SELECTTRACE(0x400,pParse,p,("Transform DISTINCT into GROUP BY:\n")); + if (sqlite3TreeTrace & 0x400) { + SELECTTRACE(0x400, pParse, p, ("Transform DISTINCT into GROUP BY:\n")); sqlite3TreeViewSelect(0, p, 0); } #endif @@ -142766,108 +140903,101 @@ SQLITE_PRIVATE int sqlite3Select( ** 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); + 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{ + 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 ){ + */ + if (pDest->eDest == SRT_EphemTab) { sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pDest->iSDParm, pEList->nExpr); - if( p->selFlags & SF_NestedFrom ){ + 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--){ + 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; + for (ii = 0; ii < pEList->nExpr; 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 */ + if ((p->selFlags & SF_FixedLimit) == 0) { + p->nSelectRow = 320; /* 4 billion rows */ } computeLimitRegisters(pParse, p, iEnd); - if( p->iLimit==0 && sSort.addrSortIndex>=0 ){ + 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 ){ + */ + 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); + 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{ + } else { sDistinct.eTnctType = WHERE_DISTINCT_NOOP; } - if( !isAgg && pGroupBy==0 ){ + if (!isAgg && pGroupBy == 0) { /* No aggregate functions and no GROUP BY clause */ - u16 wctrlFlags = (sDistinct.isTnct ? WHERE_WANT_DISTINCT : 0) - | (p->selFlags & SF_FixedLimit); + 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 ){ + Window* pWin = p->pWin; /* Main window object (or NULL) */ + if (pWin) { sqlite3WindowCodeInit(pParse, p); } #endif - assert( WHERE_USE_LIMIT==SF_FixedLimit ); - + 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 ){ + 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) ){ + if (sDistinct.isTnct && sqlite3WhereIsDistinct(pWInfo)) { sDistinct.eTnctType = sqlite3WhereIsDistinct(pWInfo); } - if( sSort.pOrderBy ){ + if (sSort.pOrderBy) { sSort.nOBSat = sqlite3WhereIsOrdered(pWInfo); sSort.labelOBLopt = sqlite3WhereOrderByLimitOptLabel(pWInfo); - if( sSort.nOBSat==sSort.pOrderBy->nExpr ){ + if (sSort.nOBSat == sSort.pOrderBy->nExpr) { sSort.pOrderBy = 0; } } - SELECTTRACE(1,pParse,p,("WhereBegin returns\n")); + 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 ){ + if (sSort.addrSortIndex >= 0 && sSort.pOrderBy == 0) { sqlite3VdbeChangeToNoop(v, sSort.addrSortIndex); } - assert( p->pEList==pEList ); + assert(p->pEList == pEList); #ifndef SQLITE_OMIT_WINDOWFUNC - if( pWin ){ + if (pWin) { int addrGosub = sqlite3VdbeMakeLabel(pParse); int iCont = sqlite3VdbeMakeLabel(pParse); int iBreak = sqlite3VdbeMakeLabel(pParse); @@ -142884,20 +141014,18 @@ SQLITE_PRIVATE int sqlite3Select( sqlite3VdbeAddOp1(v, OP_Return, regGosub); VdbeComment((v, "end inner-loop subroutine")); sqlite3VdbeResolveLabel(v, iBreak); - }else + } else #endif /* SQLITE_OMIT_WINDOWFUNC */ { /* Use the standard inner loop. */ - selectInnerLoop(pParse, p, -1, &sSort, &sDistinct, pDest, - sqlite3WhereContinueLabel(pWInfo), - sqlite3WhereBreakLabel(pWInfo)); + selectInnerLoop(pParse, p, -1, &sSort, &sDistinct, pDest, sqlite3WhereContinueLabel(pWInfo), sqlite3WhereBreakLabel(pWInfo)); /* End the database scan loop. - */ - SELECTTRACE(1,pParse,p,("WhereEnd\n")); + */ + SELECTTRACE(1, pParse, p, ("WhereEnd\n")); sqlite3WhereEnd(pWInfo); } - }else{ + } else { /* This case when there exist aggregate functions or a GROUP BY clause ** or both */ NameContext sNC; /* Name context for processing aggregate information */ @@ -142916,18 +141044,19 @@ SQLITE_PRIVATE int sqlite3Select( /* 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 */ + 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++){ + 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++){ + 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; + 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 @@ -142937,24 +141066,24 @@ SQLITE_PRIVATE int sqlite3Select( ** 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 ){ + 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++){ + for (ii = 0; ii < pGroupBy->nExpr; 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 ){ + if (sqlite3ExprListCompare(pGroupBy, sSort.pOrderBy, -1) == 0) { orderByGrp = 1; } } - }else{ - assert( 0==sqlite3LogEst(1) ); + } else { + assert(0 == sqlite3LogEst(1)); p->nSelectRow = 0; } @@ -142965,13 +141094,12 @@ SQLITE_PRIVATE int sqlite3Select( ** 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 ); + pAggInfo = sqlite3DbMallocZero(db, sizeof(*pAggInfo)); + if (pAggInfo) { + sqlite3ParserAddCleanup(pParse, (void (*)(sqlite3*, void*))agginfoFree, pAggInfo); + testcase(pParse->earlyCleanup); } - if( db->mallocFailed ){ + if (db->mallocFailed) { goto select_end; } pAggInfo->selId = p->selId; @@ -142979,71 +141107,69 @@ SQLITE_PRIVATE int sqlite3Select( sNC.pParse = pParse; sNC.pSrcList = pTabList; sNC.uNC.pAggInfo = pAggInfo; - VVA_ONLY( sNC.ncFlags = NC_UAggInfo; ) - pAggInfo->mnReg = pParse->nMem+1; + 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 ); + 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 ){ + if (p->pGroupBy == 0 && p->pHaving == 0 && pAggInfo->nFunc == 1) { minMaxFlag = minMaxQuery(db, pAggInfo->aFunc[0].pFExpr, &pMinMaxOrderBy); - }else{ + } else { minMaxFlag = WHERE_ORDERBY_NORMAL; } - for(i=0; inFunc; i++){ - Expr *pExpr = pAggInfo->aFunc[i].pFExpr; - assert( ExprUseXList(pExpr) ); + for (i = 0; i < pAggInfo->nFunc; 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) ){ + 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 (db->mallocFailed) + goto select_end; #if TREETRACE_ENABLED - if( sqlite3TreeTrace & 0x400 ){ + if (sqlite3TreeTrace & 0x400) { int ii; - SELECTTRACE(0x400,pParse,p,("After aggregate analysis %p:\n", pAggInfo)); + SELECTTRACE(0x400, pParse, p, ("After aggregate analysis %p:\n", pAggInfo)); sqlite3TreeViewSelect(0, p, 0); - if( minMaxFlag ){ + 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); + for (ii = 0; ii < pAggInfo->nColumn; 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); + for (ii = 0; ii < pAggInfo->nFunc; 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 */ + 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 */ @@ -143052,21 +141178,17 @@ SQLITE_PRIVATE int sqlite3Select( 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; + 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; + 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; + distFlag = pDistinct ? (WHERE_WANT_DISTINCT | WHERE_AGG_DISTINCT) : 0; } /* If there is a GROUP BY clause we might need a sorting index to @@ -143075,14 +141197,11 @@ SQLITE_PRIVATE int sqlite3Select( ** 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); + 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; @@ -143095,7 +141214,7 @@ SQLITE_PRIVATE int sqlite3Select( 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); + 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 @@ -143103,24 +141222,23 @@ SQLITE_PRIVATE int sqlite3Select( ** 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 ){ + 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 ){ + 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{ + } 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 @@ -143131,16 +141249,14 @@ SQLITE_PRIVATE int sqlite3Select( int nCol; int nGroupBy; - explainTempTable(pParse, - (sDistinct.isTnct && (p->selFlags&SF_Distinct)==0) ? - "DISTINCT" : "GROUP BY"); + 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 ){ + for (i = 0; i < pAggInfo->nColumn; i++) { + if (pAggInfo->aCol[i].iSorterColumn >= j) { nCol++; j++; } @@ -143148,12 +141264,11 @@ SQLITE_PRIVATE int sqlite3Select( 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 ){ + for (i = 0; i < pAggInfo->nColumn; 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); + sqlite3ExprCodeGetColumnOfTable(v, pCol->pTab, pCol->iTable, pCol->iColumn, r1); j++; } } @@ -143162,13 +141277,14 @@ SQLITE_PRIVATE int sqlite3Select( sqlite3VdbeAddOp2(v, OP_SorterInsert, pAggInfo->sortingIdx, regRecord); sqlite3ReleaseTempReg(pParse, regRecord); sqlite3ReleaseTempRange(pParse, regBase, nCol); - SELECTTRACE(1,pParse,p,("WhereEnd\n")); + 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); + VdbeComment((v, "GROUP BY sort")); + VdbeCoverage(v); pAggInfo->useSortingIdx = 1; } @@ -143179,9 +141295,7 @@ SQLITE_PRIVATE int sqlite3Select( ** 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)) - ){ + if (orderByGrp && OptimizationEnabled(db, SQLITE_GroupByOrder) && (groupBySort || sqlite3WhereIsSorted(pWInfo))) { sSort.pOrderBy = 0; sqlite3VdbeChangeToNoop(v, sSort.addrSortIndex); } @@ -143192,22 +141306,21 @@ SQLITE_PRIVATE int sqlite3Select( ** 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{ + if (groupBySort) { + sqlite3VdbeAddOp3(v, OP_SorterData, pAggInfo->sortingIdx, sortOut, sortPTab); + } + for (j = 0; j < pGroupBy->nExpr; j++) { + if (groupBySort) { + sqlite3VdbeAddOp3(v, OP_Column, sortPTab, j, iBMem + j); + } else { pAggInfo->directMode = 1; - sqlite3ExprCode(pParse, pGroupBy->a[j].pExpr, iBMem+j); + sqlite3ExprCode(pParse, pGroupBy->a[j].pExpr, iBMem + j); } } - sqlite3VdbeAddOp4(v, OP_Compare, iAMem, iBMem, pGroupBy->nExpr, - (char*)sqlite3KeyInfoRef(pKeyInfo), P4_KEYINFO); + 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); + 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 @@ -143221,7 +141334,8 @@ SQLITE_PRIVATE int sqlite3Select( 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); + sqlite3VdbeAddOp2(v, OP_IfPos, iAbortFlag, addrEnd); + VdbeCoverage(v); VdbeComment((v, "check abort flag")); sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset); VdbeComment((v, "reset accumulator")); @@ -143235,24 +141349,24 @@ SQLITE_PRIVATE int sqlite3Select( VdbeComment((v, "indicate data in accumulator")); /* End of the loop - */ - if( groupBySort ){ - sqlite3VdbeAddOp2(v, OP_SorterNext, pAggInfo->sortingIdx,addrTopOfLoop); + */ + if (groupBySort) { + sqlite3VdbeAddOp2(v, OP_SorterNext, pAggInfo->sortingIdx, addrTopOfLoop); VdbeCoverage(v); - }else{ - SELECTTRACE(1,pParse,p,("WhereEnd\n")); + } 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 @@ -143268,34 +141382,32 @@ SQLITE_PRIVATE int sqlite3Select( sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); sqlite3VdbeResolveLabel(v, addrOutputRow); addrOutputRow = sqlite3VdbeCurrentAddr(v); - sqlite3VdbeAddOp2(v, OP_IfPos, iUseFlag, addrOutputRow+2); + 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); + 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]; + 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 ){ + 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: ** @@ -143310,11 +141422,11 @@ SQLITE_PRIVATE int sqlite3Select( ** 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 */ + 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); @@ -143328,34 +141440,32 @@ SQLITE_PRIVATE int sqlite3Select( ** 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) - ){ + 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->szIdxRow < pTab->szTabRow && pIdx->pPartIdxWhere == 0 && + (!pBest || pIdx->szIdxRow < pBest->szIdxRow)) { pBest = pIdx; } } } - if( pBest ){ + 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); + 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; + } else { + int regAcc = 0; /* "populate accumulators" flag */ + ExprList* pDistinct = 0; u16 distFlag = 0; int eDist; @@ -143368,30 +141478,30 @@ SQLITE_PRIVATE int sqlite3Select( ** 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) ){ + if (pAggInfo->nAccumulator) { + for (i = 0; i < pAggInfo->nFunc; i++) { + if (ExprHasProperty(pAggInfo->aFunc[i].pFExpr, EP_WinFunc)) { continue; } - if( pAggInfo->aFunc[i].pFunc->funcFlags&SQLITE_FUNC_NEEDCOLL ){ + if (pAggInfo->aFunc[i].pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL) { break; } } - if( i==pAggInfo->nFunc ){ + 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) ); + } 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; + 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 ); + assert(p->pGroupBy == 0); resetAccumulator(pParse, pAggInfo); /* If this query is a candidate for the min/max optimization, then @@ -143399,92 +141509,90 @@ SQLITE_PRIVATE int sqlite3Select( ** 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 ); + 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 ){ + 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")); + 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 ){ + 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 ){ + if (regAcc) + sqlite3VdbeAddOp2(v, OP_Integer, 1, regAcc); + if (minMaxFlag) { sqlite3WhereMinMaxOptEarlyOut(v, pWInfo); } - SELECTTRACE(1,pParse,p,("WhereEnd\n")); + 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); + selectInnerLoop(pParse, p, -1, 0, 0, pDest, addrEnd, addrEnd); } sqlite3VdbeResolveLabel(v, addrEnd); } /* endif aggregate query */ - if( sDistinct.eTnctType==WHERE_DISTINCT_UNORDERED ){ + 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 ); + 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); + 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 ); + 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 ); + if (pAggInfo && !db->mallocFailed) { + for (i = 0; i < pAggInfo->nColumn; 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 ); + for (i = 0; i < pAggInfo->nFunc; 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 ){ + SELECTTRACE(0x1, pParse, p, ("end processing\n")); + if ((sqlite3TreeTrace & 0x2000) != 0 && ExplainQueryPlanParent(pParse) == 0) { sqlite3TreeViewSelect(0, p, 0); } #endif @@ -143521,13 +141629,13 @@ SQLITE_PRIVATE int sqlite3Select( ** 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() */ + 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; /* @@ -143535,57 +141643,58 @@ typedef struct TabResult { ** 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 */ +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{ + 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; + 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 ){ + if (p->nRow == 0) { p->nColumn = nCol; - for(i=0; iazResult[p->nData++] = z; } - }else if( (int)p->nColumn!=nCol ){ + } 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->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; @@ -143609,60 +141718,63 @@ static int sqlite3_get_table_cb(void *pArg, int nCol, char **argv, char **colv){ ** 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 */ -){ +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; + if (!sqlite3SafetyCheckOk(db) || pazResult == 0) + return SQLITE_MISUSE_BKPT; #endif *pazResult = 0; - if( pnColumn ) *pnColumn = 0; - if( pnRow ) *pnRow = 0; - if( pzErrMsg ) *pzErrMsg = 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 = 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) ); + assert(sizeof(res.azResult[0]) >= sizeof(res.nData)); res.azResult[0] = SQLITE_INT_TO_PTR(res.nData); - if( (rc&0xff)==SQLITE_ABORT ){ + if ((rc & 0xff) == SQLITE_ABORT) { sqlite3_free_table(&res.azResult[1]); - if( res.zErrMsg ){ - if( pzErrMsg ){ + if (res.zErrMsg) { + if (pzErrMsg) { sqlite3_free(*pzErrMsg); - *pzErrMsg = sqlite3_mprintf("%s",res.zErrMsg); + *pzErrMsg = sqlite3_mprintf("%s", res.zErrMsg); } sqlite3_free(res.zErrMsg); } - db->errCode = res.rc; /* Assume 32-bit assignment is atomic */ + db->errCode = res.rc; /* Assume 32-bit assignment is atomic */ return res.rc; } sqlite3_free(res.zErrMsg); - if( rc!=SQLITE_OK ){ + 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 ){ + 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; @@ -143670,23 +141782,27 @@ SQLITE_API int sqlite3_get_table( res.azResult = azNew; } *pazResult = &res.azResult[1]; - if( pnColumn ) *pnColumn = res.nColumn; - if( pnRow ) *pnRow = res.nRow; + 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 ){ +SQLITE_API void sqlite3_free_table(char** azResult /* Result returned from sqlite3_get_table() */ +) { + if (azResult) { int i, n; azResult--; - assert( azResult!=0 ); + assert(azResult != 0); n = SQLITE_PTR_TO_INT(azResult[0]); - for(i=1; ipNext; sqlite3ExprDelete(db, pTmp->pWhere); @@ -143744,30 +141860,27 @@ SQLITE_PRIVATE void sqlite3DeleteTriggerStep(sqlite3 *db, TriggerStep *pTriggerS ** 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 */ +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 ); + 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 - ){ + 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 ){ + } else if (pTrig->op == TK_RETURNING) { #ifndef SQLITE_OMIT_VIRTUALTABLE - assert( pParse->db->pVtabCtx==0 ); + assert(pParse->db->pVtabCtx == 0); #endif - assert( pParse->bReturning ); - assert( &(pParse->u1.pReturning->retTrig) == pTrig ); + assert(pParse->bReturning); + assert(&(pParse->u1.pReturning->retTrig) == pTrig); pTrig->table = pTab->zName; pTrig->pTabSchema = pTab->pSchema; pTrig->pNext = pList; @@ -143797,46 +141910,45 @@ SQLITE_PRIVATE Trigger *sqlite3TriggerList(Parse *pParse, Table *pTab){ ** 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 ){ +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 ){ + if (pName2->n > 0) { sqlite3ErrorMsg(pParse, "temporary trigger may not have qualified name"); goto trigger_cleanup; } iDb = 1; pName = pName1; - }else{ + } else { /* Figure out the db that the trigger will be created in */ iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName); - if( iDb<0 ){ + if (iDb < 0) { goto trigger_cleanup; } } - if( !pTableName || db->mallocFailed ){ + if (!pTableName || db->mallocFailed) { goto trigger_cleanup; } @@ -143848,7 +141960,7 @@ SQLITE_PRIVATE void sqlite3BeginTrigger( ** 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 ){ + if (db->init.busy && iDb != 1) { sqlite3DbFree(db, pTableName->a[0].zDatabase); pTableName->a[0].zDatabase = 0; } @@ -143859,24 +141971,24 @@ SQLITE_PRIVATE void sqlite3BeginTrigger( ** 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 ){ + 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 ); + if (db->mallocFailed) + goto trigger_cleanup; + assert(pTableName->nSrc == 1); sqlite3FixInit(&sFix, pParse, iDb, "trigger", pName); - if( sqlite3FixSrcList(&sFix, pTableName) ){ + if (sqlite3FixSrcList(&sFix, pTableName)) { goto trigger_cleanup; } pTab = sqlite3SrcListLookup(pParse, pTableName); - if( !pTab ){ + if (!pTab) { /* The table does not exist. */ goto trigger_orphan_error; } - if( IsVirtual(pTab) ){ + if (IsVirtual(pTab)) { sqlite3ErrorMsg(pParse, "cannot create triggers on virtual tables"); goto trigger_orphan_error; } @@ -143884,20 +141996,20 @@ SQLITE_PRIVATE void sqlite3BeginTrigger( /* 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 ); + if (zName == 0) { + assert(db->mallocFailed); goto trigger_cleanup; } - if( sqlite3CheckObjectName(pParse, zName, "trigger", pTab->zName) ){ + 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 ){ + 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 ); + } else { + assert(!db->init.busy); sqlite3CodeVerifySchema(pParse, iDb); } goto trigger_cleanup; @@ -143905,7 +142017,7 @@ SQLITE_PRIVATE void sqlite3BeginTrigger( } /* Do not create a trigger on a system table */ - if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 ){ + if (sqlite3StrNICmp(pTab->zName, "sqlite_", 7) == 0) { sqlite3ErrorMsg(pParse, "cannot create trigger on system table"); goto trigger_cleanup; } @@ -143913,28 +142025,30 @@ SQLITE_PRIVATE void sqlite3BeginTrigger( /* 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); + 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); + 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 ){ + 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) ){ + 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)){ + if (sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(iTabDb), 0, zDb)) { goto trigger_cleanup; } } @@ -143945,30 +142059,31 @@ SQLITE_PRIVATE void sqlite3BeginTrigger( ** INSTEAD OF trigger into a BEFORE trigger. It simplifies code ** elsewhere. */ - if (tr_tm == TK_INSTEAD){ + 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; + 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 ){ + 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{ + } else { pTrigger->pWhen = sqlite3ExprDup(db, pWhen, EXPRDUP_REDUCE); } pTrigger->pColumns = pColumns; pColumns = 0; - assert( pParse->pNewTrigger==0 ); + assert(pParse->pNewTrigger == 0); pParse->pNewTrigger = pTrigger; trigger_cleanup: @@ -143976,15 +142091,15 @@ SQLITE_PRIVATE void sqlite3BeginTrigger( sqlite3SrcListDelete(db, pTableName); sqlite3IdListDelete(db, pColumns); sqlite3ExprDelete(db, pWhen); - if( !pParse->pNewTrigger ){ + if (!pParse->pNewTrigger) { sqlite3DeleteTrigger(db, pTrigger); - }else{ - assert( pParse->pNewTrigger==pTrigger ); + } else { + assert(pParse->pNewTrigger == pTrigger); } return; trigger_orphan_error: - if( db->init.iDb==1 ){ + 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 @@ -144004,96 +142119,87 @@ SQLITE_PRIVATE void sqlite3BeginTrigger( ** 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 */ +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; + if (NEVER(pParse->nErr) || !pTrig) + goto triggerfinish_cleanup; zName = pTrig->zName; iDb = sqlite3SchemaToIndex(pParse->db, pTrig->pSchema); pTrig->step_list = pStepList; - while( 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) - ){ + 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 ); + if (IN_RENAME_OBJECT) { + assert(!db->init.busy); pParse->pNewTrigger = pTrig; pTrig = 0; - }else + } else #endif - /* if we are not initializing, - ** build the sqlite_schema entry - */ - if( !db->init.busy ){ - Vdbe *v; - char *z; - - /* If this is a new CREATE TABLE statement, and if shadow tables - ** are read-only, and the trigger makes a change to a shadow table, - ** then raise an error - do not allow the trigger to be created. */ - if( sqlite3ReadOnlyShadowTables(db) ){ - TriggerStep *pStep; - for(pStep=pTrig->step_list; pStep; pStep=pStep->pNext){ - if( pStep->zTarget!=0 - && sqlite3ShadowTableName(db, pStep->zTarget) - ){ - sqlite3ErrorMsg(pParse, - "trigger \"%s\" may not write to shadow table \"%s\"", - pTrig->zName, pStep->zTarget); - goto triggerfinish_cleanup; + /* if we are not initializing, + ** build the sqlite_schema entry + */ + if (!db->init.busy) { + Vdbe* v; + char* z; + + /* If this is a new CREATE TABLE statement, and if shadow tables + ** are read-only, and the trigger makes a change to a shadow table, + ** then raise an error - do not allow the trigger to be created. */ + if (sqlite3ReadOnlyShadowTables(db)) { + TriggerStep* pStep; + for (pStep = pTrig->step_list; pStep; pStep = pStep->pNext) { + if (pStep->zTarget != 0 && sqlite3ShadowTableName(db, pStep->zTarget)) { + sqlite3ErrorMsg(pParse, "trigger \"%s\" may not write to shadow table \"%s\"", pTrig->zName, pStep->zTarget); + goto triggerfinish_cleanup; + } } } - } - /* 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); - } + /* 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 ); + 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 ){ + if (pTrig) { sqlite3OomFault(db); - }else if( pLink->pSchema==pLink->pTabSchema ){ - Table *pTab; + } else if (pLink->pSchema == pLink->pTabSchema) { + Table* pTab; pTab = sqlite3HashFind(&pLink->pTabSchema->tblHash, pLink->table); - assert( pTab!=0 ); + assert(pTab != 0); pLink->pNext = pTab->pTrigger; pTab->pTrigger = pLink; } @@ -144101,7 +142207,7 @@ SQLITE_PRIVATE void sqlite3FinishTrigger( triggerfinish_cleanup: sqlite3DeleteTrigger(db, pTrig); - assert( IN_RENAME_OBJECT || !pParse->pNewTrigger ); + assert(IN_RENAME_OBJECT || !pParse->pNewTrigger); sqlite3DeleteTriggerStep(db, pStepList); } @@ -144109,10 +142215,13 @@ SQLITE_PRIVATE void sqlite3FinishTrigger( ** 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); +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] = ' '; + if (z) + for (i = 0; z[i]; i++) + if (sqlite3Isspace(z[i])) + z[i] = ' '; return z; } @@ -144123,14 +142232,13 @@ static char *triggerSpanDup(sqlite3 *db, const char *zStart, const char *zEnd){ ** 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 ) { +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; } @@ -144147,26 +142255,26 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep( ** ** 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; +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; + if (pParse->nErr) + return 0; pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep) + pName->n + 1); - if( pTriggerStep ){ - char *z = (char*)&pTriggerStep[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 ){ + if (IN_RENAME_OBJECT) { sqlite3RenameTokenMap(pParse, pTriggerStep->zTarget, pName); } } @@ -144180,39 +142288,38 @@ static TriggerStep *triggerStepAllocate( ** 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; +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 = triggerStepAllocate(pParse, TK_INSERT, pTableName, zStart, zEnd); + if (pTriggerStep) { + if (IN_RENAME_OBJECT) { pTriggerStep->pSelect = pSelect; pSelect = 0; - }else{ + } else { pTriggerStep->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE); } pTriggerStep->pIdList = pColumn; pTriggerStep->pUpsert = pUpsert; pTriggerStep->orconf = orconf; - if( pUpsert ){ + if (pUpsert) { sqlite3HasExplicitNulls(pParse, pUpsert->pUpsertTarget); } - }else{ - testcase( pColumn ); + } else { + testcase(pColumn); sqlite3IdListDelete(db, pColumn); - testcase( pUpsert ); + testcase(pUpsert); sqlite3UpsertDelete(db, pUpsert); } sqlite3SelectDelete(db, pSelect); @@ -144225,29 +142332,28 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep( ** 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; +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 = 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{ + } else { pTriggerStep->pExprList = sqlite3ExprListDup(db, pEList, EXPRDUP_REDUCE); pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE); pTriggerStep->pFrom = sqlite3SrcListDup(db, pFrom, EXPRDUP_REDUCE); @@ -144265,22 +142371,21 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep( ** 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; +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 = triggerStepAllocate(pParse, TK_DELETE, pTableName, zStart, zEnd); + if (pTriggerStep) { + if (IN_RENAME_OBJECT) { pTriggerStep->pWhere = pWhere; pWhere = 0; - }else{ + } else { pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE); } pTriggerStep->orconf = OE_Default; @@ -144292,8 +142397,9 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep( /* ** Recursively delete a Trigger structure */ -SQLITE_PRIVATE void sqlite3DeleteTrigger(sqlite3 *db, Trigger *pTrigger){ - if( pTrigger==0 || pTrigger->bReturning ) return; +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); @@ -144310,33 +142416,36 @@ SQLITE_PRIVATE void sqlite3DeleteTrigger(sqlite3 *db, Trigger *pTrigger){ ** 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; +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; + const char* zDb; + const char* zName; + sqlite3* db = pParse->db; - if( db->mallocFailed ) goto drop_trigger_cleanup; - if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + if (db->mallocFailed) + goto drop_trigger_cleanup; + if (SQLITE_OK != sqlite3ReadSchema(pParse)) { goto drop_trigger_cleanup; } - assert( pName->nSrc==1 ); + 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) ); + assert(zDb != 0 || sqlite3BtreeHoldsAllMutexes(db)); + for (i = OMIT_TEMPDB; i < db->nDb; 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) + break; } - if( !pTrigger ){ - if( !noErr ){ + if (!pTrigger) { + if (!noErr) { sqlite3ErrorMsg(pParse, "no such trigger: %S", pName->a); - }else{ + } else { sqlite3CodeVerifyNamedSchema(pParse, zDb); } pParse->checkSchema = 1; @@ -144352,44 +142461,41 @@ SQLITE_PRIVATE void sqlite3DropTrigger(Parse *pParse, SrcList *pName, int noErr) ** Return a pointer to the Table structure for the table that a trigger ** is set on. */ -static Table *tableOfTrigger(Trigger *pTrigger){ +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; +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 ); + assert(iDb >= 0 && iDb < db->nDb); pTable = tableOfTrigger(pTrigger); - assert( (pTable && pTable->pSchema==pTrigger->pSchema) || iDb==1 ); + assert((pTable && pTable->pSchema == pTrigger->pSchema) || iDb == 1); #ifndef SQLITE_OMIT_AUTHORIZATION - if( pTable ){ + 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) ){ + 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 - ); + */ + 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); } @@ -144398,20 +142504,20 @@ SQLITE_PRIVATE void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){ /* ** 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; +SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTrigger(sqlite3* db, int iDb, const char* zName) { + Trigger* pTrigger; + Hash* pHash; - assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + 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 ){ + 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; } @@ -144432,11 +142538,13 @@ SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTrigger(sqlite3 *db, int iDb, const ch ** it matches anything so always return true. Return false only ** if there is no match. */ -static int checkColumnOverlap(IdList *pIdList, ExprList *pEList){ +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; + if (pIdList == 0 || NEVER(pEList == 0)) + return 1; + for (e = 0; e < pEList->nExpr; e++) { + if (sqlite3IdListIndex(pIdList, pEList->a[e].zEName) >= 0) + return 1; } return 0; } @@ -144444,9 +142552,11 @@ static int checkColumnOverlap(IdList *pIdList, ExprList *pEList){ /* ** 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; +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; } @@ -144456,84 +142566,76 @@ static int tempTriggersExist(sqlite3 *db){ ** 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 */ -){ +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; + Trigger* pList = 0; + Trigger* p; pList = sqlite3TriggerList(pParse, pTab); - assert( pList==0 || IsVirtual(pTab)==0 - || (pList->bReturning && pList->pNext==0) ); - if( pList!=0 ){ + 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 - ){ + 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 ){ + if (pList == pTab->pTrigger) { pList = 0; goto exit_triggers_exist; } - while( ALWAYS(p->pNext) && p->pNext!=pTab->pTrigger ) p = p->pNext; + 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) ){ + do { + if (p->op == op && checkColumnOverlap(p->pColumns, pChanges)) { mask |= p->tr_tm; - }else if( p->op==TK_RETURNING ){ + } 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) ); + 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"); + 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{ + } else { p->tr_tm = TRIGGER_AFTER; } mask |= p->tr_tm; - }else if( p->bReturning && p->op==TK_INSERT && op==TK_UPDATE - && sqlite3IsToplevel(pParse) ){ + } 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 ); + } while (p); } exit_triggers_exist: - if( pMask ){ + 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; +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); + return triggersReallyExist(pParse, pTab, op, pChanges, pMask); } /* @@ -144546,35 +142648,34 @@ SQLITE_PRIVATE Trigger *sqlite3TriggersExist( ** 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); +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; + 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 ){ + 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; + 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); + 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); + pDup = sqlite3SrcListAppendFromTerm(pParse, 0, 0, 0, &as, pSubquery, 0); } pSrc = sqlite3SrcListAppendList(pParse, pSrc, pDup); } - }else{ + } else { sqlite3DbFree(db, zName); } return pSrc; @@ -144585,16 +142686,18 @@ SQLITE_PRIVATE SrcList *sqlite3TriggerStepSrc( ** 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; +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; } @@ -144605,36 +142708,37 @@ static int isAsteriskTerm( ** 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; +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) ){ + for (i = 0; i < pList->nExpr; 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; + for (jj = 0; jj < pTab->nCol; 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]; + 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); + } 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]; + 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; } @@ -144648,24 +142752,23 @@ static ExprList *sqlite3ExpandReturning( ** 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; +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 ); + assert(v != 0); + assert(pParse->bReturning); + assert(db->pParse == pParse); pReturning = pParse->u1.pReturning; - assert( pTrigger == &(pReturning->retTrig) ); + assert(pTrigger == &(pReturning->retTrig)); memset(&sSelect, 0, sizeof(sSelect)); memset(&sFrom, 0, sizeof(sFrom)); sSelect.pEList = sqlite3ExprListDup(db, pReturning->pReturnEL, 0); @@ -144674,16 +142777,16 @@ static void codeReturningTrigger( sFrom.a[0].pTab = pTab; sFrom.a[0].iCursor = -1; sqlite3SelectPrep(pParse, &sSelect, 0); - if( pParse->nErr==0 ){ - assert( db->mallocFailed==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 ){ + if (!db->mallocFailed) { NameContext sNC; memset(&sNC, 0, sizeof(sNC)); - if( pReturning->nRetCol==0 ){ + if (pReturning->nRetCol == 0) { pReturning->nRetCol = pNew->nExpr; pReturning->iRetCur = pParse->nTab++; } @@ -144692,25 +142795,23 @@ static void codeReturningTrigger( sNC.ncFlags = NC_UBaseReg; pParse->eTriggerOp = pTrigger->op; pParse->pTriggerTab = pTab; - if( sqlite3ResolveExprListNames(&sNC, pNew)==SQLITE_OK - && ALWAYS(!db->mallocFailed) - ){ + if (sqlite3ResolveExprListNames(&sNC, pNew) == SQLITE_OK && ALWAYS(!db->mallocFailed)) { int i; int nCol = pNew->nExpr; - int reg = pParse->nMem+1; - pParse->nMem += nCol+2; + 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); + for (i = 0; i < nCol; i++) { + Expr* pCol = pNew->a[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); + 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); @@ -144718,25 +142819,22 @@ static void codeReturningTrigger( 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){ +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 @@ -144750,55 +142848,43 @@ static int codeTriggerProgram( ** 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 ); + 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); + if (pStep->zSpan) { + sqlite3VdbeAddOp4(v, OP_Trace, 0x7fffffff, 1, 0, sqlite3MPrintf(db, "-- %s", pStep->zSpan), P4_DYNAMIC); } #endif - switch( pStep->op ){ + 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 - ); + 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) - ); + 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 - ); + 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; - } + 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; + } } } @@ -144810,14 +142896,20 @@ static int codeTriggerProgram( ** 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"; +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"; } @@ -144828,14 +142920,14 @@ static const char *onErrorText(int onError){ ** (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 ){ +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{ + } else { sqlite3DbFree(pFrom->db, pFrom->zErrMsg); } } @@ -144844,34 +142936,35 @@ static void transferParseError(Parse *pTo, Parse *pFrom){ ** 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 ); +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; + if (!pPrg) + return 0; pPrg->pNext = pTop->pTriggerPrg; pTop->pTriggerPrg = pPrg; pPrg->pProgram = pProgram = sqlite3DbMallocZero(db, sizeof(SubProgram)); - if( !pProgram ) return 0; + if (!pProgram) + return 0; sqlite3VdbeLinkSubProgram(pTop->pVdbe, pProgram); pPrg->pTrigger = pTrigger; pPrg->orconf = orconf; @@ -144891,31 +142984,22 @@ static TriggerPrg *codeRowTrigger( 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 - )); + 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 - ); + 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 ){ + if (pTrigger->pWhen) { pWhen = sqlite3ExprDup(db, pTrigger->pWhen, 0); - if( db->mallocFailed==0 - && SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen) - ){ + if (db->mallocFailed == 0 && SQLITE_OK == sqlite3ResolveExprNames(&sNC, pWhen)) { iEndTrigger = sqlite3VdbeMakeLabel(&sSubParse); sqlite3ExprIfFalse(&sSubParse, pWhen, iEndTrigger, SQLITE_JUMPIFNULL); } @@ -144926,28 +143010,28 @@ static TriggerPrg *codeRowTrigger( codeTriggerProgram(&sSubParse, pTrigger->step_list, orconf); /* Insert an OP_Halt at the end of the sub-program. */ - if( iEndTrigger ){ + 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 ); + 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; + pProgram->token = (void*)pTrigger; pPrg->aColmask[0] = sSubParse.oldmask; pPrg->aColmask[1] = sSubParse.newmask; sqlite3VdbeDelete(v); - }else{ + } else { transferParseError(pParse, &sSubParse); } - assert( !sSubParse.pTriggerPrg && !sSubParse.nMaxArg ); + assert(!sSubParse.pTriggerPrg && !sSubParse.nMaxArg); sqlite3ParseObjectReset(&sSubParse); return pPrg; } @@ -144958,28 +143042,25 @@ static TriggerPrg *codeRowTrigger( ** 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; +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) ); + 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 - ); + 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 ){ + if (!pPrg) { pPrg = codeRowTrigger(pParse, pTrigger, pTab, orconf); pParse->db->errByteOffset = -1; } @@ -144993,28 +143074,25 @@ static TriggerPrg *getRowTrigger( ** 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; +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 ); + 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)); + 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))); + 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 @@ -145065,45 +143143,41 @@ SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect( ** 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 */ +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) ); + 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){ + 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 ); + 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 ){ + 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) ){ + } else if (sqlite3IsToplevel(pParse)) { codeReturningTrigger(pParse, p, pTab, reg); } } @@ -145135,31 +143209,27 @@ SQLITE_PRIVATE void sqlite3CodeRowTrigger( ** 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 */ -){ +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 ){ + 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; + } else { + TriggerPrg* pPrg; pPrg = getRowTrigger(pParse, p, pTab, orconf); - if( pPrg ){ + if (pPrg) { mask |= pPrg->aColmask[isNew]; } } @@ -145191,15 +143261,14 @@ SQLITE_PRIVATE u32 sqlite3TriggerColmask( #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 */ +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 */ @@ -145233,23 +143302,21 @@ static void updateVirtualTable( ** 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; +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]; + 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 ){ + assert(i < pTab->nCol); + 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) ){ + if (pTab->aCol[i].affinity == SQLITE_AFF_REAL && !IsVirtual(pTab)) { sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg); } #endif @@ -145266,22 +143333,20 @@ SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){ ** 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 */ -){ +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_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); + assert(iIdxCol == XN_EXPR); + assert(pIdx->aColExpr != 0); + assert(pIdx->aColExpr->a[iCol].pExpr != 0); + return sqlite3ExprReferencesUpdatedColumn(pIdx->aColExpr->a[iCol].pExpr, aXRef, chngRowid); } /* @@ -145296,14 +143361,13 @@ static int indexColumnIsBeingUpdated( ** 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); +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); } /* @@ -145312,9 +143376,10 @@ static int indexWhereClauseMightChange( ** 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; +static Expr* exprRowColumn(Parse* pParse, int iCol) { + Expr* pRet = sqlite3PExpr(pParse, TK_ROW, 0, 0); + if (pRet) + pRet->iColumn = iCol + 1; return pRet; } @@ -145356,31 +143421,30 @@ static Expr *exprRowColumn(Parse *pParse, int iCol){ ** 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 */ -){ +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; + 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 ) { + if (pOrderBy && pLimit == 0) { sqlite3ErrorMsg(pParse, "ORDER BY without LIMIT on UPDATE"); return; } @@ -145394,50 +143458,47 @@ static void updateFromSelect( pSrc = sqlite3SrcListDup(db, pTabList, 0); pWhere2 = sqlite3ExprDup(db, pWhere, 0); - assert( pTabList->nSrc>1 ); - if( pSrc ){ + 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]); + if (pPk) { + for (i = 0; i < pPk->nKeyCol; i++) { + Expr* pNew = exprRowColumn(pParse, pPk->aiColumn[i]); #ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT - if( pLimit ){ + 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++){ + } else if (IsView(pTab)) { + for (i = 0; i < pTab->nCol; i++) { pList = sqlite3ExprListAppend(pParse, pList, exprRowColumn(pParse, i)); } eDest = SRT_Table; - }else{ + } else { eDest = IsVirtual(pTab) ? SRT_Table : SRT_Upfrom; - pList = sqlite3ExprListAppend(pParse, 0, sqlite3PExpr(pParse,TK_ROW,0,0)); + 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)); + 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) - ); + assert(pChanges != 0 || pParse->db->mallocFailed); + if (pChanges) { + for (i = 0; i < pChanges->nExpr; 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; + 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); @@ -145453,38 +143514,37 @@ static void updateFromSelect( ** \_______________________/ ** 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 */ -){ +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 */ + 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 */ + 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 + 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* 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 */ + 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 */ @@ -145496,42 +143556,43 @@ SQLITE_PRIVATE void sqlite3Update( 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 */ + 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 */ + 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 ){ + assert(db->pParse == pParse); + if (pParse->nErr) { goto update_cleanup; } - assert( db->mallocFailed==0 ); + assert(db->mallocFailed == 0); /* Locate the table which we want to update. - */ + */ pTab = sqlite3SrcListLookup(pParse, pTabList); - if( pTab==0 ) goto update_cleanup; + if (pTab == 0) + goto update_cleanup; iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); /* Figure out if we have any triggers and if the table being @@ -145540,22 +143601,21 @@ SQLITE_PRIVATE void sqlite3Update( #ifndef SQLITE_OMIT_TRIGGER pTrigger = sqlite3TriggersExist(pParse, pTab, TK_UPDATE, pChanges, &tmask); isView = IsView(pTab); - assert( pTrigger || tmask==0 ); + assert(pTrigger || tmask == 0); #else -# define pTrigger 0 -# define isView 0 -# define tmask 0 +#define pTrigger 0 +#define isView 0 +#define tmask 0 #endif #ifdef SQLITE_OMIT_VIEW -# undef isView -# define isView 0 +#undef isView +#define isView 0 #endif #if TREETRACE_ENABLED - if( sqlite3TreeTrace & 0x10000 ){ + if (sqlite3TreeTrace & 0x10000) { sqlite3TreeViewLine(0, "In sqlite3Update() at %s:%d", __FILE__, __LINE__); - sqlite3TreeViewUpdate(pParse->pWith, pTabList, pChanges, pWhere, - onError, pOrderBy, pLimit, pUpsert, pTrigger); + sqlite3TreeViewUpdate(pParse->pWith, pTabList, pChanges, pWhere, onError, pOrderBy, pLimit, pUpsert, pTrigger); } #endif @@ -145563,23 +143623,21 @@ SQLITE_PRIVATE void sqlite3Update( ** 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 ); + 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" - ); + if (!isView && nChangeFrom == 0) { + pWhere = sqlite3LimitWhere(pParse, pTabList, pWhere, pOrderBy, pLimit, "UPDATE"); pOrderBy = 0; pLimit = 0; } #endif - if( sqlite3ViewGetColumnNames(pParse, pTab) ){ + if (sqlite3ViewGetColumnNames(pParse, pTab)) { goto update_cleanup; } - if( sqlite3IsReadOnly(pParse, pTab, tmask) ){ + if (sqlite3IsReadOnly(pParse, pTab, tmask)) { goto update_cleanup; } @@ -145589,16 +143647,16 @@ SQLITE_PRIVATE void sqlite3Update( ** allocate enough space, just in case. */ iBaseCur = iDataCur = pParse->nTab++; - iIdxCur = iDataCur+1; + 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 ){ + 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 ){ + if (pUpsert) { /* On an UPSERT, reuse the same cursors already opened by INSERT */ iDataCur = pUpsert->iDataCur; iIdxCur = pUpsert->iIdxCur; @@ -145609,13 +143667,15 @@ SQLITE_PRIVATE void sqlite3Update( /* 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; + 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; i < pTab->nCol; i++) + aXRef[i] = -1; /* Initialize the name-context */ memset(&sNC, 0, sizeof(sNC)); @@ -145626,7 +143686,8 @@ SQLITE_PRIVATE void sqlite3Update( /* Begin generating code. */ v = sqlite3GetVdbe(pParse); - if( v==0 ) goto update_cleanup; + 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 @@ -145635,31 +143696,27 @@ SQLITE_PRIVATE void sqlite3Update( ** that column. */ chngRowid = chngPk = 0; - for(i=0; inExpr; i++){ + for (i = 0; i < pChanges->nExpr; 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) ){ + 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 ){ + for (j = 0; j < pTab->nCol; 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 ){ + } 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); + 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 @@ -145667,13 +143724,13 @@ SQLITE_PRIVATE void sqlite3Update( break; } } - if( j>=pTab->nCol ){ - if( pPk==0 && sqlite3IsRowid(pChanges->a[i].zEName) ){ + if (j >= pTab->nCol) { + if (pPk == 0 && sqlite3IsRowid(pChanges->a[i].zEName)) { j = -1; chngRowid = 1; pRowidExpr = pChanges->a[i].pExpr; iRowidExpr = i; - }else{ + } else { sqlite3ErrorMsg(pParse, "no such column: %s", pChanges->a[i].zEName); pParse->checkSchema = 1; goto update_cleanup; @@ -145682,20 +143739,18 @@ SQLITE_PRIVATE void sqlite3Update( #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 ){ + 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 ){ + } else if (rc == SQLITE_IGNORE) { aXRef[j] = -1; } } #endif } - assert( (chngRowid & chngPk)==0 ); - assert( chngRowid==0 || chngRowid==1 ); - assert( chngPk==0 || chngPk==1 ); + assert((chngRowid & chngPk) == 0); + assert(chngRowid == 0 || chngRowid == 1); + assert(chngPk == 0 || chngPk == 1); chngKey = chngRowid + chngPk; #ifndef SQLITE_OMIT_GENERATED_COLUMNS @@ -145706,24 +143761,23 @@ SQLITE_PRIVATE void sqlite3Update( ** 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 ){ + if (pTab->tabFlags & TF_HasGenerated) { int bProgress; - testcase( pTab->tabFlags & TF_HasVirtual ); - testcase( pTab->tabFlags & TF_HasStored ); - do{ + 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) - ){ + for (i = 0; i < pTab->nCol; 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 ); + } while (bProgress); } #endif @@ -145740,55 +143794,56 @@ SQLITE_PRIVATE void sqlite3Update( ** 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++){ + 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) - ){ + if (chngKey || hasFK > 1 || pIdx == pPk || indexWhereClauseMightChange(pIdx, aXRef, chngRowid)) { reg = ++pParse->nMem; pParse->nMem += pIdx->nColumn; - }else{ + } else { reg = 0; - for(i=0; inKeyCol; i++){ - if( indexColumnIsBeingUpdated(pIdx, i, aXRef, chngRowid) ){ + for (i = 0; i < pIdx->nKeyCol; i++) { + if (indexColumnIsBeingUpdated(pIdx, i, aXRef, chngRowid)) { reg = ++pParse->nMem; pParse->nMem += pIdx->nColumn; - if( onError==OE_Default && pIdx->onError==OE_Replace ){ + if (onError == OE_Default && pIdx->onError == OE_Replace) { bReplace = 1; } break; } } } - if( reg==0 ) aToOpen[nAllIdx+1] = 0; + if (reg == 0) + aToOpen[nAllIdx + 1] = 0; aRegIdx[nAllIdx] = reg; } - aRegIdx[nAllIdx] = ++pParse->nMem; /* Register storing the table record */ - if( bReplace ){ + 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); + memset(aToOpen, 1, nIdx + 1); } - if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); + if (pParse->nested == 0) + sqlite3VdbeCountChanges(v); sqlite3BeginWriteOperation(pParse, pTrigger || hasFK, iDb); /* Allocate required registers. */ - if( !IsVirtual(pTab) ){ + 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 ); + assert(aRegIdx[nAllIdx] == pParse->nMem); regRowSet = aRegIdx[nAllIdx]; regOldRowid = regNewRowid = ++pParse->nMem; - if( chngPk || pTrigger || hasFK ){ + if (chngPk || pTrigger || hasFK) { regOld = pParse->nMem + 1; pParse->nMem += pTab->nCol; } - if( chngKey || pTrigger || hasFK ){ + if (chngKey || pTrigger || hasFK) { regNewRowid = ++pParse->nMem; } regNew = pParse->nMem + 1; @@ -145796,7 +143851,7 @@ SQLITE_PRIVATE void sqlite3Update( } /* Start the view context. */ - if( isView ){ + if (isView) { sqlite3AuthContextPush(pParse, &sContext, pTab->zName); } @@ -145804,10 +143859,8 @@ SQLITE_PRIVATE void sqlite3Update( ** an ephemeral table. */ #if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) - if( nChangeFrom==0 && isView ){ - sqlite3MaterializeView(pParse, pTab, - pWhere, pOrderBy, pLimit, iDataCur - ); + if (nChangeFrom == 0 && isView) { + sqlite3MaterializeView(pParse, pTab, pWhere, pOrderBy, pLimit, iDataCur); pOrderBy = 0; pLimit = 0; } @@ -145816,15 +143869,14 @@ SQLITE_PRIVATE void sqlite3Update( /* Resolve the column names in all the expressions in the ** WHERE clause. */ - if( nChangeFrom==0 && sqlite3ResolveExprNames(&sNC, pWhere) ){ + 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); + if (IsVirtual(pTab)) { + updateVirtualTable(pParse, pTabList, pTab, pChanges, pRowidExpr, aXRef, pWhere, onError); goto update_cleanup; } #endif @@ -145834,57 +143886,52 @@ SQLITE_PRIVATE void sqlite3Update( /* 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 - ){ + 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) ){ + 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) ); + } else { + assert(pPk != 0 || HasRowid(pTab)); nPk = pPk ? pPk->nKeyCol : 0; - iPk = pParse->nMem+1; + iPk = pParse->nMem + 1; pParse->nMem += nPk; pParse->nMem += nChangeFrom; regKey = ++pParse->nMem; - if( pUpsert==0 ){ + 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); + 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 ){ + 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 - ); + if (nChangeFrom) { + updateFromSelect(pParse, iEph, pPk, pChanges, pTabList, pWhere, pOrderBy, pLimit); #ifndef SQLITE_OMIT_SUBQUERY - if( isView ) iDataCur = iEph; + if (isView) + iDataCur = iEph; #endif } } } - if( nChangeFrom ){ + if (nChangeFrom) { sqlite3MultiWrite(pParse); eOnePass = ONEPASS_OFF; nKey = nPk; regKey = iPk; - }else{ - if( pUpsert ){ + } 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 @@ -145894,7 +143941,7 @@ SQLITE_PRIVATE void sqlite3Update( eOnePass = ONEPASS_SINGLE; sqlite3ExprIfFalse(pParse, pWhere, labelBreak, SQLITE_JUMPIFNULL); bFinishSeek = 0; - }else{ + } else { /* Begin the database scan. ** ** Do not consider a single-pass strategy for a multi-row update if @@ -145903,11 +143950,12 @@ SQLITE_PRIVATE void sqlite3Update( ** 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 ){ + 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; + 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 @@ -145921,121 +143969,122 @@ SQLITE_PRIVATE void sqlite3Update( ** updated. */ eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); bFinishSeek = sqlite3WhereUsesDeferredSeek(pWInfo); - if( eOnePass!=ONEPASS_SINGLE ){ + if (eOnePass != ONEPASS_SINGLE) { sqlite3MultiWrite(pParse); - if( eOnePass==ONEPASS_MULTI ){ + if (eOnePass == ONEPASS_MULTI) { int iCur = aiCurOnePass[1]; - if( iCur>=0 && iCur!=iDataCur && aToOpen[iCur-iBaseCur] ){ + if (iCur >= 0 && iCur != iDataCur && aToOpen[iCur - iBaseCur]) { eOnePass = ONEPASS_OFF; } - assert( iCur!=iDataCur || !HasRowid(pTab) ); + assert(iCur != iDataCur || !HasRowid(pTab)); } } } - if( 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 ){ + if (eOnePass == ONEPASS_OFF) { aRegIdx[nAllIdx] = ++pParse->nMem; sqlite3VdbeAddOp3(v, OP_Insert, iEph, regRowSet, regOldRowid); - }else{ - if( ALWAYS(addrOpen) ) sqlite3VdbeChangeToNoop(v, addrOpen); + } else { + if (ALWAYS(addrOpen)) + sqlite3VdbeChangeToNoop(v, addrOpen); } - }else{ + } 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); + for (i = 0; i < nPk; i++) { + assert(pPk->aiColumn[i] >= 0); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, pPk->aiColumn[i], iPk + i); } - if( eOnePass ){ - if( addrOpen ) sqlite3VdbeChangeToNoop(v, addrOpen); + if (eOnePass) { + if (addrOpen) + sqlite3VdbeChangeToNoop(v, addrOpen); nKey = nPk; regKey = iPk; - }else{ - sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, nPk, regKey, - sqlite3IndexAffinityStr(db, pPk), nPk); + } 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 ){ + if (pUpsert == 0) { + if (nChangeFrom == 0 && eOnePass != ONEPASS_MULTI) { sqlite3WhereEnd(pWInfo); } - if( !isView ){ + 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_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); + 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 ){ + 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 + if (eOnePass != ONEPASS_OFF) { + if (aiCurOnePass[0] != iDataCur && aiCurOnePass[1] != iDataCur #ifdef SQLITE_ALLOW_ROWID_IN_VIEW - && !isView + && !isView #endif - ){ - assert( pPk ); - sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelBreak, regKey,nKey); + ) { + assert(pPk); + sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelBreak, regKey, nKey); VdbeCoverage(v); } - if( eOnePass!=ONEPASS_SINGLE ){ + 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 ){ + VdbeCoverageIf(v, pPk == 0); + VdbeCoverageIf(v, pPk != 0); + } else if (pPk || nChangeFrom) { labelContinue = sqlite3VdbeMakeLabel(pParse); - sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v); + 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 ){ + assert(chngKey || pTrigger || hasFK || regOldRowid == regNewRowid); + if (chngRowid) { + assert(iRowidExpr >= 0); + if (nChangeFrom == 0) { sqlite3ExprCode(pParse, pRowidExpr, regNewRowid); - }else{ + } else { sqlite3VdbeAddOp3(v, OP_Column, iEph, iRowidExpr, regNewRowid); } - sqlite3VdbeAddOp1(v, OP_MustBeInt, regNewRowid); VdbeCoverage(v); + 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 ){ + 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++){ + oldmask |= sqlite3TriggerColmask(pParse, pTrigger, pChanges, 0, TRIGGER_BEFORE | TRIGGER_AFTER, pTab, onError); + for (i = 0; i < pTab->nCol; 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 ); + 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{ + } else { sqlite3VdbeAddOp2(v, OP_Null, 0, k); } } - if( chngRowid==0 && pPk==0 ){ + if (chngRowid == 0 && pPk == 0) { sqlite3VdbeAddOp2(v, OP_Copy, regOldRowid, regNewRowid); } } @@ -146097,43 +144142,42 @@ SQLITE_PRIVATE void sqlite3Update( ** 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 ){ + newmask = sqlite3TriggerColmask(pParse, pTrigger, pChanges, 1, TRIGGER_BEFORE, pTab, onError); + for (i = 0, k = regNew; i < pTab->nCol; 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{ + } 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 ){ + if (j >= 0) { + if (nChangeFrom) { int nOff = (isView ? pTab->nCol : nPk); - assert( eOnePass==ONEPASS_OFF ); - sqlite3VdbeAddOp3(v, OP_Column, iEph, nOff+j, k); - }else{ + 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)) ){ + } 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 ); + testcase(i == 31); + testcase(i == 32); sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, k); bFinishSeek = 0; - }else{ + } 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 ); + if (pTab->tabFlags & TF_HasGenerated) { + testcase(pTab->tabFlags & TF_HasVirtual); + testcase(pTab->tabFlags & TF_HasStored); sqlite3ComputeGeneratedColumns(pParse, regNew, pTab); } #endif @@ -146141,23 +144185,22 @@ SQLITE_PRIVATE void sqlite3Update( /* Fire any BEFORE UPDATE triggers. This happens before constraints are ** verified. One could argue that this is wrong. */ - if( tmask&TRIGGER_BEFORE ){ + if (tmask & TRIGGER_BEFORE) { sqlite3TableAffinity(v, pTab, regNew); - sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges, - TRIGGER_BEFORE, pTab, regOldRowid, onError, labelContinue); + sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges, TRIGGER_BEFORE, pTab, regOldRowid, onError, labelContinue); - if( !isView ){ + 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); + if (pPk) { + sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, regKey, nKey); VdbeCoverage(v); - }else{ - sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue,regOldRowid); + } else { + sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue, regOldRowid); VdbeCoverage(v); } @@ -146170,44 +144213,44 @@ SQLITE_PRIVATE void sqlite3Update( ** 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 ){ + for (i = 0, k = regNew; i < pTab->nCol; 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 ); + if (pTab->tabFlags & TF_HasGenerated) { + testcase(pTab->tabFlags & TF_HasVirtual); + testcase(pTab->tabFlags & TF_HasStored); sqlite3ComputeGeneratedColumns(pParse, regNew, pTab); } #endif } } - if( !isView ){ + if (!isView) { /* Do constraint checks. */ - assert( regOldRowid>0 ); - sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur, - regNewRowid, regOldRowid, chngKey, onError, labelContinue, &bReplace, - aXRef, 0); + 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); + 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 ){ + if (hasFK) { sqlite3FkCheck(pParse, pTab, regOldRowid, 0, aXRef, chngKey); } @@ -146219,7 +144262,7 @@ SQLITE_PRIVATE void sqlite3Update( ** 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 ){ + if (bFinishSeek) { sqlite3VdbeAddOp1(v, OP_FinishSeek, iDataCur); } @@ -146232,64 +144275,58 @@ SQLITE_PRIVATE void sqlite3Update( ** value is copied from memory cell (regNewRowid+1+iCol), where iCol ** is the column index supplied by the user. */ - assert( regNew==regNewRowid+1 ); + 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 ); + 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 ){ + if (!pParse->nested) { sqlite3VdbeAppendP4(v, pTab, P4_TABLE); } #else - if( hasFK>1 || chngKey ){ + if (hasFK > 1 || chngKey) { sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, 0); } #endif - if( hasFK ){ + 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 - ); + 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 ){ + if (hasFK) { sqlite3FkActions(pParse, pTab, pChanges, regOldRowid, aXRef, chngKey); } } /* Increment the row counter - */ - if( regRowCount ){ + */ + if (regRowCount) { sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1); } - sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges, - TRIGGER_AFTER, pTab, regOldRowid, onError, labelContinue); + 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 ){ + if (eOnePass == ONEPASS_SINGLE) { /* Nothing to do at end-of-loop for a single-pass */ - }else if( eOnePass==ONEPASS_MULTI ){ + } else if (eOnePass == ONEPASS_MULTI) { sqlite3VdbeResolveLabel(v, labelContinue); sqlite3WhereEnd(pWInfo); - }else{ + } else { sqlite3VdbeResolveLabel(v, labelContinue); - sqlite3VdbeAddOp2(v, OP_Next, iEph, addrTop); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Next, iEph, addrTop); + VdbeCoverage(v); } sqlite3VdbeResolveLabel(v, labelBreak); @@ -146297,7 +144334,7 @@ SQLITE_PRIVATE void sqlite3Update( ** maximum rowid counter values recorded while inserting into ** autoincrement tables. */ - if( pParse->nested==0 && pParse->pTriggerTab==0 && pUpsert==0 ){ + if (pParse->nested == 0 && pParse->pTriggerTab == 0 && pUpsert == 0) { sqlite3AutoincrementEnd(pParse); } @@ -146305,7 +144342,7 @@ SQLITE_PRIVATE void sqlite3Update( ** Return the number of rows that were changed, if we are tracking ** that information. */ - if( regRowCount ){ + if (regRowCount) { sqlite3CodeChangeCount(v, regRowCount, "rows updated"); } @@ -146325,10 +144362,10 @@ SQLITE_PRIVATE void sqlite3Update( ** 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 +#undef isView #endif #ifdef pTrigger - #undef pTrigger +#undef pTrigger #endif #ifndef SQLITE_OMIT_VIRTUALTABLE @@ -146353,69 +144390,66 @@ SQLITE_PRIVATE void sqlite3Update( ** 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 */ +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 */ + 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 ); + assert(v); ephemTab = pParse->nTab++; - addr= sqlite3VdbeAddOp2(v, OP_OpenEphemeral, ephemTab, nArg); + 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 ){ + if (pSrc->nSrc > 1) { + Index* pPk = 0; + Expr* pRow; + ExprList* pList; + if (HasRowid(pTab)) { + if (pRowid) { pRow = sqlite3ExprDup(db, pRowid, 0); - }else{ + } else { pRow = sqlite3PExpr(pParse, TK_ROW, 0, 0); } - }else{ - i16 iPk; /* PRIMARY KEY column */ + } else { + i16 iPk; /* PRIMARY KEY column */ pPk = sqlite3PrimaryKeyIndex(pTab); - assert( pPk!=0 ); - assert( pPk->nKeyCol==1 ); + assert(pPk != 0); + assert(pPk->nKeyCol == 1); iPk = pPk->aiColumn[0]; - if( aXRef[iPk]>=0 ){ + if (aXRef[iPk] >= 0) { pRow = sqlite3ExprDup(db, pChanges->a[aXRef[iPk]].pExpr, 0); - }else{ + } 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{ + for (i = 0; i < pTab->nCol; 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)); } } @@ -146423,55 +144457,54 @@ static void updateVirtualTable( updateFromSelect(pParse, ephemTab, pPk, pList, pSrc, pWhere, 0, 0); sqlite3ExprListDelete(db, pList); eOnePass = ONEPASS_OFF; - }else{ + } 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; + 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() */ + for (i = 0; i < pTab->nCol; 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) ){ + if (HasRowid(pTab)) { sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg); - if( pRowid ){ - sqlite3ExprCode(pParse, pRowid, regArg+1); - }else{ - sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg+1); + 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 */ + } else { + Index* pPk; /* PRIMARY KEY index */ + i16 iPk; /* PRIMARY KEY column */ pPk = sqlite3PrimaryKeyIndex(pTab); - assert( pPk!=0 ); - assert( pPk->nKeyCol==1 ); + 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); + 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 ); + assert(eOnePass == ONEPASS_OFF || eOnePass == ONEPASS_SINGLE); - if( eOnePass ){ + if (eOnePass) { /* If using the onepass strategy, no-op out the OP_OpenEphemeral coded ** above. */ sqlite3VdbeChangeToNoop(v, addr); sqlite3VdbeAddOp1(v, OP_Close, iCsr); - }else{ + } else { /* Create a record from the argument register contents and insert it into ** the ephemeral table. */ sqlite3MultiWrite(pParse); @@ -146486,34 +144519,35 @@ static void updateVirtualTable( } } - - if( eOnePass==ONEPASS_OFF ){ + if (eOnePass == ONEPASS_OFF) { /* End the virtual table scan */ - if( pSrc->nSrc==1 ){ + if (pSrc->nSrc == 1) { sqlite3WhereEnd(pWInfo); } /* Begin scannning through the ephemeral table. */ - addr = sqlite3VdbeAddOp1(v, OP_Rewind, ephemTab); VdbeCoverage(v); + 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; +static void SQLITE_NOINLINE upsertDelete(sqlite3* db, Upsert* p) { + do { + Upsert* pNext = p->pNextUpsert; sqlite3ExprListDelete(db, p->pUpsertTarget); sqlite3ExprDelete(db, p->pUpsertTargetWhere); sqlite3ExprListDelete(db, p->pUpsertSet); @@ -146551,53 +144585,49 @@ static void SQLITE_NOINLINE upsertDelete(sqlite3 *db, Upsert *p){ sqlite3DbFree(db, p->pToFree); sqlite3DbFree(db, p); p = pNext; - }while( p ); + } while (p); } -SQLITE_PRIVATE void sqlite3UpsertDelete(sqlite3 *db, Upsert *p){ - if( p ) upsertDelete(db, 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) - ); +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; +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 ){ + if (pNew == 0) { sqlite3ExprListDelete(db, pTarget); sqlite3ExprDelete(db, pTargetWhere); sqlite3ExprListDelete(db, pSet); sqlite3ExprDelete(db, pWhere); sqlite3UpsertDelete(db, pNext); return 0; - }else{ + } else { pNew->pUpsertTarget = pTarget; pNew->pUpsertTargetWhere = pTargetWhere; pNew->pUpsertSet = pSet; pNew->pUpsertWhere = pWhere; - pNew->isDoUpdate = pSet!=0; + pNew->isDoUpdate = pSet != 0; pNew->pNextUpsert = pNext; } return pNew; @@ -146610,25 +144640,24 @@ SQLITE_PRIVATE Upsert *sqlite3UpsertNew( ** 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 ); +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 @@ -146637,24 +144666,21 @@ SQLITE_PRIVATE int sqlite3UpsertAnalyzeTarget( memset(&sNC, 0, sizeof(sNC)); sNC.pParse = pParse; sNC.pSrcList = pTabList; - for(; pUpsert && pUpsert->pUpsertTarget; - pUpsert=pUpsert->pNextUpsert, nClause++){ + for (; pUpsert && pUpsert->pUpsertTarget; pUpsert = pUpsert->pNextUpsert, nClause++) { rc = sqlite3ResolveExprListNames(&sNC, pUpsert->pUpsertTarget); - if( rc ) return rc; + if (rc) + return rc; rc = sqlite3ResolveExprNames(&sNC, pUpsert->pUpsertTargetWhere); - if( rc ) return rc; + 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 - ){ + 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 ); + assert(pUpsert->pUpsertIdx == 0); continue; } @@ -146671,45 +144697,47 @@ SQLITE_PRIVATE int sqlite3UpsertAnalyzeTarget( sCol[1].iTable = pTabList->a[0].iCursor; /* Check for matches against other indexes */ - for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + 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 ){ + 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 ); + 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 ){ + if (pExpr->op != TK_COLLATE) { sCol[0].pLeft = pExpr; pExpr = &sCol[0]; } - }else{ + } 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 */ + for (jj = 0; jj < nn; jj++) { + if (sqlite3ExprCompare(pParse, pTarget->a[jj].pExpr, pExpr, iCursor) < 2) { + break; /* Column ii of the index matches column jj of target */ } } - if( jj>=nn ){ + if (jj >= nn) { /* The target contains no match for column jj of the index */ break; } } - if( iipUpsertIdx = pIdx; break; } - if( pUpsert->pUpsertIdx==0 ){ + if (pUpsert->pUpsertIdx == 0) { char zWhich[16]; - if( nClause==0 && pUpsert->pNextUpsert==0 ){ + if (nClause == 0 && pUpsert->pNextUpsert == 0) { zWhich[0] = 0; - }else{ - sqlite3_snprintf(sizeof(zWhich),zWhich,"%r ", nClause+1); + } else { + sqlite3_snprintf(sizeof(zWhich), zWhich, "%r ", nClause + 1); } - sqlite3ErrorMsg(pParse, "%sON CONFLICT clause does not match any " - "PRIMARY KEY or UNIQUE constraint", zWhich); + sqlite3ErrorMsg(pParse, + "%sON CONFLICT clause does not match any " + "PRIMARY KEY or UNIQUE constraint", + zWhich); return SQLITE_ERROR; } } @@ -146737,13 +144767,17 @@ SQLITE_PRIVATE int sqlite3UpsertAnalyzeTarget( ** 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; +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; + if (pNext == 0) + return 1; + if (pNext->pUpsertTarget == 0) + return 1; + if (pNext->pUpsertIdx == 0) + return 1; return 0; } @@ -146753,13 +144787,9 @@ SQLITE_PRIVATE int sqlite3UpsertNextIsIPK(Upsert *pUpsert){ ** 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; +SQLITE_PRIVATE Upsert* sqlite3UpsertOfIndex(Upsert* pUpsert, Index* pIdx) { + while (pUpsert && pUpsert->pUpsertTarget != 0 && pUpsert->pUpsertIdx != pIdx) { + pUpsert = pUpsert->pNextUpsert; } return pUpsert; } @@ -146773,50 +144803,47 @@ SQLITE_PRIVATE Upsert *sqlite3UpsertOfIndex(Upsert *pUpsert, Index *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 */ +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; + Upsert* pTop = pUpsert; - assert( v!=0 ); - assert( pUpsert!=0 ); + 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) ){ + 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); + } else { + Index* pPk = sqlite3PrimaryKeyIndex(pTab); int nPk = pPk->nKeyCol; - int iPk = pParse->nMem+1; + int iPk = pParse->nMem + 1; pParse->nMem += nPk; - for(i=0; iaiColumn[i]>=0 ); + assert(pPk->aiColumn[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)); + 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); + sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_CORRUPT, OE_Abort, 0, "corrupt database", P4_STATIC); sqlite3MayAbort(pParse); sqlite3VdbeJumpHere(v, i); } @@ -146825,13 +144852,13 @@ SQLITE_PRIVATE void sqlite3UpsertDoUpdate( ** 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); + for (i = 0; i < pTab->nCol; 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); + 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")); } @@ -146870,44 +144897,46 @@ SQLITE_PRIVATE void sqlite3UpsertDoUpdate( ** 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; +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 ); + 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) - ){ + if (zSubSql && (strncmp(zSubSql, "CRE", 3) == 0 || strncmp(zSubSql, "INS", 3) == 0)) { rc = execSql(db, pzErrMsg, zSubSql); - if( rc!=SQLITE_OK ) break; + if (rc != SQLITE_OK) + break; } } - assert( rc!=SQLITE_ROW ); - if( rc==SQLITE_DONE ) rc = SQLITE_OK; - if( rc ){ + 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; +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; + if (z == 0) + return SQLITE_NOMEM; rc = execSql(db, pzErrMsg, z); sqlite3DbFree(db, z); return rc; @@ -146943,17 +144972,20 @@ static int execSqlF(sqlite3 *db, char **pzErrMsg, const char *zSql, ...){ ** 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); +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 ){ + 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; + 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 @@ -146961,12 +144993,13 @@ SQLITE_PRIVATE void sqlite3Vacuum(Parse *pParse, Token *pNm, Expr *pInto){ ** The buggy behavior is required for binary compatibility with some ** legacy applications. */ iDb = sqlite3FindDb(pParse->db, pNm); - if( iDb<0 ) iDb = 0; + if (iDb < 0) + iDb = 0; #endif } - if( iDb!=1 ){ + if (iDb != 1) { int iIntoReg = 0; - if( pInto && sqlite3ResolveSelfReference(pParse,0,0,pInto,0)==0 ){ + if (pInto && sqlite3ResolveSelfReference(pParse, 0, 0, pInto, 0) == 0) { iIntoReg = ++pParse->nMem; sqlite3ExprCode(pParse, pInto, iIntoReg); } @@ -146981,46 +145014,45 @@ SQLITE_PRIVATE void sqlite3Vacuum(Parse *pParse, Token *pNm, Expr *pInto){ /* ** 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 */ -){ +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 */ + 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 */ + 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 */ + const char* zDbMain; /* Schema name of database to vacuum */ + const char* zOut; /* Name of output file */ - if( !db->autoCommit ){ + 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"); + 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 ){ + 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{ + db->openFlags |= SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE; + } else { zOut = ""; } @@ -147034,8 +145066,7 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( 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->flags &= ~(u64)(SQLITE_ForeignKeys | SQLITE_ReverseOrder | SQLITE_Defensive | SQLITE_CountRows); db->mTrace = 0; zDbMain = db->aDb[iDb].zDbSName; @@ -147059,15 +145090,16 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( 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 ); + if (rc != SQLITE_OK) + goto end_of_vacuum; + assert((db->nDb - 1) == nDb); pDb = &db->aDb[nDb]; - assert( strcmp(pDb->zDbSName,"vacuum_db")==0 ); + assert(strcmp(pDb->zDbSName, "vacuum_db") == 0); pTemp = pDb->pBt; - if( pOut ){ - sqlite3_file *id = sqlite3PagerFile(sqlite3BtreePager(pTemp)); + if (pOut) { + sqlite3_file* id = sqlite3PagerFile(sqlite3BtreePager(pTemp)); i64 sz = 0; - if( id->pMethods!=0 && (sqlite3OsFileSize(id, &sz)!=SQLITE_OK || 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; @@ -147077,37 +145109,33 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( nRes = sqlite3BtreeGetRequestedReserve(pMain); sqlite3BtreeSetCacheSize(pTemp, db->aDb[iDb].pSchema->cache_size); - sqlite3BtreeSetSpillSize(pTemp, sqlite3BtreeSetSpillSize(pMain,0)); - sqlite3BtreeSetPagerFlags(pTemp, PAGER_SYNCHRONOUS_OFF|PAGER_CACHESPILL); + 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; + 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 - ){ + 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) - ){ + 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)); + sqlite3BtreeSetAutoVacuum(pTemp, db->nextAutovac >= 0 ? db->nextAutovac : sqlite3BtreeGetAutoVacuum(pMain)); #endif /* Query the schema of the main database. Create a mirror schema @@ -147115,18 +145143,18 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( */ 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; + "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; + "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 @@ -147134,15 +145162,15 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( ** 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 ); + "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; + 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 @@ -147150,13 +145178,13 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( ** 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; + "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, @@ -147175,42 +145203,45 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( ** 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 */ + 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) ); + assert(SQLITE_TXN_WRITE == sqlite3BtreeTxnState(pTemp)); + assert(pOut != 0 || SQLITE_TXN_WRITE == sqlite3BtreeTxnState(pMain)); /* Copy Btree meta values */ - for(i=0; iautoCommit = 1; - if( pDb ){ + if (pDb) { sqlite3BtreeClose(pDb->pBt); pDb->pBt = 0; pDb->pSchema = 0; @@ -147245,7 +145276,7 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( return rc; } -#endif /* SQLITE_OMIT_VACUUM && SQLITE_OMIT_ATTACH */ +#endif /* SQLITE_OMIT_VACUUM && SQLITE_OMIT_ATTACH */ /************** End of vacuum.c **********************************************/ /************** Begin file vtab.c ********************************************/ @@ -147273,10 +145304,10 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( ** 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 */ + 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 */ }; /* @@ -147287,28 +145318,27 @@ struct VtabCtx { ** 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 ){ +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{ + } else { int nName = sqlite3Strlen30(zName); - pMod = (Module *)sqlite3Malloc(sizeof(Module) + nName + 1); - if( pMod==0 ){ + pMod = (Module*)sqlite3Malloc(sizeof(Module) + nName + 1); + if (pMod == 0) { sqlite3OomFault(db); return 0; } - zCopy = (char *)(&pMod[1]); - memcpy(zCopy, zName, nName+1); + zCopy = (char*)(&pMod[1]); + memcpy(zCopy, zName, nName + 1); pMod->zName = zCopy; pMod->pModule = pModule; pMod->pAux = pAux; @@ -147316,13 +145346,13 @@ SQLITE_PRIVATE Module *sqlite3VtabCreateModule( pMod->pEpoTab = 0; pMod->nRefModule = 1; } - pDel = (Module *)sqlite3HashInsert(&db->aModule,zCopy,(void*)pMod); - if( pDel ){ - if( pDel==pMod ){ + pDel = (Module*)sqlite3HashInsert(&db->aModule, zCopy, (void*)pMod); + if (pDel) { + if (pDel == pMod) { sqlite3OomFault(db); sqlite3DbFree(db, pDel); pMod = 0; - }else{ + } else { sqlite3VtabEponymousTableClear(db, pDel); sqlite3VtabModuleUnref(db, pDel); } @@ -147335,35 +145365,34 @@ SQLITE_PRIVATE Module *sqlite3VtabCreateModule( ** 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 */ -){ +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); + 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 */ -){ +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; + if (!sqlite3SafetyCheckOk(db) || zName == 0) + return SQLITE_MISUSE_BKPT; #endif return createModule(db, zName, pModule, pAux, 0); } @@ -147371,15 +145400,15 @@ SQLITE_API int sqlite3_create_module( /* ** 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 */ -){ +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; + if (!sqlite3SafetyCheckOk(db) || zName == 0) + return SQLITE_MISUSE_BKPT; #endif return createModule(db, zName, pModule, pAux, xDestroy); } @@ -147388,18 +145417,21 @@ SQLITE_API int sqlite3_create_module_v2( ** 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){ +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; + if (!sqlite3SafetyCheckOk(db)) + return SQLITE_MISUSE_BKPT; #endif - for(pThis=sqliteHashFirst(&db->aModule); pThis; pThis=pNext){ - Module *pMod = (Module*)sqliteHashData(pThis); + for (pThis = sqliteHashFirst(&db->aModule); pThis; pThis = pNext) { + Module* pMod = (Module*)sqliteHashData(pThis); pNext = sqliteHashNext(pThis); - if( azNames ){ + if (azNames) { int ii; - for(ii=0; azNames[ii]!=0 && strcmp(azNames[ii],pMod->zName)!=0; ii++){} - if( azNames[ii]!=0 ) continue; + 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); } @@ -147410,14 +145442,14 @@ SQLITE_API int sqlite3_drop_modules(sqlite3 *db, const char** azNames){ ** 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 ); +SQLITE_PRIVATE void sqlite3VtabModuleUnref(sqlite3* db, Module* pMod) { + assert(pMod->nRefModule > 0); pMod->nRefModule--; - if( pMod->nRefModule==0 ){ - if( pMod->xDestroy ){ + if (pMod->nRefModule == 0) { + if (pMod->xDestroy) { pMod->xDestroy(pMod->pAux); } - assert( pMod->pEpoTab==0 ); + assert(pMod->pEpoTab == 0); sqlite3DbFree(db, pMod); } } @@ -147430,20 +145462,20 @@ SQLITE_PRIVATE void sqlite3VtabModuleUnref(sqlite3 *db, Module *pMod){ ** 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){ +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); +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; } @@ -147451,19 +145483,18 @@ SQLITE_PRIVATE VTable *sqlite3GetVTable(sqlite3 *db, Table *pTab){ ** 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; +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 ); + 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; + if (pVTab->nRef == 0) { + sqlite3_vtab* p = pVTab->pVtab; sqlite3VtabModuleUnref(pVTab->db, pVTab->pMod); - if( p ){ + if (p) { p->pModule->xDisconnect(p); } sqlite3DbFree(db, pVTab); @@ -147477,11 +145508,11 @@ SQLITE_PRIVATE void sqlite3VtabUnlock(VTable *pVTab){ ** 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; +static VTable* vtabDisconnectAll(sqlite3* db, Table* p) { + VTable* pRet = 0; + VTable* pVTable; - assert( IsVirtual(p) ); + assert(IsVirtual(p)); pVTable = p->u.vtab.p; p->u.vtab.p = 0; @@ -147491,24 +145522,24 @@ static VTable *vtabDisconnectAll(sqlite3 *db, Table *p){ ** 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) ); + assert(db == 0 || sqlite3SchemaMutexHeld(db, 0, p->pSchema)); - while( pVTable ){ - sqlite3 *db2 = pVTable->db; - VTable *pNext = pVTable->pNext; - assert( db2 ); - if( db2==db ){ + 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{ + } else { pVTable->pNext = db2->pDisconnect; db2->pDisconnect = pVTable; } pVTable = pNext; } - assert( !db || pRet ); + assert(!db || pRet); return pRet; } @@ -147520,16 +145551,16 @@ static VTable *vtabDisconnectAll(sqlite3 *db, Table *p){ ** 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; +SQLITE_PRIVATE void sqlite3VtabDisconnect(sqlite3* db, Table* p) { + VTable** ppVTab; - assert( IsVirtual(p) ); - assert( sqlite3BtreeHoldsAllMutexes(db) ); - assert( sqlite3_mutex_held(db->mutex) ); + 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; + for (ppVTab = &p->u.vtab.p; *ppVTab; ppVTab = &(*ppVTab)->pNext) { + if ((*ppVTab)->db == db) { + VTable* pVTab = *ppVTab; *ppVTab = pVTab->pNext; sqlite3VtabUnlock(pVTab); break; @@ -147537,7 +145568,6 @@ SQLITE_PRIVATE void sqlite3VtabDisconnect(sqlite3 *db, Table *p){ } } - /* ** Disconnect all the virtual table objects in the sqlite3.pDisconnect list. ** @@ -147558,20 +145588,20 @@ SQLITE_PRIVATE void sqlite3VtabDisconnect(sqlite3 *db, Table *p){ ** 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; +SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3* db) { + VTable* p = db->pDisconnect; - assert( sqlite3BtreeHoldsAllMutexes(db) ); - assert( sqlite3_mutex_held(db->mutex) ); + assert(sqlite3BtreeHoldsAllMutexes(db)); + assert(sqlite3_mutex_held(db->mutex)); - if( p ){ + if (p) { db->pDisconnect = 0; sqlite3ExpirePreparedStatements(db, 0); do { - VTable *pNext = p->pNext; + VTable* pNext = p->pNext; sqlite3VtabUnlock(p); p = pNext; - }while( p ); + } while (p); } } @@ -147589,13 +145619,15 @@ SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3 *db){ ** 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 ){ +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]); + for (i = 0; i < p->u.vtab.nArg; i++) { + if (i != 1) + sqlite3DbFree(db, p->u.vtab.azArg[i]); } sqlite3DbFree(db, p->u.vtab.azArg); } @@ -147607,23 +145639,23 @@ SQLITE_PRIVATE void sqlite3VtabClear(sqlite3 *db, Table *p){ ** string will be freed automatically when the table is ** deleted. */ -static void addModuleArgument(Parse *pParse, Table *pTable, char *zArg){ +static void addModuleArgument(Parse* pParse, Table* pTable, char* zArg) { sqlite3_int64 nBytes; - char **azModuleArg; - sqlite3 *db = pParse->db; + 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] ){ + 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 ){ + if (azModuleArg == 0) { sqlite3DbFree(db, zArg); - }else{ + } else { int i = pTable->u.vtab.nArg++; azModuleArg[i] = zArg; - azModuleArg[i+1] = 0; + azModuleArg[i + 1] = 0; pTable->u.vtab.azArg = azModuleArg; } } @@ -147633,34 +145665,30 @@ static void addModuleArgument(Parse *pParse, Table *pTable, char *zArg){ ** 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 */ +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 ); + if (pTable == 0) + return; + assert(0 == pTable->pIndex); pTable->eTabType = TABTYP_VTAB; db = pParse->db; - assert( pTable->u.vtab.nArg==0 ); + 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 - ); + 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. @@ -147668,11 +145696,10 @@ SQLITE_PRIVATE void sqlite3VtabBeginParse( ** 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 ){ + 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); + 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 } @@ -147682,11 +145709,11 @@ SQLITE_PRIVATE void sqlite3VtabBeginParse( ** 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; +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; + sqlite3* db = pParse->db; addModuleArgument(pParse, pParse->pNewTable, sqlite3DbStrNDup(db, z, n)); } } @@ -147695,15 +145722,17 @@ static void addArgumentToVtab(Parse *pParse){ ** 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 */ +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) ); + if (pTab == 0) + return; + assert(IsVirtual(pTab)); addArgumentToVtab(pParse); pParse->sArg.z = 0; - if( pTab->u.vtab.nArg<1 ) return; + 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 @@ -147711,17 +145740,17 @@ SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ ** do additional initialization work and store the statement text ** in the sqlite_schema table. */ - if( !db->init.busy ){ - char *zStmt; - char *zWhere; + if (!db->init.busy) { + char* zStmt; + char* zWhere; int iDb; int iReg; - Vdbe *v; + Vdbe* v; sqlite3MayAbort(pParse); /* Compute the complete text of the CREATE VIRTUAL TABLE statement */ - if( pEnd ){ + if (pEnd) { pParse->sNameToken.n = (int)(pEnd->z - pParse->sNameToken.z) + pEnd->n; } zStmt = sqlite3MPrintf(db, "CREATE VIRTUAL TABLE %T", &pParse->sNameToken); @@ -147736,15 +145765,10 @@ SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ */ 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 - ); + "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); @@ -147756,18 +145780,18 @@ SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ iReg = ++pParse->nMem; sqlite3VdbeLoadString(v, iReg, pTab->zName); sqlite3VdbeAddOp2(v, OP_VCreate, iDb, iReg); - }else{ + } 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 ); + 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 ){ + if (pOld) { sqlite3OomFault(db); - assert( pTab==pOld ); /* Malloc must have failed inside HashInsert() */ + assert(pTab == pOld); /* Malloc must have failed inside HashInsert() */ return; } pParse->pNewTable = 0; @@ -147778,7 +145802,7 @@ SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ ** 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){ +SQLITE_PRIVATE void sqlite3VtabArgInit(Parse* pParse) { addArgumentToVtab(pParse); pParse->sArg.z = 0; pParse->sArg.n = 0; @@ -147788,12 +145812,12 @@ SQLITE_PRIVATE void sqlite3VtabArgInit(Parse *pParse){ ** 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 ){ +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{ + } else { assert(pArg->z <= p->z); pArg->n = (int)(&p->z[p->n] - pArg->z); } @@ -147804,43 +145828,36 @@ SQLITE_PRIVATE void sqlite3VtabArgExtend(Parse *pParse, Token *p){ ** 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 -){ +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; + VTable* pVTable; int rc; - const char *const*azArg; + const char* const* azArg; int nArg = pTab->u.vtab.nArg; - char *zErr = 0; - char *zModuleName; + char* zErr = 0; + char* zModuleName; int iDb; - VtabCtx *pCtx; + VtabCtx* pCtx; - assert( IsVirtual(pTab) ); - azArg = (const char *const*)pTab->u.vtab.azArg; + 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 - ); + 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 ){ + if (!zModuleName) { return SQLITE_NOMEM_BKPT; } pVTable = sqlite3MallocZero(sizeof(VTable)); - if( !pVTable ){ + if (!pVTable) { sqlite3OomFault(db); sqlite3DbFree(db, zModuleName); return SQLITE_NOMEM_BKPT; @@ -147853,8 +145870,8 @@ static int vtabCallConstructor( pTab->u.vtab.azArg[1] = db->aDb[iDb].zDbSName; /* Invoke the virtual table constructor */ - assert( &db->pVtabCtx ); - assert( xConstruct ); + assert(&db->pVtabCtx); + assert(xConstruct); sCtx.pTab = pTab; sCtx.pVTable = pVTable; sCtx.pPrior = db->pVtabCtx; @@ -147862,30 +145879,31 @@ static int vtabCallConstructor( 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 (rc == SQLITE_NOMEM) + sqlite3OomFault(db); + assert(sCtx.pTab == pTab); - if( SQLITE_OK!=rc ){ - if( zErr==0 ){ + if (SQLITE_OK != rc) { + if (zErr == 0) { *pzErr = sqlite3MPrintf(db, "vtable constructor failed: %s", zModuleName); - }else { + } else { *pzErr = sqlite3MPrintf(db, "%s", zErr); sqlite3_free(zErr); } sqlite3DbFree(db, pVTable); - }else if( ALWAYS(pVTable->pVtab) ){ + } 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"; + 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{ + } else { int iCol; u16 oooHidden = 0; /* If everything went according to plan, link the new VTable structure @@ -147896,33 +145914,31 @@ static int vtabCallConstructor( pVTable->pNext = pTab->u.vtab.p; pTab->u.vtab.p = pVTable; - for(iCol=0; iColnCol; iCol++){ - char *zType = sqlite3ColumnType(&pTab->aCol[iCol], ""); + for (iCol = 0; iCol < pTab->nCol; 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'; + if (zType[i] == '\0' && i > 0) { + assert(zType[i - 1] == ' '); + zType[i - 1] = '\0'; } pTab->aCol[iCol].colFlags |= COLFLAG_HIDDEN; pTab->tabFlags |= TF_HasHidden; oooHidden = TF_OOOHidden; - }else{ + } else { pTab->tabFlags |= oooHidden; } } @@ -147940,15 +145956,15 @@ static int vtabCallConstructor( ** ** 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; +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) ){ + assert(pTab); + assert(IsVirtual(pTab)); + if (sqlite3GetVTable(db, pTab)) { return SQLITE_OK; } @@ -147956,14 +145972,14 @@ SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse *pParse, Table *pTab){ zMod = pTab->u.vtab.azArg[0]; pMod = (Module*)sqlite3HashFind(&db->aModule, zMod); - if( !pMod ){ - const char *zModule = pTab->u.vtab.azArg[0]; + if (!pMod) { + const char* zModule = pTab->u.vtab.azArg[0]; sqlite3ErrorMsg(pParse, "no such module: %s", zModule); rc = SQLITE_ERROR; - }else{ - char *zErr = 0; + } else { + char* zErr = 0; rc = vtabCallConstructor(db, pTab, pMod, pMod->pModule->xConnect, &zErr); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { sqlite3ErrorMsg(pParse, "%s", zErr); pParse->rc = rc; } @@ -147976,19 +145992,18 @@ SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse *pParse, Table *pTab){ ** 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){ +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 ){ + 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); + memset(&aVTrans[db->nVTrans], 0, sizeof(sqlite3_vtab*) * ARRAY_INCR); db->aVTrans = aVTrans; } @@ -147999,7 +146014,7 @@ static int growVTrans(sqlite3 *db){ ** 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){ +static void addToVTrans(sqlite3* db, VTable* pVTab) { /* Add pVtab to the end of sqlite3.aVTrans */ db->aVTrans[db->nVTrans++] = pVTab; sqlite3VtabLock(pVTab); @@ -148013,14 +146028,14 @@ static void addToVTrans(sqlite3 *db, VTable *pVTab){ ** 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){ +SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3* db, int iDb, const char* zTab, char** pzErr) { int rc = SQLITE_OK; - Table *pTab; - Module *pMod; - const char *zMod; + Table* pTab; + Module* pMod; + const char* zMod; pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zDbSName); - assert( pTab && IsVirtual(pTab) && !pTab->u.vtab.p ); + assert(pTab && IsVirtual(pTab) && !pTab->u.vtab.p); /* Locate the required virtual table module */ zMod = pTab->u.vtab.azArg[0]; @@ -148030,18 +146045,18 @@ SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3 *db, int iDb, const char *zTab, ** 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 ){ + if (pMod == 0 || pMod->pModule->xCreate == 0 || pMod->pModule->xDestroy == 0) { *pzErr = sqlite3MPrintf(db, "no such module: %s", zMod); rc = SQLITE_ERROR; - }else{ + } 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)) ){ + if (rc == SQLITE_OK && ALWAYS(sqlite3GetVTable(db, pTab))) { rc = growVTrans(db); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { addToVTrans(db, sqlite3GetVTable(db, pTab)); } } @@ -148054,27 +146069,27 @@ SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3 *db, int iDb, const char *zTab, ** 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; +SQLITE_API int sqlite3_declare_vtab(sqlite3* db, const char* zCreateTable) { + VtabCtx* pCtx; int rc = SQLITE_OK; - Table *pTab; + Table* pTab; Parse sParse; int initBusy; #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) || zCreateTable==0 ){ + if (!sqlite3SafetyCheckOk(db) || zCreateTable == 0) { return SQLITE_MISUSE_BKPT; } #endif sqlite3_mutex_enter(db->mutex); pCtx = db->pVtabCtx; - if( !pCtx || pCtx->bDeclared ){ + if (!pCtx || pCtx->bDeclared) { sqlite3Error(db, SQLITE_MISUSE); sqlite3_mutex_leave(db->mutex); return SQLITE_MISUSE_BKPT; } pTab = pCtx->pTab; - assert( IsVirtual(pTab) ); + assert(IsVirtual(pTab)); sqlite3ParseObjectInit(&sParse, db); sParse.eParseMode = PARSE_MODE_DECLARE_VTAB; @@ -148082,60 +146097,53 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ /* 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 ); + 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; + 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); + 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 - ){ + 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 ); + 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); + } 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 ){ + if (sParse.pVdbe) { sqlite3VdbeFinalize(sParse.pVdbe); } sqlite3DeleteTable(db, sParse.pNewTable); sqlite3ParseObjectReset(&sParse); db->init.busy = initBusy; - assert( (rc&0xff)==rc ); + assert((rc & 0xff) == rc); rc = sqlite3ApiExit(db, rc); sqlite3_mutex_leave(db->mutex); return rc; @@ -148148,32 +146156,30 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ ** ** This call is a no-op if zTab is not a virtual table. */ -SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab){ +SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3* db, int iDb, const char* zTab) { int rc = SQLITE_OK; - Table *pTab; + 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 ){ + 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 ); + 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 ); + if (rc == SQLITE_OK) { + assert(pTab->u.vtab.p == p && p->pNext == 0); p->pVtab = 0; pTab->u.vtab.p = 0; sqlite3VtabUnlock(p); @@ -148192,18 +146198,19 @@ SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab ** ** The array is cleared after invoking the callbacks. */ -static void callFinaliser(sqlite3 *db, int offset){ +static void callFinaliser(sqlite3* db, int offset) { int i; - if( db->aVTrans ){ - VTable **aVTrans = db->aVTrans; + 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); + for (i = 0; i < db->nVTrans; 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); @@ -148220,16 +146227,16 @@ static void callFinaliser(sqlite3 *db, int offset){ ** ** If an error message is available, leave it in p->zErrMsg. */ -SQLITE_PRIVATE int sqlite3VtabSync(sqlite3 *db, Vdbe *p){ +SQLITE_PRIVATE int sqlite3VtabSync(sqlite3* db, Vdbe* p) { int i; int rc = SQLITE_OK; - VTable **aVTrans = db->aVTrans; + 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 ){ + for (i = 0; rc == SQLITE_OK && i < db->nVTrans; i++) { + int (*x)(sqlite3_vtab*); + sqlite3_vtab* pVtab = aVTrans[i]->pVtab; + if (pVtab && (x = pVtab->pModule->xSync) != 0) { rc = x(pVtab); sqlite3VtabImportErrmsg(p, pVtab); } @@ -148242,8 +146249,8 @@ SQLITE_PRIVATE int sqlite3VtabSync(sqlite3 *db, Vdbe *p){ ** 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)); +SQLITE_PRIVATE int sqlite3VtabRollback(sqlite3* db) { + callFinaliser(db, offsetof(sqlite3_module, xRollback)); return SQLITE_OK; } @@ -148251,8 +146258,8 @@ SQLITE_PRIVATE int sqlite3VtabRollback(sqlite3 *db){ ** 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)); +SQLITE_PRIVATE int sqlite3VtabCommit(sqlite3* db) { + callFinaliser(db, offsetof(sqlite3_module, xCommit)); return SQLITE_OK; } @@ -148264,29 +146271,29 @@ SQLITE_PRIVATE int sqlite3VtabCommit(sqlite3 *db){ ** If the xBegin call is successful, place the sqlite3_vtab pointer ** in the sqlite3.aVTrans array. */ -SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *db, VTable *pVTab){ +SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3* db, VTable* pVTab) { int rc = SQLITE_OK; - const sqlite3_module *pModule; + 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) ){ + if (sqlite3VtabInSync(db)) { return SQLITE_LOCKED; } - if( !pVTab ){ + if (!pVTab) { return SQLITE_OK; } pModule = pVTab->pVtab->pModule; - if( pModule->xBegin ){ + 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 ){ + for (i = 0; i < db->nVTrans; i++) { + if (db->aVTrans[i] == pVTab) { return SQLITE_OK; } } @@ -148294,14 +146301,14 @@ SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *db, VTable *pVTab){ /* Invoke the xBegin method. If successful, add the vtab to the ** sqlite3.aVTrans[] array. */ rc = growVTrans(db); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = pModule->xBegin(pVTab->pVtab); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { int iSvpt = db->nStatement + db->nSavepoint; addToVTrans(db, pVTab); - if( iSvpt && pModule->xSavepoint ){ + if (iSvpt && pModule->xSavepoint) { pVTab->iSavepoint = iSvpt; - rc = pModule->xSavepoint(pVTab->pVtab, iSvpt-1); + rc = pModule->xSavepoint(pVTab->pVtab, iSvpt - 1); } } } @@ -148324,23 +146331,23 @@ SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *db, VTable *pVTab){ ** 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){ +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 ){ + 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); + for (i = 0; rc == SQLITE_OK && i < db->nVTrans; 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 ){ + switch (op) { case SAVEPOINT_BEGIN: xMethod = pMod->xSavepoint; - pVTab->iSavepoint = iSavepoint+1; + pVTab->iSavepoint = iSavepoint + 1; break; case SAVEPOINT_ROLLBACK: xMethod = pMod->xRollbackTo; @@ -148349,7 +146356,7 @@ SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ xMethod = pMod->xRelease; break; } - if( xMethod && pVTab->iSavepoint>iSavepoint ){ + if (xMethod && pVTab->iSavepoint > iSavepoint) { rc = xMethod(pVTab->pVtab, iSavepoint); } sqlite3VtabUnlock(pVTab); @@ -148372,64 +146379,67 @@ SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ ** 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; +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) ); + 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; + 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; + 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. - */ + /* 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++){ + for (i = 0; pDef->zName[i]; i++) { unsigned char x = (unsigned char)pDef->zName[i]; - assert( x==sqlite3UpperToLower[x] ); + assert(x == sqlite3UpperToLower[x]); } } #endif rc = pMod->xFindFunction(pVtab, nArg, pDef->zName, &xSFunc, &pArg); - if( rc==0 ){ + 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 ){ + 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); + memcpy((char*)&pNew[1], pDef->zName, sqlite3Strlen30(pDef->zName) + 1); pNew->xSFunc = xSFunc; pNew->pUserData = pArg; pNew->funcFlags |= SQLITE_FUNC_EPHEM; @@ -148442,21 +146452,22 @@ SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction( ** 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); +SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse* pParse, Table* pTab) { + Parse* pToplevel = sqlite3ParseToplevel(pParse); int i, n; - Table **apVtabLock; + Table** apVtabLock; - assert( IsVirtual(pTab) ); - for(i=0; inVtabLock; i++){ - if( pTab==pToplevel->apVtabLock[i] ) return; + assert(IsVirtual(pTab)); + for (i = 0; i < pToplevel->nVtabLock; i++) { + if (pTab == pToplevel->apVtabLock[i]) + return; } - n = (pToplevel->nVtabLock+1)*sizeof(pToplevel->apVtabLock[0]); + n = (pToplevel->nVtabLock + 1) * sizeof(pToplevel->apVtabLock[0]); apVtabLock = sqlite3Realloc(pToplevel->apVtabLock, n); - if( apVtabLock ){ + if (apVtabLock) { pToplevel->apVtabLock = apVtabLock; pToplevel->apVtabLock[pToplevel->nVtabLock++] = pTab; - }else{ + } else { sqlite3OomFault(pToplevel->db); } } @@ -148476,18 +146487,21 @@ SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse *pParse, Table *pTab){ ** 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; +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; + 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; + if (pTab == 0) + return 0; pTab->zName = sqlite3DbStrDup(db, pMod->zName); - if( pTab->zName==0 ){ + if (pTab->zName == 0) { sqlite3DbFree(db, pTab); return 0; } @@ -148495,14 +146509,14 @@ SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse *pParse, Module *pMod){ pTab->nTabRef = 1; pTab->eTabType = TABTYP_VTAB; pTab->pSchema = db->aDb[0].pSchema; - assert( pTab->u.vtab.nArg==0 ); + 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 ){ + if (rc) { sqlite3ErrorMsg(pParse, "%s", zErr); sqlite3DbFree(db, zErr); sqlite3VtabEponymousTableClear(db, pMod); @@ -148514,9 +146528,9 @@ SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse *pParse, Module *pMod){ ** 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 ){ +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. */ @@ -148533,17 +146547,16 @@ SQLITE_PRIVATE void sqlite3VtabEponymousTableClear(sqlite3 *db, Module *pMod){ ** 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 - }; +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; + 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]; + 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]; } /* @@ -148551,22 +146564,23 @@ SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *db){ ** 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, ...){ +SQLITE_API int sqlite3_vtab_config(sqlite3* db, int op, ...) { va_list ap; int rc = SQLITE_OK; - VtabCtx *p; + VtabCtx* p; #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; + if (!sqlite3SafetyCheckOk(db)) + return SQLITE_MISUSE_BKPT; #endif sqlite3_mutex_enter(db->mutex); p = db->pVtabCtx; - if( !p ){ + if (!p) { rc = SQLITE_MISUSE_BKPT; - }else{ - assert( p->pTab==0 || IsVirtual(p->pTab) ); + } else { + assert(p->pTab == 0 || IsVirtual(p->pTab)); va_start(ap, op); - switch( op ){ + switch (op) { case SQLITE_VTAB_CONSTRAINT_SUPPORT: { p->pVTable->bConstraint = (u8)va_arg(ap, int); break; @@ -148587,7 +146601,8 @@ SQLITE_API int sqlite3_vtab_config(sqlite3 *db, int op, ...){ va_end(ap); } - if( rc!=SQLITE_OK ) sqlite3Error(db, rc); + if (rc != SQLITE_OK) + sqlite3Error(db, rc); sqlite3_mutex_leave(db->mutex); return rc; } @@ -148637,9 +146652,8 @@ SQLITE_API int sqlite3_vtab_config(sqlite3 *db, int op, ...){ #ifndef SQLITE_WHEREINT_H #define SQLITE_WHEREINT_H - /* Forward references -*/ + */ typedef struct WhereClause WhereClause; typedef struct WhereMaskSet WhereMaskSet; typedef struct WhereOrInfo WhereOrInfo; @@ -148660,19 +146674,19 @@ typedef struct WhereRightJoin WhereRightJoin; ** automatically freed when its WInfo oject is destructed. */ struct WhereMemBlock { - WhereMemBlock *pNext; /* Next block in the chain */ - u64 sz; /* Bytes of space */ + 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 */ + 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 */ }; /* @@ -148691,43 +146705,43 @@ struct WhereRightJoin { ** 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 */ + 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 */ + 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[] */ + 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 */ + 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 */ + 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 */ + int addrVisit; /* Address at which row is visited */ #endif }; @@ -148746,43 +146760,43 @@ struct WhereLevel { ** and that minimize the overall cost. */ struct WhereLoop { - Bitmask prereq; /* Bitmask of other loops that must run first */ - Bitmask maskSelf; /* Bitmask identifying table iTab */ + 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 */ + 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 */ + 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 */ + 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 == */ + 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 */ + 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 */ +#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 @@ -148790,9 +146804,9 @@ struct WhereLoop { ** 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 */ + 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 @@ -148801,8 +146815,8 @@ struct WhereOrCost { */ #define N_OR_COST 3 struct WhereOrSet { - u16 n; /* Number of valid a[] entries */ - WhereOrCost a[N_OR_COST]; /* Set of best costs */ + u16 n; /* Number of valid a[] entries */ + WhereOrCost a[N_OR_COST]; /* Set of best costs */ }; /* @@ -148824,13 +146838,13 @@ struct WhereOrSet { ** 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 */ + 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 */ }; /* @@ -148885,67 +146899,67 @@ struct WherePath { ** 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 " */ + 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 */ + 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 */ + 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 */ + 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 */ +#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 */ +#define TERM_HIGHTRUTH 0x4000 /* Term excludes few rows */ #else -# define TERM_HIGHTRUTH 0 /* Only used with STAT4 */ +#define TERM_HIGHTRUTH 0 /* Only used with STAT4 */ #endif -#define TERM_SLICE 0x8000 /* One slice of a row-value/vector comparison */ +#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 */ + 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 */ }; /* @@ -148961,18 +146975,18 @@ struct WhereScan { ** 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 */ + 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[] */ + WhereTerm aStatic[1]; /* Initial static space for a[] */ #else - WhereTerm aStatic[8]; /* Initial static space for a[] */ + WhereTerm aStatic[8]; /* Initial static space for a[] */ #endif }; @@ -148981,8 +146995,8 @@ struct WhereClause { ** 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 */ + WhereClause wc; /* Decomposition into subterms */ + Bitmask indexable; /* Bitmask of all indexable tables in the clause */ }; /* @@ -148990,7 +147004,7 @@ struct WhereOrInfo { ** a dynamically allocated instance of the following structure. */ struct WhereAndInfo { - WhereClause wc; /* The subexpression broken out */ + WhereClause wc; /* The subexpression broken out */ }; /* @@ -149020,9 +147034,9 @@ struct WhereAndInfo { ** no gaps. */ struct WhereMaskSet { - int bVarSelect; /* Used by sqlite3WhereExprUsage() */ - int n; /* Number of assigned cursor values */ - int ix[BMS]; /* Cursor assigned to each bit */ + int bVarSelect; /* Used by sqlite3WhereExprUsage() */ + int n; /* Number of assigned cursor values */ + int ix[BMS]; /* Cursor assigned to each bit */ }; /* @@ -149030,24 +147044,24 @@ struct WhereMaskSet { ** 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 */ + 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 */ + 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 */ + 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_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 */ +#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 @@ -149063,10 +147077,10 @@ struct WhereLoopBuilder { ** baseline limit was exhausted by prior tables of the join. */ #ifndef SQLITE_QUERY_PLANNER_LIMIT -# define SQLITE_QUERY_PLANNER_LIMIT 20000 +#define SQLITE_QUERY_PLANNER_LIMIT 20000 #endif #ifndef SQLITE_QUERY_PLANNER_LIMIT_INCR -# define SQLITE_QUERY_PLANNER_LIMIT_INCR 1000 +#define SQLITE_QUERY_PLANNER_LIMIT_INCR 1000 #endif /* @@ -149078,9 +147092,9 @@ struct WhereLoopBuilder { */ 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 */ + 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 */ }; /* @@ -149094,38 +147108,38 @@ struct WhereExprMod { ** 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 */ + 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 */ + 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 */ }; /* @@ -149133,68 +147147,59 @@ struct WhereInfo { ** ** where.c: */ -SQLITE_PRIVATE Bitmask sqlite3WhereGetMask(WhereMaskSet*,int); +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 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); +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 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 */ +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 +#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) */ +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) +#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 +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 sqlite3WhereClauseInit(WhereClause*, WhereInfo*); SQLITE_PRIVATE void sqlite3WhereClauseClear(WhereClause*); -SQLITE_PRIVATE void sqlite3WhereSplit(WhereClause*,Expr*,u8); +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*); @@ -149202,10 +147207,6 @@ 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 @@ -149219,55 +147220,55 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs(Parse*, SrcItem*, WhereClause*); ** 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_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_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 */ +#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 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"; + if (i == XN_EXPR) + return ""; + if (i == XN_ROWID) + return "rowid"; return pIdx->pTable->aCol[i].zCnName; } @@ -149294,34 +147297,40 @@ static const char *explainIndexColumnName(Index *pIdx, int i){ ** 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 */ -){ +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); + assert(nTerm >= 1); + if (bAnd) + sqlite3_str_append(pStr, " AND ", 5); - if( nTerm>1 ) sqlite3_str_append(pStr, "(", 1); - for(i=0; i 1) + sqlite3_str_append(pStr, "(", 1); + for (i = 0; i < nTerm; i++) { + if (i) + sqlite3_str_append(pStr, ",", 1); + sqlite3_str_appendall(pStr, explainIndexColumnName(pIdx, iTerm + i)); } - if( nTerm>1 ) sqlite3_str_append(pStr, ")", 1); + if (nTerm > 1) + sqlite3_str_append(pStr, ")", 1); sqlite3_str_append(pStr, zOp, 1); - if( nTerm>1 ) sqlite3_str_append(pStr, "(", 1); - for(i=0; i 1) + sqlite3_str_append(pStr, "(", 1); + for (i = 0; i < nTerm; i++) { + if (i) + sqlite3_str_append(pStr, ",", 1); sqlite3_str_append(pStr, "?", 1); } - if( nTerm>1 ) sqlite3_str_append(pStr, ")", 1); + if (nTerm > 1) + sqlite3_str_append(pStr, ")", 1); } /* @@ -149338,26 +147347,28 @@ static void explainAppendTerm( ** ** "a=? AND b>?" */ -static void explainIndexRange(StrAccum *pStr, WhereLoop *pLoop){ - Index *pIndex = pLoop->u.btree.pIndex; +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; + 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); + for (i = 0; i < nEq; i++) { + const char* z = explainIndexColumnName(pIndex, i); + if (i) + sqlite3_str_append(pStr, " AND ", 5); + sqlite3_str_appendf(pStr, i >= nSkip ? "%s=?" : "ANY(%s)", z); } j = i; - if( pLoop->wsFlags&WHERE_BTM_LIMIT ){ + if (pLoop->wsFlags & WHERE_BTM_LIMIT) { explainAppendTerm(pStr, pIndex, pLoop->u.btree.nBtm, j, i, ">"); i = 1; } - if( pLoop->wsFlags&WHERE_TOP_LIMIT ){ + if (pLoop->wsFlags & WHERE_TOP_LIMIT) { explainAppendTerm(pStr, pIndex, pLoop->u.btree.nTop, j, i, "<"); } sqlite3_str_append(pStr, ")", 1); @@ -149372,107 +147383,103 @@ static void explainIndexRange(StrAccum *pStr, WhereLoop *pLoop){ ** 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() */ -){ +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 ) + 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 */ + 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; + 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)); + 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; + if ((flags & (WHERE_IPK | WHERE_VIRTUALTABLE)) == 0) { + const char* zFmt = 0; + Index* pIdx; - assert( pLoop->u.btree.pIndex!=0 ); + 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 ){ + 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 ){ + } else if (flags & WHERE_PARTIALIDX) { zFmt = "AUTOMATIC PARTIAL COVERING INDEX"; - }else if( flags & WHERE_AUTO_INDEX ){ + } else if (flags & WHERE_AUTO_INDEX) { zFmt = "AUTOMATIC COVERING INDEX"; - }else if( flags & WHERE_IDX_ONLY ){ + } else if (flags & WHERE_IDX_ONLY) { zFmt = "COVERING INDEX %s"; - }else{ + } else { zFmt = "INDEX %s"; } - if( zFmt ){ + 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 ){ + } else if ((flags & WHERE_IPK) != 0 && (flags & WHERE_CONSTRAINT) != 0) { char cRangeOp; -#if 0 /* Better output, but breaks many tests */ +#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"; + const char* zRowid = "rowid"; #endif sqlite3_str_appendf(&str, " USING INTEGER PRIMARY KEY (%s", zRowid); - if( flags&(WHERE_COLUMN_EQ|WHERE_COLUMN_IN) ){ + if (flags & (WHERE_COLUMN_EQ | WHERE_COLUMN_IN)) { cRangeOp = '='; - }else if( (flags&WHERE_BOTH_LIMIT)==WHERE_BOTH_LIMIT ){ + } else if ((flags & WHERE_BOTH_LIMIT) == WHERE_BOTH_LIMIT) { sqlite3_str_appendf(&str, ">? AND %s", zRowid); cRangeOp = '<'; - }else if( flags&WHERE_BTM_LIMIT ){ + } else if (flags & WHERE_BTM_LIMIT) { cRangeOp = '>'; - }else{ - assert( flags&WHERE_TOP_LIMIT); + } 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); + 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 ){ + 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{ + 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); + sqlite3ExplainBreakpoint("", zMsg); + ret = sqlite3VdbeAddOp4(v, OP_Explain, sqlite3VdbeCurrentAddr(v), pParse->addrExplain, 0, zMsg, P4_DYNAMIC); } return ret; } @@ -149487,43 +147494,42 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan( ** 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 */ -){ +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 */ + 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 ){ + 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{ + } 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); + } else { + for (i = pLoop->nSkip; i < pLoop->u.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); + ret = sqlite3VdbeAddOp4(v, OP_Explain, sqlite3VdbeCurrentAddr(v), pParse->addrExplain, 0, zMsg, P4_DYNAMIC); return ret; } #endif /* SQLITE_OMIT_EXPLAIN */ @@ -149538,26 +147544,22 @@ SQLITE_PRIVATE int sqlite3WhereExplainBloomFilter( ** 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 ){ +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{ + } else { zObj = pSrclist->a[pLvl->iFrom].zName; } - sqlite3VdbeScanStatus( - v, addrExplain, pLvl->addrBody, pLvl->addrVisit, pLoop->nOut, zObj - ); + 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 @@ -149600,29 +147602,29 @@ SQLITE_PRIVATE void sqlite3WhereAddScanStatus( ** 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){ +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 ){ + 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{ + } else { pTerm->wtFlags |= TERM_CODED; } #ifdef WHERETRACE_ENABLED - if( sqlite3WhereTrace & 0x20000 ){ + if (sqlite3WhereTrace & 0x20000) { sqlite3DebugPrintf("DISABLE-"); sqlite3WhereTermPrint(pTerm, (int)(pTerm - (pTerm->pWC->a))); } #endif - if( pTerm->iParent<0 ) break; + if (pTerm->iParent < 0) + break; pTerm = &pTerm->pWC->a[pTerm->iParent]; - assert( pTerm!=0 ); + assert(pTerm != 0); pTerm->nChild--; - if( pTerm->nChild!=0 ) break; + if (pTerm->nChild != 0) + break; nLoop++; } } @@ -149638,29 +147640,29 @@ static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){ ** 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 ); +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 ); + 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 ){ + assert(SQLITE_AFF_NONE < SQLITE_AFF_BLOB); + while (n > 0 && zAff[0] <= SQLITE_AFF_BLOB) { n--; base++; zAff++; } - while( n>1 && zAff[n-1]<=SQLITE_AFF_BLOB ){ + 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 ){ + if (n > 0) { sqlite3VdbeAddOp4(v, OP_Affinity, base, n, 0, zAff, n); } } @@ -149675,23 +147677,19 @@ static void codeApplyAffinity(Parse *pParse, int base, int n, char *zAff){ ** * 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 */ -){ +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; +static Expr* removeUnindexableInClauseTerms(Parse* pParse, /* The parsing context */ + int iEq, /* Look at loop terms starting here */ + WhereLoop* pLoop, /* The current loop */ + Expr* pX /* The IN expression to be reduced */ +) { + sqlite3* db = pParse->db; + 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) ); + 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) ); + assert(pNew->pLeft != 0); + assert(ExprUseXList(pNew->pLeft)); pOrigLhs = pNew->pLeft->x.pList; - for(i=iEq; inLTerm; i++){ - if( pLoop->aLTerm[i]->pExpr==pX ){ + for (i = iEq; i < pLoop->nLTerm; i++) { + if (pLoop->aLTerm[i]->pExpr == pX) { int iField; - assert( (pLoop->aLTerm[i]->eOperator & (WO_OR|WO_AND))==0 ); + 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 */ + 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 ); + assert(pOrigLhs->a[iField].pExpr != 0); pLhs = sqlite3ExprListAppend(pParse, pLhs, pOrigLhs->a[iField].pExpr); pOrigLhs->a[iField].pExpr = 0; } @@ -149760,17 +147758,17 @@ static Expr *removeUnindexableInClauseTerms( sqlite3ExprListDelete(db, pOrigLhs); pNew->pLeft->x.pList = pLhs; pNew->x.pSelect->pEList = pRhs; - if( pLhs && pLhs->nExpr==1 ){ + 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; + 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 (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 @@ -149778,8 +147776,8 @@ static Expr *removeUnindexableInClauseTerms( ** 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++){ + ExprList* pOrderBy = pSelect->pOrderBy; + for (i = 0; i < pOrderBy->nExpr; i++) { pOrderBy->a[i].u.x.iOrderByCol = 0; } } @@ -149794,7 +147792,6 @@ static Expr *removeUnindexableInClauseTerms( 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 @@ -149810,140 +147807,132 @@ static Expr *removeUnindexableInClauseTerms( ** 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 */ +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 ){ + 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 ){ + } else if (pX->op == TK_ISNULL) { iReg = iTarget; sqlite3VdbeAddOp2(v, OP_Null, 0, iReg); #ifndef SQLITE_OMIT_SUBQUERY - }else{ + } else { int eType = IN_INDEX_NOOP; int iTab; - struct InLoop *pIn; - WhereLoop *pLoop = pLevel->pWLoop; + 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 ); + 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 ); + assert(pX->op == TK_IN); iReg = iTarget; - for(i=0; iaLTerm[i] && pLoop->aLTerm[i]->pExpr==pX ){ + for (i = 0; i < iEq; i++) { + if (pLoop->aLTerm[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++; + for (i = iEq; i < pLoop->nLTerm; i++) { + assert(pLoop->aLTerm[i] != 0); + if (pLoop->aLTerm[i]->pExpr == pX) + nEq++; } iTab = 0; - if( !ExprUseXSelect(pX) || pX->x.pSelect->pEList->nExpr==1 ){ + 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; + } 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); + 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{ + } else { int n = sqlite3ExprVectorSize(pX->pLeft); - aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*MAX(nEq,n)); + aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int) * MAX(nEq, n)); eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap, &iTab); } pX = pExpr; } - if( eType==IN_INDEX_INDEX_DESC ){ - testcase( bRev ); + 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 ); + assert((pLoop->wsFlags & WHERE_MULTI_OR) == 0); pLoop->wsFlags |= WHERE_IN_ABLE; - if( pLevel->u.in.nIn==0 ){ + if (pLevel->u.in.nIn == 0) { pLevel->addrNxt = sqlite3VdbeMakeLabel(pParse); } - if( iEq>0 && (pLoop->wsFlags & WHERE_IN_SEEKSCAN)==0 ){ + 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); + 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[] */ + if (pIn) { + int iMap = 0; /* Index in aiMap[] */ pIn += i; - for(i=iEq;inLTerm; i++){ - if( pLoop->aLTerm[i]->pExpr==pX ){ + for (i = iEq; i < pLoop->nLTerm; i++) { + if (pLoop->aLTerm[i]->pExpr == pX) { int iOut = iReg + i - iEq; - if( eType==IN_INDEX_ROWID ){ + if (eType == IN_INDEX_ROWID) { pIn->addrInTop = sqlite3VdbeAddOp2(v, OP_Rowid, iTab, iOut); - }else{ + } else { int iCol = aiMap ? aiMap[iMap++] : 0; - pIn->addrInTop = sqlite3VdbeAddOp3(v,OP_Column,iTab, iCol, iOut); + pIn->addrInTop = sqlite3VdbeAddOp3(v, OP_Column, iTab, iCol, iOut); } - sqlite3VdbeAddOp1(v, OP_IsNull, iOut); VdbeCoverage(v); - if( i==iEq ){ + sqlite3VdbeAddOp1(v, OP_IsNull, iOut); + VdbeCoverage(v); + if (i == iEq) { pIn->iCur = iTab; pIn->eEndLoopOp = bRev ? OP_Prev : OP_Next; - if( iEq>0 ){ + if (iEq > 0) { pIn->iBase = iReg - i; pIn->nPrefix = i; - }else{ + } else { pIn->nPrefix = 0; } - }else{ + } 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 - ){ + 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{ + } else { pLevel->u.in.nIn = 0; } sqlite3DbFree(pParse->db, aiMap); @@ -149959,9 +147948,7 @@ static int codeEqualityTerm( ** 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 - ){ + if ((pLevel->pWLoop->wsFlags & WHERE_TRANSCONS) == 0 || (pTerm->eOperator & WO_EQUIV) == 0) { disableTerm(pLevel, pTerm); } @@ -150013,105 +148000,104 @@ static int codeEqualityTerm( ** 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 */ +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 ); + assert((pLoop->wsFlags & WHERE_VIRTUALTABLE) == 0); nEq = pLoop->u.btree.nEq; nSkip = pLoop->nSkip; pIdx = pLoop->u.btree.pIndex; - assert( pIdx!=0 ); + 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 ); + zAff = sqlite3DbStrDup(pParse->db, sqlite3IndexAffinityStr(pParse->db, pIdx)); + assert(zAff != 0 || pParse->db->mallocFailed); - if( nSkip ){ + 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); + 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); + 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 ); + for (j = 0; j < nSkip; j++) { + sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, j, regBase + j); + testcase(pIdx->aiColumn[j] == XN_EXPR); VdbeComment((v, "%s", explainIndexColumnName(pIdx, j))); } } /* Evaluate the equality constraints - */ - assert( zAff==0 || (int)strlen(zAff)>=nEq ); - for(j=nSkip; j= nEq); + for (j = nSkip; j < nEq; j++) { int r1; pTerm = pLoop->aLTerm[j]; - assert( pTerm!=0 ); + 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 ){ + 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); + } else { + sqlite3VdbeAddOp2(v, OP_Copy, r1, regBase + j); } } } - for(j=nSkip; jaLTerm[j]; - if( pTerm->eOperator & WO_IN ){ - if( pTerm->pExpr->flags & EP_xIsSelect ){ + 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; + 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); + } 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 ){ + 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]) ){ + if (sqlite3ExprNeedsNoAffinityChange(pRight, zAff[j])) { zAff[j] = SQLITE_AFF_BLOB; } } @@ -150139,24 +148125,22 @@ static int codeAllEqualityTerms( ** 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 ); +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 */ + 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) +#define whereLikeOptimizationStringFixup(A, B, C) #endif #ifdef SQLITE_ENABLE_CURSOR_HINTS @@ -150166,9 +148150,9 @@ static void whereLikeOptimizationStringFixup( ** 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 */ + 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 */ }; /* @@ -150177,13 +148161,10 @@ struct CCurHint { ** 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 - ){ +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; @@ -150204,16 +148185,13 @@ static int codeCursorHintCheckExpr(Walker *pWalker, Expr *pExpr){ ** 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 - ){ +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 ){ + } else if (pExpr->op == TK_FUNCTION) { int d1; char d2[4]; - if( 0==sqlite3IsLikeFunction(pWalker->pParse->db, pExpr, &d1, d2) ){ + if (0 == sqlite3IsLikeFunction(pWalker->pParse->db, pExpr, &d1, d2)) { pWalker->eCode = 1; } } @@ -150221,7 +148199,6 @@ static int codeCursorHintIsOrFunction(Walker *pWalker, Expr *pExpr){ 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 @@ -150239,21 +148216,21 @@ static int codeCursorHintIsOrFunction(Walker *pWalker, Expr *pExpr){ ** 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){ +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 */ + 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 ){ + } else if (pHint->pIdx != 0) { pExpr->iTable = pHint->iIdxCur; pExpr->iColumn = sqlite3TableColumnToIndex(pHint->pIdx, pExpr->iColumn); - assert( pExpr->iColumn>=0 ); + assert(pExpr->iColumn >= 0); } - }else if( pExpr->op==TK_AGG_FUNCTION ){ + } 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. @@ -150269,27 +148246,27 @@ static int codeCursorHintFixExpr(Walker *pWalker, Expr *pExpr){ /* ** 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; +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; + WhereClause* pWC; + WhereTerm* pTerm; int i, j; struct CCurHint sHint; Walker sWalker; - if( OptimizationDisabled(db, SQLITE_CursorHints) ) return; + if (OptimizationDisabled(db, SQLITE_CursorHints)) + return; iCur = pLevel->iTabCur; - assert( iCur==pWInfo->pTabList->a[pLevel->iFrom].iCursor ); + assert(iCur == pWInfo->pTabList->a[pLevel->iFrom].iCursor); sHint.iTabCur = iCur; sHint.iIdxCur = pLevel->iIdxCur; sHint.pIdx = pLoop->u.btree.pIndex; @@ -150297,10 +148274,12 @@ static void codeCursorHint( sWalker.pParse = pParse; sWalker.u.pCCurHint = &sHint; pWC = &pWInfo->sWC; - for(i=0; inBase; i++){ + for (i = 0; i < pWC->nBase; i++) { pTerm = &pWC->a[i]; - if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; - if( pTerm->prereqAll & pLevel->notReady ) continue; + 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 @@ -150324,54 +148303,56 @@ static void codeCursorHint( ** ** 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 - ){ + 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; + if (sWalker.eCode) + continue; } - }else{ - if( ExprHasProperty(pTerm->pExpr, EP_OuterON) ) 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; + if (pLoop->u.btree.nEq == 0 && pTerm != pEndRange) { + for (j = 0; j < pLoop->nLTerm && pLoop->aLTerm[j] != pTerm; j++) { + } + if (j < pLoop->nLTerm) + continue; } /* No subqueries or non-deterministic functions allowed */ - if( sqlite3ExprContainsSubquery(pTerm->pExpr) ) continue; + if (sqlite3ExprContainsSubquery(pTerm->pExpr)) + continue; /* For an index scan, make sure referenced columns are actually in ** the index. */ - if( sHint.pIdx!=0 ){ + if (sHint.pIdx != 0) { sWalker.eCode = 0; sWalker.xExprCallback = codeCursorHintCheckExpr; sqlite3WalkExpr(&sWalker, pTerm->pExpr); - if( sWalker.eCode ) continue; + 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 ){ + 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); + 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 */ +#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 @@ -150399,35 +148380,33 @@ static void codeCursorHint( ** 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 */ +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 ); + 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) - ){ + 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 ){ + 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++){ + for (i = 0; i < pIdx->nColumn - 1; i++) { int x1, x2; - assert( pIdx->aiColumn[i]nCol ); + assert(pIdx->aiColumn[i] < pTab->nCol); x1 = pIdx->aiColumn[i]; x2 = sqlite3TableColumnToStorage(pTab, x1); - testcase( x1!=x2 ); - if( x1>=0 ) ai[x2+1] = i+1; + testcase(x1 != x2); + if (x1 >= 0) + ai[x2 + 1] = i + 1; } sqlite3VdbeChangeP4(v, -1, (char*)ai, P4_INTARRAY); } @@ -150443,30 +148422,30 @@ static void codeDeferredSeek( ** 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) ){ +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; + if (ExprUseXSelect(p)) { + Vdbe* v = pParse->pVdbe; int iSelect; - assert( p->op==TK_SELECT ); + assert(p->op == TK_SELECT); iSelect = sqlite3CodeSubselect(pParse, p); - sqlite3VdbeAddOp3(v, OP_Copy, iSelect, iReg, nReg-1); - }else + sqlite3VdbeAddOp3(v, OP_Copy, iSelect, iReg, nReg - 1); + } else #endif { int i; - const ExprList *pList; - assert( ExprUseXList(p) ); + const ExprList* pList; + assert(ExprUseXList(p)); pList = p->x.pList; - assert( nReg<=pList->nExpr ); - for(i=0; ia[i].pExpr, iReg+i); + assert(nReg <= pList->nExpr); + for (i = 0; i < nReg; i++) { + sqlite3ExprCode(pParse, pList->a[i].pExpr, iReg + i); } } - }else{ - assert( nReg==1 || pParse->nErr ); + } else { + assert(nReg == 1 || pParse->nErr); sqlite3ExprCode(pParse, p, iReg); } } @@ -150476,22 +148455,23 @@ static void codeExprOrVector(Parse *pParse, Expr *p, int iReg, int nReg){ ** down through the Walker. */ typedef struct IdxExprTrans { - Expr *pIdxExpr; /* The index expression */ + 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()) */ + 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; +static void preserveExpr(IdxExprTrans* pTrans, Expr* pExpr) { + WhereExprMod* pNew; pNew = sqlite3DbMallocRaw(pTrans->db, sizeof(*pNew)); - if( pNew==0 ) return; + if (pNew == 0) + return; pNew->pNext = pTrans->pWInfo->pExprMods; pTrans->pWInfo->pExprMods = pNew; pNew->pExpr = pExpr; @@ -150504,20 +148484,20 @@ static void preserveExpr(IdxExprTrans *pTrans, Expr *pExpr){ ** 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 ){ +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); + testcase(ExprHasProperty(pExpr, EP_Unlikely)); + ExprClearProperty(pExpr, EP_Skip | EP_Unlikely | EP_WinFunc | EP_Subrtn); pExpr->y.pTab = 0; return WRC_Prune; - }else{ + } else { return WRC_Continue; } } @@ -150526,13 +148506,13 @@ static int whereIndexExprTransNode(Walker *p, Expr *pExpr){ /* 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 ); +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->affExpr = sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn); pExpr->iTable = pX->iIdxCur; pExpr->iColumn = pX->iIdxCol; pExpr->y.pTab = 0; @@ -150551,19 +148531,18 @@ static int whereIndexExprTransColumn(Walker *p, Expr *pExpr){ ** 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; +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 ){ + if (aColExpr == 0 && !pIdx->bHasVCol) { /* The index does not reference any expressions or virtual columns ** so no translations are needed. */ return; @@ -150575,20 +148554,18 @@ static void whereIndexExprTrans( x.iIdxCur = iIdxCur; x.pWInfo = pWInfo; x.db = pWInfo->pParse->db; - for(iIdxCol=0; iIdxColnColumn; iIdxCol++){ + for (iIdxCol = 0; iIdxCol < pIdx->nColumn; iIdxCol++) { i16 iRef = pIdx->aiColumn[iIdxCol]; - if( iRef==XN_EXPR ){ - assert( aColExpr!=0 && aColExpr->a[iIdxCol].pExpr!=0 ); + if (iRef == XN_EXPR) { + assert(aColExpr != 0 && aColExpr->a[iIdxCol].pExpr != 0); x.pIdxExpr = aColExpr->a[iIdxCol].pExpr; - if( sqlite3ExprIsConstant(x.pIdxExpr) ) continue; + 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) - ){ + } 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 @@ -150598,7 +148575,7 @@ static void whereIndexExprTrans( x.iTabCol = iRef; w.xExprCallback = whereIndexExprTransColumn; #endif /* SQLITE_OMIT_GENERATED_COLUMNS */ - }else{ + } else { continue; } x.iIdxCol = iIdxCol; @@ -150615,22 +148592,19 @@ static void whereIndexExprTrans( ** true because pTruth is true, then mark those WHERE clause terms as ** coded. */ -static void whereApplyPartialIndexConstraints( - Expr *pTruth, - int iTabCur, - WhereClause *pWC -){ +static void whereApplyPartialIndexConstraints(Expr* pTruth, int iTabCur, WhereClause* pWC) { int i; - WhereTerm *pTerm; - while( pTruth->op==TK_AND ){ + 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; + for (i = 0, pTerm = pWC->a; i < pWC->nTerm; i++, pTerm++) { + Expr* pExpr; + if (pTerm->wtFlags & TERM_CODED) + continue; pExpr = pTerm->pExpr; - if( sqlite3ExprCompare(0, pExpr, pTruth, iTabCur)==0 ){ + if (sqlite3ExprCompare(0, pExpr, pTruth, iTabCur) == 0) { pTerm->wtFlags |= TERM_CODED; } } @@ -150651,46 +148625,46 @@ static void whereApplyPartialIndexConstraints( ** 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; +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 ); + if (NEVER(pLoop->prereq & notReady)) + continue; + assert(pLevel->addrBrk == 0); pLevel->addrBrk = addrNxt; - if( pLoop->wsFlags & WHERE_IPK ){ - WhereTerm *pTerm = pLoop->aLTerm[0]; + if (pLoop->wsFlags & WHERE_IPK) { + WhereTerm* pTerm = pLoop->aLTerm[0]; int regRowid; - assert( pTerm!=0 ); - assert( pTerm->pExpr!=0 ); - testcase( pTerm->wtFlags & TERM_VIRTUAL ); + 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); + sqlite3VdbeAddOp4Int(pParse->pVdbe, OP_Filter, pLevel->regFilter, addrNxt, regRowid, 1); VdbeCoverage(pParse->pVdbe); - }else{ + } else { u16 nEq = pLoop->u.btree.nEq; int r1; - char *zStartAff; + char* zStartAff; - assert( pLoop->wsFlags & WHERE_INDEXED ); - assert( (pLoop->wsFlags & WHERE_COLUMN_IN)==0 ); - r1 = codeAllEqualityTerms(pParse,pLevel,0,0,&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); + sqlite3VdbeAddOp4Int(pParse->pVdbe, OP_Filter, pLevel->regFilter, addrNxt, r1, nEq); VdbeCoverage(pParse->pVdbe); } pLevel->regFilter = 0; @@ -150702,30 +148676,29 @@ static SQLITE_NOINLINE void filterPullDown( ** 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 */ -){ +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 */ + 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; @@ -150733,16 +148706,15 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( 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)); + 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); + 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 ){ + if (sqlite3WhereTrace & 0x20000) { + if (iLevel == 0) { sqlite3DebugPrintf("WHERE clause being coded:\n"); sqlite3TreeViewExpr(0, pWInfo->pWhere, 0); } @@ -150768,10 +148740,8 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** 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 ){ + 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")); @@ -150779,102 +148749,97 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( /* 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; + 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 ){ + if (pTabItem->fg.viaCoroutine) { int regYield = pTabItem->regReturn; sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pTabItem->addrFillSub); - pLevel->p2 = sqlite3VdbeAddOp2(v, OP_Yield, regYield, addrBrk); + pLevel->p2 = sqlite3VdbeAddOp2(v, OP_Yield, regYield, addrBrk); VdbeCoverage(v); VdbeComment((v, "next row of %s", pTabItem->pTab->zName)); pLevel->op = OP_Goto; - }else + } else #ifndef SQLITE_OMIT_VIRTUALTABLE - if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)!=0 ){ + 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 iReg; /* P3 Value for OP_VFilter */ int addrNotFound; int nConstraint = pLoop->nLTerm; - iReg = sqlite3GetTempRange(pParse, nConstraint+2); + 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 ){ + 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{ + } else { codeEqualityTerm(pParse, pTerm, pLevel, j, bRev, iTarget); addrNotFound = pLevel->addrNxt; } - }else{ - Expr *pRight = pTerm->pExpr->pRight; + } 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 ); + 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")); + 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); + 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; + 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 ); + assert((pLoop->wsFlags & WHERE_MULTI_OR) == 0); - for(j=0; jaLTerm[j]; - if( j<16 && (pLoop->u.vtab.omitMask>>j)&1 ){ + 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 */ + 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++){ + for (iIn = 0; ALWAYS(iIn < pLevel->u.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 ); + 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; } @@ -150884,24 +148849,22 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** the IN constraint is not satisfied */ pCompare = sqlite3PExpr(pParse, TK_EQ, 0, 0); - if( !db->mallocFailed ){ + 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{ + 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 - ); + if (pRight) { + pRight->iTable = iReg + j + 2; + sqlite3ExprIfFalse(pParse, pCompare, pLevel->addrCont, SQLITE_JUMPIFNULL); } pCompare->pLeft = 0; } @@ -150916,928 +148879,931 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** ** sqlite3ReleaseTempRange(pParse, iReg, nConstraint+2); */ - }else + } 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 + 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. */ - 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; + 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); } - if( 0==sqlite3ExprIsVector(pX->pRight) ){ - disableTerm(pLevel, pEnd); + 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); - } + 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 */ - 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); - } + pIdx = pLoop->u.btree.pIndex; + iIdxCur = pLevel->iIdxCur; + assert(nEq >= pLoop->nSkip); - /* 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]); + /* 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; + } + } } - 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")); + 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 ((nEq < pIdx->nColumn && bRev == (pIdx->aSortOrder[nEq] == SQLITE_SO_ASC))) { + SWAP(WhereTerm*, pRangeEnd, pRangeStart); + SWAP(u8, bSeekPastNull, bStopAtNull); + SWAP(u8, nBtm, nTop); } - if( pLevel->regFilter ){ - sqlite3VdbeAddOp4Int(v, OP_Filter, pLevel->regFilter, addrNxt, - regBase, nEq); - VdbeCoverage(v); - filterPullDown(pParse, pWInfo, iLevel, addrNxt, notReady); + + 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); } - 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); + /* 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); + } } - 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); - /* 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). - */ + /* Top of the loop body */ + if (pLevel->p2 == 0) 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; + /* 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; j < pPk->nKeyCol; 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); } - nConstraint++; - } - sqlite3DbFree(db, zStartAff); - sqlite3DbFree(db, zEndAff); - /* Top of the loop body */ - if( pLevel->p2==0 ) pLevel->p2 = sqlite3VdbeCurrentAddr(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); + } - /* 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); + /* 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; } - 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); + 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 - /* 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. +#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. ** - ** 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); + 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; } - 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; + /* 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); } - 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); + regRowid = ++pParse->nMem; } - 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); - } - } + iRetInit = sqlite3VdbeAddOp2(v, OP_Integer, 0, regReturn); - /* 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 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; iTerm < pWC->nTerm; 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 ){ - 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); - } + 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); + } + } - /* 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); + /* 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; ii < pOrWc->nTerm; 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); - } - if( iSet>=0 ){ - sqlite3VdbeAddOp3(v, OP_MakeRecord, r, nPk, regRowid); - sqlite3VdbeAddOp4Int(v, OP_IdxInsert, regRowset, regRowid, - r, nPk); - if( iSet ) sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); - } + } 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; iPk < nPk; iPk++) { + int iCol = pPk->aiColumn[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); + /* Release the array of temp registers */ + sqlite3ReleaseTempRange(pParse, r, nPk); + } } - } - /* Invoke the main loop body as a subroutine */ - sqlite3VdbeAddOp2(v, OP_Gosub, regReturn, iLoopBody); + /* 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); + /* 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; + /* 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 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; + } - if( pWInfo->nLevel>1 ){ sqlite3StackFree(db, pOrTab); } - if( !untestedTerms ) disableTerm(pLevel, pTerm); - }else + /* 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; + { + /* 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); @@ -151858,48 +149824,48 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** 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; + 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 ); + 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) ){ + 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) ){ + } else if ((pTabItem->fg.jointype & JT_LEFT) == JT_LEFT && !ExprHasProperty(pE, EP_OuterON)) { continue; - }else{ + } else { Bitmask m = sqlite3WhereGetMask(&pWInfo->sMaskSet, pE->w.iJoin); - if( m & pLevel->notReady ){ + if (m & pLevel->notReady) { /* An ON clause that is not ripe */ continue; } } } - if( iLoop==1 && !sqlite3ExprCoveredByIndex(pE, pLevel->iTabCur, pIdx) ){ + if (iLoop == 1 && !sqlite3ExprCoveredByIndex(pE, pLevel->iTabCur, pIdx)) { iNext = 2; continue; } - if( iLoop<3 && (pTerm->wtFlags & TERM_VARSELECT) ){ - if( iNext==0 ) iNext = 3; + if (iLoop < 3 && (pTerm->wtFlags & TERM_VARSELECT)) { + if (iNext == 0) + iNext = 3; continue; } - if( (pTerm->wtFlags & TERM_LIKECOND)!=0 ){ + 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 @@ -151909,29 +149875,29 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( 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); + 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) { + VdbeNoopComment((v, "WhereTerm[%d] (%p) priority=%d", pWC->nTerm - j, pTerm, iLoop)); } - if( sqlite3WhereTrace & 0x800 ){ + if (sqlite3WhereTrace & 0x800) { sqlite3DebugPrintf("Coding auxiliary constraint:\n"); - sqlite3WhereTermPrint(pTerm, pWC->nTerm-j); + sqlite3WhereTermPrint(pTerm, pWC->nTerm - j); } #endif sqlite3ExprIfFalse(pParse, pE, addrCont, SQLITE_JUMPIFNULL); - if( skipLikeAddr ) sqlite3VdbeJumpHere(v, skipLikeAddr); + if (skipLikeAddr) + sqlite3VdbeJumpHere(v, skipLikeAddr); pTerm->wtFlags |= TERM_CODED; } iLoop = iNext; - }while( iLoop>0 ); + } while (iLoop > 0); /* Insert code to test for implied constraints based on transitivity ** of the "==" operator. @@ -151941,37 +149907,40 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** 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++){ + 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; + 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 ){ + 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) - ){ + 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 ); + 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; @@ -151982,12 +149951,12 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( /* For a RIGHT OUTER JOIN, record the fact that the current row has ** been matched at least once. */ - if( pLevel->pRJ ){ - Table *pTab; + if (pLevel->pRJ) { + Table* pTab; int nPk; int r; int jmp1 = 0; - WhereRightJoin *pRJ = pLevel->pRJ; + 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 @@ -151995,54 +149964,54 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** both the iMatch index and the regBloom Bloom filter. */ pTab = pWInfo->pTabList->a[pLevel->iFrom].pTab; - if( HasRowid(pTab) ){ + if (HasRowid(pTab)) { r = sqlite3GetTempRange(pParse, 2); - sqlite3ExprCodeGetColumnOfTable(v, pTab, pLevel->iTabCur, -1, r+1); + sqlite3ExprCodeGetColumnOfTable(v, pTab, pLevel->iTabCur, -1, r + 1); nPk = 1; - }else{ + } else { int iPk; - Index *pPk = sqlite3PrimaryKeyIndex(pTab); + 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); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, iCol, r + 1 + iPk); } } - jmp1 = sqlite3VdbeAddOp4Int(v, OP_Found, pRJ->iMatch, 0, r+1, nPk); + 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); + 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); + 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 ){ + if (pLevel->iLeftJoin) { pLevel->addrFirst = sqlite3VdbeCurrentAddr(v); sqlite3VdbeAddOp2(v, OP_Integer, 1, pLevel->iLeftJoin); VdbeComment((v, "record LEFT JOIN hit")); - if( pLevel->pRJ==0 ){ + if (pLevel->pRJ == 0) { goto code_outer_join_constraints; /* WHERE clause constraints */ } } - if( pLevel->pRJ ){ + 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; + WhereRightJoin* pRJ = pLevel->pRJ; sqlite3VdbeAddOp2(v, OP_BeginSubrtn, 0, pRJ->regReturn); pRJ->addrSubrtn = sqlite3VdbeCurrentAddr(v); - assert( pParse->withinRJSubrtn < 255 ); + assert(pParse->withinRJSubrtn < 255); pParse->withinRJSubrtn++; /* WHERE clause constraints must be deferred until after outer join @@ -152051,30 +150020,30 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** 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 ); + for (pTerm = pWC->a, j = 0; j < pWC->nBase; 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 ); + 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); + 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); + if (sqlite3WhereTrace & 0x800) { + sqlite3DebugPrintf("End Coding level %d: notReady=%llx\n", iLevel, (u64)pLevel->notReady); } #endif return pLevel->notReady; @@ -152084,76 +150053,69 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** 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]; +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; kaddrSubrtn, pRJ->endSubrtn, pRJ->regReturn); + for (k = 0; k < iLevel; k++) { int iIdxCur; mAll |= pWInfo->a[k].pWLoop->maskSelf; sqlite3VdbeAddOp1(v, OP_NullRow, pWInfo->a[k].iTabCur); iIdxCur = pWInfo->a[k].iIdxCur; - if( iIdxCur ){ + if (iIdxCur) { sqlite3VdbeAddOp1(v, OP_NullRow, iIdxCur); } } - if( (pTabItem->fg.jointype & JT_LTORJ)==0 ){ + 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 - ){ + for (k = 0; k < pWC->nTerm; 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)); + 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 ); + assert(pParse->withinRJSubrtn < 100); pParse->withinRJSubrtn++; - pSubWInfo = sqlite3WhereBegin(pParse, &sFrom, pSubWhere, 0, 0, 0, - WHERE_RIGHT_JOIN, 0); - if( pSubWInfo ){ + 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) ){ + Table* pTab = pTabItem->pTab; + if (HasRowid(pTab)) { sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, -1, r); nPk = 1; - }else{ + } else { int iPk; - Index *pPk = sqlite3PrimaryKeyIndex(pTab); + Index* pPk = sqlite3PrimaryKeyIndex(pTab); nPk = pPk->nKeyCol; pParse->nMem += nPk - 1; - for(iPk=0; iPkaiColumn[iPk]; - sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, iCol,r+iPk); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, iCol, r + iPk); } } jmp = sqlite3VdbeAddOp4Int(v, OP_Filter, pRJ->regBloom, 0, r, nPk); @@ -152166,7 +150128,7 @@ SQLITE_PRIVATE SQLITE_NOINLINE void sqlite3WhereRightJoinLoop( } sqlite3ExprDelete(pParse->db, pSubWhere); ExplainQueryPlanPop(pParse); - assert( pParse->withinRJSubrtn>0 ); + assert(pParse->withinRJSubrtn > 0); pParse->withinRJSubrtn--; } @@ -152199,7 +150161,7 @@ static void exprAnalyze(SrcList*, WhereClause*, int); /* ** Deallocate all memory associated with a WhereOrInfo object. */ -static void whereOrInfoDelete(sqlite3 *db, WhereOrInfo *p){ +static void whereOrInfoDelete(sqlite3* db, WhereOrInfo* p) { sqlite3WhereClauseClear(&p->wc); sqlite3DbFree(db, p); } @@ -152207,7 +150169,7 @@ static void whereOrInfoDelete(sqlite3 *db, WhereOrInfo *p){ /* ** Deallocate all memory associated with a WhereAndInfo object. */ -static void whereAndInfoDelete(sqlite3 *db, WhereAndInfo *p){ +static void whereAndInfoDelete(sqlite3* db, WhereAndInfo* p) { sqlite3WhereClauseClear(&p->wc); sqlite3DbFree(db, p); } @@ -152231,37 +150193,37 @@ static void whereAndInfoDelete(sqlite3 *db, WhereAndInfo *p){ ** 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; +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 ){ + 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; + 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) ){ + if ((wtFlags & TERM_VIRTUAL) == 0) + pWC->nBase = pWC->nTerm; + if (p && ExprHasProperty(p, EP_Unlikely)) { pTerm->truthProb = sqlite3LogEst(p->iTable) - 270; - }else{ + } 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)); + memset(&pTerm->eOperator, 0, sizeof(WhereTerm) - offsetof(WhereTerm, eOperator)); return idx; } @@ -152270,34 +150232,32 @@ static int whereClauseInsert(WhereClause *pWC, Expr *p, u16 wtFlags){ ** 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; +static int allowedOp(int op) { + assert(TK_GT > TK_EQ && TK_GT < TK_GE); + assert(TK_LT > TK_EQ && TK_LT < TK_GE); + assert(TK_LE > TK_EQ && TK_LE < TK_GE); + assert(TK_GE == TK_EQ + 4); + return op == TK_IN || (op >= 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) - ){ +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; + 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_GT < TK_LE); + assert(pExpr->op >= TK_GT && pExpr->op <= TK_GE); + pExpr->op = ((pExpr->op - TK_GT) ^ 2) + TK_GT; } return 0; } @@ -152305,31 +150265,30 @@ static u16 exprCommute(Parse *pParse, Expr *pExpr){ /* ** Translate from TK_xx operator to WO_xx bitmask. */ -static u16 operatorMask(int op){ +static u16 operatorMask(int op) { u16 c; - assert( allowedOp(op) ); - if( op==TK_IN ){ + assert(allowedOp(op)); + if (op == TK_IN) { c = WO_IN; - }else if( op==TK_ISNULL ){ + } else if (op == TK_ISNULL) { c = WO_ISNULL; - }else if( op==TK_IS ){ + } 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 ); + } 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 @@ -152343,56 +150302,57 @@ static u16 operatorMask(int op){ ** 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) ){ +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; + if (*pnoCase) + return 0; #endif - assert( ExprUseXList(pExpr) ); + 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; + 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 ){ + 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; + 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 ){ + 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] ){ + while ((c = z[cnt]) != 0 && c != wc[0] && c != wc[1] && c != wc[2]) { cnt++; - if( c==wc[3] && z[cnt]!=0 ) cnt++; + if (c == wc[3] && z[cnt] != 0) + cnt++; } /* The optimization is possible only if (1) the pattern does not begin @@ -152403,26 +150363,27 @@ static int isLikeOrGlob( ** 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; + 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; + *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 ){ + if (pPrefix) { int iFrom, iTo; - char *zNew; - assert( !ExprHasProperty(pPrefix, EP_IntValue) ); + char* zNew; + assert(!ExprHasProperty(pPrefix, EP_IntValue)); zNew = pPrefix->u.zToken; zNew[cnt] = 0; - for(iFrom=iTo=0; iFrom0 ); + assert(iTo > 0); /* If the LHS is not an ordinary column with TEXT affinity, then the ** pattern prefix boundaries (both the start and end boundaries) must @@ -152437,25 +150398,22 @@ static int isLikeOrGlob( ** 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 */ - ){ + 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]=='-' ){ + if (isNum <= 0) { + if (iTo == 1 && zNew[0] == '-') { isNum = +1; - }else{ - zNew[iTo-1]++; + } else { + zNew[iTo - 1]++; isNum = sqlite3AtoF(zNew, &rDummy, iTo, SQLITE_UTF8); - zNew[iTo-1]--; + zNew[iTo - 1]--; } } - if( isNum>0 ){ + if (isNum > 0) { sqlite3ExprDelete(db, pPrefix); sqlite3ValueFree(pVal); return 0; @@ -152466,11 +150424,11 @@ static int isLikeOrGlob( /* 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; + if (op == TK_VARIABLE) { + Vdbe* v = pParse->pVdbe; sqlite3VdbeSetVarmask(v, pRight->iColumn); - assert( !ExprHasProperty(pRight, EP_IntValue) ); - if( *pisComplete && pRight->u.zToken[1] ){ + 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. @@ -152479,22 +150437,21 @@ static int isLikeOrGlob( */ int r1 = sqlite3GetTempReg(pParse); sqlite3ExprCodeTarget(pParse, pRight, r1); - sqlite3VdbeChangeP3(v, sqlite3VdbeCurrentAddr(v)-1, 0); + sqlite3VdbeChangeP3(v, sqlite3VdbeCurrentAddr(v) - 1, 0); sqlite3ReleaseTempReg(pParse, r1); } } - }else{ + } else { z = 0; } } - rc = (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 @@ -152522,30 +150479,27 @@ static int isLikeOrGlob( ** ** 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 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; + 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 */ + } 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) ); + assert(ExprUseXList(pExpr)); pList = pExpr->x.pList; - if( pList==0 || pList->nExpr!=2 ){ + if (pList == 0 || pList->nExpr != 2) { return 0; } @@ -152557,12 +150511,12 @@ static int isAuxiliaryVtabOperator( ** 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 ){ + assert(pCol->op != TK_COLUMN || ExprUseYTab(pCol)); + testcase(pCol->op == TK_COLUMN && pCol->y.pTab == 0); + if (ExprIsVtab(pCol)) { + for (i = 0; i < ArraySize(aOp); i++) { + assert(!ExprHasProperty(pExpr, EP_IntValue)); + if (sqlite3StrICmp(pExpr->u.zToken, aOp[i].zOp) == 0) { *peOp2 = aOp[i].eOp2; *ppRight = pList->a[0].pExpr; *ppLeft = pCol; @@ -152582,21 +150536,21 @@ static int isAuxiliaryVtabOperator( ** 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; + 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 ){ + 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; @@ -152604,26 +150558,29 @@ static int isAuxiliaryVtabOperator( } } } - }else if( pExpr->op==TK_NE || pExpr->op==TK_ISNOT || pExpr->op==TK_NOTNULL ){ + } 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) ){ + 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) ){ + 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; + 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; @@ -152634,9 +150591,9 @@ static int isAuxiliaryVtabOperator( ** 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); +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; } } @@ -152644,7 +150601,7 @@ static void transferJoinMarkings(Expr *pDerived, Expr *pBase){ /* ** Mark term iChild as being a child of term iParent */ -static void markTermAsChild(WhereClause *pWC, int iChild, int 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++; @@ -152655,11 +150612,11 @@ static void markTermAsChild(WhereClause *pWC, int iChild, int iParent){ ** 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; +static WhereTerm* whereNthSubterm(WhereTerm* pTerm, int N) { + if (pTerm->eOperator != WO_AND) { + return N == 0 ? pTerm : 0; } - if( Nu.pAndInfo->wc.nTerm ){ + if (N < pTerm->u.pAndInfo->wc.nTerm) { return &pTerm->u.pAndInfo->wc.a[N]; } return 0; @@ -152685,42 +150642,49 @@ static WhereTerm *whereNthSubterm(WhereTerm *pTerm, int N){ ** ** 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 */ -){ +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; + 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) ){ + if ((eOp & (eOp - 1)) != 0) { + if (eOp & (WO_LT | WO_LE)) { eOp = WO_LE; - }else{ - assert( eOp & (WO_GT|WO_GE) ); + } 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); + idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL | TERM_DYNAMIC); exprAnalyze(pSrc, pWC, idxNew); } @@ -152812,55 +150776,56 @@ static void whereCombineDisjuncts( ** 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 */ +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 ); + 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; + 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 ); + 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 ); + 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; + if (pAndInfo) { + WhereClause* pAndWC; + WhereTerm* pAndTerm; int j; Bitmask b = 0; pOrTerm->u.pAndInfo = pAndInfo; @@ -152873,32 +150838,30 @@ static void exprAnalyzeOrTerm( 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 - ){ + if (!db->mallocFailed) { + for (j = 0, pAndTerm = pAndWC->a; j < pAndWC->nTerm; 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 ){ + } else if (pOrTerm->wtFlags & TERM_COPIED) { /* Skip this term for now. We revisit it when we process the ** corresponding TERM_VIRTUAL term */ - }else{ + } else { Bitmask b; b = sqlite3WhereGetMask(&pWInfo->sMaskSet, pOrTerm->leftCursor); - if( pOrTerm->wtFlags & TERM_VIRTUAL ){ - WhereTerm *pOther = &pOrWc->a[pOrTerm->iParent]; + 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 ){ + if ((pOrTerm->eOperator & WO_EQ) == 0) { chngToIN = 0; - }else{ + } else { chngToIN &= b; } } @@ -152911,19 +150874,19 @@ static void exprAnalyzeOrTerm( pOrInfo->indexable = indexable; pTerm->eOperator = WO_OR; pTerm->leftCursor = -1; - if( indexable ){ + if (indexable) { pWC->hasOr = 1; } /* For a two-way OR, attempt to implementation case 2. - */ - if( indexable && pOrWc->nTerm==2 ){ + */ + if (indexable && pOrWc->nTerm == 2) { int iOne = 0; - WhereTerm *pOne; - while( (pOne = whereNthSubterm(&pOrWc->a[0],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 ){ + WhereTerm* pTwo; + while ((pTwo = whereNthSubterm(&pOrWc->a[1], iTwo++)) != 0) { whereCombineDisjuncts(pSrc, pWC, pOne, pTwo); } } @@ -152950,11 +150913,11 @@ static void exprAnalyzeOrTerm( ** 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 */ + 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 @@ -152962,58 +150925,56 @@ static void exprAnalyzeOrTerm( ** 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; + 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 ); + for (i = pOrWc->nTerm - 1; i >= 0; i--, pOrTerm++) { + assert(pOrTerm->eOperator & WO_EQ); pOrTerm->wtFlags &= ~TERM_OK; - if( pOrTerm->leftCursor==iCursor ){ + 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 ); + assert(j == 1); continue; } - if( (chngToIN & sqlite3WhereGetMask(&pWInfo->sMaskSet, - pOrTerm->leftCursor))==0 ){ + 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) ); + 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 ); + assert((pOrTerm->eOperator & (WO_OR | WO_AND)) == 0); iColumn = pOrTerm->u.x.leftColumn; iCursor = pOrTerm->leftCursor; pLeft = pOrTerm->pExpr->pLeft; break; } - if( i<0 ){ + 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) ); + assert(j == 1); + assert(IsPowerOfTwo(chngToIN)); + assert(chngToIN == sqlite3WhereGetMask(&pWInfo->sMaskSet, iCursor)); break; } - testcase( j==1 ); + 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 ){ + 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) - )){ + } else if (pOrTerm->u.x.leftColumn != iColumn || + (iColumn == XN_EXPR && sqlite3ExprCompare(pParse, pOrTerm->pExpr->pLeft, pLeft, -1))) { okToChngToIN = 0; - }else{ + } 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 @@ -153021,9 +150982,9 @@ static void exprAnalyzeOrTerm( */ affRight = sqlite3ExprAffinity(pOrTerm->pExpr->pRight); affLeft = sqlite3ExprAffinity(pOrTerm->pExpr->pLeft); - if( affRight!=0 && affRight!=affLeft ){ + if (affRight != 0 && affRight != affLeft) { okToChngToIN = 0; - }else{ + } else { pOrTerm->wtFlags |= TERM_OK; } } @@ -153034,36 +150995,37 @@ static void exprAnalyzeOrTerm( ** 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 ); + 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 ); + assert(pLeft != 0); pDup = sqlite3ExprDup(db, pLeft, 0); pNew = sqlite3PExpr(pParse, TK_IN, pDup, 0); - if( pNew ){ + if (pNew) { int idxNew; transferJoinMarkings(pNew, pExpr); - assert( ExprUseXList(pNew) ); + assert(ExprUseXList(pNew)); pNew->x.pList = pList; - idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC); - testcase( idxNew==0 ); + 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{ + } else { sqlite3ExprListDelete(db, pList); } } @@ -153086,21 +151048,23 @@ static void exprAnalyzeOrTerm( ** 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){ +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; + 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)) - ){ + if (aff1 != aff2 && (!sqlite3IsNumericAffinity(aff1) || !sqlite3IsNumericAffinity(aff2))) { return 0; } pColl = sqlite3ExprCompareCollSeq(pParse, pExpr); - if( sqlite3IsBinary(pColl) ) return 1; + if (sqlite3IsBinary(pColl)) + return 1; return sqlite3ExprCollSeqMatch(pParse, pExpr->pLeft, pExpr->pRight); } @@ -153109,23 +151073,23 @@ static int termIsEquivalence(Parse *pParse, Expr *pExpr){ ** a bitmask indicating which tables are used in that expression ** tree. */ -static Bitmask exprSelectUsage(WhereMaskSet *pMaskSet, Select *pS){ +static Bitmask exprSelectUsage(WhereMaskSet* pMaskSet, Select* pS) { Bitmask mask = 0; - while( pS ){ - SrcList *pSrc = pS->pSrc; + 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) ){ + if (ALWAYS(pSrc != 0)) { int i; - for(i=0; inSrc; i++){ + for (i = 0; i < pSrc->nSrc; i++) { mask |= exprSelectUsage(pMaskSet, pSrc->a[i].pSelect); - if( pSrc->a[i].fg.isUsing==0 ){ + if (pSrc->a[i].fg.isUsing == 0) { mask |= sqlite3WhereExprUsage(pMaskSet, pSrc->a[i].u3.pOn); } - if( pSrc->a[i].fg.isTabFunc ){ + if (pSrc->a[i].fg.isTabFunc) { mask |= sqlite3WhereExprListUsage(pMaskSet, pSrc->a[i].u1.pFuncArg); } } @@ -153148,22 +151112,24 @@ static Bitmask exprSelectUsage(WhereMaskSet *pMaskSet, Select *pS){ ** 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; +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){} + 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 ){ + for (pIdx = pFrom->a[i].pTab->pIndex; pIdx; pIdx = pIdx->pNext) { + if (pIdx->aColExpr == 0) + continue; + for (i = 0; i < pIdx->nKeyCol; 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; @@ -153172,36 +151138,35 @@ static SQLITE_NOINLINE int exprMightBeIndexed2( } 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 */ -){ +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) ); + assert(TK_GT + 1 == TK_LE && TK_GT + 2 == TK_LT && TK_GT + 3 == TK_GE); + assert(TK_IS < TK_GE && TK_ISNULL < TK_GE && TK_IN < TK_GE); + assert(op <= TK_GE); + if (pExpr->op == TK_VECTOR && (op >= TK_GT && ALWAYS(op <= TK_GE))) { + assert(ExprUseXList(pExpr)); pExpr = pExpr->x.pList->a[0].pExpr; - } - if( pExpr->op==TK_COLUMN ){ + 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); + 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 @@ -153220,87 +151185,85 @@ static int exprMightBeIndexed( ** 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 */ +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 */ + 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 */ + 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 ){ + if (db->mallocFailed) { return; } - assert( pWC->nTerm > idxTerm ); + 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 ); + 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) ){ + if (op == TK_IN) { + assert(pExpr->pRight == 0); + if (sqlite3ExprCheckIN(pParse, pExpr)) + return; + if (ExprUseXSelect(pExpr)) { pTerm->prereqRight = exprSelectUsage(pMaskSet, pExpr->x.pSelect); - }else{ + } else { pTerm->prereqRight = sqlite3WhereExprListUsage(pMaskSet, pExpr->x.pList); } prereqAll = prereqLeft | pTerm->prereqRight; - }else{ + } else { pTerm->prereqRight = sqlite3WhereExprUsage(pMaskSet, pExpr->pRight); - if( pExpr->pLeft==0 - || ExprHasProperty(pExpr, EP_xIsSelect|EP_IfNullRow) - || pExpr->x.pList!=0 - ){ + if (pExpr->pLeft == 0 || ExprHasProperty(pExpr, EP_xIsSelect | EP_IfNullRow) || pExpr->x.pList != 0) { prereqAll = sqlite3WhereExprUsageNN(pMaskSet, pExpr); - }else{ + } else { prereqAll = prereqLeft | pTerm->prereqRight; } } - if( pMaskSet->bVarSelect ) pTerm->wtFlags |= TERM_VARSELECT; + if (pMaskSet->bVarSelect) + pTerm->wtFlags |= TERM_VARSELECT; #ifdef SQLITE_DEBUG - if( prereqAll!=sqlite3WhereExprUsageNN(pMaskSet, pExpr) ){ + if (prereqAll != sqlite3WhereExprUsageNN(pMaskSet, pExpr)) { printf("\n*** Incorrect prereqAll computed for:\n"); - sqlite3TreeViewExpr(0,pExpr,0); - assert( 0 ); + sqlite3TreeViewExpr(0, pExpr, 0); + assert(0); } #endif - if( ExprHasProperty(pExpr, EP_OuterON|EP_InnerON) ){ + if (ExprHasProperty(pExpr, EP_OuterON | EP_InnerON)) { Bitmask x = sqlite3WhereGetMask(pMaskSet, pExpr->w.iJoin); - if( ExprHasProperty(pExpr, EP_OuterON) ){ + 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 ){ + 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 ){ + } 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 ){ + if (ALWAYS(pSrc->nSrc > 0) && (pSrc->a[0].fg.jointype & JT_LTORJ) != 0) { sqlite3ErrorMsg(pParse, "ON clause references tables to its right"); return; } @@ -153311,71 +151274,67 @@ static void exprAnalyze( pTerm->leftCursor = -1; pTerm->iParent = -1; pTerm->eOperator = 0; - if( allowedOp(op) ){ + 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; + 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 (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) ){ + if (exprMightBeIndexed(pSrc, prereqLeft, aiCurCol, pLeft, op)) { pTerm->leftCursor = aiCurCol[0]; - assert( (pTerm->eOperator & (WO_OR|WO_AND))==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 ){ + 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 ){ + if (db->mallocFailed) { sqlite3ExprDelete(db, pDup); return; } - idxNew = whereClauseInsert(pWC, pDup, TERM_VIRTUAL|TERM_DYNAMIC); - if( idxNew==0 ) 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; + if (op == TK_IS) + pNew->wtFlags |= TERM_IS; pTerm = &pWC->a[idxTerm]; pTerm->wtFlags |= TERM_COPIED; - if( termIsEquivalence(pParse, pDup) ){ + if (termIsEquivalence(pParse, pDup)) { pTerm->eOperator |= WO_EQUIV; eExtraOp = WO_EQUIV; } - }else{ + } else { pDup = pExpr; pNew = pTerm; } pNew->wtFlags |= exprCommute(pParse, pDup); pNew->leftCursor = aiCurCol[0]; - assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); + assert((pTerm->eOperator & (WO_OR | WO_AND)) == 0); pNew->u.x.leftColumn = aiCurCol[1]; - testcase( (prereqLeft | extraRight) != prereqLeft ); + 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) ); + } 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); @@ -153400,23 +151359,21 @@ static void exprAnalyze( ** 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; + 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) ); + assert(ExprUseXList(pExpr)); pList = pExpr->x.pList; - assert( pList!=0 ); - assert( pList->nExpr==2 ); - for(i=0; i<2; i++){ - Expr *pNewExpr; + 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)); + 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 ); + idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL | TERM_DYNAMIC); + testcase(idxNew == 0); exprAnalyze(pSrc, pWC, idxNew); pTerm = &pWC->a[idxTerm]; markTermAsChild(pWC, idxNew, idxTerm); @@ -153428,8 +151385,8 @@ static void exprAnalyze( /* 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 ); + else if (pExpr->op == TK_OR) { + assert(pWC->op == TK_AND); exprAnalyzeOrTerm(pSrc, pWC, idxTerm); pTerm = &pWC->a[idxTerm]; } @@ -153440,23 +151397,17 @@ static void exprAnalyze( ** ** 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; + 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; + WhereTerm* pNewTerm; - pNewExpr = sqlite3PExpr(pParse, TK_GT, - sqlite3ExprDup(db, pLeft, 0), - sqlite3ExprAlloc(db, TK_NULL, 0, 0)); + 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 ){ + idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL | TERM_DYNAMIC | TERM_VNULL); + if (idxNew) { pNewTerm = &pWC->a[idxNew]; pNewTerm->prereqRight = 0; pNewTerm->leftCursor = pLeft->iTable; @@ -153470,7 +151421,6 @@ static void exprAnalyze( } } - #ifndef SQLITE_OMIT_LIKE_OPTIMIZATION /* Add constraints to reduce the search space on a LIKE or GLOB ** operator. @@ -153485,75 +151435,68 @@ static void exprAnalyze( ** 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; + 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 char* zCollSeqName; /* Name of collating sequence */ const u16 wtFlags = TERM_LIKEOPT | TERM_VIRTUAL | TERM_DYNAMIC; - assert( ExprUseXList(pExpr) ); + 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) ); - + 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 ){ + if (noCase && !pParse->db->mallocFailed) { int i; char c; pTerm->wtFlags |= TERM_LIKE; - for(i=0; (c = pStr1->u.zToken[i])!=0; i++){ + 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]; + 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 ){ + 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; + 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); + pNewExpr1 = sqlite3PExpr(pParse, TK_GE, sqlite3ExprAddCollateString(pParse, pNewExpr1, zCollSeqName), pStr1); transferJoinMarkings(pNewExpr1, pExpr); idxNew1 = whereClauseInsert(pWC, pNewExpr1, wtFlags); - testcase( idxNew1==0 ); + testcase(idxNew1 == 0); exprAnalyze(pSrc, pWC, idxNew1); pNewExpr2 = sqlite3ExprDup(db, pLeft, 0); - pNewExpr2 = sqlite3PExpr(pParse, TK_LT, - sqlite3ExprAddCollateString(pParse,pNewExpr2,zCollSeqName), - pStr2); + pNewExpr2 = sqlite3PExpr(pParse, TK_LT, sqlite3ExprAddCollateString(pParse, pNewExpr2, zCollSeqName), pStr2); transferJoinMarkings(pNewExpr2, pExpr); idxNew2 = whereClauseInsert(pWC, pNewExpr2, wtFlags); - testcase( idxNew2==0 ); + testcase(idxNew2 == 0); exprAnalyze(pSrc, pWC, idxNew2); pTerm = &pWC->a[idxTerm]; - if( isComplete ){ + if (isComplete) { markTermAsChild(pWC, idxNew1, idxTerm); markTermAsChild(pWC, idxNew2, idxTerm); } @@ -153570,27 +151513,23 @@ static void exprAnalyze( ** ** 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 - ){ + 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); + Expr* pNew; + Expr* pLeft = sqlite3ExprForVectorField(pParse, pExpr->pLeft, 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); + 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->wtFlags |= TERM_CODED | TERM_VIRTUAL; /* Disable the original */ pTerm->eOperator = WO_ROWVAL; } @@ -153603,21 +151542,17 @@ static void exprAnalyze( ** 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 + 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 + && pExpr->x.pSelect->pWin == 0 #endif - && pWC->op==TK_AND - ){ + && pWC->op == TK_AND) { int i; - for(i=0; ipLeft); i++){ + for (i = 0; i < sqlite3ExprVectorSize(pExpr->pLeft); i++) { int idxNew; - idxNew = whereClauseInsert(pWC, pExpr, TERM_VIRTUAL|TERM_SLICE); - pWC->a[idxNew].u.x.iField = i+1; + idxNew = whereClauseInsert(pWC, pExpr, TERM_VIRTUAL | TERM_SLICE); + pWC->a[idxNew].u.x.iField = i + 1; exprAnalyze(pSrc, pWC, idxNew); markTermAsChild(pWC, idxNew, idxTerm); } @@ -153633,26 +151568,25 @@ static void exprAnalyze( ** virtual tables. The native query optimizer does not attempt ** to do anything with MATCH functions. */ - else if( pWC->op==TK_AND ){ + else if (pWC->op == TK_AND) { Expr *pRight = 0, *pLeft = 0; int res = isAuxiliaryVtabOperator(db, pExpr, &eOp2, &pLeft, &pRight); - while( res-- > 0 ){ + while (res-- > 0) { int idxNew; - WhereTerm *pNewTerm; + 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 ){ + 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 ); + idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL | TERM_DYNAMIC); + testcase(idxNew == 0); pNewTerm = &pWC->a[idxNew]; pNewTerm->prereqRight = prereqExpr; pNewTerm->leftCursor = pLeft->iTable; @@ -153672,7 +151606,7 @@ static void exprAnalyze( /* 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] ); + testcase(pTerm != &pWC->a[idxTerm]); pTerm = &pWC->a[idxTerm]; pTerm->prereqRight |= extraRight; } @@ -153699,14 +151633,15 @@ static void exprAnalyze( ** 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); +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 ){ + assert(pE2 != 0 || pExpr == 0); + if (pE2 == 0) + return; + if (pE2->op != op) { whereClauseInsert(pWC, pExpr, 0); - }else{ + } else { sqlite3WhereSplit(pWC, pE2->pLeft, op); sqlite3WhereSplit(pWC, pE2->pRight, op); } @@ -153723,34 +151658,35 @@ SQLITE_PRIVATE void sqlite3WhereSplit(WhereClause *pWC, Expr *pExpr, u8 op){ ** 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; +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; + 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; + } 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; + if (pNew) { + WhereTerm* pTerm; int idx; - idx = whereClauseInsert(pWC, pNew, TERM_DYNAMIC|TERM_VIRTUAL); + idx = whereClauseInsert(pWC, pNew, TERM_DYNAMIC | TERM_VIRTUAL); pTerm = &pWC->a[idx]; pTerm->leftCursor = iCsr; pTerm->eOperator = WO_AUX; @@ -153776,45 +151712,47 @@ static void whereAddLimitExpr( ** 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; +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 ){ + for (ii = 0; ii < pWC->nTerm; 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 ); + assert(pWC->a[ii].wtFlags & TERM_VIRTUAL); + assert(pWC->a[ii].eOperator == WO_ROWVAL); continue; } - if( pWC->a[ii].leftCursor!=iCsr ) return; + 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; + if (pOrderBy) { + for (ii = 0; ii < pOrderBy->nExpr; 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); + 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); } } } @@ -153822,10 +151760,9 @@ SQLITE_PRIVATE void sqlite3WhereAddLimit(WhereClause *pWC, Select *p){ /* ** Initialize a preallocated WhereClause structure. */ -SQLITE_PRIVATE void sqlite3WhereClauseInit( - WhereClause *pWC, /* The WhereClause to be initialized */ - WhereInfo *pWInfo /* The WHERE processing context */ -){ +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; @@ -153840,40 +151777,40 @@ SQLITE_PRIVATE void sqlite3WhereClauseInit( ** 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]; +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 ); + for (i = pWC->nBase; i < pWC->nTerm; 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 ){ + 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 ); + 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 ); + } else { + assert((a->wtFlags & TERM_ANDINFO) != 0); whereAndInfoDelete(db, a->u.pAndInfo); } } - if( a==aLast ) break; + if (a == aLast) + break; a++; } } } - /* ** These routines walk (recursively) an expression tree and generate ** a bitmask indicating which tables are used in that expression @@ -153905,25 +151842,24 @@ SQLITE_PRIVATE void sqlite3WhereClauseClear(WhereClause *pWC){ ** "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 -){ +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 = (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; + 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 ){ + } 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 ); + 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); @@ -153931,30 +151867,29 @@ static SQLITE_NOINLINE Bitmask sqlite3WhereExprUsageFull( #endif return mask; } -SQLITE_PRIVATE Bitmask sqlite3WhereExprUsageNN(WhereMaskSet *pMaskSet, Expr *p){ - if( p->op==TK_COLUMN && !ExprHasProperty(p, EP_FixedCol) ){ +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 ); + } 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 sqlite3WhereExprUsage(WhereMaskSet* pMaskSet, Expr* p) { + return p ? sqlite3WhereExprUsageNN(pMaskSet, p) : 0; } -SQLITE_PRIVATE Bitmask sqlite3WhereExprListUsage(WhereMaskSet *pMaskSet, ExprList *pList){ +SQLITE_PRIVATE Bitmask sqlite3WhereExprListUsage(WhereMaskSet* pMaskSet, ExprList* pList) { int i; Bitmask mask = 0; - if( pList ){ - for(i=0; inExpr; i++){ + if (pList) { + for (i = 0; i < pList->nExpr; i++) { mask |= sqlite3WhereExprUsage(pMaskSet, pList->a[i].pExpr); } } return mask; } - /* ** Call exprAnalyze on all terms in a WHERE clause. ** @@ -153963,12 +151898,11 @@ SQLITE_PRIVATE Bitmask sqlite3WhereExprListUsage(WhereMaskSet *pMaskSet, ExprLis ** 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 */ -){ +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--){ + for (i = pWC->nTerm - 1; i >= 0; i--) { exprAnalyze(pTabList, pWC, i); } } @@ -153980,43 +151914,45 @@ SQLITE_PRIVATE void sqlite3WhereExprAnalyze( ** 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; +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; + ExprList* pArgs; + Expr* pColRef; + Expr* pTerm; + if (pItem->fg.isTabFunc == 0) + return; pTab = pItem->pTab; - assert( pTab!=0 ); + assert(pTab != 0); pArgs = pItem->u1.pFuncArg; - if( pArgs==0 ) return; - for(j=k=0; jnExpr; j++){ - Expr *pRhs; + if (pArgs == 0) + return; + for (j = k = 0; j < pArgs->nExpr; 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); + while (k < pTab->nCol && (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; + if (pColRef == 0) + return; pColRef->iTable = pItem->iCursor; pColRef->iColumn = k++; - assert( ExprUseYTab(pColRef) ); + 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); + 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) ){ + if (pItem->fg.jointype & (JT_LEFT | JT_LTORJ)) { joinType = EP_OuterON; - }else{ + } else { joinType = EP_InnerON; } sqlite3SetJoinExpr(pTerm, pItem->iCursor, joinType); @@ -154058,14 +151994,14 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs( */ 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 */ + 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 */ @@ -154074,7 +152010,7 @@ static int whereLoopResize(sqlite3*, WhereLoop*, int); /* ** Return the estimated number of output rows from a WHERE clause */ -SQLITE_PRIVATE LogEst sqlite3WhereOutputRowCount(WhereInfo *pWInfo){ +SQLITE_PRIVATE LogEst sqlite3WhereOutputRowCount(WhereInfo* pWInfo) { return pWInfo->nRowOut; } @@ -154082,7 +152018,7 @@ SQLITE_PRIVATE LogEst sqlite3WhereOutputRowCount(WhereInfo *pWInfo){ ** 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){ +SQLITE_PRIVATE int sqlite3WhereIsDistinct(WhereInfo* pWInfo) { return pWInfo->eDistinct; } @@ -154094,7 +152030,7 @@ SQLITE_PRIVATE int sqlite3WhereIsDistinct(WhereInfo *pWInfo){ ** is positive but less than the number of ORDER BY terms means that ** block sorting is required. */ -SQLITE_PRIVATE int sqlite3WhereIsOrdered(WhereInfo *pWInfo){ +SQLITE_PRIVATE int sqlite3WhereIsOrdered(WhereInfo* pWInfo) { return pWInfo->nOBSat; } @@ -154121,15 +152057,15 @@ SQLITE_PRIVATE int sqlite3WhereIsOrdered(WhereInfo *pWInfo){ ** 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 ){ +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 ); + pInner = &pWInfo->a[pWInfo->nLevel - 1]; + assert(pInner->addrNxt != 0); return pInner->pRJ ? pWInfo->iContinue : pInner->addrNxt; } @@ -154144,14 +152080,16 @@ SQLITE_PRIVATE int sqlite3WhereOrderByLimitOptLabel(WhereInfo *pWInfo){ ** 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; +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--){ + 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 ){ + if ((pInner->pWLoop->wsFlags & WHERE_COLUMN_IN) != 0) { sqlite3VdbeGoto(v, pInner->addrNxt); return; } @@ -154163,8 +152101,8 @@ SQLITE_PRIVATE void sqlite3WhereMinMaxOptEarlyOut(Vdbe *v, WhereInfo *pWInfo){ ** 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 ); +SQLITE_PRIVATE int sqlite3WhereContinueLabel(WhereInfo* pWInfo) { + assert(pWInfo->iContinue != 0); return pWInfo->iContinue; } @@ -154172,7 +152110,7 @@ SQLITE_PRIVATE int sqlite3WhereContinueLabel(WhereInfo *pWInfo){ ** Return the VDBE address or label to jump to in order to break ** out of a WHERE loop. */ -SQLITE_PRIVATE int sqlite3WhereBreakLabel(WhereInfo *pWInfo){ +SQLITE_PRIVATE int sqlite3WhereBreakLabel(WhereInfo* pWInfo) { return pWInfo->iBreak; } @@ -154193,13 +152131,11 @@ SQLITE_PRIVATE int sqlite3WhereBreakLabel(WhereInfo *pWInfo){ ** 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); +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]); + 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; @@ -154209,16 +152145,16 @@ SQLITE_PRIVATE int sqlite3WhereOkOnePass(WhereInfo *pWInfo, int *aiCur){ ** 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){ +SQLITE_PRIVATE int sqlite3WhereUsesDeferredSeek(WhereInfo* pWInfo) { return pWInfo->bDeferredSeek; } /* ** Move the content of pSrc into pDest */ -static void whereOrMove(WhereOrSet *pDest, WhereOrSet *pSrc){ +static void whereOrMove(WhereOrSet* pDest, WhereOrSet* pSrc) { pDest->n = pSrc->n; - memcpy(pDest->a, pSrc->a, pDest->n*sizeof(pDest->a[0])); + memcpy(pDest->a, pSrc->a, pDest->n * sizeof(pDest->a[0])); } /* @@ -154228,36 +152164,38 @@ static void whereOrMove(WhereOrSet *pDest, WhereOrSet *pSrc){ ** 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 */ -){ +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 ){ + 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 ){ + if (p->rRun <= rRun && (p->prereq & prereq) == p->prereq) { return 0; } } - if( pSet->nn < N_OR_COST) { p = &pSet->a[pSet->n++]; p->nOut = nOut; - }else{ + } else { p = pSet->a; - for(i=1; in; i++){ - if( p->rRun>pSet->a[i].rRun ) p = pSet->a + i; + for (i = 1; i < pSet->n; i++) { + if (p->rRun > pSet->a[i].rRun) + p = pSet->a + i; } - if( p->rRun<=rRun ) return 0; + if (p->rRun <= rRun) + return 0; } whereOrInsert_done: p->prereq = prereq; p->rRun = rRun; - if( p->nOut>nOut ) p->nOut = nOut; + if (p->nOut > nOut) + p->nOut = nOut; return 1; } @@ -154265,16 +152203,16 @@ static int whereOrInsert( ** 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){ +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 ){ + 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 ){ + for (i = 1; i < pMaskSet->n; i++) { + if (pMaskSet->ix[i] == iCursor) { return MASKBIT(i); } } @@ -154282,11 +152220,11 @@ SQLITE_PRIVATE Bitmask sqlite3WhereGetMask(WhereMaskSet *pMaskSet, int iCursor){ } /* 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 ){ + */ +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; @@ -154294,12 +152232,12 @@ SQLITE_PRIVATE void *sqlite3WhereMalloc(WhereInfo *pWInfo, u64 nByte){ } 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; +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 < nByte); memcpy(pNew, pOld, pOldBlk->sz); } return pNew; @@ -154313,8 +152251,8 @@ SQLITE_PRIVATE void *sqlite3WhereRealloc(WhereInfo *pWInfo, void *pOld, u64 nByt ** 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) ); +static void createMask(WhereMaskSet* pMaskSet, int iCursor) { + assert(pMaskSet->n < ArraySize(pMaskSet->ix)); pMaskSet->ix[pMaskSet->n++] = iCursor; } @@ -154322,9 +152260,9 @@ static void createMask(WhereMaskSet *pMaskSet, int 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){ +static Expr* whereRightSubexprIsColumn(Expr* p) { p = sqlite3ExprSkipCollateAndLikely(p->pRight); - if( ALWAYS(p!=0) && p->op==TK_COLUMN && !ExprHasProperty(p, EP_FixedCol) ){ + if (ALWAYS(p != 0) && p->op == TK_COLUMN && !ExprHasProperty(p, EP_FixedCol)) { return p; } return 0; @@ -154335,83 +152273,71 @@ static Expr *whereRightSubexprIsColumn(Expr *p){ ** 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 */ +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 ); + 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 - ){ + 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; k < pWC->nTerm; 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->nEquiv < ArraySize(pScan->aiCur) && + (pX = whereRightSubexprIsColumn(pTerm->pExpr)) != 0) { int j; - for(j=0; jnEquiv; j++){ - if( pScan->aiCur[j]==pX->iTable - && pScan->aiColumn[j]==pX->iColumn ){ - break; + for (j = 0; j < pScan->nEquiv; j++) { + if (pScan->aiCur[j] == pX->iTable && pScan->aiColumn[j] == pX->iColumn) { + break; } } - if( j==pScan->nEquiv ){ + if (j == pScan->nEquiv) { pScan->aiCur[j] = pX->iTable; pScan->aiColumn[j] = pX->iColumn; pScan->nEquiv++; } } - if( (pTerm->eOperator & pScan->opMask)!=0 ){ + 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; + if (pScan->zCollName && (pTerm->eOperator & WO_ISNULL) == 0) { + CollSeq* pColl; + Parse* pParse = pWC->pWInfo->pParse; pX = pTerm->pExpr; - if( !sqlite3IndexAffinityOk(pX, pScan->idxaff) ){ + 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) ){ + 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 ); + 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; + pScan->k = k + 1; #ifdef WHERETRACE_ENABLED - if( sqlite3WhereTrace & 0x20000 ){ + 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("SCAN-TERM %p: nEquiv=%d", pTerm, pScan->nEquiv); + for (ii = 0; ii < pScan->nEquiv; ii++) { + sqlite3DebugPrintf(" {%d:%d}", pScan->aiCur[ii], pScan->aiColumn[ii]); } sqlite3DebugPrintf("\n"); } @@ -154422,8 +152348,9 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ } pWC = pWC->pOuter; k = 0; - }while( pWC!=0 ); - if( pScan->iEquiv>=pScan->nEquiv ) break; + } while (pWC != 0); + if (pScan->iEquiv >= pScan->nEquiv) + break; pWC = pScan->pOrigWC; k = 0; pScan->iEquiv++; @@ -154437,7 +152364,7 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ ** 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){ +static SQLITE_NOINLINE WhereTerm* whereScanInitIndexExpr(WhereScan* pScan) { pScan->idxaff = sqlite3ExprAffinity(pScan->pIdxExpr); return whereScanNext(pScan); } @@ -154461,14 +152388,13 @@ static SQLITE_NOINLINE WhereTerm *whereScanInitIndexExpr(WhereScan *pScan){ ** 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 */ -){ +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; @@ -154479,21 +152405,21 @@ static WhereTerm *whereScanInit( pScan->aiCur[0] = iCur; pScan->nEquiv = 1; pScan->iEquiv = 1; - if( pIdx ){ + if (pIdx) { int j = iColumn; iColumn = pIdx->aiColumn[j]; - if( iColumn==pIdx->pTable->iPKey ){ + if (iColumn == pIdx->pTable->iPKey) { iColumn = XN_ROWID; - }else if( iColumn>=0 ){ + } else if (iColumn >= 0) { pScan->idxaff = pIdx->pTable->aCol[iColumn].affinity; pScan->zCollName = pIdx->azColl[j]; - }else if( iColumn==XN_EXPR ){ + } 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 ){ + } else if (iColumn == XN_EXPR) { return 0; } pScan->aiColumn[0] = iColumn; @@ -154525,27 +152451,27 @@ static WhereTerm *whereScanInit( ** 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; +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 ); + 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; + if (pResult == 0) + pResult = p; } p = whereScanNext(&scan); } @@ -154559,25 +152485,20 @@ SQLITE_PRIVATE WhereTerm *sqlite3WhereFindTerm( ** 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 */ -){ +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) ){ + const char* zColl = pIdx->azColl[iCol]; + + for (i = 0; i < pList->nExpr; 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; } } @@ -154589,19 +152510,18 @@ static int findIndexCol( /* ** Return TRUE if the iCol-th column of index pIdx is NOT NULL */ -static int indexColumnNotNull(Index *pIdx, int iCol){ +static int indexColumnNotNull(Index* pIdx, int iCol) { int j; - assert( pIdx!=0 ); - assert( iCol>=0 && iColnColumn ); + assert(pIdx != 0); + assert(iCol >= 0 && iCol < pIdx->nColumn); j = pIdx->aiColumn[iCol]; - if( j>=0 ){ + if (j >= 0) { return pIdx->pTable->aCol[j].notNull; - }else if( j==(-1) ){ + } else if (j == (-1)) { return 1; - }else{ - assert( j==(-2) ); - return 0; /* Assume an indexed expression can always yield a NULL */ - + } else { + assert(j == (-2)); + return 0; /* Assume an indexed expression can always yield a NULL */ } } @@ -154612,21 +152532,21 @@ static int indexColumnNotNull(Index *pIdx, int iCol){ ** 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; +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; + if (pTabList->nSrc != 1) + return 0; iBase = pTabList->a[0].iCursor; pTab = pTabList->a[0].pTab; @@ -154634,11 +152554,14 @@ static int isDistinctRedundant( ** 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; + for (i = 0; i < pDistinct->nExpr; 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 @@ -154654,16 +152577,20 @@ static int isDistinctRedundant( ** 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; + for (pIdx = pTab->pIndex; pIdx; pIdx = pIdx->pNext) { + if (!IsUniqueIndex(pIdx)) + continue; + if (pIdx->pPartIdxWhere) + continue; + for (i = 0; i < pIdx->nKeyCol; 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 ){ + if (i == pIdx->nKeyCol) { /* This index implies that the DISTINCT qualifier is redundant. */ return 1; } @@ -154672,12 +152599,11 @@ static int isDistinctRedundant( return 0; } - /* ** Estimate the logarithm of the input value to base 2. */ -static LogEst estLog(LogEst N){ - return N<=10 ? 0 : sqlite3LogEst(N) - 33; +static LogEst estLog(LogEst N) { + return N <= 10 ? 0 : sqlite3LogEst(N) - 33; } /* @@ -154692,30 +152618,31 @@ static LogEst estLog(LogEst N){ ** 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); +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 ){ + if (pParse->db->mallocFailed) + return; + for (; iStart < iEnd; iStart++, pOp++) { + if (pOp->p1 != 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->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 ){ + if (iAutoidxCur == 0) { pOp->opcode = OP_Null; pOp->p3 = 0; } @@ -154731,34 +152658,24 @@ static void translateColumnToCopy( ** are no-ops. */ #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(WHERETRACE_ENABLED) -static void whereTraceIndexInfoInputs(sqlite3_index_info *p){ +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){ + if (!sqlite3WhereTrace) + return; + for (i = 0; i < p->nConstraint; 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; i < p->nOrderBy; 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); + if (!sqlite3WhereTrace) + return; + for (i = 0; i < p->nConstraint; 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); @@ -154777,79 +152694,79 @@ static void whereTraceIndexInfoOutputs(sqlite3_index_info *p){ ** 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 */ -){ +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; + 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 ); + 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 */ +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); + 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 */ @@ -154858,33 +152775,28 @@ static SQLITE_NOINLINE void constructAutomaticIndex( pWCEnd = &pWC->a[pWC->nTerm]; pLoop = pLevel->pWLoop; idxCols = 0; - for(pTerm=pWC->a; pTermpExpr; + for (pTerm = pWC->a; pTerm < pWCEnd; pTerm++) { + Expr* pExpr = pTerm->pExpr; /* 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 ((pTerm->wtFlags & TERM_VIRTUAL) == 0 && sqlite3ExprIsTableConstraint(pExpr, pSrc)) { + pPartial = sqlite3ExprAnd(pParse, pPartial, sqlite3ExprDup(pParse->db, pExpr, 0)); } - if( termCanDriveIndex(pTerm, pSrc, notReady) ){ + if (termCanDriveIndex(pTerm, pSrc, notReady)) { int iCol; Bitmask cMask; - assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); + 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); + 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) ){ + if ((idxCols & cMask) == 0) { + if (whereLoopResize(pParse->db, pLoop, nKeyCol + 1)) { goto end_auto_index_create; } pLoop->aLTerm[nKeyCol++] = pTerm; @@ -154892,10 +152804,9 @@ static SQLITE_NOINLINE void constructAutomaticIndex( } } } - assert( nKeyCol>0 || pParse->db->mallocFailed ); + 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; + 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 @@ -154905,116 +152816,117 @@ static SQLITE_NOINLINE void constructAutomaticIndex( ** 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 & (~idxCols | MASKBIT(BMS - 1)); + mxBitCol = MIN(BMS - 1, pTable->nCol); + testcase(pTable->nCol == BMS - 1); + testcase(pTable->nCol == BMS - 2); + for (i = 0; i < mxBitCol; i++) { + if (extraCols & MASKBIT(i)) + nKeyCol++; } - if( pSrc->colUsed & MASKBIT(BMS-1) ){ + if (pSrc->colUsed & 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; + 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; pTerma; pTerm < pWCEnd; pTerm++) { + if (termCanDriveIndex(pTerm, pSrc, notReady)) { int iCol; Bitmask cMask; - assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); + assert((pTerm->eOperator & (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; + 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 */ + assert(pColl != 0 || pParse->nErr > 0); /* TH3 collate01.800 */ pIdx->azColl[n] = pColl ? pColl->zName : sqlite3StrBINARY; n++; } } } - assert( (u32)n==pLoop->u.btree.nEq ); + 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++){ + if (pSrc->colUsed & MASKBIT(BMS - 1)) { + for (i = BMS - 1; i < pTable->nCol; i++) { pIdx->aiColumn[n] = i; pIdx->azColl[n] = sqlite3StrBINARY; n++; } } - assert( n==nKeyCol ); + assert(n == nKeyCol); pIdx->aiColumn[n] = XN_ROWID; pIdx->azColl[n] = sqlite3StrBINARY; /* Create the automatic index */ - assert( pLevel->iIdxCur>=0 ); + assert(pLevel->iIdxCur >= 0); pLevel->iIdxCur = pParse->nTab++; - sqlite3VdbeAddOp2(v, OP_OpenAutoindex, pLevel->iIdxCur, nKeyCol+1); + sqlite3VdbeAddOp2(v, OP_OpenAutoindex, pLevel->iIdxCur, nKeyCol + 1); sqlite3VdbeSetP4KeyInfo(pParse, pIdx); VdbeComment((v, "for %s", pTable->zName)); - if( OptimizationEnabled(pParse->db, SQLITE_BloomFilter) ){ + 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 ){ + 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); + 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); + } else { + addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, pLevel->iTabCur); + VdbeCoverage(v); } - if( pPartial ){ + 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); + 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); + 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); + } else { + sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop + 1); + VdbeCoverage(v); sqlite3VdbeChangeP5(v, SQLITE_STMTSTATUS_AUTOINDEX); } sqlite3VdbeJumpHere(v, addrTop); @@ -155048,30 +152960,30 @@ static SQLITE_NOINLINE void constructAutomaticIndex( ** 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; +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); @@ -155087,62 +152999,63 @@ static SQLITE_NOINLINE void sqlite3ConstructBloomFilter( ** sqlite_stat1 table, testing is much easier. */ pItem = &pWInfo->pTabList->a[pLevel->iFrom]; - assert( pItem!=0 ); + assert(pItem != 0); pTab = pItem->pTab; - assert( pTab!=0 ); + assert(pTab != 0); sz = sqlite3LogEstToInt(pTab->nRowLogEst); - if( sz<10000 ){ + if (sz < 10000) { sz = 10000; - }else if( sz>10000000 ){ + } else if (sz > 10000000) { sz = 10000000; } sqlite3VdbeAddOp2(v, OP_Blob, (int)sz, pLevel->regFilter); - addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, iCur); VdbeCoverage(v); + 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) - ){ + for (pTerm = pWInfo->sWC.a; pTerm < pWCEnd; pTerm++) { + Expr* pExpr = pTerm->pExpr; + if ((pTerm->wtFlags & TERM_VIRTUAL) == 0 && sqlite3ExprIsTableConstraint(pExpr, pItem)) { sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL); } } - if( pLoop->wsFlags & WHERE_IPK ){ + 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; + } 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); + 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); + 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; + 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; + 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 - ){ + 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 @@ -155150,77 +153063,77 @@ static SQLITE_NOINLINE void sqlite3ConstructBloomFilter( break; } } - }while( iLevel < pWInfo->nLevel ); + } 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 */ -){ +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; + 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; + sqlite3_index_info* pIdxInfo; u16 mNoOmit = 0; - const Table *pTab; + const Table* pTab; int eDistinct = 0; - ExprList *pOrderBy = pWInfo->pOrderBy; + ExprList* pOrderBy = pWInfo->pOrderBy; - assert( pSrc!=0 ); + assert(pSrc != 0); pTab = pSrc->pTab; - assert( pTab!=0 ); - assert( IsVirtual(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++){ + for (i = nTerm = 0, pTerm = pWC->a; i < pWC->nTerm; 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 ); + 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.leftColumn < pTab->nCol); /* 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 - ){ + 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; } } @@ -155233,63 +153146,62 @@ static sqlite3_index_info *allocateIndexInfo( ** the sqlite3_index_info structure. */ nOrderBy = 0; - if( pOrderBy ){ + if (pOrderBy) { int n = pOrderBy->nExpr; - for(i=0; ia[i].pExpr; - Expr *pE2; + for (i = 0; i < n; i++) { + Expr* pExpr = pOrderBy->a[i].pExpr; + Expr* pE2; /* Skip over constant terms in the ORDER BY clause */ - if( sqlite3ExprIsConstant(pExpr) ){ + if (sqlite3ExprIsConstant(pExpr)) { continue; } /* Virtual tables are unable to deal with NULLS FIRST */ - if( pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_BIGNULL ) break; + 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 ); + if (pExpr->op == TK_COLUMN && pExpr->iTable == pSrc->iCursor) { + assert(pExpr->iColumn >= XN_ROWID && pExpr->iColumn < pTab->nCol); 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 ); + 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->iColumn < pTab->nCol); pExpr->iColumn = pE2->iColumn; - if( pE2->iColumn<0 ) continue; /* Collseq does not matter for rowid */ + 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; + 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 ){ + if (i == n) { nOrderBy = n; - if( (pWInfo->wctrlFlags & WHERE_DISTINCTBY) ){ - eDistinct = 2 + ((pWInfo->wctrlFlags & WHERE_SORTBYGROUP)!=0); - }else if( pWInfo->wctrlFlags & WHERE_GROUPBY ){ + 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 ){ + */ + 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; } @@ -155304,58 +153216,59 @@ static sqlite3_index_info *allocateIndexInfo( pHidden->pParse = pParse; pHidden->eDistinct = eDistinct; pHidden->mIn = 0; - for(i=j=0, pTerm=pWC->a; inTerm; i++, pTerm++){ + for (i = j = 0, pTerm = pWC->a; i < pWC->nTerm; i++, pTerm++) { u16 op; - if( (pTerm->wtFlags & TERM_OK)==0 ) continue; + 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 ){ + if (op == WO_IN) { + if ((pTerm->wtFlags & TERM_SLICE) == 0) { pHidden->mIn |= SMASKBIT32(j); } op = WO_EQ; } - if( op==WO_AUX ){ + if (op == WO_AUX) { pIdxCons[j].op = pTerm->eMatchOp; - }else if( op & (WO_ISNULL|WO_IS) ){ - if( op==WO_ISNULL ){ + } else if (op & (WO_ISNULL | WO_IS)) { + if (op == WO_ISNULL) { pIdxCons[j].op = SQLITE_INDEX_CONSTRAINT_ISNULL; - }else{ + } else { pIdxCons[j].op = SQLITE_INDEX_CONSTRAINT_IS; } - }else{ + } 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; + 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 ); + 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) ); + for (i = j = 0; i < nOrderBy; i++) { + Expr* pExpr = pOrderBy->a[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++; @@ -155370,14 +153283,14 @@ static sqlite3_index_info *allocateIndexInfo( ** 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; +static void freeIndexInfo(sqlite3* db, sqlite3_index_info* pIdxInfo) { + HiddenIndexInfo* pHidden; int i; - assert( pIdxInfo!=0 ); + assert(pIdxInfo != 0); pHidden = (HiddenIndexInfo*)&pIdxInfo[1]; - assert( pHidden->pParse!=0 ); - assert( pHidden->pParse->db==db ); - for(i=0; inConstraint; i++){ + assert(pHidden->pParse != 0); + assert(pHidden->pParse->db == db); + for (i = 0; i < pIdxInfo->nConstraint; i++) { sqlite3ValueFree(pHidden->aRhs[i]); /* IMP: R-14553-25174 */ pHidden->aRhs[i] = 0; } @@ -155400,8 +153313,8 @@ static void freeIndexInfo(sqlite3 *db, sqlite3_index_info *pIdxInfo){ ** 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; +static int vtabBestIndex(Parse* pParse, Table* pTab, sqlite3_index_info* p) { + sqlite3_vtab* pVtab = sqlite3GetVTable(pParse->db, pTab)->pVtab; int rc; whereTraceIndexInfoInputs(p); @@ -155410,12 +153323,12 @@ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){ pParse->db->nSchemaLock--; whereTraceIndexInfoOutputs(p); - if( rc!=SQLITE_OK && rc!=SQLITE_CONSTRAINT ){ - if( rc==SQLITE_NOMEM ){ + if (rc != SQLITE_OK && rc != SQLITE_CONSTRAINT) { + if (rc == SQLITE_NOMEM) { sqlite3OomFault(pParse->db); - }else if( !pVtab->zErrMsg ){ + } else if (!pVtab->zErrMsg) { sqlite3ErrorMsg(pParse, "%s", sqlite3ErrStr(rc)); - }else{ + } else { sqlite3ErrorMsg(pParse, "%s", pVtab->zErrMsg); } } @@ -155439,29 +153352,28 @@ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){ ** 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 > */ +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 ); + UNUSED_PARAMETER(pParse); #endif - assert( pRec!=0 ); - assert( pIdx->nSample>0 ); - assert( pRec->nField>0 ); + 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 @@ -155510,108 +153422,103 @@ static int whereKeyStats( 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 */ + do { + int iSamp; /* Index in aSample[] of test sample */ + int n; /* Number of fields in test sample */ - iTest = (iMin+iSample)/2; + iTest = (iMin + iSample) / 2; iSamp = iTest / nField; - if( iSamp>0 ){ + 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 (pParse->db->mallocFailed == 0) { + if (res == 0) { /* If (res==0) is true, then pRec must be equal to sample i. */ - assert( inSample ); - assert( iCol==nField-1 ); + assert(i < pIdx->nSample); + assert(iCol == nField - 1); pRec->nField = nField; - assert( 0==sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec) - || pParse->db->mallocFailed - ); - }else{ + 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 ); + 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 ){ + if (iCol > 0) { pRec->nField = iCol; - assert( sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec)<=0 - || pParse->db->mallocFailed ); + assert(sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec) <= 0 || pParse->db->mallocFailed); } - if( i>0 ){ + if (i > 0) { pRec->nField = nField; - assert( sqlite3VdbeRecordCompare(aSample[i-1].n, aSample[i-1].p, pRec)<0 - || pParse->db->mallocFailed ); + assert(sqlite3VdbeRecordCompare(aSample[i - 1].n, aSample[i - 1].p, pRec) < 0 || pParse->db->mallocFailed); } } } #endif /* ifdef SQLITE_DEBUG */ - if( res==0 ){ + if (res == 0) { /* Record pRec is equal to sample i */ - assert( iCol==nField-1 ); + assert(iCol == nField - 1); aStat[0] = aSample[i].anLt[iCol]; aStat[1] = aSample[i].anEq[iCol]; - }else{ + } 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 ){ + if (i >= pIdx->nSample) { iUpper = sqlite3LogEstToInt(pIdx->aiRowLogEst[0]); - }else{ + } else { iUpper = aSample[i].anLt[iCol]; } - if( iLower>=iUpper ){ + if (iLower >= iUpper) { iGap = 0; - }else{ + } else { iGap = iUpper - iLower; } - if( roundUp ){ - iGap = (iGap*2)/3; - }else{ - iGap = iGap/3; + if (roundUp) { + iGap = (iGap * 2) / 3; + } else { + iGap = iGap / 3; } aStat[0] = iLower + iGap; - aStat[1] = pIdx->aAvgEq[nField-1]; + aStat[1] = pIdx->aAvgEq[nField - 1]; } /* Restore the pRec->nField value before returning. */ @@ -155631,34 +153538,34 @@ static int whereKeyStats( ** 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){ +static LogEst whereRangeAdjust(WhereTerm* pTerm, LogEst nNew) { LogEst nRet = nNew; - if( pTerm ){ - if( pTerm->truthProb<=0 ){ + if (pTerm) { + if (pTerm->truthProb <= 0) { nRet += pTerm->truthProb; - }else if( (pTerm->wtFlags & TERM_VNULL)==0 ){ - nRet -= 20; assert( 20==sqlite3LogEst(4) ); + } 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; +SQLITE_PRIVATE char sqlite3IndexColumnAffinity(sqlite3* db, Index* pIdx, int iCol) { + assert(iCol >= 0 && iCol < pIdx->nColumn); + if (!pIdx->zColAff) { + if (sqlite3IndexAffinityStr(db, pIdx) == 0) + return SQLITE_AFF_BLOB; } - assert( pIdx->zColAff[iCol]!=0 ); + 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 @@ -155695,68 +153602,69 @@ SQLITE_PRIVATE char sqlite3IndexColumnAffinity(sqlite3 *db, Index *pIdx, int iCo ** 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; +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; + sqlite3* db = pParse->db; int nLower = -1; - int nUpper = p->nSample+1; + int nUpper = p->nSample + 1; int rc = SQLITE_OK; u8 aff = sqlite3IndexColumnAffinity(db, p, nEq); - CollSeq *pColl; + 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 */ + 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 ){ + if (pLower) { rc = sqlite3Stat4ValueFromExpr(pParse, pLower->pExpr->pRight, aff, &p1); nLower = 0; } - if( pUpper && rc==SQLITE_OK ){ + if (pUpper && rc == SQLITE_OK) { rc = sqlite3Stat4ValueFromExpr(pParse, pUpper->pExpr->pRight, aff, &p2); nUpper = p2 ? 0 : p->nSample; } - if( p1 || p2 ){ + if (p1 || p2) { int i; int nDiff; - for(i=0; rc==SQLITE_OK && inSample; i++){ + for (i = 0; rc == SQLITE_OK && i < p->nSample; i++) { rc = sqlite3Stat4Column(db, p->aSample[i].p, p->aSample[i].n, nEq, &pVal); - if( rc==SQLITE_OK && p1 ){ + if (rc == SQLITE_OK && p1) { int res = sqlite3MemCompare(p1, pVal, pColl); - if( res>=0 ) nLower++; + if (res >= 0) + nLower++; } - if( rc==SQLITE_OK && p2 ){ + if (rc == SQLITE_OK && p2) { int res = sqlite3MemCompare(p2, pVal, pColl); - if( res>=0 ) nUpper++; + if (res >= 0) + nUpper++; } } nDiff = (nUpper - nLower); - if( nDiff<=0 ) nDiff = 1; + 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 ){ + 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)); + WHERETRACE(0x10, ("range skip-scan regions: %u..%u adjust=%d est=%d\n", nLower, nUpper, nAdjust * -1, pLoop->nOut)); } - }else{ - assert( *pbDone==0 ); + } else { + assert(*pbDone == 0); } sqlite3ValueFree(p1); @@ -155807,26 +153715,22 @@ static int whereRangeSkipScanEst( ** 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 */ -){ +static int whereRangeScanEst(Parse* pParse, /* Parsing & code generating context */ + WhereLoopBuilder* pBuilder, 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 /* 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; + 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; + if (p->nSample > 0 && ALWAYS(nEq < p->nSampleCol) && 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; @@ -155850,20 +153754,20 @@ static int whereRangeScanEst( ** ** 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 */ + 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 ); + if (pRec) { + testcase(pRec->nField != pBuilder->nRecValid); pRec->nField = pBuilder->nRecValid; } /* Determine iLower and iUpper using ($P) only. */ - if( nEq==0 ){ + if (nEq == 0) { iLower = 0; iUpper = p->nRowEst0; - }else{ + } 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); @@ -155871,79 +153775,86 @@ static int whereRangeScanEst( 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] ){ + 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; + 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 ){ + if (rc == SQLITE_OK && n) { tRowcnt iNew; - u16 mask = WO_GT|WO_LE; - if( sqlite3ExprVectorSize(pExpr)>n ) mask = (WO_LE|WO_LT); + 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; + 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; + 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 ){ + if (rc == SQLITE_OK && n) { tRowcnt iNew; - u16 mask = WO_GT|WO_LE; - if( sqlite3ExprVectorSize(pExpr)>n ) mask = (WO_LE|WO_LT); + 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 ){ + 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 (iLwrIdx == iUprIdx) + nNew -= 20; + assert(20 == sqlite3LogEst(4)); + } else { + nNew = 10; + assert(10 == sqlite3LogEst(2)); } - if( nNewwtFlags & TERM_VNULL)==0 ); + assert(pUpper == 0 || (pUpper->wtFlags & TERM_VNULL) == 0); nNew = whereRangeAdjust(pLower, nOut); nNew = whereRangeAdjust(pUpper, nNew); @@ -155953,17 +153864,18 @@ static int whereRangeScanEst( ** 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 ){ + 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)); + if (pLoop->nOut > nOut) { + WHERETRACE(0x10, ("Range scan lowers nOut from %d to %d\n", pLoop->nOut, nOut)); } #endif pLoop->nOut = (LogEst)nOut; @@ -155988,47 +153900,46 @@ static int whereRangeScanEst( ** 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; +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 */ + 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->nRecValid= 1); + assert(nEq <= p->nColumn); + assert(p->aSample != 0); + assert(p->nSample > 0); + assert(pBuilder->nRecValid < nEq); /* If values are not available for all fields of the index to the left ** of this one, no estimate can be made. Return SQLITE_NOTFOUND. */ - if( pBuilder->nRecValid<(nEq-1) ){ + if (pBuilder->nRecValid < (nEq - 1)) { return SQLITE_NOTFOUND; } /* This is an optimization only. The call to sqlite3Stat4ProbeSetValue() ** below would return the same value. */ - if( nEq>=p->nColumn ){ + if (nEq >= p->nColumn) { *pnRow = 1; return SQLITE_OK; } - rc = sqlite3Stat4ProbeSetValue(pParse, p, &pRec, pExpr, 1, nEq-1, &bOk); + 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; + 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])); + WHERETRACE(0x10, ("equality scan regions %s(%d): %d\n", p->zName, nEq - 1, (int)a[1])); *pnRow = a[1]; return rc; @@ -156052,77 +153963,74 @@ static int whereEqualScanEst( ** 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; +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 */ + 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++){ + assert(p->aSample != 0); + for (i = 0; rc == SQLITE_OK && i < pList->nExpr; 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; + if (rc == SQLITE_OK) { + if (nRowEst > nRow0) + nRowEst = nRow0; *pnRow = nRowEst; - WHERETRACE(0x10,("IN row estimate: est=%d\n", nRowEst)); + WHERETRACE(0x10, ("IN row estimate: est=%d\n", nRowEst)); } - assert( pBuilder->nRecValid==nRecValid ); + 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 ){ +SQLITE_PRIVATE void sqlite3WhereTermPrint(WhereTerm* pTerm, int iTerm) { + if (pTerm == 0) { sqlite3DebugPrintf("TERM-%-3d NULL\n", iTerm); - }else{ + } 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); + 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); + 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 (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 ){ + if ((pTerm->eOperator & (WO_OR | WO_AND)) == 0 && pTerm->u.x.iField) { sqlite3DebugPrintf(" iField=%d", pTerm->u.x.iField); } - if( pTerm->iParent>=0 ){ + if (pTerm->iParent >= 0) { sqlite3DebugPrintf(" iParent=%d", pTerm->iParent); } sqlite3DebugPrintf("\n"); @@ -156135,9 +154043,9 @@ SQLITE_PRIVATE void sqlite3WhereTermPrint(WhereTerm *pTerm, int iTerm){ /* ** Show the complete content of a WhereClause */ -SQLITE_PRIVATE void sqlite3WhereClausePrint(WhereClause *pWC){ +SQLITE_PRIVATE void sqlite3WhereClausePrint(WhereClause* pWC) { int i; - for(i=0; inTerm; i++){ + for (i = 0; i < pWC->nTerm; i++) { sqlite3WhereTermPrint(&pWC->a[i], i); } } @@ -156147,48 +154055,46 @@ SQLITE_PRIVATE void sqlite3WhereClausePrint(WhereClause *pWC){ /* ** 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 ){ +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--; + while (zName[i] != '_') + i--; zName += i; } sqlite3DebugPrintf(".%-16s %2d", zName, p->u.btree.nEq); - }else{ - sqlite3DebugPrintf("%20s",""); + } 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{ + } 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{ + 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 ){ + if (p->nLTerm && (sqlite3WhereTrace & 0x100) != 0) { int i; - for(i=0; inLTerm; i++){ + for (i = 0; i < p->nLTerm; i++) { sqlite3WhereTermPrint(p->aLTerm[i], i); } } @@ -156199,7 +154105,7 @@ SQLITE_PRIVATE void sqlite3WhereLoopPrint(WhereLoop *p, WhereClause *pWC){ ** Convert bulk memory into a valid WhereLoop that can be passed ** to whereLoopClear harmlessly. */ -static void whereLoopInit(WhereLoop *p){ +static void whereLoopInit(WhereLoop* p) { p->aLTerm = p->aLTermSpace; p->nLTerm = 0; p->nLSlot = ArraySize(p->aLTermSpace); @@ -156209,13 +154115,13 @@ static void whereLoopInit(WhereLoop *p){ /* ** 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 ){ +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 ){ + } 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; @@ -156226,8 +154132,9 @@ static void whereLoopClearUnion(sqlite3 *db, WhereLoop *p){ /* ** Deallocate internal memory used by a WhereLoop object */ -static void whereLoopClear(sqlite3 *db, WhereLoop *p){ - if( p->aLTerm!=p->aLTermSpace ) sqlite3DbFreeNN(db, p->aLTerm); +static void whereLoopClear(sqlite3* db, WhereLoop* p) { + if (p->aLTerm != p->aLTermSpace) + sqlite3DbFreeNN(db, p->aLTerm); whereLoopClearUnion(db, p); whereLoopInit(p); } @@ -156235,14 +154142,17 @@ static void whereLoopClear(sqlite3 *db, WhereLoop *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); +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; @@ -156251,17 +154161,17 @@ static int whereLoopResize(sqlite3 *db, WhereLoop *p, int n){ /* ** Transfer content from the second pLoop into the first. */ -static int whereLoopXfer(sqlite3 *db, WhereLoop *pTo, WhereLoop *pFrom){ +static int whereLoopXfer(sqlite3* db, WhereLoop* pTo, WhereLoop* pFrom) { whereLoopClearUnion(db, pTo); - if( whereLoopResize(db, pTo, pFrom->nLTerm) ){ + 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 ){ + 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 ){ + } else if ((pFrom->wsFlags & WHERE_AUTO_INDEX) != 0) { pFrom->u.btree.pIndex = 0; } return SQLITE_OK; @@ -156270,7 +154180,7 @@ static int whereLoopXfer(sqlite3 *db, WhereLoop *pTo, WhereLoop *pFrom){ /* ** Delete a WhereLoop object */ -static void whereLoopDelete(sqlite3 *db, WhereLoop *p){ +static void whereLoopDelete(sqlite3* db, WhereLoop* p) { whereLoopClear(db, p); sqlite3DbFreeNN(db, p); } @@ -156278,17 +154188,17 @@ static void whereLoopDelete(sqlite3 *db, WhereLoop *p){ /* ** Free a WhereInfo structure */ -static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){ - assert( pWInfo!=0 ); +static void whereInfoFree(sqlite3* db, WhereInfo* pWInfo) { + assert(pWInfo != 0); sqlite3WhereClauseClear(&pWInfo->sWC); - while( pWInfo->pLoops ){ - WhereLoop *p = pWInfo->pLoops; + 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; + assert(pWInfo->pExprMods == 0); + while (pWInfo->pMemToFree) { + WhereMemBlock* pNext = pWInfo->pMemToFree->pNext; sqlite3DbFreeNN(db, pWInfo->pMemToFree); pWInfo->pMemToFree = pNext; } @@ -156296,10 +154206,10 @@ static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){ } /* Undo all Expr node modifications -*/ -static void whereUndoExprMods(WhereInfo *pWInfo){ - while( pWInfo->pExprMods ){ - WhereExprMod *p = pWInfo->pExprMods; + */ +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); @@ -156325,28 +154235,31 @@ static void whereUndoExprMods(WhereInfo *pWInfo){ ** 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 */ -){ +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 ){ + 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 (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 (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) */ + if ((pX->wsFlags & WHERE_IDX_ONLY) != 0 && (pY->wsFlags & WHERE_IDX_ONLY) == 0) { + return 0; /* Constraint (5) */ } - return 1; /* All conditions meet */ + return 1; /* All conditions meet */ } /* @@ -156363,27 +154276,26 @@ static int whereLoopCheaperProperSubset( ** 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) ){ +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))); + 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) ){ + } 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))); + 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); } @@ -156404,13 +154316,10 @@ static void whereLoopAdjustCost(const WhereLoop *p, WhereLoop *pTemplate){ ** 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 ){ +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. */ @@ -156419,23 +154328,18 @@ static WhereLoop **whereLoopFindLesser( /* 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 ); + 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 ); + 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 - ){ + 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; } @@ -156444,12 +154348,12 @@ static WhereLoop **whereLoopFindLesser( ** (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 ((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 @@ -156457,12 +154361,12 @@ static WhereLoop **whereLoopFindLesser( ** (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 */ + 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; @@ -156492,16 +154396,17 @@ static WhereLoop **whereLoopFindLesser( ** (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){ +static int whereLoopInsert(WhereLoopBuilder* pBuilder, WhereLoop* pTemplate) { WhereLoop **ppPrev, *p; - WhereInfo *pWInfo = pBuilder->pWInfo; - sqlite3 *db = pWInfo->pParse->db; + 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; + if (pBuilder->iPlanLimit == 0) { + WHERETRACE(0xffffffff, ("=== query planner search limit reached ===\n")); + if (pBuilder->pOrSet) + pBuilder->pOrSet->n = 0; return SQLITE_DONE; } pBuilder->iPlanLimit--; @@ -156511,17 +154416,16 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ /* If pBuilder->pOrSet is defined, then only keep track of the costs ** and prereqs. */ - if( pBuilder->pOrSet!=0 ){ - if( pTemplate->nLTerm ){ + 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); + whereOrInsert(pBuilder->pOrSet, pTemplate->prereq, pTemplate->rRun, pTemplate->nOut); #if WHERETRACE_ENABLED /* 0x8 */ - if( sqlite3WhereTrace & 0x8 ){ - sqlite3DebugPrintf(x?" or-%d: ":" or-X: ", n); + if (sqlite3WhereTrace & 0x8) { + sqlite3DebugPrintf(x ? " or-%d: " : " or-X: ", n); sqlite3WhereLoopPrint(pTemplate, pBuilder->pWC); } #endif @@ -156530,20 +154434,20 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ } /* Look for an existing WhereLoop to replace with pTemplate - */ + */ ppPrev = whereLoopFindLesser(&pWInfo->pLoops, pTemplate); - if( ppPrev==0 ){ + 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 ){ + if (sqlite3WhereTrace & 0x8) { sqlite3DebugPrintf(" skip: "); sqlite3WhereLoopPrint(pTemplate, pBuilder->pWC); } #endif return SQLITE_OK; - }else{ + } else { p = *ppPrev; } @@ -156552,37 +154456,40 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ ** WhereLoop and insert it. */ #if WHERETRACE_ENABLED /* 0x8 */ - if( sqlite3WhereTrace & 0x8 ){ - if( p!=0 ){ + if (sqlite3WhereTrace & 0x8) { + if (p != 0) { sqlite3DebugPrintf("replace: "); sqlite3WhereLoopPrint(p, pBuilder->pWC); sqlite3DebugPrintf(" with: "); - }else{ + } else { sqlite3DebugPrintf(" add: "); } sqlite3WhereLoopPrint(pTemplate, pBuilder->pWC); } #endif - if( p==0 ){ + 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; + if (p == 0) + return SQLITE_NOMEM_BKPT; whereLoopInit(p); p->pNextLoop = 0; - }else{ + } 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 ){ + WhereLoop** ppTail = &p->pNextLoop; + WhereLoop* pToDel; + while (*ppTail) { ppTail = whereLoopFindLesser(ppTail, pTemplate); - if( ppTail==0 ) break; + if (ppTail == 0) + break; pToDel = *ppTail; - if( pToDel==0 ) break; + if (pToDel == 0) + break; *ppTail = pToDel->pNextLoop; #if WHERETRACE_ENABLED /* 0x8 */ - if( sqlite3WhereTrace & 0x8 ){ + if (sqlite3WhereTrace & 0x8) { sqlite3DebugPrintf(" delete: "); sqlite3WhereLoopPrint(pToDel, pBuilder->pWC); } @@ -156591,9 +154498,9 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ } } rc = whereLoopXfer(db, p, pTemplate); - if( (p->wsFlags & WHERE_VIRTUALTABLE)==0 ){ - Index *pIndex = p->u.btree.pIndex; - if( pIndex && pIndex->idxType==SQLITE_IDXTYPE_IPK ){ + if ((p->wsFlags & WHERE_VIRTUALTABLE) == 0) { + Index* pIndex = p->u.btree.pIndex; + if (pIndex && pIndex->idxType == SQLITE_IDXTYPE_IPK) { p->u.btree.pIndex = 0; } } @@ -156629,30 +154536,35 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ ** 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 */ -){ +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); + 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--){ + 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 (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 (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 @@ -156662,33 +154574,29 @@ static void whereLoopOutputAdjust( ** 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 - ){ + 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 (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{ + } 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; + 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 ){ + testcase(pTerm->pExpr->op == TK_IS); + if (sqlite3ExprIsInteger(pRight, &k) && k >= (-1) && k <= 1) { k = 10; - }else{ + } else { k = 20; } - if( iReducewtFlags |= TERM_HEURTRUTH; iReduce = k; } @@ -156696,7 +154604,7 @@ static void whereLoopOutputAdjust( } } } - if( pLoop->nOut > nRow-iReduce ){ + if (pLoop->nOut > nRow - iReduce) { pLoop->nOut = nRow - iReduce; } } @@ -156718,31 +154626,30 @@ static void whereLoopOutputAdjust( ** 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 */ -){ +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) ); + assert(ExprUseXList(pTerm->pExpr->pLeft)); pLhs = pTerm->pExpr->pLeft->x.pList->a[i].pExpr; pRhs = pTerm->pExpr->pRight; - if( ExprUseXSelect(pRhs) ){ + if (ExprUseXSelect(pRhs)) { pRhs = pRhs->x.pSelect->pEList->a[i].pExpr; - }else{ + } else { pRhs = pRhs->x.pList->a[i].pExpr; } @@ -156750,22 +154657,22 @@ static int whereRangeVectorLen( ** 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] - ){ + 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 ); + testcase(pLhs->iColumn == XN_ROWID); aff = sqlite3CompareAffinity(pRhs, sqlite3ExprAffinity(pLhs)); idxaff = sqlite3TableColumnAffinity(pIdx->pTable, pLhs->iColumn); - if( aff!=idxaff ) break; + if (aff != idxaff) + break; pColl = sqlite3BinaryCompareCollSeq(pParse, pLhs, pRhs); - if( pColl==0 ) break; - if( sqlite3StrICmp(pColl->zName, pIdx->azColl[i+nEq]) ) break; + if (pColl == 0) + break; + if (sqlite3StrICmp(pColl->zName, pIdx->azColl[i + nEq])) + break; } return i; } @@ -156775,9 +154682,9 @@ static int whereRangeVectorLen( ** compiled with -DSQLITE_ENABLE_COSTMULT */ #ifdef SQLITE_ENABLE_COSTMULT -# define ApplyCostMultiplier(C,T) C += T +#define ApplyCostMultiplier(C, T) C += T #else -# define ApplyCostMultiplier(C,T) +#define ApplyCostMultiplier(C, T) #endif /* @@ -156792,51 +154699,50 @@ static int whereRangeVectorLen( ** 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 */ +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 (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); + 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 ); + assert(pNew->u.btree.nEq < pProbe->nColumn); + assert(pNew->u.btree.nEq < pProbe->nKeyCol || pProbe->idxType != SQLITE_IDXTYPE_PRIMARYKEY); saved_nEq = pNew->u.btree.nEq; saved_nBtm = pNew->u.btree.nBtm; @@ -156846,29 +154752,28 @@ static int whereLoopAddBtreeIndex( saved_wsFlags = pNew->wsFlags; saved_prereq = pNew->prereq; saved_nOut = pNew->nOut; - pTerm = whereScanInit(&scan, pBuilder->pWC, pSrc->iCursor, saved_nEq, - opMask, pProbe); + 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 */ + 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 */ + 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) - ){ + 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; + 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; + 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 @@ -156883,22 +154788,19 @@ static int whereLoopAddBtreeIndex( ** 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 - ){ + 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 ){ + if (IsUniqueIndex(pProbe) && saved_nEq == pProbe->nKeyCol - 1) { pBuilder->bldFlags1 |= SQLITE_BLDF1_UNIQUE; - }else{ + } else { pBuilder->bldFlags1 |= SQLITE_BLDF1_INDEXED; } pNew->wsFlags = saved_wsFlags; @@ -156906,36 +154808,36 @@ static int whereLoopAddBtreeIndex( 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 */ + 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 - ); + 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) ){ + 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) ); + 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; + for (i = 0; i < pNew->nLTerm - 1; i++) { + if (pNew->aLTerm[i] && pNew->aLTerm[i]->pExpr == pExpr) + nIn = 0; } - }else if( ALWAYS(pExpr->x.pList && pExpr->x.pList->nExpr) ){ + } 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 ){ + if (pProbe->hasStat1 && rLogSize >= 10) { LogEst M, logK, x; /* Let: ** N = the total number of rows in the table @@ -156961,76 +154863,66 @@ static int whereLoopAddBtreeIndex( 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)); + 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)); + } 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) ){ + } 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) - ){ + 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{ + } else { pNew->wsFlags |= WHERE_UNQ_WANTED; } } - if( scan.iEquiv>1 ) pNew->wsFlags |= WHERE_TRANSCONS; - }else if( eOp & WO_ISNULL ){ + 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 - ); + } 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 ){ + 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 */ + assert((pTop - (pTerm->pWC->a)) < pTerm->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 - ); + } 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; + 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 @@ -157038,73 +154930,70 @@ static int whereLoopAddBtreeIndex( ** 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 ){ + 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{ + } else { int nEq = ++pNew->u.btree.nEq; - assert( eOp & (WO_ISNULL|WO_EQ|WO_IN|WO_IS) ); + 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 ); + 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{ + } 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 ); + 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{ + } 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 ){ + 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 (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"); + 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 (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; + if (pNew->nOut > saved_nOut) + pNew->nOut = saved_nOut; pNew->nOut -= nIn; } } - if( nOut==0 ) + if (nOut == 0) #endif { - pNew->nOut += (pProbe->aiRowLogEst[nEq] - pProbe->aiRowLogEst[nEq-1]); - if( eOp & WO_ISNULL ){ + 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=?). */ @@ -157118,10 +155007,10 @@ static int whereLoopAddBtreeIndex( ** 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; + 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 ){ + if ((pNew->wsFlags & (WHERE_IDX_ONLY | WHERE_IPK)) == 0) { pNew->rRun = sqlite3LogEstAdd(pNew->rRun, pNew->nOut + 16); } ApplyCostMultiplier(pNew->rRun, pProbe->pTable->costMult); @@ -157132,18 +155021,15 @@ static int whereLoopAddBtreeIndex( whereLoopOutputAdjust(pBuilder->pWC, pNew, rSize); rc = whereLoopInsert(pBuilder, pNew); - if( pNew->wsFlags & WHERE_COLUMN_RANGE ){ + if (pNew->wsFlags & WHERE_COLUMN_RANGE) { pNew->nOut = saved_nOut; - }else{ + } 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); + if ((pNew->wsFlags & WHERE_TOP_LIMIT) == 0 && pNew->u.btree.nEq < pProbe->nColumn && + (pNew->u.btree.nEq < pProbe->nKeyCol || pProbe->idxType != SQLITE_IDXTYPE_PRIMARYKEY)) { + whereLoopAddBtreeIndex(pBuilder, pSrc, pProbe, nInMul + nIn); } pNew->nOut = saved_nOut; #ifdef SQLITE_ENABLE_STAT4 @@ -157169,22 +155055,17 @@ static int whereLoopAddBtreeIndex( ** 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 - ){ + assert(42 == sqlite3LogEst(18)); + if (saved_nEq == saved_nSkip && saved_nEq + 1 < pProbe->nKeyCol && 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]; + 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. */ @@ -157196,8 +155077,7 @@ static int whereLoopAddBtreeIndex( pNew->wsFlags = saved_wsFlags; } - WHERETRACE(0x800, ("END %s.addBtreeIdx(%s), nEq=%d, rc=%d\n", - pProbe->pTable->zName, pProbe->zName, saved_nEq, rc)); + WHERETRACE(0x800, ("END %s.addBtreeIdx(%s), nEq=%d, rc=%d\n", pProbe->pTable->zName, pProbe->zName, saved_nEq, rc)); return rc; } @@ -157209,29 +155089,31 @@ static int whereLoopAddBtreeIndex( ** 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; +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 ){ + if (pIndex->bUnordered) + return 0; + if ((pOB = pBuilder->pWInfo->pOrderBy) == 0) + return 0; + for (ii = 0; ii < pOB->nExpr; 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; jj < pIndex->nKeyCol; jj++) { + if (pExpr->iColumn == pIndex->aiColumn[jj]) + return 1; + } + } else if ((aColExpr = pIndex->aColExpr) != 0) { + for (jj = 0; jj < pIndex->nKeyCol; jj++) { + if (pIndex->aiColumn[jj] != XN_EXPR) + continue; + if (sqlite3ExprCompareSkip(pExpr, aColExpr->a[jj].pExpr, iCursor) == 0) { return 1; } } @@ -157243,31 +155125,31 @@ static int indexMightHelpWithOrderBy( /* 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 */ -){ +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; + WhereTerm* pTerm; + Parse* pParse; - if( jointype & JT_LTORJ ) return 0; + if (jointype & JT_LTORJ) + return 0; pParse = pWC->pWInfo->pParse; - while( pWhere->op==TK_AND ){ - if( !whereUsablePartialIndex(iTab,jointype,pWC,pWhere->pLeft) ) return 0; + 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; + if (pParse->db->flags & SQLITE_EnableQPSG) + pParse = 0; + for (i = 0, pTerm = pWC->a; i < pWC->nTerm; 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 - ){ + 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; } } @@ -157310,24 +155192,23 @@ static int whereUsablePartialIndex( ** 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 */ +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; @@ -157335,20 +155216,20 @@ static int whereLoopAddBtree( pSrc = pTabList->a + pNew->iTab; pTab = pSrc->pTab; pWC = pBuilder->pWC; - assert( !IsVirtual(pSrc->pTab) ); + assert(!IsVirtual(pSrc->pTab)); - if( pSrc->fg.isIndexedBy ){ - assert( pSrc->fg.isCte==0 ); + 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) ){ + } else if (!HasRowid(pTab)) { pProbe = pTab->pIndex; - }else{ + } 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 */ + Index* pFirst; /* First of real indices on the table */ memset(&sPk, 0, sizeof(Index)); sPk.nKeyCol = 1; sPk.nColumn = 1; @@ -157361,7 +155242,7 @@ static int whereLoopAddBtree( aiRowEstPk[0] = pTab->nRowLogEst; aiRowEstPk[1] = 0; pFirst = pSrc->pTab->pIndex; - if( pSrc->fg.notIndexed==0 ){ + 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; @@ -157372,24 +155253,24 @@ static int whereLoopAddBtree( #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 */ - ){ + 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; + 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) ){ + for (pTerm = pWC->a; rc == SQLITE_OK && pTerm < pWCEnd; pTerm++) { + if (pTerm->prereqRight & pNew->maskSelf) + continue; + if (termCanDriveIndex(pTerm, pSrc, 0)) { pNew->u.btree.nEq = 1; pNew->nSkip = 0; pNew->u.btree.pIndex = 0; @@ -157404,19 +155285,21 @@ static int whereLoopAddBtree( ** 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 ){ + if (!IsView(pTab) && (pTab->tabFlags & TF_Ephemeral) == 0) { pNew->rSetup += 28; - }else{ + } else { pNew->rSetup -= 10; } ApplyCostMultiplier(pNew->rSetup, pTab->costMult); - if( pNew->rSetup<0 ) pNew->rSetup = 0; + 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->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); @@ -157427,17 +155310,13 @@ static int whereLoopAddBtree( /* 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; + 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; @@ -157452,8 +155331,8 @@ static int whereLoopAddBtree( 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 ){ + assert((pWInfo->wctrlFlags & WHERE_ONEPASS_DESIRED) == 0 || b == 0); + if (pProbe->idxType == SQLITE_IDXTYPE_IPK) { /* Integer primary key index */ pNew->wsFlags = WHERE_IPK; @@ -157472,7 +155351,7 @@ static int whereLoopAddBtree( ** better. */ #ifdef SQLITE_ENABLE_STAT4 - pNew->rRun = rSize + 16 - 2*((pTab->tabFlags & TF_HasStat4)!=0); + pNew->rRun = rSize + 16 - 2 * ((pTab->tabFlags & TF_HasStat4) != 0); #else pNew->rRun = rSize + 16; #endif @@ -157480,58 +155359,51 @@ static int whereLoopAddBtree( whereLoopOutputAdjust(pWC, pNew, rSize); rc = whereLoopInsert(pBuilder, pNew); pNew->nOut = rSize; - if( rc ) break; - }else{ + if (rc) + break; + } else { Bitmask m; - if( pProbe->isCovering ){ + if (pProbe->isCovering) { pNew->wsFlags = WHERE_IDX_ONLY | WHERE_INDEXED; m = 0; - }else{ + } else { m = pSrc->colUsed & pProbe->colNotIdxed; - pNew->wsFlags = (m==0) ? (WHERE_IDX_ONLY|WHERE_INDEXED) : WHERE_INDEXED; + 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) - ) - ){ + if (b || !HasRowid(pTab) || pProbe->pPartIdxWhere != 0 || pSrc->fg.isIndexedBy || + (m == 0 && pProbe->bUnordered == 0 && (pProbe->szIdxRow < pTab->szTabRow) && (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 ){ + 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 */ + 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) ){ + WhereClause* pWC2 = &pWInfo->sWC; + for (ii = 0; ii < pWC2->nTerm; 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 ){ + if (pTerm->truthProb <= 0) { nLookup += pTerm->truthProb; - }else{ + } else { nLookup--; - if( pTerm->eOperator & (WO_EQ|WO_IS) ) nLookup -= 19; + if (pTerm->eOperator & (WO_EQ | WO_IS)) + nLookup -= 19; } } @@ -157539,22 +155411,23 @@ static int whereLoopAddBtree( } ApplyCostMultiplier(pNew->rRun, pTab->costMult); whereLoopOutputAdjust(pWC, pNew, rSize); - if( (pSrc->fg.jointype & JT_RIGHT)!=0 && pProbe->aColExpr ){ + 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{ + } else { rc = whereLoopInsert(pBuilder, pNew); } pNew->nOut = rSize; - if( rc ) break; + if (rc) + break; } } pBuilder->bldFlags1 = 0; rc = whereLoopAddBtreeIndex(pBuilder, pSrc, pProbe, 0); - if( pBuilder->bldFlags1==SQLITE_BLDF1_INDEXED ){ + 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 @@ -157575,10 +155448,9 @@ static int whereLoopAddBtree( /* ** 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; +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; } /* @@ -157601,49 +155473,45 @@ static int isLimitTerm(WhereTerm *pTerm){ ** 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; +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]; + 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 ); + 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]; + for (i = 0; i < nConstraint; i++, pIdxCons++) { + WhereTerm* pTerm = &pWC->a[pIdxCons->iTermOffset]; pIdxCons->usable = 0; - if( (pTerm->prereqRight & mUsable)==pTerm->prereqRight - && (pTerm->eOperator & mExclude)==0 - && (pbRetryLimit || !isLimitTerm(pTerm)) - ){ + 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 ); + memset(pUsage, 0, sizeof(pUsage[0]) * nConstraint); + assert(pIdxInfo->needToFreeIdxStr == 0); pIdxInfo->idxStr = 0; pIdxInfo->idxNum = 0; pIdxInfo->orderByConsumed = 0; @@ -157655,8 +155523,8 @@ static int whereLoopAddVirtualOne( /* Invoke the virtual table xBestIndex() method */ rc = vtabBestIndex(pParse, pSrc->pTab, pIdxInfo); - if( rc ){ - if( rc==SQLITE_CONSTRAINT ){ + 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. @@ -157668,49 +155536,45 @@ static int whereLoopAddVirtualOne( } mxTerm = -1; - assert( pNew->nLSlot>=nConstraint ); - memset(pNew->aLTerm, 0, sizeof(pNew->aLTerm[0])*nConstraint ); + 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; + if ((iTerm = pUsage[i].argvIndex - 1) >= 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 ); + 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 ); + testcase(iTerm == nConstraint - 1); + testcase(j == 0); + testcase(j == pWC->nTerm - 1); pTerm = &pWC->a[j]; pNew->prereq |= pTerm->prereqRight; - assert( iTermnLSlot ); + assert(iTerm < pNew->nLSlot); 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 ){ + if (iTerm > mxTerm) + mxTerm = iTerm; + testcase(iTerm == 15); + testcase(iTerm == 16); + if (pUsage[i].omit) { + if (i < 16 && ((1 << i) & mNoOmit) == 0) { + testcase(i != iTerm); + pNew->u.vtab.omitMask |= 1 << iTerm; + } else { + testcase(i != iTerm); + } + if (pTerm->eMatchOp == SQLITE_INDEX_CONSTRAINT_OFFSET) { pNew->u.vtab.bOmitOffset = 1; } } - if( SMASKBIT32(i) & pHidden->mHandleIn ){ + if (SMASKBIT32(i) & pHidden->mHandleIn) { pNew->u.vtab.mHandleIn |= MASKBIT32(iTerm); - }else if( (pTerm->eOperator & WO_IN)!=0 ){ + } 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 @@ -157718,17 +155582,18 @@ static int whereLoopAddVirtualOne( ** together. */ pIdxInfo->orderByConsumed = 0; pIdxInfo->idxFlags &= ~SQLITE_INDEX_SCAN_UNIQUE; - *pbIn = 1; assert( (mExclude & WO_IN)==0 ); + *pbIn = 1; + assert((mExclude & WO_IN) == 0); } - assert( pbRetryLimit || !isLimitTerm(pTerm) ); - if( isLimitTerm(pTerm) && *pbIn ){ + 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 ){ + if (pIdxInfo->needToFreeIdxStr) { sqlite3_free(pIdxInfo->idxStr); pIdxInfo->idxStr = 0; pIdxInfo->needToFreeIdxStr = 0; @@ -157739,42 +155604,40 @@ static int whereLoopAddVirtualOne( } } - pNew->nLTerm = mxTerm+1; - for(i=0; i<=mxTerm; i++){ - if( pNew->aLTerm[i]==0 ){ + 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 ); + sqlite3ErrorMsg(pParse, "%s.xBestIndex malfunction", pSrc->pTab->zName); + testcase(pIdxInfo->needToFreeIdxStr); return SQLITE_ERROR; } } - assert( pNew->nLTerm<=pNew->nLSlot ); + 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->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 ){ + if (pIdxInfo->idxFlags & SQLITE_INDEX_SCAN_UNIQUE) { pNew->wsFlags |= WHERE_ONEROW; - }else{ + } else { pNew->wsFlags &= ~WHERE_ONEROW; } rc = whereLoopInsert(pBuilder, pNew); - if( pNew->u.vtab.needFree ){ + 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))); + WHERETRACE(0xffff, + (" bIn=%d prereqIn=%04llx prereqOut=%04llx\n", *pbIn, (sqlite3_uint64)mPrereq, (sqlite3_uint64)(pNew->prereq & ~mPrereq))); return rc; } @@ -157794,14 +155657,14 @@ static int whereLoopAddVirtualOne( ** ** 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; +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 && iCons < pIdxInfo->nConstraint) { + CollSeq* pC = 0; int iTerm = pIdxInfo->aConstraint[iCons].iTermOffset; - Expr *pX = pHidden->pWC->a[iTerm].pExpr; - if( pX->pLeft ){ + Expr* pX = pHidden->pWC->a[iTerm].pExpr; + if (pX->pLeft) { pC = sqlite3ExprCompareCollSeq(pHidden->pParse, pX); } zRet = (pC ? pC->zName : sqlite3StrBINARY); @@ -157814,13 +155677,13 @@ SQLITE_API const char *sqlite3_vtab_collation(sqlite3_index_info *pIdxInfo, int ** 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]; +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 ){ + if (m & pHidden->mIn) { + if (bHandle == 0) { pHidden->mHandleIn &= ~m; - }else if( bHandle>0 ){ + } else if (bHandle > 0) { pHidden->mHandleIn |= m; } return 1; @@ -157834,31 +155697,27 @@ SQLITE_API int sqlite3_vtab_in(sqlite3_index_info *pIdxInfo, int iCons, int bHan ** 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; +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 ){ + 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 ); + } 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 */ + if (rc == SQLITE_OK && pVal == 0) { /* IMP: R-19933-32160 */ + rc = SQLITE_NOTFOUND; /* IMP: R-36424-56542 */ } return rc; @@ -157867,14 +155726,13 @@ SQLITE_API int sqlite3_vtab_rhs_value( /* ** 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 ); +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) +#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 @@ -157884,16 +155742,16 @@ SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info *pIdxInfo){ ** ** 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; +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; iwriteMask) { + for (i = 0; i < nDb; i++) { sqlite3BeginWriteOperation(pParse, 0, i); } } @@ -157925,39 +155783,39 @@ SQLITE_PRIVATE void sqlite3VtabUsesAllSchemas(sqlite3_index_info *pIdxInfo){ ** 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 */ +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 */ + int bRetry = 0; /* True to retry with LIMIT/OFFSET disabled */ - assert( (mPrereq & mUnusable)==0 ); + 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) ); + assert(IsVirtual(pSrc->pTab)); p = allocateIndexInfo(pWInfo, pWC, mUnusable, pSrc, &mNoOmit); - if( p==0 ) return SQLITE_NOMEM_BKPT; + 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) ){ + if (whereLoopResize(pParse->db, pNew, nConstraint)) { freeIndexInfo(pParse->db, p); return SQLITE_NOMEM_BKPT; } @@ -157965,14 +155823,10 @@ static int whereLoopAddVirtual( /* 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 - ); + 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 @@ -157980,21 +155834,20 @@ static int whereLoopAddVirtual( ** 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 */ + 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 ){ + 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 ); + rc = whereLoopAddVirtualOne(pBuilder, mPrereq, ALLBITS, WO_IN, p, mNoOmit, &bIn, 0); + assert(bIn == 0); mBestNoIn = pNew->prereq & ~mPrereq; - if( mBestNoIn==0 ){ + if (mBestNoIn == 0) { seenZero = 1; seenZeroNoIN = 1; } @@ -158002,50 +155855,50 @@ static int whereLoopAddVirtual( /* 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 ){ + 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 && mThis 0); + for (i = 0; i < nConstraint; i++) { + Bitmask mThis = (pWC->a[p->aConstraint[i].iTermOffset].prereqRight & ~mPrereq); + if (mThis > mPrev && mThis < mNext) + mNext = mThis; } mPrev = mNext; - if( mNext==ALLBITS ) break; - if( mNext==mBest || mNext==mBestNoIn ) continue; - WHERETRACE(0x40, (" VirtualOne: mPrev=%04llx mNext=%04llx\n", - (sqlite3_uint64)mPrev, (sqlite3_uint64)mNext)); - rc = whereLoopAddVirtualOne( - pBuilder, mPrereq, mNext|mPrereq, 0, p, mNoOmit, &bIn, 0); - if( pNew->prereq==mPrereq ){ + if (mNext == ALLBITS) + break; + if (mNext == mBest || mNext == mBestNoIn) + continue; + WHERETRACE(0x40, (" VirtualOne: mPrev=%04llx mNext=%04llx\n", (sqlite3_uint64)mPrev, (sqlite3_uint64)mNext)); + rc = whereLoopAddVirtualOne(pBuilder, mPrereq, mNext | mPrereq, 0, p, mNoOmit, &bIn, 0); + if (pNew->prereq == mPrereq) { seenZero = 1; - if( bIn==0 ) seenZeroNoIN = 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 ){ + 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; + 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 ){ + 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); + rc = whereLoopAddVirtualOne(pBuilder, mPrereq, mPrereq, WO_IN, p, mNoOmit, &bIn, 0); } } - if( p->needToFreeIdxStr ) sqlite3_free(p->idxStr); + 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; @@ -158056,21 +155909,17 @@ static int whereLoopAddVirtual( ** 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; +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; + SrcItem* pItem; pWC = pBuilder->pWC; pWCEnd = pWC->a + pWC->nTerm; @@ -158080,15 +155929,14 @@ static int whereLoopAddOr( 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; + if (pItem->fg.jointype & JT_RIGHT) + return SQLITE_OK; + + for (pTerm = pWC->a; pTerm < pWCEnd && rc == SQLITE_OK; pTerm++) { + if ((pTerm->eOperator & 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; @@ -158096,10 +155944,10 @@ static int whereLoopAddOr( sSubBuild.pOrSet = &sCur; WHERETRACE(0x200, ("Begin processing OR-clause %p\n", pTerm)); - for(pOrTerm=pOrWC->a; pOrTermeOperator & WO_AND)!=0 ){ + for (pOrTerm = pOrWC->a; pOrTerm < pOrWCEnd; pOrTerm++) { + if ((pOrTerm->eOperator & WO_AND) != 0) { sSubBuild.pWC = &pOrTerm->u.pAndInfo->wc; - }else if( pOrTerm->leftCursor==iCur ){ + } else if (pOrTerm->leftCursor == iCur) { tempWC.pWInfo = pWC->pWInfo; tempWC.pOuter = pWC; tempWC.op = TK_AND; @@ -158107,46 +155955,43 @@ static int whereLoopAddOr( tempWC.nBase = 1; tempWC.a = pOrTerm; sSubBuild.pWC = &tempWC; - }else{ + } 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 ){ + 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) ){ + if (IsVirtual(pItem->pTab)) { rc = whereLoopAddVirtual(&sSubBuild, mPrereq, mUnusable); - }else + } else #endif { rc = whereLoopAddBtree(&sSubBuild, mPrereq); } - if( rc==SQLITE_OK ){ + 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 ){ + 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 ){ + } else if (once) { whereOrMove(&sSum, &sCur); once = 0; - }else{ + } else { WhereOrSet sPrev; whereOrMove(&sPrev, &sSum); sSum.n = 0; - for(i=0; irSetup = 0; pNew->iSortIdx = 0; memset(&pNew->u, 0, sizeof(pNew->u)); - for(i=0; rc==SQLITE_OK && ipWInfo; +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; + 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; - + 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; pItema; pItem < pEnd; iTab++, pItem++) { Bitmask mUnusable = 0; pNew->iTab = 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 - ){ + 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 @@ -158222,36 +156064,37 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ ** 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; + if (pItem->fg.jointype & JT_LTORJ) + hasRightJoin = 1; mPrereq |= mPrior; - bFirstPastRJ = (pItem->fg.jointype & JT_RIGHT)!=0; - }else if( !hasRightJoin ){ + 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)) ){ + if (IsVirtual(pItem->pTab)) { + SrcItem* p; + for (p = &pItem[1]; p < pEnd; p++) { + if (mUnusable || (p->fg.jointype & (JT_OUTER | JT_CROSS))) { mUnusable |= sqlite3WhereGetMask(&pWInfo->sMaskSet, p->iCursor); } } rc = whereLoopAddVirtual(pBuilder, mPrereq, mUnusable); - }else + } else #endif /* SQLITE_OMIT_VIRTUALTABLE */ { rc = whereLoopAddBtree(pBuilder, mPrereq); } - if( rc==SQLITE_OK && pBuilder->pWC->hasOr ){ + if (rc == SQLITE_OK && pBuilder->pWC->hasOr) { rc = whereLoopAddOr(pBuilder, mPrereq, mUnusable); } mPrior |= pNew->maskSelf; - if( rc || db->mallocFailed ){ - if( rc==SQLITE_DONE ){ + 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{ + } else { break; } } @@ -158278,39 +156121,38 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ ** 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 */ +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 @@ -158334,36 +156176,38 @@ static i8 wherePathSatisfiesOrderBy( ** automatically order-distinct. */ - assert( pOrderBy!=0 ); - if( nLoop && OptimizationDisabled(db, SQLITE_OrderByIdxJoin) ) return 0; + 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 */ + testcase(nOrderBy == BMS - 1); + if (nOrderBy > BMS - 1) + return 0; /* Cannot optimize overly large ORDER BYs */ isOrderDistinct = 1; - obDone = MASKBIT(nOrderBy)-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) ){ + if (wctrlFlags & (WHERE_ORDERBY_LIMIT | WHERE_ORDERBY_MAX | WHERE_ORDERBY_MIN)) { eqOpMask |= WO_IN; } - for(iLoop=0; isOrderDistinct && obSat0 ) ready |= pLoop->maskSelf; - if( iLoop 0) + ready |= pLoop->maskSelf; + if (iLoop < nLoop) { pLoop = pPath->aLoop[iLoop]; - if( wctrlFlags & WHERE_ORDERBY_LIMIT ) continue; - }else{ + 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) - ){ + 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 ){ + } else if (wctrlFlags & WHERE_DISTINCTBY) { pLoop->u.btree.nDistinctCol = 0; } iCur = pWInfo->pTabList->a[pLoop->iTab].iCursor; @@ -158373,56 +156217,59 @@ static i8 wherePathSatisfiesOrderBy( ** 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 ){ + 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) ){ + assert(wctrlFlags & (WHERE_ORDERBY_LIMIT | WHERE_ORDERBY_MIN | WHERE_ORDERBY_MAX)); + for (j = 0; j < pLoop->nLTerm && 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 ); + testcase(pTerm->pExpr->op == TK_IS); } obSat |= MASKBIT(i); } - if( (pLoop->wsFlags & WHERE_ONEROW)==0 ){ - if( pLoop->wsFlags & WHERE_IPK ){ + 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 ){ + } else if ((pIndex = pLoop->u.btree.pIndex) == 0 || pIndex->bUnordered) { return 0; - }else{ + } else { nKeyCol = pIndex->nKeyCol; nColumn = pIndex->nColumn; - assert( nColumn==nKeyCol+1 || !HasRowid(pIndex->pTable) ); - assert( pIndex->aiColumn[nColumn-1]==XN_ROWID - || !HasRowid(pIndex->pTable)); + 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; + isOrderDistinct = IsUniqueIndex(pIndex) && (pLoop->wsFlags & WHERE_SKIPSCAN) == 0; } /* Loop through all columns of the index and deal with the ones @@ -158430,13 +156277,11 @@ static i8 wherePathSatisfiesOrderBy( */ 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 ){ + assert(j >= pLoop->u.btree.nEq || (pLoop->aLTerm[j] == 0) == (j < pLoop->nSkip)); + if (j < pLoop->u.btree.nEq && j >= pLoop->nSkip) { u16 eOp = pLoop->aLTerm[j]->eOperator; /* Skip over == and IS and ISNULL terms. (Also skip IN terms when @@ -158451,23 +156296,23 @@ static i8 wherePathSatisfiesOrderBy( ** 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 ); + 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) ){ + } 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) ); + Expr* pX = pLoop->aLTerm[j]->pExpr; + for (i = j + 1; i < pLoop->u.btree.nEq; i++) { + if (pLoop->aLTerm[i]->pExpr == pX) { + assert((pLoop->aLTerm[i]->eOperator & WO_IN)); bOnce = 0; break; } @@ -158478,11 +156323,12 @@ static i8 wherePathSatisfiesOrderBy( /* Get the column number in the table (iColumn) and sort order ** (revIdx) for the j-th column of the index. */ - if( pIndex ){ + if (pIndex) { iColumn = pIndex->aiColumn[j]; revIdx = pIndex->aSortOrder[j] & KEYINFO_ORDER_DESC; - if( iColumn==pIndex->pTable->iPKey ) iColumn = XN_ROWID; - }else{ + if (iColumn == pIndex->pTable->iPKey) + iColumn = XN_ROWID; + } else { iColumn = XN_ROWID; revIdx = 0; } @@ -158490,14 +156336,11 @@ static i8 wherePathSatisfiesOrderBy( /* 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 - ){ + if (isOrderDistinct) { + if (iColumn >= 0 && j >= pLoop->u.btree.nEq && pIndex->pTable->aCol[iColumn].notNull == 0) { isOrderDistinct = 0; } - if( iColumn==XN_EXPR ){ + if (iColumn == XN_EXPR) { isOrderDistinct = 0; } } @@ -158506,104 +156349,113 @@ static i8 wherePathSatisfiesOrderBy( ** 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) ){ + 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 ){ + if (iColumn != XN_ROWID) { pColl = sqlite3ExprNNCollSeq(pWInfo->pParse, pOrderBy->a[i].pExpr); - if( sqlite3StrICmp(pColl->zName, pIndex->azColl[j])!=0 ) continue; + if (sqlite3StrICmp(pColl->zName, pIndex->azColl[j]) != 0) + continue; } - if( wctrlFlags & WHERE_DISTINCTBY ){ - pLoop->u.btree.nDistinctCol = j+1; + if (wctrlFlags & WHERE_DISTINCTBY) { + pLoop->u.btree.nDistinctCol = j + 1; } isMatch = 1; break; } - if( isMatch && (wctrlFlags & WHERE_GROUPBY)==0 ){ + 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) - ){ + if (revSet) { + if ((rev ^ revIdx) != (pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_DESC)) { isMatch = 0; } - }else{ + } else { rev = revIdx ^ (pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_DESC); - if( rev ) *pRevMask |= MASKBIT(iLoop); + if (rev) + *pRevMask |= MASKBIT(iLoop); revSet = 1; } } - if( isMatch && (pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_BIGNULL) ){ - if( j==pLoop->u.btree.nEq ){ + if (isMatch && (pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_BIGNULL)) { + if (j == pLoop->u.btree.nEq) { pLoop->wsFlags |= WHERE_BIGNULL_SORT; - }else{ + } else { isMatch = 0; } } - if( isMatch ){ - if( iColumn==XN_ROWID ){ - testcase( distinctColumns==0 ); + if (isMatch) { + if (iColumn == XN_ROWID) { + testcase(distinctColumns == 0); distinctColumns = 1; } obSat |= MASKBIT(i); - }else{ + } 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 ){ + 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(i 0; i--) { + Bitmask m = ALWAYS(i < BMS) ? MASKBIT(i) - 1 : 0; + if ((obSat & m) == m) + return i; } return 0; } return -1; } - /* ** If the WHERE_GROUPBY flag is set in the mask passed to sqlite3WhereBegin(), ** the planner assumes that the specified pOrderBy list is actually a GROUP @@ -158627,19 +156479,22 @@ static i8 wherePathSatisfiesOrderBy( ** SELECT * FROM t1 GROUP BY x,y ORDER BY x,y; -- IsSorted()==1 ** SELECT * FROM t1 GROUP BY y,x ORDER BY y,x; -- IsSorted()==0 */ -SQLITE_PRIVATE int sqlite3WhereIsSorted(WhereInfo *pWInfo){ - assert( pWInfo->wctrlFlags & (WHERE_GROUPBY|WHERE_DISTINCTBY) ); - assert( pWInfo->wctrlFlags & WHERE_SORTBYGROUP ); +SQLITE_PRIVATE int sqlite3WhereIsSorted(WhereInfo* pWInfo) { + assert(pWInfo->wctrlFlags & (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 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; + for (i = 0; i < nLoop; i++) { + zName[i] = pPath->aLoop[i]->cId; + } + if (pLast) + zName[i++] = pLast->cId; zName[i] = 0; return zName; } @@ -158650,12 +156505,7 @@ static const char *wherePathName(WherePath *pPath, int nLoop, WhereLoop *pLast){ ** nOrderby columns and that the first nSorted columns are already in ** order. */ -static LogEst whereSortingCost( - WhereInfo *pWInfo, - LogEst nRow, - int nOrderBy, - int nSorted -){ +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: ** @@ -158671,8 +156521,8 @@ static LogEst whereSortingCost( ** below. */ LogEst rScale, rSortCost; - assert( nOrderBy>0 && 66==sqlite3LogEst(100) ); - rScale = sqlite3LogEst((nOrderBy-nSorted)*100/nOrderBy) - 66; + 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. @@ -158680,12 +156530,15 @@ static LogEst whereSortingCost( ** 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->iLimitwctrlFlags & WHERE_USE_LIMIT) != 0 && pWInfo->iLimit < nRow) { nRow = pWInfo->iLimit; - }else if( (pWInfo->wctrlFlags & WHERE_WANT_DISTINCT) ){ + } 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) ); } + if (nRow > 10) { + nRow -= 10; + assert(10 == sqlite3LogEst(2)); + } } rSortCost += estLog(nRow); return rSortCost; @@ -158703,27 +156556,27 @@ static LogEst whereSortingCost( ** 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 */ +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; @@ -158731,8 +156584,8 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ /* 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 ); + 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 @@ -158740,25 +156593,26 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ ** 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 ){ + if (pWInfo->pOrderBy == 0 || nRowEst == 0) { nOrderBy = 0; - }else{ + } else { nOrderBy = pWInfo->pOrderBy->nExpr; } /* Allocate and initialize space for aTo, aFrom and aSortCost[] */ - nSpace = (sizeof(WherePath)+sizeof(WhereLoop*)*nLoop)*mxChoice*2; + nSpace = (sizeof(WherePath) + sizeof(WhereLoop*) * nLoop) * mxChoice * 2; nSpace += sizeof(LogEst) * nOrderBy; pSpace = sqlite3DbMallocRawNN(db, nSpace); - if( pSpace==0 ) return SQLITE_NOMEM_BKPT; + if (pSpace == 0) + return SQLITE_NOMEM_BKPT; aTo = (WherePath*)pSpace; - aFrom = aTo+mxChoice; + 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){ + pX = (WhereLoop**)(aFrom + mxChoice); + for (ii = mxChoice * 2, pFrom = aTo; ii > 0; ii--, pFrom++, pX += nLoop) { pFrom->aLoop = pX; } - if( nOrderBy ){ + 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 @@ -158768,70 +156622,69 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ aSortCost = (LogEst*)pX; memset(aSortCost, 0, sizeof(LogEst) * nOrderBy); } - assert( aSortCost==0 || &pSpace[nSpace]==(char*)&aSortCost[nOrderBy] ); - assert( aSortCost!=0 || &pSpace[nSpace]==(char*)pX ); + 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) ); + aFrom[0].nRow = MIN(pParse->nQueryLoop, 48); + assert(48 == sqlite3LogEst(28)); nFrom = 1; - assert( aFrom[0].isOrdered==0 ); - if( nOrderBy ){ + 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; + 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 ){ + for (ii = 0, pFrom = aFrom; ii < nFrom; ii++, pFrom++) { + for (pWLoop = pWInfo->pLoops; 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) ); + 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(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{ + if (isOrdered < 0) { + isOrdered = wherePathSatisfiesOrderBy(pWInfo, pWInfo->pOrderBy, pFrom, pWInfo->wctrlFlags, iLoop, pWLoop, &revMask); + } else { revMask = pFrom->revLoop; } - if( isOrdered>=0 && isOrdered= 0 && isOrdered < nOrderBy) { + if (aSortCost[isOrdered] == 0) { + aSortCost[isOrdered] = whereSortingCost(pWInfo, nRowEst, nOrderBy, isOrdered); } /* TUNING: Add a small extra penalty (5) to sorting as an ** extra encouragment to the query planner to select a plan @@ -158839,13 +156692,11 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ ** required. */ rCost = sqlite3LogEstAdd(rUnsorted, aSortCost[isOrdered]) + 5; - WHERETRACE(0x002, - ("---- sort cost=%-3d (%d/%d) increases cost %3d to %-3d\n", - aSortCost[isOrdered], (nOrderBy-isOrdered), nOrderBy, - rUnsorted, rCost)); - }else{ + WHERETRACE(0x002, ("---- sort cost=%-3d (%d/%d) increases cost %3d to %-3d\n", aSortCost[isOrdered], (nOrderBy - isOrdered), + nOrderBy, rUnsorted, rCost)); + } else { rCost = rUnsorted; - rUnsorted -= 2; /* TUNING: Slight bias in favor of no-sort plans */ + rUnsorted -= 2; /* TUNING: Slight bias in favor of no-sort plans */ } /* Check to see if pWLoop should be added to the set of @@ -158859,49 +156710,43 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ ** 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 ); + for (jj = 0, pTo = aTo; jj < nTo; jj++, pTo++) { + if (pTo->maskLoop == maskNew && ((pTo->isOrdered ^ isOrdered) & 0x80) == 0) { + testcase(jj == nTo - 1); break; } } - if( jj>=nTo ){ + if (jj >= nTo) { /* None of the existing best-so-far paths match the candidate. */ - if( nTo>=mxChoice - && (rCost>mxCost || (rCost==mxCost && rUnsorted>=mxUnsorted)) - ){ + 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' : '?'); + 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' : '?'); + if (sqlite3WhereTrace & 0x4) { + sqlite3DebugPrintf("New %s cost=%-3d,%3d,%3d order=%c\n", wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, rUnsorted, + isOrdered >= 0 ? isOrdered + '0' : '?'); } #endif - }else{ + } 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 @@ -158910,40 +156755,28 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ ** 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) - ) - ) - ){ + if (pTo->rCost < rCost || (pTo->rCost == rCost && (pTo->nRow < nOut || (pTo->nRow == 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' : '?'); + 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 ); + testcase(pTo->rCost == rCost); continue; } - testcase( pTo->rCost==rCost+1 ); + 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' : '?'); + 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 } @@ -158954,16 +156787,14 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ pTo->rCost = rCost; pTo->rUnsorted = rUnsorted; pTo->isOrdered = isOrdered; - memcpy(pTo->aLoop, pFrom->aLoop, sizeof(WhereLoop*)*iLoop); + memcpy(pTo->aLoop, pFrom->aLoop, sizeof(WhereLoop*) * iLoop); pTo->aLoop[iLoop] = pWLoop; - if( nTo>=mxChoice ){ + 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) - ){ + for (jj = 1, pTo = &aTo[1]; jj < mxChoice; jj++, pTo++) { + if (pTo->rCost > mxCost || (pTo->rCost == mxCost && pTo->rUnsorted > mxUnsorted)) { mxCost = pTo->rCost; mxUnsorted = pTo->rUnsorted; mxI = jj; @@ -158973,16 +156804,15 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ } } -#ifdef WHERETRACE_ENABLED /* >=2 */ - if( sqlite3WhereTrace & 0x02 ){ +#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 ){ + for (ii = 0, pTo = aTo; ii < nTo; ii++, pTo++) { + sqlite3DebugPrintf(" %s cost=%-3d nrow=%-3d order=%c", wherePathName(pTo, iLoop + 1, 0), pTo->rCost, pTo->nRow, + pTo->isOrdered >= 0 ? (pTo->isOrdered + '0') : '?'); + if (pTo->isOrdered > 0) { sqlite3DebugPrintf(" rev=0x%llx\n", pTo->revLoop); - }else{ + } else { sqlite3DebugPrintf("\n"); } } @@ -158996,7 +156826,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ nFrom = nTo; } - if( nFrom==0 ){ + if (nFrom == 0) { sqlite3ErrorMsg(pParse, "no query solution"); sqlite3DbFreeNN(db, pSpace); return SQLITE_ERROR; @@ -159004,79 +156834,66 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ /* 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]; + for (ii = 1; ii < nFrom; ii++) { + if (pFrom->rCost > aFrom[ii].rCost) + pFrom = &aFrom[ii]; } - assert( pWInfo->nLevel==nLoop ); + assert(pWInfo->nLevel == nLoop); /* Load the lowest cost path into pWInfo */ - for(iLoop=0; iLoopa + iLoop; + for (iLoop = 0; iLoop < nLoop; iLoop++) { + WhereLevel* pLevel = pWInfo->a + 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 - ){ + 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 ){ + 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 ){ + if (pWInfo->pOrderBy) { pWInfo->nOBSat = pFrom->isOrdered; - if( pWInfo->wctrlFlags & WHERE_DISTINCTBY ){ - if( pFrom->isOrdered==pWInfo->pOrderBy->nExpr ){ + if (pWInfo->wctrlFlags & WHERE_DISTINCTBY) { + if (pFrom->isOrdered == pWInfo->pOrderBy->nExpr) { pWInfo->eDistinct = WHERE_DISTINCT_ORDERED; } - }else{ + } else { pWInfo->revMask = pFrom->revLoop; - if( pWInfo->nOBSat<=0 ){ + 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) - ){ + 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 ){ + 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 - ){ + } 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 - ){ + 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 ){ + 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 */ @@ -159095,27 +156912,29 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ ** 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; +static int whereShortCut(WhereLoopBuilder* pBuilder) { + WhereInfo* pWInfo; + SrcItem* pItem; + WhereClause* pWC; + WhereTerm* pTerm; + WhereLoop* pLoop; int iCur; int j; - Table *pTab; - Index *pIdx; + Table* pTab; + Index* pIdx; WhereScan scan; pWInfo = pBuilder->pWInfo; - if( pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE ) return 0; - assert( pWInfo->pTabList->nSrc>=1 ); + 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 ); + 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; @@ -159123,62 +156942,66 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ 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; + 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){ + 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++){ + 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; j < pIdx->nKeyCol; 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 ); + 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 ){ + 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) */ + pLoop->rRun = 39; /* 39==sqlite3LogEst(15) */ break; } } - if( pLoop->wsFlags ){ + if (pLoop->wsFlags) { pLoop->nOut = (LogEst)1; pWInfo->a[0].pWLoop = pLoop; - assert( pWInfo->sMaskSet.n==1 && iCur==pWInfo->sMaskSet.ix[0] ); + 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 ){ + 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; + if (scan.iEquiv > 1) + pLoop->wsFlags |= WHERE_TRANSCONS; #ifdef SQLITE_DEBUG pLoop->cId = '0'; #endif #ifdef WHERETRACE_ENABLED - if( sqlite3WhereTrace ){ + if (sqlite3WhereTrace) { sqlite3DebugPrintf("whereShortCut() used to compute solution\n"); } #endif @@ -159190,8 +157013,8 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ /* ** Helper function for exprIsDeterministic(). */ -static int exprNodeIsDeterministic(Walker *pWalker, Expr *pExpr){ - if( pExpr->op==TK_FUNCTION && ExprHasProperty(pExpr, EP_ConstFunc)==0 ){ +static int exprNodeIsDeterministic(Walker* pWalker, Expr* pExpr) { + if (pExpr->op == TK_FUNCTION && ExprHasProperty(pExpr, EP_ConstFunc) == 0) { pWalker->eCode = 0; return WRC_Abort; } @@ -159203,7 +157026,7 @@ static int exprNodeIsDeterministic(Walker *pWalker, Expr *pExpr){ ** functions. Do not consider non-deterministic SQL functions that are ** part of sub-select statements. */ -static int exprIsDeterministic(Expr *p){ +static int exprIsDeterministic(Expr* p) { Walker w; memset(&w, 0, sizeof(w)); w.eCode = 1; @@ -159213,26 +157036,25 @@ static int exprIsDeterministic(Expr *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; +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)]; + "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) +#define WHERETRACE_ALL_LOOPS(W, C) showAllWhereLoops(W, C) #else -# define WHERETRACE_ALL_LOOPS(W,C) +#define WHERETRACE_ALL_LOOPS(W, C) #endif /* Attempt to omit tables from a join that do not affect the result. @@ -159264,63 +157086,59 @@ static void showAllWhereLoops(WhereInfo *pWInfo, WhereClause *pWC){ ** LEFT JOIN t2 ** LEFT JOIN t3 ON (t1.ipk=t3.ipk) */ -static SQLITE_NOINLINE Bitmask whereOmitNoopJoin( - WhereInfo *pWInfo, - Bitmask notReady -){ +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) ); + 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) ); + assert(pWInfo->pResultSet != 0); + assert(0 == (pWInfo->wctrlFlags & WHERE_AGG_DISTINCT)); tabUsed = sqlite3WhereExprListUsage(&pWInfo->sMaskSet, pWInfo->pResultSet); - if( pWInfo->pOrderBy ){ + if (pWInfo->pOrderBy) { tabUsed |= sqlite3WhereExprListUsage(&pWInfo->sMaskSet, pWInfo->pOrderBy); } - for(i=pWInfo->nLevel-1; i>=1; i--){ + for (i = pWInfo->nLevel - 1; i >= 1; i--) { WhereTerm *pTerm, *pEnd; - SrcItem *pItem; - WhereLoop *pLoop; + 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 - ){ + 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; + 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 - ){ + for (pTerm = pWInfo->sWC.a; pTerm < pEnd; pTerm++) { + if ((pTerm->prereqAll & 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 ){ + for (pTerm = pWInfo->sWC.a; pTerm < pEnd; pTerm++) { + if ((pTerm->prereqAll & 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); + 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 ); + assert(pWInfo->nLevel > 0); } return notReady; } @@ -159343,36 +157161,29 @@ static SQLITE_NOINLINE Bitmask whereOmitNoopJoin( ** 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 -){ +static SQLITE_NOINLINE void whereCheckIfBloomFilterIsUseful(const WhereInfo* pWInfo) { int i; LogEst nSearch; - assert( pWInfo->nLevel>=2 ); - assert( OptimizationEnabled(pWInfo->pParse->db, SQLITE_BloomFilter) ); + 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; + for (i = 1; i < pWInfo->nLevel; 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 ); + 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))); + 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; @@ -159467,53 +157278,50 @@ static SQLITE_NOINLINE void whereCheckIfBloomFilterIsUseful( ** 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 - )); +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 ); + 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; + 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 ){ + testcase(pTabList->nSrc == BMS); + if (pTabList->nSrc > BMS) { sqlite3ErrorMsg(pParse, "at most %d tables in a join", BMS); return 0; } @@ -159532,9 +157340,9 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** 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)); + nByteWInfo = ROUND8P(sizeof(WhereInfo) + (nTabList - 1) * sizeof(WhereLevel)); pWInfo = sqlite3DbMallocRawNN(db, nByteWInfo + sizeof(WhereLoop)); - if( db->mallocFailed ){ + if (db->mallocFailed) { sqlite3DbFree(db, pWInfo); pWInfo = 0; goto whereBeginError; @@ -159553,10 +157361,9 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( #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 */ + 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 @@ -159564,8 +157371,8 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** 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) ); + sWLB.pNew = (WhereLoop*)(((char*)pWInfo) + nByteWInfo); + assert(EIGHT_BYTE_ALIGNMENT(sWLB.pNew)); whereLoopInit(sWLB.pNew); #ifdef SQLITE_DEBUG sWLB.pNew->cId = '*'; @@ -159578,16 +157385,15 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( 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) - ){ + */ + 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{ + } 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<a[ii].iCursor); sqlite3WhereTabFuncArgs(pParse, &pTabList->a[ii], &pWInfo->sWC); - }while( (++ii)nSrc ); - #ifdef SQLITE_DEBUG + } while ((++ii) < pTabList->nSrc); +#ifdef SQLITE_DEBUG { Bitmask mx = 0; - for(ii=0; iinSrc; ii++){ + for (ii = 0; ii < pTabList->nSrc; ii++) { Bitmask m = sqlite3WhereGetMask(pMaskSet, pTabList->a[ii].iCursor); - assert( m>=mx ); + assert(m >= mx); mx = m; } } - #endif +#endif } /* Analyze all of the subexpressions. */ sqlite3WhereExprAnalyze(pTabList, &pWInfo->sWC); sqlite3WhereAddLimit(&pWInfo->sWC, pLimit); - if( pParse->nErr ) goto whereBeginError; + 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 @@ -159635,25 +157442,26 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** 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)) ){ + for (ii = 0; ii < sWLB.pWC->nBase; 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) ){ + 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) ){ + } else if (isDistinctRedundant(pParse, pTabList, &pWInfo->sWC, pResultSet)) { /* The DISTINCT marking is pointless. Ignore it. */ pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE; - }else if( pOrderBy==0 ){ + } else if (pOrderBy == 0) { /* Try to ORDER BY the result set to make distinct processing easier */ pWInfo->wctrlFlags |= WHERE_DISTINCTBY; pWInfo->pOrderBy = pResultSet; @@ -159662,13 +157470,13 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( /* Construct the WhereLoop objects */ #if defined(WHERETRACE_ENABLED) - if( sqlite3WhereTrace & 0xffff ){ - sqlite3DebugPrintf("*** Optimizer Start *** (wctrlFlags: 0x%x",wctrlFlags); - if( wctrlFlags & WHERE_USE_LIMIT ){ + if (sqlite3WhereTrace & 0xffff) { + sqlite3DebugPrintf("*** Optimizer Start *** (wctrlFlags: 0x%x", wctrlFlags); + if (wctrlFlags & WHERE_USE_LIMIT) { sqlite3DebugPrintf(", limit: %d", iAuxArg); } sqlite3DebugPrintf(")\n"); - if( sqlite3WhereTrace & 0x100 ){ + if (sqlite3WhereTrace & 0x100) { Select sSelect; memset(&sSelect, 0, sizeof(sSelect)); sSelect.selFlags = SF_WhereBegin; @@ -159679,15 +157487,16 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( sqlite3TreeViewSelect(0, &sSelect, 0); } } - if( sqlite3WhereTrace & 0x100 ){ /* Display all terms of the WHERE clause */ + 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 ){ + if (nTabList != 1 || whereShortCut(&sWLB) == 0) { rc = whereLoopAddAll(&sWLB); - if( rc ) goto whereBeginError; + if (rc) + goto whereBeginError; #ifdef SQLITE_ENABLE_STAT4 /* If one or more WhereTerm.truthProb values were used in estimating @@ -159695,43 +157504,45 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** 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 ){ + 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; + 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; + 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 (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 (pWInfo->pOrderBy == 0 && (db->flags & SQLITE_ReverseOrder) != 0) { + pWInfo->revMask = ALLBITS; } - if( pParse->nErr ){ + if (pParse->nErr) { goto whereBeginError; } - assert( db->mallocFailed==0 ); + assert(db->mallocFailed == 0); #ifdef WHERETRACE_ENABLED - if( sqlite3WhereTrace ){ + if (sqlite3WhereTrace) { sqlite3DebugPrintf("---- Solution nRow=%d", pWInfo->nRowOut); - if( pWInfo->nOBSat>0 ){ + if (pWInfo->nOBSat > 0) { sqlite3DebugPrintf(" ORDERBY=%d,0x%llx", pWInfo->nOBSat, pWInfo->revMask); } - switch( pWInfo->eDistinct ){ + switch (pWInfo->eDistinct) { case WHERE_DISTINCT_UNIQUE: { sqlite3DebugPrintf(" DISTINCT=unique"); break; @@ -159746,7 +157557,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( } } sqlite3DebugPrintf("\n"); - for(ii=0; iinLevel; ii++){ + for (ii = 0; ii < pWInfo->nLevel; ii++) { sqlite3WhereLoopPrint(pWInfo->a[ii].pWLoop, sWLB.pWC); } } @@ -159763,31 +157574,27 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** 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) - ){ + 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 ); + 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) - ){ + if (pWInfo->nLevel >= 2 && OptimizationEnabled(db, SQLITE_BloomFilter)) { whereCheckIfBloomFilterIsUseful(pWInfo); } #if defined(WHERETRACE_ENABLED) - if( sqlite3WhereTrace & 0x100 ){ /* Display all terms of the WHERE clause */ + 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")); + WHERETRACE(0xffff, ("*** Optimizer Finished ***\n")); #endif pWInfo->pParse->nQueryLoop += pWInfo->nRowOut; @@ -159810,19 +157617,16 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** 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 ){ + 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)) - )){ + 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 ){ + 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); @@ -159833,112 +157637,101 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( /* Open all tables in the pTabList and any indices selected for ** searching those tables. */ - for(ii=0, pLevel=pWInfo->a; iia; ii < nTabList; ii++, pLevel++) { + Table* pTab; /* Table to open */ + int iDb; /* Index of database containing table/index */ + SrcItem* pTabItem; pTabItem = &pTabList->a[pLevel->iFrom]; pTab = pTabItem->pTab; iDb = sqlite3SchemaToIndex(db, pTab->pSchema); pLoop = pLevel->pWLoop; - if( (pTab->tabFlags & TF_Ephemeral)!=0 || IsView(pTab) ){ + if ((pTab->tabFlags & TF_Ephemeral) != 0 || IsView(pTab)) { /* Do nothing */ - }else + } else #ifndef SQLITE_OMIT_VIRTUALTABLE - if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)!=0 ){ - const char *pVTab = (const char *)sqlite3GetVTable(db, pTab); + 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) ){ + } else if (IsVirtual(pTab)) { /* noop */ - }else + } else #endif - if( ((pLoop->wsFlags & WHERE_IDX_ONLY)==0 - && (wctrlFlags & WHERE_OR_SUBCLAUSE)==0) - || (pTabItem->fg.jointype & (JT_LTORJ|JT_RIGHT))!=0 - ){ + 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 ){ + 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 - ){ + 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->nCol < BMS && (pTab->tabFlags & (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++){} + for (; b; b = b >> 1, n++) { + } sqlite3VdbeChangeP4(v, -1, SQLITE_INT_TO_PTR(n), P4_INT32); - assert( n<=pTab->nCol ); + assert(n <= pTab->nCol); } #ifdef SQLITE_ENABLE_CURSOR_HINTS - if( pLoop->u.btree.pIndex!=0 ){ - sqlite3VdbeChangeP5(v, OPFLAG_SEEKEQ|bFordelete); - }else + 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); + sqlite3VdbeAddOp4Dup8(v, OP_ColumnsUsed, pTabItem->iCursor, 0, 0, (const u8*)&pTabItem->colUsed, P4_INT64); #endif - }else{ + } else { sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); } - if( pLoop->wsFlags & WHERE_INDEXED ){ - Index *pIx = pLoop->u.btree.pIndex; + 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 - ){ + 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; + } else if (pWInfo->eOnePass != ONEPASS_OFF) { + Index* pJ = pTabItem->pTab->pIndex; iIndexCur = iAuxArg; - assert( wctrlFlags & WHERE_ONEPASS_DESIRED ); - while( ALWAYS(pJ) && pJ!=pIx ){ + 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 ){ + } else if (iAuxArg && (wctrlFlags & WHERE_OR_SUBCLAUSE) != 0) { iIndexCur = iAuxArg; op = OP_ReopenIdx; - }else{ + } else { iIndexCur = pParse->nTab++; } pLevel->iIdxCur = iIndexCur; - assert( pIx!=0 ); - assert( pIx->pSchema==pTab->pSchema ); - assert( iIndexCur>=0 ); - if( op ){ + 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 - ){ + 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)); @@ -159946,41 +157739,42 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( { u64 colUsed = 0; int ii, jj; - for(ii=0; iinColumn; ii++){ + for (ii = 0; ii < pIx->nColumn; 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); + 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); + 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; + 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; + assert(pTab == pTabItem->pTab); + if (HasRowid(pTab)) { + KeyInfo* pInfo; sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRJ->iMatch, 1); pInfo = sqlite3KeyInfoAlloc(pParse->db, 1, 0); - if( pInfo ){ + if (pInfo) { pInfo->aColl[0] = 0; pInfo->aSortFlags[0] = 0; sqlite3VdbeAppendP4(v, pInfo, P4_KEYINFO); } - }else{ - Index *pPk = sqlite3PrimaryKeyIndex(pTab); + } else { + Index* pPk = sqlite3PrimaryKeyIndex(pTab); sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRJ->iMatch, pPk->nKeyCol); sqlite3VdbeSetP4KeyInfo(pParse, pPk); } @@ -159993,47 +157787,48 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( } } pWInfo->iTop = sqlite3VdbeCurrentAddr(v); - if( db->mallocFailed ) goto whereBeginError; + 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; + SrcItem* pSrc; + if (pParse->nErr) + goto whereBeginError; pLevel = &pWInfo->a[ii]; wsFlags = pLevel->pWLoop->wsFlags; pSrc = &pTabList->a[pLevel->iFrom]; - if( pSrc->fg.isMaterialized ){ - if( pSrc->fg.isCorrelated ){ + 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); + } 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 ){ + 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); + constructAutomaticIndex(pParse, &pWInfo->sWC, &pTabList->a[pLevel->iFrom], notReady, pLevel); #endif - }else{ + } else { sqlite3ConstructBloomFilter(pWInfo, ii, pLevel, notReady); } - if( db->mallocFailed ) goto whereBeginError; + if (db->mallocFailed) + goto whereBeginError; } - addrExplain = sqlite3WhereExplainOneScan( - pParse, pTabList, pLevel, wctrlFlags - ); + addrExplain = sqlite3WhereExplainOneScan(pParse, pTabList, pLevel, wctrlFlags); pLevel->addrBody = sqlite3VdbeCurrentAddr(v); - notReady = sqlite3WhereCodeOneLoopStart(pParse,v,pWInfo,ii,pLevel,notReady); + notReady = sqlite3WhereCodeOneLoopStart(pParse, v, pWInfo, ii, pLevel, notReady); pWInfo->iContinue = pLevel->addrCont; - if( (wsFlags&WHERE_MULTI_OR)==0 && (wctrlFlags&WHERE_OR_SUBCLAUSE)==0 ){ + if ((wsFlags & WHERE_MULTI_OR) == 0 && (wctrlFlags & WHERE_OR_SUBCLAUSE) == 0) { sqlite3WhereAddScanStatus(v, pTabList, pLevel, addrExplain); } } @@ -160045,8 +157840,8 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( /* Jump here if malloc fails */ whereBeginError: - if( pWInfo ){ - testcase( pWInfo->pExprMods!=0 ); + if (pWInfo) { + testcase(pWInfo->pExprMods != 0); whereUndoExprMods(pWInfo); pParse->nQueryLoop = pWInfo->savedNQueryLoop; whereInfoFree(db, pWInfo); @@ -160061,17 +157856,14 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** does that. */ #ifndef SQLITE_DEBUG -# define OpcodeRewriteTrace(D,K,P) /* no-op */ +#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); - } +#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 @@ -160079,16 +157871,23 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** 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; +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; } @@ -160098,27 +157897,27 @@ static int cursorIsOpen(Vdbe *v, int iCur, int k){ ** 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; +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; + 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--){ + for (i = pWInfo->nLevel - 1; i >= 0; i--) { int addr; pLevel = &pWInfo->a[i]; - if( pLevel->pRJ ){ + if (pLevel->pRJ) { /* Terminate the subroutine that forms the interior of the loop of ** the RIGHT JOIN table */ - WhereRightJoin *pRJ = pLevel->pRJ; + WhereRightJoin* pRJ = pLevel->pRJ; sqlite3VdbeResolveLabel(v, pLevel->addrCont); pLevel->addrCont = 0; pRJ->endSubrtn = sqlite3VdbeCurrentAddr(v); @@ -160127,64 +157926,59 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ nRJ++; } pLoop = pLevel->pWLoop; - if( pLevel->op!=OP_Noop ){ + if (pLevel->op != OP_Noop) { #ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT int addrSeek = 0; - Index *pIdx; + 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; + 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); + for (j = 0; j < n; j++) { + sqlite3VdbeAddOp3(v, OP_Column, pLevel->iIdxCur, j, r1 + j); } - pParse->nMem += n+1; - op = pLevel->op==OP_Prev ? OP_SeekLT : OP_SeekGT; + 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); + 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); + 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 ){ + 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); + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, pLevel->regBignull, pLevel->p2 - 1); VdbeCoverage(v); } #ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT - if( addrSeek ) sqlite3VdbeJumpHere(v, addrSeek); + if (addrSeek) + sqlite3VdbeJumpHere(v, addrSeek); #endif - }else if( pLevel->addrCont ){ + } else if (pLevel->addrCont) { sqlite3VdbeResolveLabel(v, pLevel->addrCont); } - if( (pLoop->wsFlags & WHERE_IN_ABLE)!=0 && pLevel->u.in.nIn>0 ){ - struct InLoop *pIn; + 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 (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 @@ -160193,94 +157987,89 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ ** 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); + 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); + 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); + 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); + VdbeCoverageIf(v, pIn->eEndLoopOp == OP_Prev); + VdbeCoverageIf(v, pIn->eEndLoopOp == OP_Next); } - sqlite3VdbeJumpHere(v, pIn->addrInTop-1); + sqlite3VdbeJumpHere(v, pIn->addrInTop - 1); } } sqlite3VdbeResolveLabel(v, pLevel->addrBrk); - if( pLevel->pRJ ){ + if (pLevel->pRJ) { sqlite3VdbeAddOp3(v, OP_Return, pLevel->pRJ->regReturn, 0, 1); VdbeCoverage(v); } - if( pLevel->addrSkip ){ + 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); + sqlite3VdbeJumpHere(v, pLevel->addrSkip - 2); } #ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS - if( pLevel->addrLikeRep ){ - sqlite3VdbeAddOp2(v, OP_DecrJumpZero, (int)(pLevel->iLikeRepCntr>>1), - pLevel->addrLikeRep); + if (pLevel->addrLikeRep) { + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, (int)(pLevel->iLikeRepCntr >> 1), pLevel->addrLikeRep); VdbeCoverage(v); } #endif - if( pLevel->iLeftJoin ){ + 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 ); + 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; + 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 ){ + if (pLevel->op == OP_Return) { sqlite3VdbeAddOp2(v, OP_Gosub, pLevel->p1, pLevel->addrFirst); - }else{ + } else { sqlite3VdbeGoto(v, pLevel->addrFirst); } sqlite3VdbeJumpHere(v, addr); } - VdbeModuleComment((v, "End WHERE-loop%d: %s", i, - pWInfo->pTabList->a[pLevel->iFrom].pTab->zName)); + 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++){ + assert(pWInfo->nLevel <= pTabList->nSrc); + if (pWInfo->pExprMods) + whereUndoExprMods(pWInfo); + for (i = 0, pLevel = pWInfo->a; i < pWInfo->nLevel; i++, pLevel++) { int k, last; VdbeOp *pOp, *pLastOp; - Index *pIdx = 0; - SrcItem *pTabItem = &pTabList->a[pLevel->iFrom]; - Table *pTab = pTabItem->pTab; - assert( pTab!=0 ); + 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 ){ + if (pLevel->pRJ) { sqlite3WhereRightJoinLoop(pWInfo, i, pLevel); continue; } @@ -160289,10 +158078,9 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ ** 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); + if (pTabItem->fg.viaCoroutine) { + testcase(pParse->db->mallocFailed); + translateColumnToCopy(pParse, pLevel->addrBody, pLevel->iTabCur, pTabItem->regResult, 0); continue; } @@ -160307,91 +158095,85 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ ** that reference the table and converts them into opcodes that ** reference the index. */ - if( pLoop->wsFlags & (WHERE_INDEXED|WHERE_IDX_ONLY) ){ + if (pLoop->wsFlags & (WHERE_INDEXED | WHERE_IDX_ONLY)) { pIdx = pLoop->u.btree.pIndex; - }else if( pLoop->wsFlags & WHERE_MULTI_OR ){ + } else if (pLoop->wsFlags & WHERE_MULTI_OR) { pIdx = pLevel->u.pCoveringIdx; } - if( pIdx - && !db->mallocFailed - ){ - if( pWInfo->eOnePass==ONEPASS_OFF || !HasRowid(pIdx->pTable) ){ + if (pIdx && !db->mallocFailed) { + if (pWInfo->eOnePass == ONEPASS_OFF || !HasRowid(pIdx->pTable)) { last = iEnd; - }else{ + } 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); + 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 ); + 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 ){ + assert(pOp <= pLastOp); + do { + if (pOp->p1 != pLevel->iTabCur) { /* no-op */ - }else if( pOp->opcode==OP_Column + } else if (pOp->opcode == OP_Column #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC - || pOp->opcode==OP_Offset + || pOp->opcode == OP_Offset #endif - ){ + ) { int x = pOp->p2; - assert( pIdx->pTable==pTab ); + assert(pIdx->pTable == pTab); #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC - if( pOp->opcode==OP_Offset ){ + if (pOp->opcode == OP_Offset) { /* Do not need to translate the column number */ - }else + } else #endif - if( !HasRowid(pTab) ){ - Index *pPk = sqlite3PrimaryKeyIndex(pTab); + if (!HasRowid(pTab)) { + Index* pPk = sqlite3PrimaryKeyIndex(pTab); x = pPk->aiColumn[x]; - assert( x>=0 ); - }else{ - testcase( x!=sqlite3StorageColumnToTable(pTab,x) ); - x = sqlite3StorageColumnToTable(pTab,x); + assert(x >= 0); + } else { + testcase(x != sqlite3StorageColumnToTable(pTab, x)); + x = sqlite3StorageColumnToTable(pTab, x); } x = sqlite3TableColumnToIndex(pIdx, x); - if( x>=0 ){ + if (x >= 0) { pOp->p2 = x; pOp->p1 = pLevel->iIdxCur; OpcodeRewriteTrace(db, k, pOp); - }else{ + } 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 - ); + 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) - ); + assert((pLoop->wsFlags & WHERE_IDX_ONLY) == 0 || cursorIsOpen(v, pOp->p1, k)); #endif } - }else if( pOp->opcode==OP_Rowid ){ + } else if (pOp->opcode == OP_Rowid) { pOp->p1 = pLevel->iIdxCur; pOp->opcode = OP_IdxRowid; OpcodeRewriteTrace(db, k, pOp); - }else if( pOp->opcode==OP_IfNullRow ){ + } 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"); + if (db->flags & SQLITE_VdbeAddopTrace) + printf("TRANSLATE complete\n"); #endif } } @@ -160402,7 +158184,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ sqlite3VdbeResolveLabel(v, pWInfo->iBreak); /* Final cleanup - */ + */ pParse->nQueryLoop = pWInfo->savedNQueryLoop; whereInfoFree(db, pWInfo); pParse->withinRJSubrtn -= nRJ; @@ -160557,18 +158339,15 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ ** ** 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)++; +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)); +static void row_numberValueFunc(sqlite3_context* pCtx) { + i64* p = (i64*)sqlite3_aggregate_context(pCtx, sizeof(*p)); sqlite3_result_int64(pCtx, (p ? *p : 0)); } @@ -160588,22 +158367,19 @@ struct CallCount { ** ** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW */ -static void dense_rankStepFunc( - sqlite3_context *pCtx, - int nArg, - sqlite3_value **apArg -){ - struct CallCount *p; +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; + if (p) + p->nStep = 1; UNUSED_PARAMETER(nArg); UNUSED_PARAMETER(apArg); } -static void dense_rankValueFunc(sqlite3_context *pCtx){ - struct CallCount *p; +static void dense_rankValueFunc(sqlite3_context* pCtx) { + struct CallCount* p; p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); - if( p ){ - if( p->nStep ){ + if (p) { + if (p->nStep) { p->nValue++; p->nStep = 0; } @@ -160618,36 +158394,34 @@ static void dense_rankValueFunc(sqlite3_context *pCtx){ */ struct NthValueCtx { i64 nStep; - sqlite3_value *pValue; + sqlite3_value* pValue; }; -static void nth_valueStepFunc( - sqlite3_context *pCtx, - int nArg, - sqlite3_value **apArg -){ - struct NthValueCtx *p; +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 ){ + if (p) { i64 iVal; - switch( sqlite3_value_numeric_type(apArg[1]) ){ + 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; + if (((i64)fVal) != fVal) + goto error_out; iVal = (i64)fVal; break; } default: goto error_out; } - if( iVal<=0 ) goto error_out; + if (iVal <= 0) + goto error_out; p->nStep++; - if( iVal==p->nStep ){ + if (iVal == p->nStep) { p->pValue = sqlite3_value_dup(apArg[0]); - if( !p->pValue ){ + if (!p->pValue) { sqlite3_result_error_nomem(pCtx); } } @@ -160656,15 +158430,13 @@ static void nth_valueStepFunc( UNUSED_PARAMETER(apArg); return; - error_out: - sqlite3_result_error( - pCtx, "second argument to nth_value must be a positive integer", -1 - ); +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; +static void nth_valueFinalizeFunc(sqlite3_context* pCtx) { + struct NthValueCtx* p; p = (struct NthValueCtx*)sqlite3_aggregate_context(pCtx, 0); - if( p && p->pValue ){ + if (p && p->pValue) { sqlite3_result_value(pCtx, p->pValue); sqlite3_value_free(p->pValue); p->pValue = 0; @@ -160673,26 +158445,22 @@ static void nth_valueFinalizeFunc(sqlite3_context *pCtx){ #define nth_valueInvFunc noopStepFunc #define nth_valueValueFunc noopValueFunc -static void first_valueStepFunc( - sqlite3_context *pCtx, - int nArg, - sqlite3_value **apArg -){ - struct NthValueCtx *p; +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 ){ + if (p && p->pValue == 0) { p->pValue = sqlite3_value_dup(apArg[0]); - if( !p->pValue ){ + if (!p->pValue) { sqlite3_result_error_nomem(pCtx); } } UNUSED_PARAMETER(nArg); UNUSED_PARAMETER(apArg); } -static void first_valueFinalizeFunc(sqlite3_context *pCtx){ - struct NthValueCtx *p; +static void first_valueFinalizeFunc(sqlite3_context* pCtx) { + struct NthValueCtx* p; p = (struct NthValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); - if( p && p->pValue ){ + if (p && p->pValue) { sqlite3_result_value(pCtx, p->pValue); sqlite3_value_free(p->pValue); p->pValue = 0; @@ -160707,26 +158475,22 @@ static void first_valueFinalizeFunc(sqlite3_context *pCtx){ ** ** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW */ -static void rankStepFunc( - sqlite3_context *pCtx, - int nArg, - sqlite3_value **apArg -){ - struct CallCount *p; +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 ){ + if (p) { p->nStep++; - if( p->nValue==0 ){ + if (p->nValue == 0) { p->nValue = p->nStep; } } UNUSED_PARAMETER(nArg); UNUSED_PARAMETER(apArg); } -static void rankValueFunc(sqlite3_context *pCtx){ - struct CallCount *p; +static void rankValueFunc(sqlite3_context* pCtx) { + struct CallCount* p; p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); - if( p ){ + if (p) { sqlite3_result_int64(pCtx, p->nValue); p->nValue = 0; } @@ -160738,39 +158502,33 @@ static void rankValueFunc(sqlite3_context *pCtx){ ** ** 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 ); +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 ){ + 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 ); +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; +static void percent_rankValueFunc(sqlite3_context* pCtx) { + struct CallCount* p; p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); - if( p ){ + if (p) { p->nValue = p->nStep; - if( p->nTotal>1 ){ - double r = (double)p->nValue / (double)(p->nTotal-1); + if (p->nTotal > 1) { + double r = (double)p->nValue / (double)(p->nTotal - 1); sqlite3_result_double(pCtx, r); - }else{ + } else { sqlite3_result_double(pCtx, 0.0); } } @@ -160783,34 +158541,28 @@ static void percent_rankValueFunc(sqlite3_context *pCtx){ ** ** 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 ); +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 ){ + 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 ); +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; +static void cume_distValueFunc(sqlite3_context* pCtx) { + struct CallCount* p; p = (struct CallCount*)sqlite3_aggregate_context(pCtx, 0); - if( p ){ + if (p) { double r = (double)(p->nStep) / (double)(p->nTotal); sqlite3_result_double(pCtx, r); } @@ -160821,9 +158573,9 @@ static void cume_distValueFunc(sqlite3_context *pCtx){ ** 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 */ + i64 nTotal; /* Total rows in partition */ + i64 nParam; /* Parameter passed to ntile(N) */ + i64 iRow; /* Current row */ }; /* @@ -160832,55 +158584,47 @@ struct NtileCtx { ** ** 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); +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 ){ + 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 - ); + 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); +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; +static void ntileValueFunc(sqlite3_context* pCtx) { + struct NtileCtx* p; p = (struct NtileCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); - if( p && p->nParam>0 ){ + 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); + 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 ); + assert((nLarge * (nSize + 1) + (p->nParam - nLarge) * nSize) == p->nTotal); - if( iRowpVal); p->pVal = sqlite3_value_dup(apArg[0]); - if( p->pVal==0 ){ + if (p->pVal == 0) { sqlite3_result_error_nomem(pCtx); - }else{ + } else { p->nVal++; } } } -static void last_valueInvFunc( - sqlite3_context *pCtx, - int nArg, - sqlite3_value **apArg -){ - struct LastValueCtx *p; +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) ){ + if (ALWAYS(p)) { p->nVal--; - if( p->nVal==0 ){ + if (p->nVal == 0) { sqlite3_value_free(p->pVal); p->pVal = 0; } } } -static void last_valueValueFunc(sqlite3_context *pCtx){ - struct LastValueCtx *p; +static void last_valueValueFunc(sqlite3_context* pCtx) { + struct LastValueCtx* p; p = (struct LastValueCtx*)sqlite3_aggregate_context(pCtx, 0); - if( p && p->pVal ){ + if (p && p->pVal) { sqlite3_result_value(pCtx, p->pVal); } } -static void last_valueFinalizeFunc(sqlite3_context *pCtx){ - struct LastValueCtx *p; +static void last_valueFinalizeFunc(sqlite3_context* pCtx) { + struct LastValueCtx* p; p = (struct LastValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); - if( p && p->pVal ){ + if (p && p->pVal) { sqlite3_result_value(pCtx, p->pVal); sqlite3_value_free(p->pVal); p->pVal = 0; @@ -160958,17 +158694,17 @@ static void last_valueFinalizeFunc(sqlite3_context *pCtx){ ** ** 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 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"; +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 @@ -160979,74 +158715,71 @@ static const char lagName[] = "lag"; ** 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*/ } +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} \ -} +#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} \ -} +#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} \ -} - +#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){ +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), + 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; +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 ){ + if (p == 0) { sqlite3ErrorMsg(pParse, "no such window: %s", zName); } return p; @@ -161069,15 +158802,14 @@ static Window *windowFind(Parse *pParse, Window *pList, const char *zName){ ** 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; +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); @@ -161086,42 +158818,30 @@ SQLITE_PRIVATE void sqlite3WindowUpdate( pWin->eEnd = p->eEnd; pWin->eFrmType = p->eFrmType; pWin->eExclude = p->eExclude; - }else{ + } 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{ + 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; + 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 }, + {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 ){ + for (i = 0; i < ArraySize(aUp); i++) { + if (pFunc->zName == aUp[i].zFunc) { sqlite3ExprDelete(db, pWin->pStart); sqlite3ExprDelete(db, pWin->pEnd); pWin->pEnd = pWin->pStart = 0; @@ -161129,7 +158849,7 @@ SQLITE_PRIVATE void sqlite3WindowUpdate( pWin->eStart = aUp[i].eStart; pWin->eEnd = aUp[i].eEnd; pWin->eExclude = 0; - if( pWin->eStart==TK_FOLLOWING ){ + if (pWin->eStart == TK_FOLLOWING) { pWin->pStart = sqlite3Expr(db, TK_INTEGER, "1"); } break; @@ -161146,11 +158866,11 @@ SQLITE_PRIVATE void sqlite3WindowUpdate( */ typedef struct WindowRewrite WindowRewrite; struct WindowRewrite { - Window *pWin; - SrcList *pSrc; - ExprList *pSub; - Table *pTab; - Select *pSubSelect; /* Current sub-select, if any */ + Window* pWin; + SrcList* pSrc; + ExprList* pSub; + Table* pTab; + Select* pSubSelect; /* Current sub-select, if any */ }; /* @@ -161158,79 +158878,84 @@ struct WindowRewrite { ** 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 ); +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 ){ + if (p->pSubSelect) { + if (pExpr->op != TK_COLUMN) { return WRC_Continue; - }else{ + } else { int nSrc = p->pSrc->nSrc; int i; - for(i=0; iiTable==p->pSrc->a[i].iCursor ) break; + for (i = 0; i < nSrc; i++) { + if (pExpr->iTable == p->pSrc->a[i].iCursor) + break; } - if( i==nSrc ) return WRC_Continue; + if (i == nSrc) + return WRC_Continue; } } - switch( pExpr->op ){ + switch (pExpr->op) { case TK_FUNCTION: - if( !ExprHasProperty(pExpr, EP_WinFunc) ){ + 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 ); + } 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 + /* no break */ deliberate_fall_through - case TK_AGG_FUNCTION: + case TK_AGG_FUNCTION: case TK_COLUMN: { int iCol = -1; - if( pParse->db->mallocFailed ) return WRC_Abort; - if( p->pSub ){ + 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) ){ + for (i = 0; i < p->pSub->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; + 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 ){ + if (p->pSub) { int f = pExpr->flags & EP_Collate; - assert( ExprHasProperty(pExpr, EP_Static)==0 ); + 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->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; + if (pParse->db->mallocFailed) + return WRC_Abort; break; } @@ -161240,12 +158965,12 @@ static int selectWindowRewriteExprCb(Walker *pWalker, Expr *pExpr){ return WRC_Continue; } -static int selectWindowRewriteSelectCb(Walker *pWalker, Select *pSelect){ - struct WindowRewrite *p = pWalker->u.pRewrite; - Select *pSave = p->pSubSelect; - if( pSave==pSelect ){ +static int selectWindowRewriteSelectCb(Walker* pWalker, Select* pSelect) { + struct WindowRewrite* p = pWalker->u.pRewrite; + Select* pSave = p->pSubSelect; + if (pSave == pSelect) { return WRC_Continue; - }else{ + } else { p->pSubSelect = pSelect; sqlite3WalkSelect(pWalker, pSelect); p->pSubSelect = pSave; @@ -161253,7 +158978,6 @@ static int selectWindowRewriteSelectCb(Walker *pWalker, Select *pSelect){ return WRC_Prune; } - /* ** Iterate through each expression in expression-list pEList. For each: ** @@ -161267,18 +158991,13 @@ static int selectWindowRewriteSelectCb(Walker *pWalker, Select *pSelect){ ** 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 */ -){ +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 ); + assert(pWin != 0); memset(&sWalker, 0, sizeof(Walker)); memset(&sRewrite, 0, sizeof(WindowRewrite)); @@ -161301,35 +159020,34 @@ static void selectWindowRewriteEList( ** 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 ){ +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 ){ + for (i = 0; i < pAppend->nExpr; 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 ){ + if (bIntToNull) { int iDummy; - Expr *pSub; + Expr* pSub; pSub = sqlite3ExprSkipCollateAndLikely(pDup); - if( sqlite3ExprIsInteger(pSub, &iDummy) ){ + if (sqlite3ExprIsInteger(pSub, &iDummy)) { pSub->op = TK_NULL; - pSub->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse); + 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; + if (pList) + pList->a[nInit + i].fg.sortFlags = pAppend->a[i].fg.sortFlags; } } return pList; @@ -161343,20 +159061,17 @@ static ExprList *exprListAppendList( ** ** 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 - ){ +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); +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; } @@ -161368,37 +159083,33 @@ static int disallowAggregatesInOrderByCb(Walker *pWalker, Expr *pExpr){ ** 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){ +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; + 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 ){ + if (pTab == 0) { return sqlite3ErrorToParser(db, SQLITE_NOMEM); } sqlite3AggInfoPersistWalkerInit(&w, pParse); sqlite3WalkSelect(&w, p); - if( (p->selFlags & SF_Aggregate)==0 ){ + if ((p->selFlags & SF_Aggregate) == 0) { w.xExprCallback = disallowAggregatesInOrderByCb; w.xSelectCallback = 0; sqlite3WalkExprList(&w, p->pOrderBy); @@ -161416,10 +159127,10 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ ** 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 ){ + 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 ){ + if (sqlite3ExprListCompare(pSort, p->pOrderBy, -1) == 0) { sqlite3ExprListDelete(db, p->pOrderBy); p->pOrderBy = 0; } @@ -161446,21 +159157,21 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ ** 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 ); + 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 ){ + if (pWin->pWFunc->funcFlags & SQLITE_FUNC_SUBTYPE) { selectWindowRewriteEList(pParse, pMWin, pSrc, pArgs, pTab, &pSublist); pWin->iArgCol = (pSublist ? pSublist->nExpr : 0); pWin->bExprArgs = 1; - }else{ + } else { pWin->iArgCol = (pSublist ? pSublist->nExpr : 0); pSublist = exprListAppendList(pParse, pSublist, pArgs, 0); } - if( pWin->pFilter ){ - Expr *pFilter = sqlite3ExprDup(db, pWin->pFilter, 0); + if (pWin->pFilter) { + Expr* pFilter = sqlite3ExprDup(db, pWin->pFilter, 0); pSublist = sqlite3ExprListAppend(pParse, pSublist, pFilter); } pWin->regAccum = ++pParse->nMem; @@ -161474,35 +159185,29 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ ** 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") - ); + 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)); + 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; + 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; + pSub->selFlags |= SF_Expanded | SF_OrderByReqd; pTab2 = sqlite3ResultSetOfSelect(pParse, pSub, SQLITE_AFF_NONE); pSub->selFlags |= (selFlags & SF_Aggregate); - if( pTab2==0 ){ + 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{ + } else { memcpy(pTab, pTab2, sizeof(Table)); pTab->tabFlags |= TF_Ephemeral; p->pSrc->a[0].pTab = pTab; @@ -161513,10 +159218,11 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ w.xSelectCallback2 = sqlite3WalkerDepthDecrease; sqlite3WalkSelect(&w, pSub); } - }else{ + } else { sqlite3SelectDelete(db, pSub); } - if( db->mallocFailed ) rc = SQLITE_NOMEM; + 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 @@ -161524,7 +159230,7 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ sqlite3ParserAddCleanup(pParse, sqlite3DbFree, pTab); } - assert( rc==SQLITE_OK || pParse->nErr!=0 ); + assert(rc == SQLITE_OK || pParse->nErr != 0); return rc; } @@ -161532,10 +159238,11 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ ** 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 ){ +SQLITE_PRIVATE void sqlite3WindowUnlinkFromSelect(Window* p) { + if (p->ppThis) { *p->ppThis = p->pNextWin; - if( p->pNextWin ) p->pNextWin->ppThis = p->ppThis; + if (p->pNextWin) + p->pNextWin->ppThis = p->ppThis; p->ppThis = 0; } } @@ -161543,8 +159250,8 @@ SQLITE_PRIVATE void sqlite3WindowUnlinkFromSelect(Window *p){ /* ** Free the Window object passed as the second argument. */ -SQLITE_PRIVATE void sqlite3WindowDelete(sqlite3 *db, Window *p){ - if( p ){ +SQLITE_PRIVATE void sqlite3WindowDelete(sqlite3* db, Window* p) { + if (p) { sqlite3WindowUnlinkFromSelect(p); sqlite3ExprDelete(db, p->pFilter); sqlite3ExprListDelete(db, p->pPartition); @@ -161560,9 +159267,9 @@ SQLITE_PRIVATE void sqlite3WindowDelete(sqlite3 *db, Window *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; +SQLITE_PRIVATE void sqlite3WindowListDelete(sqlite3* db, Window* p) { + while (p) { + Window* pNext = p->pNextWin; sqlite3WindowDelete(db, p); p = pNext; } @@ -161575,9 +159282,10 @@ SQLITE_PRIVATE void sqlite3WindowListDelete(sqlite3 *db, Window *p){ ** 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); +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); } @@ -161587,28 +159295,25 @@ static Expr *sqlite3WindowOffsetExpr(Parse *pParse, Expr *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; +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 ){ + 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; } @@ -161627,19 +159332,18 @@ SQLITE_PRIVATE Window *sqlite3WindowAlloc( ** 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)) - ){ + 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; + if (pWin == 0) + goto windowAllocErr; pWin->eFrmType = eType; pWin->eStart = eStart; pWin->eEnd = eEnd; - if( eExclude==0 && OptimizationDisabled(pParse->db, SQLITE_WindowFunc) ){ + if (eExclude == 0 && OptimizationDisabled(pParse->db, SQLITE_WindowFunc)) { eExclude = TK_NO; } pWin->eExclude = eExclude; @@ -161659,20 +159363,14 @@ SQLITE_PRIVATE Window *sqlite3WindowAlloc( ** 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 ){ +SQLITE_PRIVATE Window* sqlite3WindowAssemble(Parse* pParse, Window* pWin, ExprList* pPartition, ExprList* pOrderBy, Token* pBase) { + if (pWin) { pWin->pPartition = pPartition; pWin->pOrderBy = pOrderBy; - if( pBase ){ + if (pBase) { pWin->zBase = sqlite3DbStrNDup(pParse->db, pBase->z, pBase->n); } - }else{ + } else { sqlite3ExprListDelete(pParse->db, pPartition); sqlite3ExprListDelete(pParse->db, pOrderBy); } @@ -161686,28 +159384,26 @@ SQLITE_PRIVATE Window *sqlite3WindowAssemble( ** 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; +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 ){ + if (pWin->pPartition) { zErr = "PARTITION clause"; - }else if( pExist->pOrderBy && pWin->pOrderBy ){ + } else if (pExist->pOrderBy && pWin->pOrderBy) { zErr = "ORDER BY clause"; - }else if( pExist->bImplicitFrame==0 ){ + } else if (pExist->bImplicitFrame == 0) { zErr = "frame specification"; } - if( zErr ){ - sqlite3ErrorMsg(pParse, - "cannot override %s of window: %s", zErr, pWin->zBase - ); - }else{ + 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 ); + if (pExist->pOrderBy) { + assert(pWin->pOrderBy == 0); pWin->pOrderBy = sqlite3ExprListDup(db, pExist->pOrderBy, 0); } sqlite3DbFree(db, pWin->zBase); @@ -161720,19 +159416,17 @@ SQLITE_PRIVATE void sqlite3WindowChain(Parse *pParse, Window *pWin, Window *pLis /* ** 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 ); +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" - ); + if ((p->flags & EP_Distinct) && pWin->eFrmType != TK_FILTER) { + sqlite3ErrorMsg(pParse, "DISTINCT is not supported for window functions"); } - }else{ + } else { sqlite3WindowDelete(pParse->db, pWin); } } @@ -161743,17 +159437,17 @@ SQLITE_PRIVATE void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){ ** 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) ){ +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 ){ + if (pSel->pWin) { pSel->pWin->ppThis = &pWin->pNextWin; } pSel->pWin = pWin; pWin->ppThis = &pSel->pWin; - }else{ - if( sqlite3ExprListCompare(pWin->pPartition, pSel->pWin->pPartition,-1) ){ + } else { + if (sqlite3ExprListCompare(pWin->pPartition, pSel->pWin->pPartition, -1)) { pSel->selFlags |= SF_MultiPart; } } @@ -161765,64 +159459,65 @@ SQLITE_PRIVATE void sqlite3WindowLink(Select *pSel, Window *pWin){ ** 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 -){ +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)) ){ + 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)) ){ + if ((res = sqlite3ExprListCompare(p1->pOrderBy, p2->pOrderBy, -1))) { return res; } - if( bFilter ){ - if( (res = sqlite3ExprCompare(pParse, p1->pFilter, p2->pFilter, -1)) ){ + 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){ +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); + 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); + 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 ){ + if (pMWin->pPartition) { int nExpr = pMWin->pPartition->nExpr; - pMWin->regPart = pParse->nMem+1; + pMWin->regPart = pParse->nMem + 1; pParse->nMem += nExpr; - sqlite3VdbeAddOp3(v, OP_Null, 0, pMWin->regPart, pMWin->regPart+nExpr-1); + 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 ){ + if (pMWin->eExclude) { pMWin->regStartRowid = ++pParse->nMem; pMWin->regEndRowid = ++pParse->nMem; pMWin->csrApp = pParse->nTab++; @@ -161832,9 +159527,9 @@ SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse *pParse, Select *pSelect){ return; } - for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - FuncDef *p = pWin->pWFunc; - if( (p->funcFlags & SQLITE_FUNC_MINMAX) && pWin->eStart!=TK_UNBOUNDED ){ + 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: ** @@ -161842,42 +159537,40 @@ SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse *pParse, Select *pSelect){ ** regApp+1: integer value used to ensure keys are unique ** regApp+2: output of MakeRecord */ - ExprList *pList; - KeyInfo *pKeyInfo; - assert( ExprUseXList(pWin->pOwner) ); + 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; + pWin->regApp = pParse->nMem + 1; pParse->nMem += 3; - if( pKeyInfo && pWin->pWFunc->zName[1]=='i' ){ - assert( pKeyInfo->aSortFlags[0]==0 ); + 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 ){ + 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->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 ){ + } 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_STARTING_INT 0 +#define WINDOW_ENDING_INT 1 #define WINDOW_NTH_VALUE_INT 2 -#define WINDOW_STARTING_NUM 3 -#define WINDOW_ENDING_NUM 4 +#define WINDOW_STARTING_NUM 3 +#define WINDOW_ENDING_NUM 4 /* ** A "PRECEDING " (eCond==0) or "FOLLOWING " (eCond==1) or the @@ -161886,43 +159579,41 @@ SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse *pParse, Select *pSelect){ ** 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 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); + 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= 0 && eCond < ArraySize(azErr)); sqlite3VdbeAddOp2(v, OP_Integer, 0, regZero); - if( eCond>=WINDOW_STARTING_NUM ){ + if (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); + 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); + 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); + 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); + 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 */ + 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); @@ -161933,9 +159624,9 @@ static void windowCheckValue(Parse *pParse, int reg, int eCond){ ** 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) ); +static int windowArgCount(Window* pWin) { + const ExprList* pList; + assert(ExprUseXList(pWin->pOwner)); pList = pWin->pOwner->x.pList; return (pList ? pList->nExpr : 0); } @@ -161947,8 +159638,8 @@ typedef struct WindowCsrAndReg WindowCsrAndReg; ** See comments above struct WindowCodeArg. */ struct WindowCsrAndReg { - int csr; /* Cursor number */ - int reg; /* First in array of peer values */ + int csr; /* Cursor number */ + int reg; /* First in array of peer values */ }; /* @@ -162007,13 +159698,13 @@ struct WindowCsrAndReg { ** 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 */ + 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; @@ -162025,20 +159716,16 @@ struct WindowCodeArg { ** 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; +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); + for (i = 0; i < pOrderBy->nExpr; i++) { + sqlite3VdbeAddOp3(v, OP_Column, csr, iColOff + i, reg + i); } } } @@ -162062,106 +159749,99 @@ static void windowReadPeerValues( ** 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; +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 ); + 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 ); + 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); + for (i = 0; i < nArg; i++) { + if (i != 1 || pFunc->zName != 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) - ){ + 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); + 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{ + 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, 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 ){ + } 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 ){ + 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 ); + 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); + 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 ){ + if (pWin->bExprArgs) { int iOp = sqlite3VdbeCurrentAddr(v); int iEnd; - assert( ExprUseXList(pWin->pOwner) ); + 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 ){ + for (iEnd = sqlite3VdbeCurrentAddr(v); iOp < iEnd; iOp++) { + VdbeOp* pOp = sqlite3VdbeGetOp(v, iOp); + if (pOp->opcode == OP_Column && pOp->p1 == pMWin->iEphCsr) { pOp->p1 = csr; } } } - if( pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ - CollSeq *pColl; - assert( nArg>0 ); - assert( ExprUseXList(pWin->pOwner) ); + 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); + sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (const char*)pColl, P4_COLLSEQ); } - sqlite3VdbeAddOp3(v, bInverse? OP_AggInverse : OP_AggStep, - bInverse, regArg, pWin->regAccum); + sqlite3VdbeAddOp3(v, bInverse ? OP_AggInverse : OP_AggStep, bInverse, regArg, pWin->regAccum); sqlite3VdbeAppendP4(v, pFunc, P4_FUNCDEF); sqlite3VdbeChangeP5(v, (u8)nArg); - if( pWin->bExprArgs ){ + if (pWin->bExprArgs) { sqlite3ReleaseTempRange(pParse, regArg, nArg); } - if( addrIf ) sqlite3VdbeJumpHere(v, addrIf); + if (addrIf) + sqlite3VdbeJumpHere(v, addrIf); } } } @@ -162171,7 +159851,7 @@ static void windowAggStep( */ #define WINDOW_RETURN_ROW 1 #define WINDOW_AGGINVERSE 2 -#define WINDOW_AGGSTEP 3 +#define WINDOW_AGGSTEP 3 /* ** Generate VM code to invoke either xValue() (bFin==0) or xFinalize() @@ -162179,33 +159859,30 @@ static void windowAggStep( ** 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) - ){ +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{ + sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v) - 2); + } else if (pWin->regApp) { + assert(pMWin->regStartRowid == 0); + } else { int nArg = windowArgCount(pWin); - if( bFin ){ + 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); + } else { + sqlite3VdbeAddOp3(v, OP_AggValue, pWin->regAccum, nArg, pWin->regResult); sqlite3VdbeAppendP4(v, pWin->pWFunc, P4_FUNCDEF); } } @@ -162218,16 +159895,16 @@ static void windowAggFinal(WindowCodeArg *p, int bFin){ ** 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; +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 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; @@ -162237,7 +159914,7 @@ static void windowFullScan(WindowCodeArg *p){ VdbeModuleComment((v, "windowFullScan begin")); - assert( pMWin!=0 ); + assert(pMWin != 0); csr = pMWin->csrApp; nPeer = (pMWin->pOrderBy ? pMWin->pOrderBy->nExpr : 0); @@ -162246,7 +159923,7 @@ static void windowFullScan(WindowCodeArg *p){ regCRowid = sqlite3GetTempReg(pParse); regRowid = sqlite3GetTempReg(pParse); - if( nPeer ){ + if (nPeer) { regCPeer = sqlite3GetTempRange(pParse, nPeer); regPeer = sqlite3GetTempRange(pParse, nPeer); } @@ -162254,7 +159931,7 @@ static void windowFullScan(WindowCodeArg *p){ sqlite3VdbeAddOp2(v, OP_Rowid, pMWin->iEphCsr, regCRowid); windowReadPeerValues(p, pMWin->iEphCsr, regCPeer); - for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ + for (pWin = pMWin; pWin; pWin = pWin->pNextWin) { sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); } @@ -162265,32 +159942,33 @@ static void windowFullScan(WindowCodeArg *p){ sqlite3VdbeAddOp3(v, OP_Gt, pMWin->regEndRowid, lblBrk, regRowid); VdbeCoverageNeverNull(v); - if( pMWin->eExclude==TK_CURRENT ){ + if (pMWin->eExclude == TK_CURRENT) { sqlite3VdbeAddOp3(v, OP_Eq, regCRowid, lblNext, regRowid); VdbeCoverageNeverNull(v); - }else if( pMWin->eExclude!=TK_NO ){ + } else if (pMWin->eExclude != TK_NO) { int addr; int addrEq = 0; - KeyInfo *pKeyInfo = 0; + KeyInfo* pKeyInfo = 0; - if( pMWin->pOrderBy ){ + if (pMWin->pOrderBy) { pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pMWin->pOrderBy, 0, 0); } - if( pMWin->eExclude==TK_TIES ){ + if (pMWin->eExclude == TK_TIES) { addrEq = sqlite3VdbeAddOp3(v, OP_Eq, regCRowid, 0, regRowid); VdbeCoverageNeverNull(v); } - if( pKeyInfo ){ + if (pKeyInfo) { windowReadPeerValues(p, csr, regPeer); sqlite3VdbeAddOp3(v, OP_Compare, regPeer, regCPeer, nPeer); sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); - addr = sqlite3VdbeCurrentAddr(v)+1; + addr = sqlite3VdbeCurrentAddr(v) + 1; sqlite3VdbeAddOp3(v, OP_Jump, addr, lblNext, addr); VdbeCoverageEqNe(v); - }else{ + } else { sqlite3VdbeAddOp2(v, OP_Goto, 0, lblNext); } - if( addrEq ) sqlite3VdbeJumpHere(v, addrEq); + if (addrEq) + sqlite3VdbeJumpHere(v, addrEq); } windowAggStep(p, pMWin, csr, 0, p->regArg); @@ -162298,11 +159976,11 @@ static void windowFullScan(WindowCodeArg *p){ sqlite3VdbeResolveLabel(v, lblNext); sqlite3VdbeAddOp2(v, OP_Next, csr, addrNext); VdbeCoverage(v); - sqlite3VdbeJumpHere(v, addrNext-1); - sqlite3VdbeJumpHere(v, addrNext+1); + sqlite3VdbeJumpHere(v, addrNext - 1); + sqlite3VdbeJumpHere(v, addrNext + 1); sqlite3ReleaseTempReg(pParse, regRowid); sqlite3ReleaseTempReg(pParse, regCRowid); - if( nPeer ){ + if (nPeer) { sqlite3ReleaseTempRange(pParse, regPeer, nPeer); sqlite3ReleaseTempRange(pParse, regCPeer, nPeer); } @@ -162324,62 +160002,59 @@ static void windowFullScan(WindowCodeArg *p){ ** lag() ** lead() */ -static void windowReturnOneRow(WindowCodeArg *p){ - Window *pMWin = p->pMWin; - Vdbe *v = p->pVdbe; +static void windowReturnOneRow(WindowCodeArg* p) { + Window* pMWin = p->pMWin; + Vdbe* v = p->pVdbe; - if( pMWin->regStartRowid ){ + 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 - ){ + } 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); + if (pFunc->zName == nth_valueName) { + sqlite3VdbeAddOp3(v, OP_Column, pMWin->iEphCsr, pWin->iArgCol + 1, tmpReg); windowCheckValue(pParse, tmpReg, 2); - }else{ + } else { sqlite3VdbeAddOp2(v, OP_Integer, 1, tmpReg); } sqlite3VdbeAddOp3(v, OP_Add, tmpReg, pWin->regApp, tmpReg); - sqlite3VdbeAddOp3(v, OP_Gt, pWin->regApp+1, lbl, 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 ){ + } 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 ){ + if (nArg < 3) { sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); - }else{ - sqlite3VdbeAddOp3(v, OP_Column, iEph,pWin->iArgCol+2,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); + 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); + } 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_Column, iEph, pWin->iArgCol + 1, tmpReg2); sqlite3VdbeAddOp3(v, op, tmpReg2, tmpReg, tmpReg); sqlite3ReleaseTempReg(pParse, tmpReg2); } @@ -162401,30 +160076,30 @@ static void windowReturnOneRow(WindowCodeArg *p){ ** any equivalent initialization required by any built-in window functions ** in the list. */ -static int windowInitAccum(Parse *pParse, Window *pMWin){ - Vdbe *v = sqlite3GetVdbe(pParse); +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 ); + 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 ){ + 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); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp + 1); } - if( (pFunc->funcFlags & SQLITE_FUNC_MINMAX) && pWin->csrApp ){ - assert( pWin->eStart!=TK_UNBOUNDED ); + 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); + sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp + 1); } } } - regArg = pParse->nMem+1; + regArg = pParse->nMem + 1; pParse->nMem += nArg; return regArg; } @@ -162433,16 +160108,13 @@ static int windowInitAccum(Parse *pParse, Window *pMWin){ ** 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) - ){ +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; } } @@ -162459,25 +160131,20 @@ static int windowCacheFrame(Window *pMWin){ ** 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 ){ +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); + 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 - ); + sqlite3VdbeAddOp3(v, OP_Jump, sqlite3VdbeCurrentAddr(v) + 1, addr, sqlite3VdbeCurrentAddr(v) + 1); VdbeCoverageEqNe(v); - sqlite3VdbeAddOp3(v, OP_Copy, regNew, regOld, nVal-1); - }else{ + sqlite3VdbeAddOp3(v, OP_Copy, regNew, regOld, nVal - 1); + } else { sqlite3VdbeAddOp2(v, OP_Goto, 0, addr); } } @@ -162505,44 +160172,51 @@ static void windowIfNewPeer( ** 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; +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; + 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 - )); + 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 @@ -162563,10 +160237,11 @@ static void windowCodeRangeTest( ** 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 ){ + 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 ){ + int addr = sqlite3VdbeAddOp1(v, OP_NotNull, reg1); + VdbeCoverage(v); + switch (op) { case OP_Ge: sqlite3VdbeAddOp2(v, OP_Goto, 0, lbl); break; @@ -162578,14 +160253,17 @@ static void windowCodeRangeTest( sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); VdbeCoverage(v); break; - default: assert( op==OP_Lt ); /* no-op */ 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 ){ + sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); + VdbeCoverage(v); + if (op == OP_Gt || op == OP_Ge) { sqlite3VdbeChangeP2(v, -1, addrDone); } } @@ -162606,8 +160284,9 @@ static void windowCodeRangeTest( 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); + 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); @@ -162615,17 +160294,22 @@ static void windowCodeRangeTest( /* 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); + 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); + 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); @@ -162638,56 +160322,49 @@ static void windowCodeRangeTest( ** 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 */ -){ +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; + Parse* pParse = p->pParse; + Window* pMWin = p->pMWin; int ret = 0; - Vdbe *v = p->pVdbe; + Vdbe* v = p->pVdbe; int addrContinue = 0; - int bPeer = (pMWin->eFrmType!=TK_ROWS); + 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 ); + if (op == WINDOW_AGGINVERSE && pMWin->eStart == TK_UNBOUNDED) { + assert(regCountdown == 0 && jumpOnEof == 0); return 0; } - if( regCountdown>0 ){ - if( pMWin->eFrmType==TK_RANGE ){ + 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 - ); + 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 { + windowCodeRangeTest(p, OP_Gt, p->end.csr, regCountdown, p->current.csr, lblDone); } - }else{ + } else { sqlite3VdbeAddOp3(v, OP_IfPos, regCountdown, lblDone, 1); VdbeCoverage(v); } } - if( op==WINDOW_RETURN_ROW && pMWin->regStartRowid==0 ){ + if (op == WINDOW_RETURN_ROW && pMWin->regStartRowid == 0) { windowAggFinal(p, 0); } addrContinue = sqlite3VdbeCurrentAddr(v); @@ -162698,27 +160375,25 @@ static int windowCodeOp( ** 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 - ){ + if (pMWin->eStart == pMWin->eEnd && regCountdown && pMWin->eFrmType == TK_RANGE) { int regRowid1 = sqlite3GetTempReg(pParse); int regRowid2 = sqlite3GetTempReg(pParse); - if( op==WINDOW_AGGINVERSE ){ + 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 ){ + } 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 ); + assert(pMWin->eStart == TK_PRECEDING || pMWin->eStart == TK_FOLLOWING); } - switch( op ){ + switch (op) { case WINDOW_RETURN_ROW: csr = p->current.csr; reg = p->current.reg; @@ -162728,45 +160403,45 @@ static int windowCodeOp( case WINDOW_AGGINVERSE: csr = p->start.csr; reg = p->start.reg; - if( pMWin->regStartRowid ){ - assert( pMWin->regEndRowid ); + if (pMWin->regStartRowid) { + assert(pMWin->regEndRowid); sqlite3VdbeAddOp2(v, OP_AddImm, pMWin->regStartRowid, 1); - }else{ + } else { windowAggStep(p, pMWin, csr, 1, p->regArg); } break; default: - assert( op==WINDOW_AGGSTEP ); + assert(op == WINDOW_AGGSTEP); csr = p->end.csr; reg = p->end.reg; - if( pMWin->regStartRowid ){ - assert( pMWin->regEndRowid ); + if (pMWin->regStartRowid) { + assert(pMWin->regEndRowid); sqlite3VdbeAddOp2(v, OP_AddImm, pMWin->regEndRowid, 1); - }else{ + } else { windowAggStep(p, pMWin, csr, 0, p->regArg); } break; } - if( op==p->eDelete ){ + if (op == p->eDelete) { sqlite3VdbeAddOp1(v, OP_Delete, csr); sqlite3VdbeChangeP5(v, OPFLAG_SAVEPOSITION); } - if( jumpOnEof ){ - sqlite3VdbeAddOp2(v, OP_Next, csr, sqlite3VdbeCurrentAddr(v)+2); + 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); + } else { + sqlite3VdbeAddOp2(v, OP_Next, csr, sqlite3VdbeCurrentAddr(v) + 1 + bPeer); VdbeCoverage(v); - if( bPeer ){ + if (bPeer) { sqlite3VdbeAddOp2(v, OP_Goto, 0, lblDone); } } - if( bPeer ){ + if (bPeer) { int nReg = (pMWin->pOrderBy ? pMWin->pOrderBy->nExpr : 0); int regTmp = (nReg ? sqlite3GetTempRange(pParse, nReg) : 0); windowReadPeerValues(p, csr, regTmp); @@ -162774,24 +160449,23 @@ static int windowCodeOp( sqlite3ReleaseTempRange(pParse, regTmp, nReg); } - if( addrNextRange ){ + 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) ){ +SQLITE_PRIVATE Window* sqlite3WindowDup(sqlite3* db, Expr* pOwner, Window* p) { + Window* pNew = 0; + if (ALWAYS(p)) { pNew = sqlite3DbMallocZero(db, sizeof(Window)); - if( pNew ){ + if (pNew) { pNew->zName = sqlite3DbStrDup(db, p->zName); pNew->zBase = sqlite3DbStrDup(db, p->zBase); pNew->pFilter = sqlite3ExprDup(db, p->pFilter, 0); @@ -162820,14 +160494,15 @@ SQLITE_PRIVATE Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){ ** 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; +SQLITE_PRIVATE Window* sqlite3WindowListDup(sqlite3* db, Window* p) { + Window* pWin; + Window* pRet = 0; + Window** pp = &pRet; - for(pWin=p; pWin; pWin=pWin->pNextWin){ + for (pWin = p; pWin; pWin = pWin->pNextWin) { *pp = sqlite3WindowDup(db, 0, pWin); - if( *pp==0 ) break; + if (*pp == 0) + break; pp = &((*pp)->pNextWin); } @@ -162842,12 +160517,12 @@ SQLITE_PRIVATE Window *sqlite3WindowListDup(sqlite3 *db, Window *p){ ** If an OOM error occurs, this function sets the Parse.db.mallocFailed ** flag and returns zero. */ -static int windowExprGtZero(Parse *pParse, Expr *pExpr){ +static int windowExprGtZero(Parse* pParse, Expr* pExpr) { int ret = 0; - sqlite3 *db = pParse->db; - sqlite3_value *pVal = 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 ){ + if (pVal && sqlite3_value_int(pVal) > 0) { ret = 1; } sqlite3ValueFree(pVal); @@ -163189,44 +160864,37 @@ static int windowExprGtZero(Parse *pParse, Expr *pExpr){ ** 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 - ); +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); @@ -163238,9 +160906,9 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( 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; + 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 @@ -163248,23 +160916,19 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( ** (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 ){ + switch (pMWin->eStart) { case TK_FOLLOWING: - if( pMWin->eFrmType!=TK_RANGE - && windowExprGtZero(pParse, pMWin->pStart) - ){ + 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) - ){ + if (windowCacheFrame(pMWin) == 0) { + if (pMWin->eEnd == TK_PRECEDING) { + if (pMWin->eFrmType != TK_RANGE && windowExprGtZero(pParse, pMWin->pEnd)) { s.eDelete = WINDOW_AGGSTEP; } - }else{ + } else { s.eDelete = WINDOW_RETURN_ROW; } } @@ -163277,7 +160941,7 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( /* 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; + regNew = pParse->nMem + 1; pParse->nMem += nInput; regRecord = ++pParse->nMem; s.regRowid = ++pParse->nMem; @@ -163285,31 +160949,36 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( /* 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 ){ + if (pMWin->eStart == TK_PRECEDING || pMWin->eStart == TK_FOLLOWING) { regStart = ++pParse->nMem; } - if( pMWin->eEnd==TK_PRECEDING || pMWin->eEnd==TK_FOLLOWING ){ + 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 ){ + 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; + 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 ){ + if (pMWin->pPartition) { int addr; - ExprList *pPart = pMWin->pPartition; + ExprList* pPart = pMWin->pPartition; int nPart = pPart->nExpr; int regNewPart = regNew + pMWin->nBufferCol; - KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pPart, 0, 0); + 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); + 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); + sqlite3VdbeAddOp3(v, OP_Copy, regNewPart, pMWin->regPart, nPart - 1); } /* Insert the new row into the ephemeral table */ @@ -163344,20 +161013,20 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( /* This block is run for the first row of each partition */ s.regArg = windowInitAccum(pParse, pMWin); - if( regStart ){ + if (regStart) { sqlite3ExprCode(pParse, pMWin->pStart, regStart); - windowCheckValue(pParse, regStart, 0 + (pMWin->eFrmType==TK_RANGE?3:0)); + windowCheckValue(pParse, regStart, 0 + (pMWin->eFrmType == TK_RANGE ? 3 : 0)); } - if( regEnd ){ + if (regEnd) { sqlite3ExprCode(pParse, pMWin->pEnd, regEnd); - windowCheckValue(pParse, regEnd, 1 + (pMWin->eFrmType==TK_RANGE?3:0)); + 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); + 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 */ + 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); @@ -163366,12 +161035,12 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( sqlite3VdbeAddOp2(v, OP_Goto, 0, lblWhereEnd); sqlite3VdbeJumpHere(v, addrGe); } - if( pMWin->eStart==TK_FOLLOWING && pMWin->eFrmType!=TK_RANGE && regEnd ){ - assert( pMWin->eEnd==TK_FOLLOWING ); + 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 ){ + if (pMWin->eStart != TK_UNBOUNDED) { sqlite3VdbeAddOp2(v, OP_Rewind, s.start.csr, 1); VdbeCoverageNeverTaken(v); } @@ -163379,11 +161048,11 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( 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); + 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); @@ -163391,13 +161060,13 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( sqlite3VdbeJumpHere(v, addrNe); /* Beginning of the block executed for the second and subsequent rows. */ - if( regPeer ){ + if (regPeer) { windowIfNewPeer(pParse, pOrderBy, regNewPeer, regPeer, lblWhereEnd); } - if( pMWin->eStart==TK_FOLLOWING ){ + if (pMWin->eStart == TK_FOLLOWING) { windowCodeOp(&s, WINDOW_AGGSTEP, 0, 0); - if( pMWin->eEnd!=TK_UNBOUNDED ){ - if( pMWin->eFrmType==TK_RANGE ){ + 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); @@ -163405,43 +161074,45 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); sqlite3VdbeAddOp2(v, OP_Goto, 0, addrNext); sqlite3VdbeResolveLabel(v, lbl); - }else{ + } 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); + } 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); + if (bRPS) + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); - if( !bRPS ) windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); - }else{ + 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 ){ + if (pMWin->eEnd != TK_UNBOUNDED) { + if (pMWin->eFrmType == TK_RANGE) { int lbl = 0; addr = sqlite3VdbeCurrentAddr(v); - if( regEnd ){ + 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 ){ + if (regEnd) { sqlite3VdbeAddOp2(v, OP_Goto, 0, addr); sqlite3VdbeResolveLabel(v, lbl); } - }else{ - if( regEnd ){ + } 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); + if (regEnd) + sqlite3VdbeJumpHere(v, addr); } } } @@ -163451,7 +161122,7 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( sqlite3WhereEnd(pWInfo); /* Fall through */ - if( pMWin->pPartition ){ + if (pMWin->pPartition) { addrInteger = sqlite3VdbeAddOp2(v, OP_Integer, 0, regFlushPart); sqlite3VdbeJumpHere(v, addrGosubFlush); } @@ -163459,28 +161130,28 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( 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); + 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); + if (bRPS) + windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); - }else if( pMWin->eStart==TK_FOLLOWING ){ + } 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 ){ + 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 ){ + } 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 ); + } else { + assert(pMWin->eEnd == TK_FOLLOWING); addrStart = sqlite3VdbeCurrentAddr(v); addrBreak1 = windowCodeOp(&s, WINDOW_RETURN_ROW, regEnd, 1); addrBreak2 = windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 1); @@ -163492,7 +161163,7 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( sqlite3VdbeAddOp2(v, OP_Goto, 0, addrStart); sqlite3VdbeJumpHere(v, addrBreak1); sqlite3VdbeJumpHere(v, addrBreak3); - }else{ + } else { int addrBreak; int addrStart; windowCodeOp(&s, WINDOW_AGGSTEP, 0, 0); @@ -163505,8 +161176,8 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( sqlite3VdbeJumpHere(v, addrEmpty); sqlite3VdbeAddOp1(v, OP_ResetSorter, s.current.csr); - if( pMWin->pPartition ){ - if( pMWin->regStartRowid ){ + if (pMWin->pPartition) { + if (pMWin->regStartRowid) { sqlite3VdbeAddOp2(v, OP_Integer, 1, pMWin->regStartRowid); sqlite3VdbeAddOp2(v, OP_Integer, 0, pMWin->regEndRowid); } @@ -163571,14 +161242,14 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( ** omitted. */ #ifdef SQLITE_AMALGAMATION -# define sqlite3Parser_ENGINEALWAYSONSTACK 1 +#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 +#define YYMALLOCARGTYPE u64 /* ** An instance of the following structure describes the event of a @@ -163589,34 +161260,35 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( ** ** Then the "b" IdList records the list "a,b,c". */ -struct TrigEvent { int a; IdList * b; }; +struct TrigEvent { + int a; + IdList* b; +}; -struct FrameBound { int eType; Expr *pExpr; }; +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; +static void disableLookaside(Parse* pParse) { + sqlite3* db = pParse->db; pParse->disableLookaside++; DisableLookaside; } -#if !defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) \ - && defined(SQLITE_UDL_CAPABLE_PARSER) +#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 ){ +static void updateDeleteLimitError(Parse* pParse, ExprList* pOrderBy, Expr* pLimit) { + if (pOrderBy) { sqlite3ErrorMsg(pParse, "syntax error near \"ORDER BY\""); - }else{ + } else { sqlite3ErrorMsg(pParse, "syntax error near \"LIMIT\""); } sqlite3ExprListDelete(pParse->db, pOrderBy); @@ -163624,314 +161296,299 @@ static void updateDeleteLimitError( } #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"); +/* +** 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; } } - } - - /* 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); - } + 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"); } - return p; } +} +/* 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; +} - /* 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; +/* 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; +} - /* 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; +/* 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 +#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 +#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 ***************************************/ @@ -163987,7 +161644,7 @@ static void updateDeleteLimitError( ** YY_MAX_REDUCE Maximum value for reduce actions */ #ifndef INTERFACE -# define INTERFACE 1 +#define INTERFACE 1 #endif /************* Begin control #defines *****************************************/ #define YYCODETYPE unsigned short int @@ -164003,7 +161660,10 @@ typedef union { Select* yy47; SrcList* yy131; struct TrigEvent yy180; - struct {int value; int mask;} yy231; + struct { + int value; + int mask; + } yy231; IdList* yy254; u32 yy285; ExprList* yy322; @@ -164025,26 +161685,26 @@ typedef union { #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 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 576 -#define YYNRULE 405 -#define YYNRULE_WITH_ACTION 342 -#define YYNTOKEN 185 -#define YY_MAX_SHIFT 575 -#define YY_MIN_SHIFTREDUCE 835 -#define YY_MAX_SHIFTREDUCE 1239 -#define YY_ERROR_ACTION 1240 -#define YY_ACCEPT_ACTION 1241 -#define YY_NO_ACTION 1242 -#define YY_MIN_REDUCE 1243 -#define YY_MAX_REDUCE 1647 +#define YYNSTATE 576 +#define YYNRULE 405 +#define YYNRULE_WITH_ACTION 342 +#define YYNTOKEN 185 +#define YY_MAX_SHIFT 575 +#define YY_MIN_SHIFTREDUCE 835 +#define YY_MAX_SHIFTREDUCE 1239 +#define YY_ERROR_ACTION 1240 +#define YY_ACCEPT_ACTION 1241 +#define YY_NO_ACTION 1242 +#define YY_MIN_REDUCE 1243 +#define YY_MAX_REDUCE 1647 /************* End control #defines *******************************************/ -#define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) +#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. @@ -164055,10 +161715,9 @@ typedef union { ** for testing. */ #ifndef yytestcase -# define yytestcase(X) +#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 @@ -164111,616 +161770,616 @@ typedef union { *********** Begin parsing tables **********************************************/ #define YY_ACTTAB_COUNT (2098) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 568, 208, 568, 118, 115, 229, 568, 118, 115, 229, - /* 10 */ 568, 1314, 377, 1293, 408, 562, 562, 562, 568, 409, - /* 20 */ 378, 1314, 1276, 41, 41, 41, 41, 208, 1526, 71, - /* 30 */ 71, 971, 419, 41, 41, 491, 303, 279, 303, 972, - /* 40 */ 397, 71, 71, 125, 126, 80, 1217, 1217, 1050, 1053, - /* 50 */ 1040, 1040, 123, 123, 124, 124, 124, 124, 476, 409, - /* 60 */ 1241, 1, 1, 575, 2, 1245, 550, 118, 115, 229, - /* 70 */ 317, 480, 146, 480, 524, 118, 115, 229, 529, 1327, - /* 80 */ 417, 523, 142, 125, 126, 80, 1217, 1217, 1050, 1053, - /* 90 */ 1040, 1040, 123, 123, 124, 124, 124, 124, 118, 115, - /* 100 */ 229, 327, 122, 122, 122, 122, 121, 121, 120, 120, - /* 110 */ 120, 119, 116, 444, 284, 284, 284, 284, 442, 442, - /* 120 */ 442, 1567, 376, 1569, 1192, 375, 1163, 565, 1163, 565, - /* 130 */ 409, 1567, 537, 259, 226, 444, 101, 145, 449, 316, - /* 140 */ 559, 240, 122, 122, 122, 122, 121, 121, 120, 120, - /* 150 */ 120, 119, 116, 444, 125, 126, 80, 1217, 1217, 1050, - /* 160 */ 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, 142, - /* 170 */ 294, 1192, 339, 448, 120, 120, 120, 119, 116, 444, - /* 180 */ 127, 1192, 1193, 1194, 148, 441, 440, 568, 119, 116, - /* 190 */ 444, 124, 124, 124, 124, 117, 122, 122, 122, 122, - /* 200 */ 121, 121, 120, 120, 120, 119, 116, 444, 454, 113, - /* 210 */ 13, 13, 546, 122, 122, 122, 122, 121, 121, 120, - /* 220 */ 120, 120, 119, 116, 444, 422, 316, 559, 1192, 1193, - /* 230 */ 1194, 149, 1224, 409, 1224, 124, 124, 124, 124, 122, - /* 240 */ 122, 122, 122, 121, 121, 120, 120, 120, 119, 116, - /* 250 */ 444, 465, 342, 1037, 1037, 1051, 1054, 125, 126, 80, - /* 260 */ 1217, 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, - /* 270 */ 124, 124, 1279, 522, 222, 1192, 568, 409, 224, 514, - /* 280 */ 175, 82, 83, 122, 122, 122, 122, 121, 121, 120, - /* 290 */ 120, 120, 119, 116, 444, 1007, 16, 16, 1192, 133, - /* 300 */ 133, 125, 126, 80, 1217, 1217, 1050, 1053, 1040, 1040, - /* 310 */ 123, 123, 124, 124, 124, 124, 122, 122, 122, 122, - /* 320 */ 121, 121, 120, 120, 120, 119, 116, 444, 1041, 546, - /* 330 */ 1192, 373, 1192, 1193, 1194, 252, 1434, 399, 504, 501, - /* 340 */ 500, 111, 560, 566, 4, 926, 926, 433, 499, 340, - /* 350 */ 460, 328, 360, 394, 1237, 1192, 1193, 1194, 563, 568, - /* 360 */ 122, 122, 122, 122, 121, 121, 120, 120, 120, 119, - /* 370 */ 116, 444, 284, 284, 369, 1580, 1607, 441, 440, 154, - /* 380 */ 409, 445, 71, 71, 1286, 565, 1221, 1192, 1193, 1194, - /* 390 */ 85, 1223, 271, 557, 543, 515, 1561, 568, 98, 1222, - /* 400 */ 6, 1278, 472, 142, 125, 126, 80, 1217, 1217, 1050, - /* 410 */ 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, 550, - /* 420 */ 13, 13, 1027, 507, 1224, 1192, 1224, 549, 109, 109, - /* 430 */ 222, 568, 1238, 175, 568, 427, 110, 197, 445, 570, - /* 440 */ 569, 430, 1552, 1017, 325, 551, 1192, 270, 287, 368, - /* 450 */ 510, 363, 509, 257, 71, 71, 543, 71, 71, 359, - /* 460 */ 316, 559, 1613, 122, 122, 122, 122, 121, 121, 120, - /* 470 */ 120, 120, 119, 116, 444, 1017, 1017, 1019, 1020, 27, - /* 480 */ 284, 284, 1192, 1193, 1194, 1158, 568, 1612, 409, 901, - /* 490 */ 190, 550, 356, 565, 550, 937, 533, 517, 1158, 516, - /* 500 */ 413, 1158, 552, 1192, 1193, 1194, 568, 544, 1554, 51, - /* 510 */ 51, 214, 125, 126, 80, 1217, 1217, 1050, 1053, 1040, - /* 520 */ 1040, 123, 123, 124, 124, 124, 124, 1192, 474, 135, - /* 530 */ 135, 409, 284, 284, 1490, 505, 121, 121, 120, 120, - /* 540 */ 120, 119, 116, 444, 1007, 565, 518, 217, 541, 1561, - /* 550 */ 316, 559, 142, 6, 532, 125, 126, 80, 1217, 1217, - /* 560 */ 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, - /* 570 */ 1555, 122, 122, 122, 122, 121, 121, 120, 120, 120, - /* 580 */ 119, 116, 444, 485, 1192, 1193, 1194, 482, 281, 1267, - /* 590 */ 957, 252, 1192, 373, 504, 501, 500, 1192, 340, 571, - /* 600 */ 1192, 571, 409, 292, 499, 957, 876, 191, 480, 316, - /* 610 */ 559, 384, 290, 380, 122, 122, 122, 122, 121, 121, - /* 620 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1217, - /* 630 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, - /* 640 */ 124, 409, 394, 1136, 1192, 869, 100, 284, 284, 1192, - /* 650 */ 1193, 1194, 373, 1093, 1192, 1193, 1194, 1192, 1193, 1194, - /* 660 */ 565, 455, 32, 373, 233, 125, 126, 80, 1217, 1217, - /* 670 */ 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, - /* 680 */ 1433, 959, 568, 228, 958, 122, 122, 122, 122, 121, - /* 690 */ 121, 120, 120, 120, 119, 116, 444, 1158, 228, 1192, - /* 700 */ 157, 1192, 1193, 1194, 1553, 13, 13, 301, 957, 1232, - /* 710 */ 1158, 153, 409, 1158, 373, 1583, 1176, 5, 369, 1580, - /* 720 */ 429, 1238, 3, 957, 122, 122, 122, 122, 121, 121, - /* 730 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1217, - /* 740 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, - /* 750 */ 124, 409, 208, 567, 1192, 1028, 1192, 1193, 1194, 1192, - /* 760 */ 388, 852, 155, 1552, 286, 402, 1098, 1098, 488, 568, - /* 770 */ 465, 342, 1319, 1319, 1552, 125, 126, 80, 1217, 1217, - /* 780 */ 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, - /* 790 */ 129, 568, 13, 13, 374, 122, 122, 122, 122, 121, - /* 800 */ 121, 120, 120, 120, 119, 116, 444, 302, 568, 453, - /* 810 */ 528, 1192, 1193, 1194, 13, 13, 1192, 1193, 1194, 1297, - /* 820 */ 463, 1267, 409, 1317, 1317, 1552, 1012, 453, 452, 200, - /* 830 */ 299, 71, 71, 1265, 122, 122, 122, 122, 121, 121, - /* 840 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1217, - /* 850 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, - /* 860 */ 124, 409, 227, 1073, 1158, 284, 284, 419, 312, 278, - /* 870 */ 278, 285, 285, 1419, 406, 405, 382, 1158, 565, 568, - /* 880 */ 1158, 1196, 565, 1600, 565, 125, 126, 80, 1217, 1217, - /* 890 */ 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, - /* 900 */ 453, 1482, 13, 13, 1536, 122, 122, 122, 122, 121, - /* 910 */ 121, 120, 120, 120, 119, 116, 444, 201, 568, 354, - /* 920 */ 1586, 575, 2, 1245, 840, 841, 842, 1562, 317, 1212, - /* 930 */ 146, 6, 409, 255, 254, 253, 206, 1327, 9, 1196, - /* 940 */ 262, 71, 71, 424, 122, 122, 122, 122, 121, 121, - /* 950 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1217, - /* 960 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, - /* 970 */ 124, 568, 284, 284, 568, 1213, 409, 574, 313, 1245, - /* 980 */ 349, 1296, 352, 419, 317, 565, 146, 491, 525, 1643, - /* 990 */ 395, 371, 491, 1327, 70, 70, 1295, 71, 71, 240, - /* 1000 */ 1325, 104, 80, 1217, 1217, 1050, 1053, 1040, 1040, 123, - /* 1010 */ 123, 124, 124, 124, 124, 122, 122, 122, 122, 121, - /* 1020 */ 121, 120, 120, 120, 119, 116, 444, 1114, 284, 284, - /* 1030 */ 428, 448, 1525, 1213, 439, 284, 284, 1489, 1352, 311, - /* 1040 */ 474, 565, 1115, 971, 491, 491, 217, 1263, 565, 1538, - /* 1050 */ 568, 972, 207, 568, 1027, 240, 383, 1116, 519, 122, - /* 1060 */ 122, 122, 122, 121, 121, 120, 120, 120, 119, 116, - /* 1070 */ 444, 1018, 107, 71, 71, 1017, 13, 13, 912, 568, - /* 1080 */ 1495, 568, 284, 284, 97, 526, 491, 448, 913, 1326, - /* 1090 */ 1322, 545, 409, 284, 284, 565, 151, 209, 1495, 1497, - /* 1100 */ 262, 450, 55, 55, 56, 56, 565, 1017, 1017, 1019, - /* 1110 */ 443, 332, 409, 527, 12, 295, 125, 126, 80, 1217, - /* 1120 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, - /* 1130 */ 124, 347, 409, 864, 1534, 1213, 125, 126, 80, 1217, - /* 1140 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, - /* 1150 */ 124, 1137, 1641, 474, 1641, 371, 125, 114, 80, 1217, - /* 1160 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, - /* 1170 */ 124, 1495, 329, 474, 331, 122, 122, 122, 122, 121, - /* 1180 */ 121, 120, 120, 120, 119, 116, 444, 203, 1419, 568, - /* 1190 */ 1294, 864, 464, 1213, 436, 122, 122, 122, 122, 121, - /* 1200 */ 121, 120, 120, 120, 119, 116, 444, 553, 1137, 1642, - /* 1210 */ 539, 1642, 15, 15, 892, 122, 122, 122, 122, 121, - /* 1220 */ 121, 120, 120, 120, 119, 116, 444, 568, 298, 538, - /* 1230 */ 1135, 1419, 1559, 1560, 1331, 409, 6, 6, 1169, 1268, - /* 1240 */ 415, 320, 284, 284, 1419, 508, 565, 525, 300, 457, - /* 1250 */ 43, 43, 568, 893, 12, 565, 330, 478, 425, 407, - /* 1260 */ 126, 80, 1217, 1217, 1050, 1053, 1040, 1040, 123, 123, - /* 1270 */ 124, 124, 124, 124, 568, 57, 57, 288, 1192, 1419, - /* 1280 */ 496, 458, 392, 392, 391, 273, 389, 1135, 1558, 849, - /* 1290 */ 1169, 407, 6, 568, 321, 1158, 470, 44, 44, 1557, - /* 1300 */ 1114, 426, 234, 6, 323, 256, 540, 256, 1158, 431, - /* 1310 */ 568, 1158, 322, 17, 487, 1115, 58, 58, 122, 122, - /* 1320 */ 122, 122, 121, 121, 120, 120, 120, 119, 116, 444, - /* 1330 */ 1116, 216, 481, 59, 59, 1192, 1193, 1194, 111, 560, - /* 1340 */ 324, 4, 236, 456, 526, 568, 237, 456, 568, 437, - /* 1350 */ 168, 556, 420, 141, 479, 563, 568, 293, 568, 1095, - /* 1360 */ 568, 293, 568, 1095, 531, 568, 872, 8, 60, 60, - /* 1370 */ 235, 61, 61, 568, 414, 568, 414, 568, 445, 62, - /* 1380 */ 62, 45, 45, 46, 46, 47, 47, 199, 49, 49, - /* 1390 */ 557, 568, 359, 568, 100, 486, 50, 50, 63, 63, - /* 1400 */ 64, 64, 561, 415, 535, 410, 568, 1027, 568, 534, - /* 1410 */ 316, 559, 316, 559, 65, 65, 14, 14, 568, 1027, - /* 1420 */ 568, 512, 932, 872, 1018, 109, 109, 931, 1017, 66, - /* 1430 */ 66, 131, 131, 110, 451, 445, 570, 569, 416, 177, - /* 1440 */ 1017, 132, 132, 67, 67, 568, 467, 568, 932, 471, - /* 1450 */ 1364, 283, 226, 931, 315, 1363, 407, 568, 459, 407, - /* 1460 */ 1017, 1017, 1019, 239, 407, 86, 213, 1350, 52, 52, - /* 1470 */ 68, 68, 1017, 1017, 1019, 1020, 27, 1585, 1180, 447, - /* 1480 */ 69, 69, 288, 97, 108, 1541, 106, 392, 392, 391, - /* 1490 */ 273, 389, 568, 879, 849, 883, 568, 111, 560, 466, - /* 1500 */ 4, 568, 152, 30, 38, 568, 1132, 234, 396, 323, - /* 1510 */ 111, 560, 527, 4, 563, 53, 53, 322, 568, 163, - /* 1520 */ 163, 568, 337, 468, 164, 164, 333, 563, 76, 76, - /* 1530 */ 568, 289, 1514, 568, 31, 1513, 568, 445, 338, 483, - /* 1540 */ 100, 54, 54, 344, 72, 72, 296, 236, 1080, 557, - /* 1550 */ 445, 879, 1360, 134, 134, 168, 73, 73, 141, 161, - /* 1560 */ 161, 1574, 557, 535, 568, 319, 568, 348, 536, 1009, - /* 1570 */ 473, 261, 261, 891, 890, 235, 535, 568, 1027, 568, - /* 1580 */ 475, 534, 261, 367, 109, 109, 521, 136, 136, 130, - /* 1590 */ 130, 1027, 110, 366, 445, 570, 569, 109, 109, 1017, - /* 1600 */ 162, 162, 156, 156, 568, 110, 1080, 445, 570, 569, - /* 1610 */ 410, 351, 1017, 568, 353, 316, 559, 568, 343, 568, - /* 1620 */ 100, 497, 357, 258, 100, 898, 899, 140, 140, 355, - /* 1630 */ 1310, 1017, 1017, 1019, 1020, 27, 139, 139, 362, 451, - /* 1640 */ 137, 137, 138, 138, 1017, 1017, 1019, 1020, 27, 1180, - /* 1650 */ 447, 568, 372, 288, 111, 560, 1021, 4, 392, 392, - /* 1660 */ 391, 273, 389, 568, 1141, 849, 568, 1076, 568, 258, - /* 1670 */ 492, 563, 568, 211, 75, 75, 555, 962, 234, 261, - /* 1680 */ 323, 111, 560, 929, 4, 113, 77, 77, 322, 74, - /* 1690 */ 74, 42, 42, 1373, 445, 48, 48, 1418, 563, 974, - /* 1700 */ 975, 1092, 1091, 1092, 1091, 862, 557, 150, 930, 1346, - /* 1710 */ 113, 1358, 554, 1424, 1021, 1275, 1266, 1254, 236, 1253, - /* 1720 */ 1255, 445, 1593, 1343, 308, 276, 168, 309, 11, 141, - /* 1730 */ 393, 310, 232, 557, 1405, 1027, 335, 291, 1400, 219, - /* 1740 */ 336, 109, 109, 936, 297, 1410, 235, 341, 477, 110, - /* 1750 */ 502, 445, 570, 569, 1393, 1409, 1017, 400, 1293, 365, - /* 1760 */ 223, 1486, 1027, 1485, 1355, 1356, 1354, 1353, 109, 109, - /* 1770 */ 204, 1596, 1232, 558, 265, 218, 110, 205, 445, 570, - /* 1780 */ 569, 410, 387, 1017, 1533, 179, 316, 559, 1017, 1017, - /* 1790 */ 1019, 1020, 27, 230, 1531, 1229, 79, 560, 85, 4, - /* 1800 */ 418, 215, 548, 81, 84, 188, 1406, 173, 181, 461, - /* 1810 */ 451, 35, 462, 563, 183, 1017, 1017, 1019, 1020, 27, - /* 1820 */ 184, 1491, 185, 186, 495, 242, 98, 398, 1412, 36, - /* 1830 */ 1411, 484, 91, 469, 401, 1414, 445, 192, 1480, 246, - /* 1840 */ 1502, 490, 346, 277, 248, 196, 493, 511, 557, 350, - /* 1850 */ 1256, 249, 250, 403, 1313, 1312, 111, 560, 432, 4, - /* 1860 */ 1311, 1304, 93, 1611, 883, 1610, 224, 404, 434, 520, - /* 1870 */ 263, 435, 1579, 563, 1283, 1282, 364, 1027, 306, 1281, - /* 1880 */ 264, 1609, 1565, 109, 109, 370, 1303, 307, 1564, 438, - /* 1890 */ 128, 110, 1378, 445, 570, 569, 445, 546, 1017, 10, - /* 1900 */ 1466, 105, 381, 1377, 34, 572, 99, 1336, 557, 314, - /* 1910 */ 1186, 530, 272, 274, 379, 210, 1335, 547, 385, 386, - /* 1920 */ 275, 573, 1251, 1246, 411, 412, 1518, 165, 178, 1519, - /* 1930 */ 1017, 1017, 1019, 1020, 27, 1517, 1516, 1027, 78, 147, - /* 1940 */ 166, 220, 221, 109, 109, 836, 304, 167, 446, 212, - /* 1950 */ 318, 110, 231, 445, 570, 569, 144, 1090, 1017, 1088, - /* 1960 */ 326, 180, 169, 1212, 182, 334, 238, 915, 241, 1104, - /* 1970 */ 187, 170, 171, 421, 87, 88, 423, 189, 89, 90, - /* 1980 */ 172, 1107, 243, 1103, 244, 158, 18, 245, 345, 247, - /* 1990 */ 1017, 1017, 1019, 1020, 27, 261, 1096, 193, 1226, 489, - /* 2000 */ 194, 37, 366, 851, 494, 251, 195, 506, 92, 19, - /* 2010 */ 498, 358, 20, 503, 881, 361, 94, 894, 305, 159, - /* 2020 */ 513, 39, 95, 1174, 160, 1056, 966, 1143, 96, 174, - /* 2030 */ 1142, 225, 280, 282, 198, 960, 113, 1164, 1160, 260, - /* 2040 */ 21, 22, 23, 1162, 1168, 1167, 1148, 24, 33, 25, - /* 2050 */ 202, 542, 26, 100, 1071, 102, 1057, 103, 7, 1055, - /* 2060 */ 1059, 1113, 1060, 1112, 266, 267, 28, 40, 390, 1022, - /* 2070 */ 863, 112, 29, 564, 1182, 1181, 268, 176, 143, 925, - /* 2080 */ 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, - /* 2090 */ 1242, 1242, 1242, 1242, 269, 1602, 1242, 1601, + /* 0 */ 568, 208, 568, 118, 115, 229, 568, 118, 115, 229, + /* 10 */ 568, 1314, 377, 1293, 408, 562, 562, 562, 568, 409, + /* 20 */ 378, 1314, 1276, 41, 41, 41, 41, 208, 1526, 71, + /* 30 */ 71, 971, 419, 41, 41, 491, 303, 279, 303, 972, + /* 40 */ 397, 71, 71, 125, 126, 80, 1217, 1217, 1050, 1053, + /* 50 */ 1040, 1040, 123, 123, 124, 124, 124, 124, 476, 409, + /* 60 */ 1241, 1, 1, 575, 2, 1245, 550, 118, 115, 229, + /* 70 */ 317, 480, 146, 480, 524, 118, 115, 229, 529, 1327, + /* 80 */ 417, 523, 142, 125, 126, 80, 1217, 1217, 1050, 1053, + /* 90 */ 1040, 1040, 123, 123, 124, 124, 124, 124, 118, 115, + /* 100 */ 229, 327, 122, 122, 122, 122, 121, 121, 120, 120, + /* 110 */ 120, 119, 116, 444, 284, 284, 284, 284, 442, 442, + /* 120 */ 442, 1567, 376, 1569, 1192, 375, 1163, 565, 1163, 565, + /* 130 */ 409, 1567, 537, 259, 226, 444, 101, 145, 449, 316, + /* 140 */ 559, 240, 122, 122, 122, 122, 121, 121, 120, 120, + /* 150 */ 120, 119, 116, 444, 125, 126, 80, 1217, 1217, 1050, + /* 160 */ 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, 142, + /* 170 */ 294, 1192, 339, 448, 120, 120, 120, 119, 116, 444, + /* 180 */ 127, 1192, 1193, 1194, 148, 441, 440, 568, 119, 116, + /* 190 */ 444, 124, 124, 124, 124, 117, 122, 122, 122, 122, + /* 200 */ 121, 121, 120, 120, 120, 119, 116, 444, 454, 113, + /* 210 */ 13, 13, 546, 122, 122, 122, 122, 121, 121, 120, + /* 220 */ 120, 120, 119, 116, 444, 422, 316, 559, 1192, 1193, + /* 230 */ 1194, 149, 1224, 409, 1224, 124, 124, 124, 124, 122, + /* 240 */ 122, 122, 122, 121, 121, 120, 120, 120, 119, 116, + /* 250 */ 444, 465, 342, 1037, 1037, 1051, 1054, 125, 126, 80, + /* 260 */ 1217, 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, + /* 270 */ 124, 124, 1279, 522, 222, 1192, 568, 409, 224, 514, + /* 280 */ 175, 82, 83, 122, 122, 122, 122, 121, 121, 120, + /* 290 */ 120, 120, 119, 116, 444, 1007, 16, 16, 1192, 133, + /* 300 */ 133, 125, 126, 80, 1217, 1217, 1050, 1053, 1040, 1040, + /* 310 */ 123, 123, 124, 124, 124, 124, 122, 122, 122, 122, + /* 320 */ 121, 121, 120, 120, 120, 119, 116, 444, 1041, 546, + /* 330 */ 1192, 373, 1192, 1193, 1194, 252, 1434, 399, 504, 501, + /* 340 */ 500, 111, 560, 566, 4, 926, 926, 433, 499, 340, + /* 350 */ 460, 328, 360, 394, 1237, 1192, 1193, 1194, 563, 568, + /* 360 */ 122, 122, 122, 122, 121, 121, 120, 120, 120, 119, + /* 370 */ 116, 444, 284, 284, 369, 1580, 1607, 441, 440, 154, + /* 380 */ 409, 445, 71, 71, 1286, 565, 1221, 1192, 1193, 1194, + /* 390 */ 85, 1223, 271, 557, 543, 515, 1561, 568, 98, 1222, + /* 400 */ 6, 1278, 472, 142, 125, 126, 80, 1217, 1217, 1050, + /* 410 */ 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, 550, + /* 420 */ 13, 13, 1027, 507, 1224, 1192, 1224, 549, 109, 109, + /* 430 */ 222, 568, 1238, 175, 568, 427, 110, 197, 445, 570, + /* 440 */ 569, 430, 1552, 1017, 325, 551, 1192, 270, 287, 368, + /* 450 */ 510, 363, 509, 257, 71, 71, 543, 71, 71, 359, + /* 460 */ 316, 559, 1613, 122, 122, 122, 122, 121, 121, 120, + /* 470 */ 120, 120, 119, 116, 444, 1017, 1017, 1019, 1020, 27, + /* 480 */ 284, 284, 1192, 1193, 1194, 1158, 568, 1612, 409, 901, + /* 490 */ 190, 550, 356, 565, 550, 937, 533, 517, 1158, 516, + /* 500 */ 413, 1158, 552, 1192, 1193, 1194, 568, 544, 1554, 51, + /* 510 */ 51, 214, 125, 126, 80, 1217, 1217, 1050, 1053, 1040, + /* 520 */ 1040, 123, 123, 124, 124, 124, 124, 1192, 474, 135, + /* 530 */ 135, 409, 284, 284, 1490, 505, 121, 121, 120, 120, + /* 540 */ 120, 119, 116, 444, 1007, 565, 518, 217, 541, 1561, + /* 550 */ 316, 559, 142, 6, 532, 125, 126, 80, 1217, 1217, + /* 560 */ 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, + /* 570 */ 1555, 122, 122, 122, 122, 121, 121, 120, 120, 120, + /* 580 */ 119, 116, 444, 485, 1192, 1193, 1194, 482, 281, 1267, + /* 590 */ 957, 252, 1192, 373, 504, 501, 500, 1192, 340, 571, + /* 600 */ 1192, 571, 409, 292, 499, 957, 876, 191, 480, 316, + /* 610 */ 559, 384, 290, 380, 122, 122, 122, 122, 121, 121, + /* 620 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1217, + /* 630 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, + /* 640 */ 124, 409, 394, 1136, 1192, 869, 100, 284, 284, 1192, + /* 650 */ 1193, 1194, 373, 1093, 1192, 1193, 1194, 1192, 1193, 1194, + /* 660 */ 565, 455, 32, 373, 233, 125, 126, 80, 1217, 1217, + /* 670 */ 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, + /* 680 */ 1433, 959, 568, 228, 958, 122, 122, 122, 122, 121, + /* 690 */ 121, 120, 120, 120, 119, 116, 444, 1158, 228, 1192, + /* 700 */ 157, 1192, 1193, 1194, 1553, 13, 13, 301, 957, 1232, + /* 710 */ 1158, 153, 409, 1158, 373, 1583, 1176, 5, 369, 1580, + /* 720 */ 429, 1238, 3, 957, 122, 122, 122, 122, 121, 121, + /* 730 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1217, + /* 740 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, + /* 750 */ 124, 409, 208, 567, 1192, 1028, 1192, 1193, 1194, 1192, + /* 760 */ 388, 852, 155, 1552, 286, 402, 1098, 1098, 488, 568, + /* 770 */ 465, 342, 1319, 1319, 1552, 125, 126, 80, 1217, 1217, + /* 780 */ 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, + /* 790 */ 129, 568, 13, 13, 374, 122, 122, 122, 122, 121, + /* 800 */ 121, 120, 120, 120, 119, 116, 444, 302, 568, 453, + /* 810 */ 528, 1192, 1193, 1194, 13, 13, 1192, 1193, 1194, 1297, + /* 820 */ 463, 1267, 409, 1317, 1317, 1552, 1012, 453, 452, 200, + /* 830 */ 299, 71, 71, 1265, 122, 122, 122, 122, 121, 121, + /* 840 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1217, + /* 850 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, + /* 860 */ 124, 409, 227, 1073, 1158, 284, 284, 419, 312, 278, + /* 870 */ 278, 285, 285, 1419, 406, 405, 382, 1158, 565, 568, + /* 880 */ 1158, 1196, 565, 1600, 565, 125, 126, 80, 1217, 1217, + /* 890 */ 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, + /* 900 */ 453, 1482, 13, 13, 1536, 122, 122, 122, 122, 121, + /* 910 */ 121, 120, 120, 120, 119, 116, 444, 201, 568, 354, + /* 920 */ 1586, 575, 2, 1245, 840, 841, 842, 1562, 317, 1212, + /* 930 */ 146, 6, 409, 255, 254, 253, 206, 1327, 9, 1196, + /* 940 */ 262, 71, 71, 424, 122, 122, 122, 122, 121, 121, + /* 950 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1217, + /* 960 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, + /* 970 */ 124, 568, 284, 284, 568, 1213, 409, 574, 313, 1245, + /* 980 */ 349, 1296, 352, 419, 317, 565, 146, 491, 525, 1643, + /* 990 */ 395, 371, 491, 1327, 70, 70, 1295, 71, 71, 240, + /* 1000 */ 1325, 104, 80, 1217, 1217, 1050, 1053, 1040, 1040, 123, + /* 1010 */ 123, 124, 124, 124, 124, 122, 122, 122, 122, 121, + /* 1020 */ 121, 120, 120, 120, 119, 116, 444, 1114, 284, 284, + /* 1030 */ 428, 448, 1525, 1213, 439, 284, 284, 1489, 1352, 311, + /* 1040 */ 474, 565, 1115, 971, 491, 491, 217, 1263, 565, 1538, + /* 1050 */ 568, 972, 207, 568, 1027, 240, 383, 1116, 519, 122, + /* 1060 */ 122, 122, 122, 121, 121, 120, 120, 120, 119, 116, + /* 1070 */ 444, 1018, 107, 71, 71, 1017, 13, 13, 912, 568, + /* 1080 */ 1495, 568, 284, 284, 97, 526, 491, 448, 913, 1326, + /* 1090 */ 1322, 545, 409, 284, 284, 565, 151, 209, 1495, 1497, + /* 1100 */ 262, 450, 55, 55, 56, 56, 565, 1017, 1017, 1019, + /* 1110 */ 443, 332, 409, 527, 12, 295, 125, 126, 80, 1217, + /* 1120 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, + /* 1130 */ 124, 347, 409, 864, 1534, 1213, 125, 126, 80, 1217, + /* 1140 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, + /* 1150 */ 124, 1137, 1641, 474, 1641, 371, 125, 114, 80, 1217, + /* 1160 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, + /* 1170 */ 124, 1495, 329, 474, 331, 122, 122, 122, 122, 121, + /* 1180 */ 121, 120, 120, 120, 119, 116, 444, 203, 1419, 568, + /* 1190 */ 1294, 864, 464, 1213, 436, 122, 122, 122, 122, 121, + /* 1200 */ 121, 120, 120, 120, 119, 116, 444, 553, 1137, 1642, + /* 1210 */ 539, 1642, 15, 15, 892, 122, 122, 122, 122, 121, + /* 1220 */ 121, 120, 120, 120, 119, 116, 444, 568, 298, 538, + /* 1230 */ 1135, 1419, 1559, 1560, 1331, 409, 6, 6, 1169, 1268, + /* 1240 */ 415, 320, 284, 284, 1419, 508, 565, 525, 300, 457, + /* 1250 */ 43, 43, 568, 893, 12, 565, 330, 478, 425, 407, + /* 1260 */ 126, 80, 1217, 1217, 1050, 1053, 1040, 1040, 123, 123, + /* 1270 */ 124, 124, 124, 124, 568, 57, 57, 288, 1192, 1419, + /* 1280 */ 496, 458, 392, 392, 391, 273, 389, 1135, 1558, 849, + /* 1290 */ 1169, 407, 6, 568, 321, 1158, 470, 44, 44, 1557, + /* 1300 */ 1114, 426, 234, 6, 323, 256, 540, 256, 1158, 431, + /* 1310 */ 568, 1158, 322, 17, 487, 1115, 58, 58, 122, 122, + /* 1320 */ 122, 122, 121, 121, 120, 120, 120, 119, 116, 444, + /* 1330 */ 1116, 216, 481, 59, 59, 1192, 1193, 1194, 111, 560, + /* 1340 */ 324, 4, 236, 456, 526, 568, 237, 456, 568, 437, + /* 1350 */ 168, 556, 420, 141, 479, 563, 568, 293, 568, 1095, + /* 1360 */ 568, 293, 568, 1095, 531, 568, 872, 8, 60, 60, + /* 1370 */ 235, 61, 61, 568, 414, 568, 414, 568, 445, 62, + /* 1380 */ 62, 45, 45, 46, 46, 47, 47, 199, 49, 49, + /* 1390 */ 557, 568, 359, 568, 100, 486, 50, 50, 63, 63, + /* 1400 */ 64, 64, 561, 415, 535, 410, 568, 1027, 568, 534, + /* 1410 */ 316, 559, 316, 559, 65, 65, 14, 14, 568, 1027, + /* 1420 */ 568, 512, 932, 872, 1018, 109, 109, 931, 1017, 66, + /* 1430 */ 66, 131, 131, 110, 451, 445, 570, 569, 416, 177, + /* 1440 */ 1017, 132, 132, 67, 67, 568, 467, 568, 932, 471, + /* 1450 */ 1364, 283, 226, 931, 315, 1363, 407, 568, 459, 407, + /* 1460 */ 1017, 1017, 1019, 239, 407, 86, 213, 1350, 52, 52, + /* 1470 */ 68, 68, 1017, 1017, 1019, 1020, 27, 1585, 1180, 447, + /* 1480 */ 69, 69, 288, 97, 108, 1541, 106, 392, 392, 391, + /* 1490 */ 273, 389, 568, 879, 849, 883, 568, 111, 560, 466, + /* 1500 */ 4, 568, 152, 30, 38, 568, 1132, 234, 396, 323, + /* 1510 */ 111, 560, 527, 4, 563, 53, 53, 322, 568, 163, + /* 1520 */ 163, 568, 337, 468, 164, 164, 333, 563, 76, 76, + /* 1530 */ 568, 289, 1514, 568, 31, 1513, 568, 445, 338, 483, + /* 1540 */ 100, 54, 54, 344, 72, 72, 296, 236, 1080, 557, + /* 1550 */ 445, 879, 1360, 134, 134, 168, 73, 73, 141, 161, + /* 1560 */ 161, 1574, 557, 535, 568, 319, 568, 348, 536, 1009, + /* 1570 */ 473, 261, 261, 891, 890, 235, 535, 568, 1027, 568, + /* 1580 */ 475, 534, 261, 367, 109, 109, 521, 136, 136, 130, + /* 1590 */ 130, 1027, 110, 366, 445, 570, 569, 109, 109, 1017, + /* 1600 */ 162, 162, 156, 156, 568, 110, 1080, 445, 570, 569, + /* 1610 */ 410, 351, 1017, 568, 353, 316, 559, 568, 343, 568, + /* 1620 */ 100, 497, 357, 258, 100, 898, 899, 140, 140, 355, + /* 1630 */ 1310, 1017, 1017, 1019, 1020, 27, 139, 139, 362, 451, + /* 1640 */ 137, 137, 138, 138, 1017, 1017, 1019, 1020, 27, 1180, + /* 1650 */ 447, 568, 372, 288, 111, 560, 1021, 4, 392, 392, + /* 1660 */ 391, 273, 389, 568, 1141, 849, 568, 1076, 568, 258, + /* 1670 */ 492, 563, 568, 211, 75, 75, 555, 962, 234, 261, + /* 1680 */ 323, 111, 560, 929, 4, 113, 77, 77, 322, 74, + /* 1690 */ 74, 42, 42, 1373, 445, 48, 48, 1418, 563, 974, + /* 1700 */ 975, 1092, 1091, 1092, 1091, 862, 557, 150, 930, 1346, + /* 1710 */ 113, 1358, 554, 1424, 1021, 1275, 1266, 1254, 236, 1253, + /* 1720 */ 1255, 445, 1593, 1343, 308, 276, 168, 309, 11, 141, + /* 1730 */ 393, 310, 232, 557, 1405, 1027, 335, 291, 1400, 219, + /* 1740 */ 336, 109, 109, 936, 297, 1410, 235, 341, 477, 110, + /* 1750 */ 502, 445, 570, 569, 1393, 1409, 1017, 400, 1293, 365, + /* 1760 */ 223, 1486, 1027, 1485, 1355, 1356, 1354, 1353, 109, 109, + /* 1770 */ 204, 1596, 1232, 558, 265, 218, 110, 205, 445, 570, + /* 1780 */ 569, 410, 387, 1017, 1533, 179, 316, 559, 1017, 1017, + /* 1790 */ 1019, 1020, 27, 230, 1531, 1229, 79, 560, 85, 4, + /* 1800 */ 418, 215, 548, 81, 84, 188, 1406, 173, 181, 461, + /* 1810 */ 451, 35, 462, 563, 183, 1017, 1017, 1019, 1020, 27, + /* 1820 */ 184, 1491, 185, 186, 495, 242, 98, 398, 1412, 36, + /* 1830 */ 1411, 484, 91, 469, 401, 1414, 445, 192, 1480, 246, + /* 1840 */ 1502, 490, 346, 277, 248, 196, 493, 511, 557, 350, + /* 1850 */ 1256, 249, 250, 403, 1313, 1312, 111, 560, 432, 4, + /* 1860 */ 1311, 1304, 93, 1611, 883, 1610, 224, 404, 434, 520, + /* 1870 */ 263, 435, 1579, 563, 1283, 1282, 364, 1027, 306, 1281, + /* 1880 */ 264, 1609, 1565, 109, 109, 370, 1303, 307, 1564, 438, + /* 1890 */ 128, 110, 1378, 445, 570, 569, 445, 546, 1017, 10, + /* 1900 */ 1466, 105, 381, 1377, 34, 572, 99, 1336, 557, 314, + /* 1910 */ 1186, 530, 272, 274, 379, 210, 1335, 547, 385, 386, + /* 1920 */ 275, 573, 1251, 1246, 411, 412, 1518, 165, 178, 1519, + /* 1930 */ 1017, 1017, 1019, 1020, 27, 1517, 1516, 1027, 78, 147, + /* 1940 */ 166, 220, 221, 109, 109, 836, 304, 167, 446, 212, + /* 1950 */ 318, 110, 231, 445, 570, 569, 144, 1090, 1017, 1088, + /* 1960 */ 326, 180, 169, 1212, 182, 334, 238, 915, 241, 1104, + /* 1970 */ 187, 170, 171, 421, 87, 88, 423, 189, 89, 90, + /* 1980 */ 172, 1107, 243, 1103, 244, 158, 18, 245, 345, 247, + /* 1990 */ 1017, 1017, 1019, 1020, 27, 261, 1096, 193, 1226, 489, + /* 2000 */ 194, 37, 366, 851, 494, 251, 195, 506, 92, 19, + /* 2010 */ 498, 358, 20, 503, 881, 361, 94, 894, 305, 159, + /* 2020 */ 513, 39, 95, 1174, 160, 1056, 966, 1143, 96, 174, + /* 2030 */ 1142, 225, 280, 282, 198, 960, 113, 1164, 1160, 260, + /* 2040 */ 21, 22, 23, 1162, 1168, 1167, 1148, 24, 33, 25, + /* 2050 */ 202, 542, 26, 100, 1071, 102, 1057, 103, 7, 1055, + /* 2060 */ 1059, 1113, 1060, 1112, 266, 267, 28, 40, 390, 1022, + /* 2070 */ 863, 112, 29, 564, 1182, 1181, 268, 176, 143, 925, + /* 2080 */ 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, + /* 2090 */ 1242, 1242, 1242, 1242, 269, 1602, 1242, 1601, }; 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, 43, 234, 18, - /* 1810 */ 162, 270, 200, 36, 237, 153, 154, 155, 156, 157, - /* 1820 */ 237, 283, 237, 237, 18, 199, 149, 246, 272, 270, - /* 1830 */ 272, 200, 158, 246, 246, 234, 59, 234, 246, 199, - /* 1840 */ 290, 62, 289, 200, 199, 22, 221, 115, 71, 200, - /* 1850 */ 200, 199, 199, 221, 218, 218, 19, 20, 64, 22, - /* 1860 */ 218, 227, 22, 224, 126, 224, 165, 221, 24, 305, - /* 1870 */ 200, 113, 312, 36, 218, 220, 218, 100, 282, 218, - /* 1880 */ 91, 218, 317, 106, 107, 221, 227, 282, 317, 82, - /* 1890 */ 148, 114, 265, 116, 117, 118, 59, 145, 121, 22, - /* 1900 */ 277, 158, 200, 265, 25, 202, 147, 250, 71, 279, - /* 1910 */ 13, 146, 194, 194, 249, 248, 250, 140, 247, 246, - /* 1920 */ 6, 192, 192, 192, 303, 303, 213, 207, 300, 213, - /* 1930 */ 153, 154, 155, 156, 157, 213, 213, 100, 213, 222, - /* 1940 */ 207, 214, 214, 106, 107, 4, 222, 207, 3, 22, - /* 1950 */ 163, 114, 15, 116, 117, 118, 16, 23, 121, 23, - /* 1960 */ 139, 151, 130, 25, 142, 16, 24, 20, 144, 1, - /* 1970 */ 142, 130, 130, 61, 53, 53, 37, 151, 53, 53, - /* 1980 */ 130, 116, 34, 1, 141, 5, 22, 115, 161, 141, - /* 1990 */ 153, 154, 155, 156, 157, 25, 68, 68, 75, 41, - /* 2000 */ 115, 24, 131, 20, 19, 125, 22, 96, 22, 22, - /* 2010 */ 67, 23, 22, 67, 59, 24, 22, 28, 67, 23, - /* 2020 */ 22, 22, 149, 23, 23, 23, 116, 23, 25, 37, - /* 2030 */ 97, 141, 23, 23, 22, 143, 25, 75, 88, 34, - /* 2040 */ 34, 34, 34, 86, 75, 93, 23, 34, 22, 34, - /* 2050 */ 25, 24, 34, 25, 23, 142, 23, 142, 44, 23, - /* 2060 */ 23, 23, 11, 23, 25, 22, 22, 22, 15, 23, - /* 2070 */ 23, 22, 22, 25, 1, 1, 141, 25, 23, 135, - /* 2080 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2090 */ 319, 319, 319, 319, 141, 141, 319, 141, 319, 319, - /* 2100 */ 319, 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, + /* 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, 43, 234, 18, + /* 1810 */ 162, 270, 200, 36, 237, 153, 154, 155, 156, 157, + /* 1820 */ 237, 283, 237, 237, 18, 199, 149, 246, 272, 270, + /* 1830 */ 272, 200, 158, 246, 246, 234, 59, 234, 246, 199, + /* 1840 */ 290, 62, 289, 200, 199, 22, 221, 115, 71, 200, + /* 1850 */ 200, 199, 199, 221, 218, 218, 19, 20, 64, 22, + /* 1860 */ 218, 227, 22, 224, 126, 224, 165, 221, 24, 305, + /* 1870 */ 200, 113, 312, 36, 218, 220, 218, 100, 282, 218, + /* 1880 */ 91, 218, 317, 106, 107, 221, 227, 282, 317, 82, + /* 1890 */ 148, 114, 265, 116, 117, 118, 59, 145, 121, 22, + /* 1900 */ 277, 158, 200, 265, 25, 202, 147, 250, 71, 279, + /* 1910 */ 13, 146, 194, 194, 249, 248, 250, 140, 247, 246, + /* 1920 */ 6, 192, 192, 192, 303, 303, 213, 207, 300, 213, + /* 1930 */ 153, 154, 155, 156, 157, 213, 213, 100, 213, 222, + /* 1940 */ 207, 214, 214, 106, 107, 4, 222, 207, 3, 22, + /* 1950 */ 163, 114, 15, 116, 117, 118, 16, 23, 121, 23, + /* 1960 */ 139, 151, 130, 25, 142, 16, 24, 20, 144, 1, + /* 1970 */ 142, 130, 130, 61, 53, 53, 37, 151, 53, 53, + /* 1980 */ 130, 116, 34, 1, 141, 5, 22, 115, 161, 141, + /* 1990 */ 153, 154, 155, 156, 157, 25, 68, 68, 75, 41, + /* 2000 */ 115, 24, 131, 20, 19, 125, 22, 96, 22, 22, + /* 2010 */ 67, 23, 22, 67, 59, 24, 22, 28, 67, 23, + /* 2020 */ 22, 22, 149, 23, 23, 23, 116, 23, 25, 37, + /* 2030 */ 97, 141, 23, 23, 22, 143, 25, 75, 88, 34, + /* 2040 */ 34, 34, 34, 86, 75, 93, 23, 34, 22, 34, + /* 2050 */ 25, 24, 34, 25, 23, 142, 23, 142, 44, 23, + /* 2060 */ 23, 23, 11, 23, 25, 22, 22, 22, 15, 23, + /* 2070 */ 23, 22, 22, 25, 1, 1, 141, 25, 23, 135, + /* 2080 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2090 */ 319, 319, 319, 319, 141, 141, 319, 141, 319, 319, + /* 2100 */ 319, 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, }; -#define YY_SHIFT_COUNT (575) -#define YY_SHIFT_MIN (0) -#define YY_SHIFT_MAX (2074) +#define YY_SHIFT_COUNT (575) +#define YY_SHIFT_MIN (0) +#define YY_SHIFT_MAX (2074) 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, 2098, 2098, 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, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 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, 1764, 1791, - /* 330 */ 1791, 1791, 1791, 1633, 1806, 1677, 1651, 1651, 1677, 1783, - /* 340 */ 1764, 1677, 1764, 1677, 1633, 1806, 1674, 1779, 1633, 1806, - /* 350 */ 1823, 1633, 1806, 1633, 1806, 1823, 1732, 1732, 1732, 1794, - /* 360 */ 1840, 1840, 1823, 1732, 1738, 1732, 1794, 1732, 1732, 1701, - /* 370 */ 1844, 1758, 1758, 1823, 1633, 1789, 1789, 1807, 1807, 1742, - /* 380 */ 1752, 1877, 1633, 1743, 1742, 1759, 1765, 1677, 1879, 1897, - /* 390 */ 1897, 1914, 1914, 1914, 2098, 2098, 2098, 2098, 2098, 2098, - /* 400 */ 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 207, - /* 410 */ 1095, 331, 620, 903, 806, 1074, 1483, 1432, 1481, 1322, - /* 420 */ 1370, 1394, 1515, 1291, 1546, 1547, 1557, 1595, 1598, 1599, - /* 430 */ 1434, 1453, 1618, 1462, 1567, 1489, 1644, 1654, 1616, 1660, - /* 440 */ 1548, 1549, 1682, 1685, 1597, 742, 1941, 1945, 1927, 1787, - /* 450 */ 1937, 1940, 1934, 1936, 1821, 1810, 1832, 1938, 1938, 1942, - /* 460 */ 1822, 1947, 1824, 1949, 1968, 1828, 1841, 1938, 1842, 1912, - /* 470 */ 1939, 1938, 1826, 1921, 1922, 1925, 1926, 1850, 1865, 1948, - /* 480 */ 1843, 1982, 1980, 1964, 1872, 1827, 1928, 1970, 1929, 1923, - /* 490 */ 1958, 1848, 1885, 1977, 1983, 1985, 1871, 1880, 1984, 1943, - /* 500 */ 1986, 1987, 1988, 1990, 1946, 1955, 1991, 1911, 1989, 1994, - /* 510 */ 1951, 1992, 1996, 1873, 1998, 2000, 2001, 2002, 2003, 2004, - /* 520 */ 1999, 1933, 1890, 2009, 2010, 1910, 2005, 2012, 1892, 2011, - /* 530 */ 2006, 2007, 2008, 2013, 1950, 1962, 1957, 2014, 1969, 1952, - /* 540 */ 2015, 2023, 2026, 2027, 2025, 2028, 2018, 1913, 1915, 2031, - /* 550 */ 2011, 2033, 2036, 2037, 2038, 2039, 2040, 2043, 2051, 2044, - /* 560 */ 2045, 2046, 2047, 2049, 2050, 2048, 1944, 1935, 1953, 1954, - /* 570 */ 1956, 2052, 2055, 2053, 2073, 2074, + /* 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, 2098, 2098, 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, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 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, 1764, 1791, + /* 330 */ 1791, 1791, 1791, 1633, 1806, 1677, 1651, 1651, 1677, 1783, + /* 340 */ 1764, 1677, 1764, 1677, 1633, 1806, 1674, 1779, 1633, 1806, + /* 350 */ 1823, 1633, 1806, 1633, 1806, 1823, 1732, 1732, 1732, 1794, + /* 360 */ 1840, 1840, 1823, 1732, 1738, 1732, 1794, 1732, 1732, 1701, + /* 370 */ 1844, 1758, 1758, 1823, 1633, 1789, 1789, 1807, 1807, 1742, + /* 380 */ 1752, 1877, 1633, 1743, 1742, 1759, 1765, 1677, 1879, 1897, + /* 390 */ 1897, 1914, 1914, 1914, 2098, 2098, 2098, 2098, 2098, 2098, + /* 400 */ 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 207, + /* 410 */ 1095, 331, 620, 903, 806, 1074, 1483, 1432, 1481, 1322, + /* 420 */ 1370, 1394, 1515, 1291, 1546, 1547, 1557, 1595, 1598, 1599, + /* 430 */ 1434, 1453, 1618, 1462, 1567, 1489, 1644, 1654, 1616, 1660, + /* 440 */ 1548, 1549, 1682, 1685, 1597, 742, 1941, 1945, 1927, 1787, + /* 450 */ 1937, 1940, 1934, 1936, 1821, 1810, 1832, 1938, 1938, 1942, + /* 460 */ 1822, 1947, 1824, 1949, 1968, 1828, 1841, 1938, 1842, 1912, + /* 470 */ 1939, 1938, 1826, 1921, 1922, 1925, 1926, 1850, 1865, 1948, + /* 480 */ 1843, 1982, 1980, 1964, 1872, 1827, 1928, 1970, 1929, 1923, + /* 490 */ 1958, 1848, 1885, 1977, 1983, 1985, 1871, 1880, 1984, 1943, + /* 500 */ 1986, 1987, 1988, 1990, 1946, 1955, 1991, 1911, 1989, 1994, + /* 510 */ 1951, 1992, 1996, 1873, 1998, 2000, 2001, 2002, 2003, 2004, + /* 520 */ 1999, 1933, 1890, 2009, 2010, 1910, 2005, 2012, 1892, 2011, + /* 530 */ 2006, 2007, 2008, 2013, 1950, 1962, 1957, 2014, 1969, 1952, + /* 540 */ 2015, 2023, 2026, 2027, 2025, 2028, 2018, 1913, 1915, 2031, + /* 550 */ 2011, 2033, 2036, 2037, 2038, 2039, 2040, 2043, 2051, 2044, + /* 560 */ 2045, 2046, 2047, 2049, 2050, 2048, 1944, 1935, 1953, 1954, + /* 570 */ 1956, 2052, 2055, 2053, 2073, 2074, }; #define YY_REDUCE_COUNT (408) -#define YY_REDUCE_MIN (-271) -#define YY_REDUCE_MAX (1740) +#define YY_REDUCE_MIN (-271) +#define YY_REDUCE_MAX (1740) 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, 1574, 1577, - /* 330 */ 1583, 1585, 1586, 1612, 1626, 1581, 1556, 1558, 1587, 1559, - /* 340 */ 1601, 1588, 1603, 1592, 1631, 1640, 1550, 1553, 1643, 1645, - /* 350 */ 1625, 1649, 1652, 1650, 1653, 1632, 1636, 1637, 1642, 1634, - /* 360 */ 1639, 1641, 1646, 1656, 1655, 1658, 1659, 1661, 1663, 1560, - /* 370 */ 1564, 1596, 1605, 1664, 1670, 1565, 1571, 1627, 1638, 1657, - /* 380 */ 1665, 1623, 1702, 1630, 1666, 1667, 1671, 1673, 1703, 1718, - /* 390 */ 1719, 1729, 1730, 1731, 1621, 1622, 1628, 1720, 1713, 1716, - /* 400 */ 1722, 1723, 1733, 1717, 1724, 1727, 1728, 1725, 1740, + /* 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, 1574, 1577, + /* 330 */ 1583, 1585, 1586, 1612, 1626, 1581, 1556, 1558, 1587, 1559, + /* 340 */ 1601, 1588, 1603, 1592, 1631, 1640, 1550, 1553, 1643, 1645, + /* 350 */ 1625, 1649, 1652, 1650, 1653, 1632, 1636, 1637, 1642, 1634, + /* 360 */ 1639, 1641, 1646, 1656, 1655, 1658, 1659, 1661, 1663, 1560, + /* 370 */ 1564, 1596, 1605, 1664, 1670, 1565, 1571, 1627, 1638, 1657, + /* 380 */ 1665, 1623, 1702, 1630, 1666, 1667, 1671, 1673, 1703, 1718, + /* 390 */ 1719, 1729, 1730, 1731, 1621, 1622, 1628, 1720, 1713, 1716, + /* 400 */ 1722, 1723, 1733, 1717, 1724, 1727, 1728, 1725, 1740, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 1647, 1647, 1647, 1475, 1240, 1351, 1240, 1240, 1240, 1475, - /* 10 */ 1475, 1475, 1240, 1381, 1381, 1528, 1273, 1240, 1240, 1240, - /* 20 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1474, 1240, 1240, - /* 30 */ 1240, 1240, 1563, 1563, 1240, 1240, 1240, 1240, 1240, 1240, - /* 40 */ 1240, 1240, 1390, 1240, 1397, 1240, 1240, 1240, 1240, 1240, - /* 50 */ 1476, 1477, 1240, 1240, 1240, 1527, 1529, 1492, 1404, 1403, - /* 60 */ 1402, 1401, 1510, 1369, 1395, 1388, 1392, 1470, 1471, 1469, - /* 70 */ 1473, 1477, 1476, 1240, 1391, 1438, 1454, 1437, 1240, 1240, - /* 80 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 90 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 100 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 110 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 120 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 130 */ 1446, 1453, 1452, 1451, 1460, 1450, 1447, 1440, 1439, 1441, - /* 140 */ 1442, 1240, 1240, 1264, 1240, 1240, 1261, 1315, 1240, 1240, - /* 150 */ 1240, 1240, 1240, 1547, 1546, 1240, 1443, 1240, 1273, 1432, - /* 160 */ 1431, 1457, 1444, 1456, 1455, 1535, 1599, 1598, 1493, 1240, - /* 170 */ 1240, 1240, 1240, 1240, 1240, 1563, 1240, 1240, 1240, 1240, - /* 180 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 190 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1371, - /* 200 */ 1563, 1563, 1240, 1273, 1563, 1563, 1372, 1372, 1269, 1269, - /* 210 */ 1375, 1240, 1542, 1342, 1342, 1342, 1342, 1351, 1342, 1240, - /* 220 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 230 */ 1240, 1240, 1240, 1240, 1532, 1530, 1240, 1240, 1240, 1240, - /* 240 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 250 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 260 */ 1240, 1240, 1240, 1347, 1240, 1240, 1240, 1240, 1240, 1240, - /* 270 */ 1240, 1240, 1240, 1240, 1240, 1592, 1240, 1505, 1329, 1347, - /* 280 */ 1347, 1347, 1347, 1349, 1330, 1328, 1341, 1274, 1247, 1639, - /* 290 */ 1407, 1396, 1348, 1396, 1636, 1394, 1407, 1407, 1394, 1407, - /* 300 */ 1348, 1636, 1290, 1615, 1285, 1381, 1381, 1381, 1371, 1371, - /* 310 */ 1371, 1371, 1375, 1375, 1472, 1348, 1341, 1240, 1639, 1639, - /* 320 */ 1357, 1357, 1638, 1638, 1357, 1493, 1623, 1416, 1318, 1324, - /* 330 */ 1324, 1324, 1324, 1357, 1258, 1394, 1623, 1623, 1394, 1416, - /* 340 */ 1318, 1394, 1318, 1394, 1357, 1258, 1509, 1633, 1357, 1258, - /* 350 */ 1483, 1357, 1258, 1357, 1258, 1483, 1316, 1316, 1316, 1305, - /* 360 */ 1240, 1240, 1483, 1316, 1290, 1316, 1305, 1316, 1316, 1581, - /* 370 */ 1240, 1487, 1487, 1483, 1357, 1573, 1573, 1384, 1384, 1389, - /* 380 */ 1375, 1478, 1357, 1240, 1389, 1387, 1385, 1394, 1308, 1595, - /* 390 */ 1595, 1591, 1591, 1591, 1644, 1644, 1542, 1608, 1273, 1273, - /* 400 */ 1273, 1273, 1608, 1292, 1292, 1274, 1274, 1273, 1608, 1240, - /* 410 */ 1240, 1240, 1240, 1240, 1240, 1603, 1240, 1537, 1494, 1361, - /* 420 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 430 */ 1240, 1240, 1240, 1240, 1548, 1240, 1240, 1240, 1240, 1240, - /* 440 */ 1240, 1240, 1240, 1240, 1240, 1421, 1240, 1243, 1539, 1240, - /* 450 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1398, 1399, 1362, - /* 460 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1413, 1240, 1240, - /* 470 */ 1240, 1408, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 480 */ 1635, 1240, 1240, 1240, 1240, 1240, 1240, 1508, 1507, 1240, - /* 490 */ 1240, 1359, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 500 */ 1240, 1240, 1240, 1240, 1240, 1288, 1240, 1240, 1240, 1240, - /* 510 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 520 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1386, - /* 530 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 540 */ 1240, 1240, 1240, 1240, 1578, 1376, 1240, 1240, 1240, 1240, - /* 550 */ 1626, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 560 */ 1240, 1240, 1240, 1240, 1240, 1619, 1332, 1423, 1240, 1422, - /* 570 */ 1426, 1262, 1240, 1252, 1240, 1240, + /* 0 */ 1647, 1647, 1647, 1475, 1240, 1351, 1240, 1240, 1240, 1475, + /* 10 */ 1475, 1475, 1240, 1381, 1381, 1528, 1273, 1240, 1240, 1240, + /* 20 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1474, 1240, 1240, + /* 30 */ 1240, 1240, 1563, 1563, 1240, 1240, 1240, 1240, 1240, 1240, + /* 40 */ 1240, 1240, 1390, 1240, 1397, 1240, 1240, 1240, 1240, 1240, + /* 50 */ 1476, 1477, 1240, 1240, 1240, 1527, 1529, 1492, 1404, 1403, + /* 60 */ 1402, 1401, 1510, 1369, 1395, 1388, 1392, 1470, 1471, 1469, + /* 70 */ 1473, 1477, 1476, 1240, 1391, 1438, 1454, 1437, 1240, 1240, + /* 80 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 90 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 100 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 110 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 120 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 130 */ 1446, 1453, 1452, 1451, 1460, 1450, 1447, 1440, 1439, 1441, + /* 140 */ 1442, 1240, 1240, 1264, 1240, 1240, 1261, 1315, 1240, 1240, + /* 150 */ 1240, 1240, 1240, 1547, 1546, 1240, 1443, 1240, 1273, 1432, + /* 160 */ 1431, 1457, 1444, 1456, 1455, 1535, 1599, 1598, 1493, 1240, + /* 170 */ 1240, 1240, 1240, 1240, 1240, 1563, 1240, 1240, 1240, 1240, + /* 180 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 190 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1371, + /* 200 */ 1563, 1563, 1240, 1273, 1563, 1563, 1372, 1372, 1269, 1269, + /* 210 */ 1375, 1240, 1542, 1342, 1342, 1342, 1342, 1351, 1342, 1240, + /* 220 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 230 */ 1240, 1240, 1240, 1240, 1532, 1530, 1240, 1240, 1240, 1240, + /* 240 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 250 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 260 */ 1240, 1240, 1240, 1347, 1240, 1240, 1240, 1240, 1240, 1240, + /* 270 */ 1240, 1240, 1240, 1240, 1240, 1592, 1240, 1505, 1329, 1347, + /* 280 */ 1347, 1347, 1347, 1349, 1330, 1328, 1341, 1274, 1247, 1639, + /* 290 */ 1407, 1396, 1348, 1396, 1636, 1394, 1407, 1407, 1394, 1407, + /* 300 */ 1348, 1636, 1290, 1615, 1285, 1381, 1381, 1381, 1371, 1371, + /* 310 */ 1371, 1371, 1375, 1375, 1472, 1348, 1341, 1240, 1639, 1639, + /* 320 */ 1357, 1357, 1638, 1638, 1357, 1493, 1623, 1416, 1318, 1324, + /* 330 */ 1324, 1324, 1324, 1357, 1258, 1394, 1623, 1623, 1394, 1416, + /* 340 */ 1318, 1394, 1318, 1394, 1357, 1258, 1509, 1633, 1357, 1258, + /* 350 */ 1483, 1357, 1258, 1357, 1258, 1483, 1316, 1316, 1316, 1305, + /* 360 */ 1240, 1240, 1483, 1316, 1290, 1316, 1305, 1316, 1316, 1581, + /* 370 */ 1240, 1487, 1487, 1483, 1357, 1573, 1573, 1384, 1384, 1389, + /* 380 */ 1375, 1478, 1357, 1240, 1389, 1387, 1385, 1394, 1308, 1595, + /* 390 */ 1595, 1591, 1591, 1591, 1644, 1644, 1542, 1608, 1273, 1273, + /* 400 */ 1273, 1273, 1608, 1292, 1292, 1274, 1274, 1273, 1608, 1240, + /* 410 */ 1240, 1240, 1240, 1240, 1240, 1603, 1240, 1537, 1494, 1361, + /* 420 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 430 */ 1240, 1240, 1240, 1240, 1548, 1240, 1240, 1240, 1240, 1240, + /* 440 */ 1240, 1240, 1240, 1240, 1240, 1421, 1240, 1243, 1539, 1240, + /* 450 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1398, 1399, 1362, + /* 460 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1413, 1240, 1240, + /* 470 */ 1240, 1408, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 480 */ 1635, 1240, 1240, 1240, 1240, 1240, 1240, 1508, 1507, 1240, + /* 490 */ 1240, 1359, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 500 */ 1240, 1240, 1240, 1240, 1240, 1288, 1240, 1240, 1240, 1240, + /* 510 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 520 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1386, + /* 530 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 540 */ 1240, 1240, 1240, 1240, 1578, 1376, 1240, 1240, 1240, 1240, + /* 550 */ 1626, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 560 */ 1240, 1240, 1240, 1240, 1240, 1619, 1332, 1423, 1240, 1422, + /* 570 */ 1426, 1262, 1240, 1252, 1240, 1240, }; /********** End of lemon-generated parsing tables *****************************/ @@ -164742,52 +162401,52 @@ static const YYACTIONTYPE yy_default[] = { static const YYCODETYPE yyFallback[] = { 0, /* $ => nothing */ 0, /* SEMI => nothing */ - 59, /* EXPLAIN => ID */ - 59, /* QUERY => ID */ - 59, /* PLAN => ID */ - 59, /* BEGIN => ID */ + 59, /* EXPLAIN => ID */ + 59, /* QUERY => ID */ + 59, /* PLAN => ID */ + 59, /* BEGIN => ID */ 0, /* TRANSACTION => nothing */ - 59, /* DEFERRED => ID */ - 59, /* IMMEDIATE => ID */ - 59, /* EXCLUSIVE => ID */ + 59, /* DEFERRED => ID */ + 59, /* IMMEDIATE => ID */ + 59, /* EXCLUSIVE => ID */ 0, /* COMMIT => nothing */ - 59, /* END => ID */ - 59, /* ROLLBACK => ID */ - 59, /* SAVEPOINT => ID */ - 59, /* RELEASE => ID */ + 59, /* END => ID */ + 59, /* ROLLBACK => ID */ + 59, /* SAVEPOINT => ID */ + 59, /* RELEASE => ID */ 0, /* TO => nothing */ 0, /* TABLE => nothing */ 0, /* CREATE => nothing */ - 59, /* IF => ID */ + 59, /* IF => ID */ 0, /* NOT => nothing */ 0, /* EXISTS => nothing */ - 59, /* TEMP => ID */ + 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 */ + 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 */ + 59, /* MATCH => ID */ + 59, /* LIKE_KW => ID */ 0, /* BETWEEN => nothing */ 0, /* IN => nothing */ 0, /* ISNULL => nothing */ @@ -164800,47 +162459,47 @@ static const YYCODETYPE yyFallback[] = { 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 */ + 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 */ @@ -164945,33 +162604,33 @@ static const YYCODETYPE yyFallback[] = { ** 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 */ + 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 */ + yyStackEntry* yytos; /* Pointer to top element of the stack */ #ifdef YYTRACKMAXSTACKDEPTH - int yyhwm; /* High-water mark of the stack */ + int yyhwm; /* High-water mark of the stack */ #endif #ifndef YYNOERRORRECOVERY - int yyerrcnt; /* Shifts left before out of the error */ + 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 */ + 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 */ + yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */ + yyStackEntry* yystackEnd; /* Last entry in the stack */ #endif }; typedef struct yyParser yyParser; @@ -164979,8 +162638,8 @@ typedef struct yyParser yyParser; /* #include */ #ifndef NDEBUG /* #include */ -static FILE *yyTraceFILE = 0; -static char *yyTracePrompt = 0; +static FILE* yyTraceFILE = 0; +static char* yyTracePrompt = 0; #endif /* NDEBUG */ #ifndef NDEBUG @@ -165001,783 +162660,784 @@ static char *yyTracePrompt = 0; ** Outputs: ** None. */ -SQLITE_PRIVATE void sqlite3ParserTrace(FILE *TraceFILE, char *zTracePrompt){ +SQLITE_PRIVATE void sqlite3ParserTrace(FILE* TraceFILE, char* zTracePrompt) { yyTraceFILE = TraceFILE; yyTracePrompt = zTracePrompt; - if( yyTraceFILE==0 ) yyTracePrompt = 0; - else if( yyTracePrompt==0 ) yyTraceFILE = 0; + 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", +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", - /* 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", - /* 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 ::=", + */ +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", + /* 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", + /* 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 +#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){ +static int yyGrowStack(yyParser* p) { int newSize; int idx; - yyStackEntry *pNew; + yyStackEntry* pNew; - newSize = p->yystksz*2 + 100; + 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 (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 ){ + 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); + if (yyTraceFILE) { + fprintf(yyTraceFILE, "%sStack grows from %d to %d entries.\n", yyTracePrompt, p->yystksz, newSize); } #endif p->yystksz = newSize; } - return pNew==0; + return pNew == 0; } #endif @@ -165787,22 +163447,22 @@ static int yyGrowStack(yyParser *p){ ** grammar. */ #ifndef YYMALLOCARGTYPE -# define YYMALLOCARGTYPE size_t +#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; + */ +SQLITE_PRIVATE void sqlite3ParserInit(void* yypRawParser sqlite3ParserCTX_PDECL) { + yyParser* yypParser = (yyParser*)yypRawParser; sqlite3ParserCTX_STORE #ifdef YYTRACKMAXSTACKDEPTH - yypParser->yyhwm = 0; + yypParser->yyhwm = 0; #endif -#if YYSTACKDEPTH<=0 +#if YYSTACKDEPTH <= 0 yypParser->yytos = NULL; yypParser->yystack = NULL; yypParser->yystksz = 0; - if( yyGrowStack(yypParser) ){ + if (yyGrowStack(yypParser)) { yypParser->yystack = &yypParser->yystk0; yypParser->yystksz = 1; } @@ -165813,8 +163473,8 @@ SQLITE_PRIVATE void sqlite3ParserInit(void *yypRawParser sqlite3ParserCTX_PDECL) yypParser->yytos = yypParser->yystack; yypParser->yystack[0].stateno = 0; yypParser->yystack[0].major = 0; -#if YYSTACKDEPTH>0 - yypParser->yystackEnd = &yypParser->yystack[YYSTACKDEPTH-1]; +#if YYSTACKDEPTH > 0 + yypParser->yystackEnd = &yypParser->yystack[YYSTACKDEPTH - 1]; #endif } @@ -165831,18 +163491,16 @@ SQLITE_PRIVATE void sqlite3ParserInit(void *yypRawParser sqlite3ParserCTX_PDECL) ** 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); +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 @@ -165850,33 +163508,29 @@ SQLITE_PRIVATE void *sqlite3ParserAlloc(void *(*mallocProc)(YYMALLOCARGTYPE) sql ** 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 ***************************************/ +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; + { + sqlite3SelectDelete(pParse->db, (yypminor->yy47)); + } break; case 216: /* term */ case 217: /* expr */ case 246: /* where_opt */ @@ -165888,10 +163542,9 @@ sqlite3SelectDelete(pParse->db, (yypminor->yy47)); case 290: /* when_clause */ case 295: /* key_opt */ case 311: /* filter_clause */ -{ -sqlite3ExprDelete(pParse->db, (yypminor->yy528)); -} - break; + { + sqlite3ExprDelete(pParse->db, (yypminor->yy528)); + } break; case 221: /* eidlist_opt */ case 231: /* sortlist */ case 232: /* eidlist */ @@ -165905,2738 +163558,2890 @@ sqlite3ExprDelete(pParse->db, (yypminor->yy528)); case 277: /* paren_exprlist */ case 279: /* case_exprlist */ case 310: /* part_opt */ -{ -sqlite3ExprListDelete(pParse->db, (yypminor->yy322)); -} - break; + { + 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; + { + sqlite3SrcListDelete(pParse->db, (yypminor->yy131)); + } break; case 241: /* wqlist */ -{ -sqlite3WithDelete(pParse->db, (yypminor->yy521)); -} - break; + { + sqlite3WithDelete(pParse->db, (yypminor->yy521)); + } break; case 251: /* window_clause */ case 306: /* windowdefn_list */ -{ -sqlite3WindowListDelete(pParse->db, (yypminor->yy41)); -} - break; + { + sqlite3WindowListDelete(pParse->db, (yypminor->yy41)); + } break; case 263: /* idlist */ case 270: /* idlist_opt */ -{ -sqlite3IdListDelete(pParse->db, (yypminor->yy254)); -} - break; + { + 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; + { + sqlite3WindowDelete(pParse->db, (yypminor->yy41)); + } break; case 286: /* trigger_cmd_list */ case 291: /* trigger_cmd */ -{ -sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy33)); -} - break; + { + 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 */ - 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 */ - 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 */ - -6, /* (150) cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret */ - 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 */ - -9, /* (157) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret */ - -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 */ -{ - sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy131, &yymsp[-1].minor.yy0); - sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy131,yymsp[0].minor.yy528,0,0); -} - 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 */ -{ - sqlite3SrcListIndexedBy(pParse, yymsp[-5].minor.yy131, &yymsp[-4].minor.yy0); - sqlite3ExprListCheckLength(pParse,yymsp[-2].minor.yy322,"set list"); - if( yymsp[-1].minor.yy131 ){ - SrcList *pFromClause = yymsp[-1].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[-5].minor.yy131 = sqlite3SrcListAppendList(pParse, yymsp[-5].minor.yy131, pFromClause); - } - sqlite3Update(pParse,yymsp[-5].minor.yy131,yymsp[-2].minor.yy322,yymsp[0].minor.yy528,yymsp[-6].minor.yy394,0,0,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); + { + 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 */ } } - 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); + +/* +** 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); } - 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); + +/* +** 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 } - 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*/ + +#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); } - 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); +#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; } - 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); +#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; stateno < YYNSTATE; stateno++) { + i = yy_shift_ofst[stateno]; + for (iLookAhead = 0; iLookAhead < YYNTOKEN; iLookAhead++) { + if (yy_lookahead[i + iLookAhead] != iLookAhead) + continue; + if (yycoverage[stateno][iLookAhead] == 0) + nMissed++; + if (out) { + fprintf(out, "State %d lookahead %s %s\n", stateno, yyTokenName[iLookAhead], yycoverage[stateno][iLookAhead] ? "ok" : "missed"); + } + } } - if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); + return nMissed; } - 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); +#endif + +/* +** Find the appropriate action for a parser given the terminal +** look-ahead token iLookAhead. +*/ +static YYACTIONTYPE yy_find_shift_action(YYCODETYPE iLookAhead, /* The look-ahead token */ + YYACTIONTYPE stateno /* Current state number */ +) { + int i; + + if (stateno > YY_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 < sizeof(yyFallback) / sizeof(yyFallback[0])); + iFallback = yyFallback[iLookAhead]; + if (iFallback != 0) { +#ifndef NDEBUG + if (yyTraceFILE) { + fprintf(yyTraceFILE, "%sFALLBACK %s => %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]); } - }else{ - yymsp[-4].minor.yy528->x.pList = yymsp[-1].minor.yy322; - sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy528); +#endif /* NDEBUG */ + return yy_action[j]; } } - if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); +#endif /* YYWILDCARD */ + return yy_default[stateno]; + } else { + assert(i >= 0 && i < (int)(sizeof(yy_action) / sizeof(yy_action[0]))); + return yy_action[i]; } - } - 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); + } while (1); } - 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); + +/* +** 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]; } -} - 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; +#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 && i < YY_ACTTAB_COUNT); + assert(yy_lookahead[i] == iLookAhead); +#endif + return yy_action[i]; } - 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; + +/* +** The following routine is called if the stack overflows. +*/ +static void yyStackOverflow(yyParser* yypParser) { + sqlite3ParserARG_FETCH sqlite3ParserCTX_FETCH +#ifndef NDEBUG + if (yyTraceFILE) { + fprintf(yyTraceFILE, "%sStack Overflow!\n", yyTracePrompt); } +#endif + while (yypParser->yytos > 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 } - 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); + +/* +** Print tracing information for a SHIFT action +*/ +#ifndef NDEBUG +static void yyTraceShift(yyParser* yypParser, int yyNewState, const char* zTag) { + if (yyTraceFILE) { + if (yyNewState < YYNSTATE) { + fprintf(yyTraceFILE, "%s%s '%s', go to state %d\n", yyTracePrompt, zTag, yyTokenName[yypParser->yytos->major], yyNewState); + } else { + fprintf(yyTraceFILE, "%s%s '%s', pending reduce %d\n", yyTracePrompt, zTag, yyTokenName[yypParser->yytos->major], + yyNewState - YY_MIN_REDUCE); + } } - 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); +#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)); } - 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); +#endif +#if YYSTACKDEPTH > 0 + if (yypParser->yytos > yypParser->yystackEnd) { + yypParser->yytos--; + yyStackOverflow(yypParser); + return; } -} - 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); +#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"); } - 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 ************************************************/ + +/* 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 */ + 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 */ + 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 */ + -6, /* (150) cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret */ + 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 */ + -9, /* (157) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret */ + -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 */ + { + sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy131, &yymsp[-1].minor.yy0); + sqlite3DeleteFrom(pParse, yymsp[-2].minor.yy131, yymsp[0].minor.yy528, 0, 0); + } 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 */ + { + sqlite3SrcListIndexedBy(pParse, yymsp[-5].minor.yy131, &yymsp[-4].minor.yy0); + sqlite3ExprListCheckLength(pParse, yymsp[-2].minor.yy322, "set list"); + if (yymsp[-1].minor.yy131) { + SrcList* pFromClause = yymsp[-1].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[-5].minor.yy131 = sqlite3SrcListAppendList(pParse, yymsp[-5].minor.yy131, pFromClause); + } + sqlite3Update(pParse, yymsp[-5].minor.yy131, yymsp[-2].minor.yy322, yymsp[0].minor.yy528, yymsp[-6].minor.yy394, 0, 0, 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) ); + assert(!(yyact > YY_MAX_SHIFT && yyact <= YY_MAX_SHIFTREDUCE)); /* It is not possible for a REDUCE to be followed by an error */ - assert( yyact!=YY_ERROR_ACTION ); + assert(yyact != YY_ERROR_ACTION); - yymsp += yysize+1; + yymsp += yysize + 1; yypParser->yytos = yymsp; yymsp->stateno = (YYACTIONTYPE)yyact; yymsp->major = (YYCODETYPE)yygoto; @@ -168648,73 +166453,68 @@ static YYACTIONTYPE yy_reduce( ** The following code executes when the parse fails */ #ifndef YYNOERRORRECOVERY -static void yy_parse_failed( - yyParser *yypParser /* The parser */ -){ - sqlite3ParserARG_FETCH - sqlite3ParserCTX_FETCH +static void yy_parse_failed(yyParser* yypParser /* The parser */ +) { + sqlite3ParserARG_FETCH sqlite3ParserCTX_FETCH #ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt); + if (yyTraceFILE) { + fprintf(yyTraceFILE, "%sFail!\n", yyTracePrompt); } #endif - while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); + 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 *****************************************/ + /************ Begin %parse_failure code ***************************************/ + /************ End %parse_failure code *****************************************/ sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument variable */ - sqlite3ParserCTX_STORE + 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 +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 ****************************************/ + /************ Begin %syntax_error code ****************************************/ - UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */ - if( TOKEN.z[0] ){ + UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */ + if (TOKEN.z[0]) { sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN); - }else{ + } else { sqlite3ErrorMsg(pParse, "incomplete input"); } -/************ End %syntax_error code ******************************************/ + /************ End %syntax_error code ******************************************/ sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument variable */ - sqlite3ParserCTX_STORE + sqlite3ParserCTX_STORE } /* ** The following is executed when the parser accepts */ -static void yy_accept( - yyParser *yypParser /* The parser */ -){ - sqlite3ParserARG_FETCH - sqlite3ParserCTX_FETCH +static void yy_accept(yyParser* yypParser /* The parser */ +) { + sqlite3ParserARG_FETCH sqlite3ParserCTX_FETCH #ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt); + if (yyTraceFILE) { + fprintf(yyTraceFILE, "%sAccept!\n", yyTracePrompt); } #endif #ifndef YYNOERRORRECOVERY yypParser->yyerrcnt = -1; #endif - assert( yypParser->yytos==yypParser->yystack ); + 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 *******************************************/ + /*********** Begin %parse_accept code *****************************************/ + /*********** End %parse_accept code *******************************************/ sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument variable */ - sqlite3ParserCTX_STORE + sqlite3ParserCTX_STORE } /* The main parser program. @@ -168736,62 +166536,54 @@ static void yy_accept( ** 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 */ -){ +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. */ + YYACTIONTYPE yyact; /* The parser action. */ #if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) - int yyendofinput; /* True if we are at the end of input */ + int yyendofinput; /* True if we are at the end of input */ #endif #ifdef YYERRORSYMBOL - int yyerrorhit = 0; /* True if yymajor has invoked an error */ + int yyerrorhit = 0; /* True if yymajor has invoked an error */ #endif - yyParser *yypParser = (yyParser*)yyp; /* The parser */ - sqlite3ParserCTX_FETCH - sqlite3ParserARG_STORE + yyParser* yypParser = (yyParser*)yyp; /* The parser */ + sqlite3ParserCTX_FETCH sqlite3ParserARG_STORE - assert( yypParser->yytos!=0 ); + assert(yypParser->yytos != 0); #if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) - yyendofinput = (yymajor==0); + 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); + 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 ){ + 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 ){ + 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[yysize].stateno); + } else { + fprintf(yyTraceFILE, "%sReduce %d [%s]%s.\n", yyTracePrompt, yyruleno, yyRuleName[yyruleno], + yyruleno < YYNRULE_WITH_ACTION ? "" : " without external action"); } } #endif /* NDEBUG */ @@ -168799,48 +166591,47 @@ SQLITE_PRIVATE void sqlite3Parser( /* Check that the stack is large enough to grow by a single entry ** if the RHS of the rule is empty. This ensures that there is room ** enough on the stack to push the LHS value */ - if( yyRuleInfoNRhs[yyruleno]==0 ){ + if (yyRuleInfoNRhs[yyruleno] == 0) { #ifdef YYTRACKMAXSTACKDEPTH - if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ + if ((int)(yypParser->yytos - yypParser->yystack) > yypParser->yyhwm) { yypParser->yyhwm++; - assert( yypParser->yyhwm == - (int)(yypParser->yytos - yypParser->yystack)); + assert(yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack)); } #endif -#if YYSTACKDEPTH>0 - if( yypParser->yytos>=yypParser->yystackEnd ){ +#if YYSTACKDEPTH > 0 + if (yypParser->yytos >= yypParser->yystackEnd) { yyStackOverflow(yypParser); break; } #else - if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){ - if( yyGrowStack(yypParser) ){ + 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); + 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 ){ + } else if (yyact == YY_ACCEPT_ACTION) { yypParser->yytos--; yy_accept(yypParser); return; - }else{ - assert( yyact == YY_ERROR_ACTION ); + } else { + assert(yyact == YY_ERROR_ACTION); yyminorunion.yy0 = yyminor; #ifdef YYERRORSYMBOL int yymx; #endif #ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt); + if (yyTraceFILE) { + fprintf(yyTraceFILE, "%sSyntax Error!\n", yyTracePrompt); } #endif #ifdef YYERRORSYMBOL @@ -168863,40 +166654,40 @@ SQLITE_PRIVATE void sqlite3Parser( ** shifted successfully. ** */ - if( yypParser->yyerrcnt<0 ){ - yy_syntax_error(yypParser,yymajor,yyminor); + if (yypParser->yyerrcnt < 0) { + yy_syntax_error(yypParser, yymajor, yyminor); } yymx = yypParser->yytos->major; - if( yymx==YYERRORSYMBOL || yyerrorhit ){ + if (yymx == YYERRORSYMBOL || yyerrorhit) { #ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sDiscard input token %s\n", - yyTracePrompt,yyTokenName[yymajor]); + 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; + } 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); + 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); + } else if (yymx != YYERRORSYMBOL) { + yy_shift(yypParser, yyact, YYERRORSYMBOL, yyminor); } } yypParser->yyerrcnt = 3; yyerrorhit = 1; - if( yymajor==YYNOCODE ) break; + if (yymajor == YYNOCODE) + break; yyact = yypParser->yytos->stateno; #elif defined(YYNOERRORRECOVERY) /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to @@ -168906,10 +166697,10 @@ SQLITE_PRIVATE void sqlite3Parser( ** 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); + yy_syntax_error(yypParser, yymajor, yyminor); + yy_destructor(yypParser, (YYCODETYPE)yymajor, &yyminorunion); break; -#else /* YYERRORSYMBOL is not defined */ +#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. @@ -168919,12 +166710,12 @@ SQLITE_PRIVATE void sqlite3Parser( ** 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); + if (yypParser->yyerrcnt <= 0) { + yy_syntax_error(yypParser, yymajor, yyminor); } yypParser->yyerrcnt = 3; - yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); - if( yyendofinput ){ + yy_destructor(yypParser, (YYCODETYPE)yymajor, &yyminorunion); + if (yyendofinput) { yy_parse_failed(yypParser); #ifndef YYNOERRORRECOVERY yypParser->yyerrcnt = -1; @@ -168935,15 +166726,15 @@ SQLITE_PRIVATE void sqlite3Parser( } } #ifndef NDEBUG - if( yyTraceFILE ){ - yyStackEntry *i; + 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]); + 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"); + fprintf(yyTraceFILE, "]\n"); } #endif return; @@ -168953,9 +166744,9 @@ SQLITE_PRIVATE void sqlite3Parser( ** Return the fallback token corresponding to canonical token iToken, or ** 0 if iToken has no fallback. */ -SQLITE_PRIVATE int sqlite3ParserFallback(int iToken){ +SQLITE_PRIVATE int sqlite3ParserFallback(int iToken) { #ifdef YYFALLBACK - assert( iToken<(int)(sizeof(yyFallback)/sizeof(yyFallback[0])) ); + assert(iToken < (int)(sizeof(yyFallback) / sizeof(yyFallback[0]))); return yyFallback[iToken]; #else (void)iToken; @@ -168993,76 +166784,556 @@ SQLITE_PRIVATE int sqlite3ParserFallback(int iToken){ ** 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 */ +#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 + /* 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, + /* 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 }; @@ -169076,28 +167347,28 @@ static const unsigned char aiClass[] = { ** Used by keywordhash.h */ #ifdef SQLITE_ASCII -# define charMap(X) sqlite3UpperToLower[(unsigned char)X] +#define charMap(X) sqlite3UpperToLower[(unsigned char)X] #endif #ifdef SQLITE_EBCDIC -# define charMap(X) ebcdicToAscii[(unsigned char)X] +#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 */ + /* 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 @@ -169142,137 +167413,86 @@ const unsigned char ebcdicToAscii[] = { /* 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', + '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, + 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, + 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, + 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, + 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, + 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 @@ -169406,201 +167626,213 @@ static const unsigned char aKWCode[147] = { /* 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){ +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; + 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; + if ((z[0] & ~0x20) != zKW[0]) + continue; + if ((z[1] & ~0x20) != zKW[1]) + continue; j = 2; - while( j=SQLITE_N_KEYWORD ) return SQLITE_ERROR; +SQLITE_API int sqlite3_keyword_name(int i, const char** pzName, int* pnName) { + if (i < 0 || i >= 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); +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. @@ -169618,48 +167850,44 @@ SQLITE_API int sqlite3_keyword_check(const char *zName, int nName){ ** But the feature is undocumented. */ #ifdef SQLITE_ASCII -#define IdChar(C) ((sqlite3CtypeMap[(unsigned char)C]&0x46)!=0) +#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 */ + /* 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])) +#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); } +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 */ +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 - ){ + } 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; @@ -169696,23 +167924,26 @@ static int getToken(const unsigned char **pz){ ** * the previous token was TK_RP, and ** * the next token is TK_LP. */ -static int analyzeWindowKeyword(const unsigned char *z){ +static int analyzeWindowKeyword(const unsigned char* z) { int t; t = getToken(&z); - if( t!=TK_ID ) return TK_ID; + if (t != TK_ID) + return TK_ID; t = getToken(&z); - if( t!=TK_AS ) return TK_ID; + if (t != TK_AS) + return TK_ID; return TK_WINDOW; } -static int analyzeOverKeyword(const unsigned char *z, int lastToken){ - if( lastToken==TK_RP ){ +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; + 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 ){ +static int analyzeFilterKeyword(const unsigned char* z, int lastToken) { + if (lastToken == TK_RP && getToken(&z) == TK_LP) { return TK_FILTER; } return TK_ID; @@ -169723,29 +167954,31 @@ static int analyzeFilterKeyword(const unsigned char *z, int lastToken){ ** 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){ +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. */ + 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++){} + 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 */ + 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]=='>' ){ + } else if (z[1] == '>') { *tokenType = TK_PTR; - return 2 + (z[2]=='>'); + return 2 + (z[2] == '>'); } *tokenType = TK_MINUS; return 1; @@ -169771,13 +168004,15 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ return 1; } case CC_SLASH: { - if( z[1]!='*' || z[2]==0 ){ + 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 */ + 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: { @@ -169786,49 +168021,49 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ } case CC_EQ: { *tokenType = TK_EQ; - return 1 + (z[1]=='='); + return 1 + (z[1] == '='); } case CC_LT: { - if( (c=z[1])=='=' ){ + if ((c = z[1]) == '=') { *tokenType = TK_LE; return 2; - }else if( c=='>' ){ + } else if (c == '>') { *tokenType = TK_NE; return 2; - }else if( c=='<' ){ + } else if (c == '<') { *tokenType = TK_LSHIFT; return 2; - }else{ + } else { *tokenType = TK_LT; return 1; } } case CC_GT: { - if( (c=z[1])=='=' ){ + if ((c = z[1]) == '=') { *tokenType = TK_GE; return 2; - }else if( c=='>' ){ + } else if (c == '>') { *tokenType = TK_RSHIFT; return 2; - }else{ + } else { *tokenType = TK_GT; return 1; } } case CC_BANG: { - if( z[1]!='=' ){ + if (z[1] != '=') { *tokenType = TK_ILLEGAL; return 1; - }else{ + } else { *tokenType = TK_NE; return 2; } } case CC_PIPE: { - if( z[1]!='|' ){ + if (z[1] != '|') { *tokenType = TK_BITOR; return 1; - }else{ + } else { *tokenType = TK_CONCAT; return 2; } @@ -169847,32 +168082,32 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ } 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 ){ + testcase(delim == '`'); + testcase(delim == '\''); + testcase(delim == '"'); + for (i = 1; (c = z[i]) != 0; i++) { + if (c == delim) { + if (z[i + 1] == delim) { i++; - }else{ + } else { break; } } } - if( c=='\'' ){ + if (c == '\'') { *tokenType = TK_STRING; - return i+1; - }else if( c!=0 ){ + return i + 1; + } else if (c != 0) { *tokenType = TK_ID; - return i+1; - }else{ + return i + 1; + } else { *tokenType = TK_ILLEGAL; return i; } } case CC_DOT: { #ifndef SQLITE_OMIT_FLOATING_POINT - if( !sqlite3Isdigit(z[1]) ) + if (!sqlite3Isdigit(z[1])) #endif { *tokenType = TK_DOT; @@ -169883,83 +168118,98 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ /* 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' ); + 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++){} + 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++){} + for (i = 0; sqlite3Isdigit(z[i]); i++) { + } #ifndef SQLITE_OMIT_FLOATING_POINT - if( z[i]=='.' ){ + if (z[i] == '.') { i++; - while( sqlite3Isdigit(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])) - ) - ){ + 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++; } + while (sqlite3Isdigit(z[i])) { + i++; + } *tokenType = TK_FLOAT; } #endif - while( IdChar(z[i]) ){ + 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; + 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++){} + 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]=='#' ); + 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) ){ + for (i = 1; (c = z[i]) != 0; i++) { + if (IdChar(c)) { n++; #ifndef SQLITE_OMIT_TCL_VARIABLE - }else if( c=='(' && n>0 ){ - do{ + } else if (c == '(' && n > 0) { + do { i++; - }while( (c=z[i])!=0 && !sqlite3Isspace(c) && c!=')' ); - if( c==')' ){ + } while ((c = z[i]) != 0 && !sqlite3Isspace(c) && c != ')'); + if (c == ')') { i++; - }else{ + } else { *tokenType = TK_ILLEGAL; } break; - }else if( c==':' && z[i+1]==':' ){ + } else if (c == ':' && z[i + 1] == ':') { i++; #endif - }else{ + } else { break; } } - if( n==0 ) *tokenType = TK_ILLEGAL; + if (n == 0) + *tokenType = TK_ILLEGAL; return i; } case CC_KYWD0: { - for(i=1; aiClass[z[i]]<=CC_KYWD; i++){} - if( IdChar(z[i]) ){ + 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 */ @@ -169971,15 +168221,20 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ } case CC_X: { #ifndef SQLITE_OMIT_BLOB_LITERAL - testcase( z[0]=='x' ); testcase( z[0]=='X' ); - if( z[1]=='\'' ){ + 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 ){ + for (i = 2; sqlite3Isxdigit(z[i]); i++) { + } + if (z[i] != '\'' || i % 2) { *tokenType = TK_ILLEGAL; - while( z[i] && z[i]!='\'' ){ i++; } + while (z[i] && z[i] != '\'') { + i++; + } } - if( z[i] ) i++; + if (z[i]) + i++; return i; } #endif @@ -169993,7 +168248,7 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ break; } case CC_BOM: { - if( z[1]==0xbb && z[2]==0xbf ){ + if (z[1] == 0xbb && z[2] == 0xbf) { *tokenType = TK_SPACE; return 3; } @@ -170009,7 +168264,9 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ return 1; } } - while( IdChar(z[i]) ){ i++; } + while (IdChar(z[i])) { + i++; + } *tokenType = TK_ID; return i; } @@ -170017,32 +168274,32 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ /* ** 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 */ +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 */ + yyParser sEngine; /* Space to hold the Lemon-generated Parser object */ #endif - VVA_ONLY( u8 startedWithOom = db->mallocFailed ); + VVA_ONLY(u8 startedWithOom = db->mallocFailed); - assert( zSql!=0 ); + assert(zSql != 0); mxSqlLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH]; - if( db->nVdbeActive==0 ){ + if (db->nVdbeActive == 0) { AtomicStore(&db->u1.isInterrupted, 0); } pParse->rc = SQLITE_OK; pParse->zTail = zSql; #ifdef SQLITE_DEBUG - if( db->flags & SQLITE_ParserTrace ){ + if (db->flags & SQLITE_ParserTrace) { printf("parser: [[[%s]]]\n", zSql); sqlite3ParserTrace(stdout, "parser: "); - }else{ + } else { sqlite3ParserTrace(0, 0); } #endif @@ -170051,66 +168308,64 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql){ sqlite3ParserInit(pEngine, pParse); #else pEngine = sqlite3ParserAlloc(sqlite3Malloc, pParse); - if( pEngine==0 ){ + 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 ); + assert(pParse->pNewTable == 0); + assert(pParse->pNewTrigger == 0); + assert(pParse->nVar == 0); + assert(pParse->pVList == 0); pParentParse = db->pParse; db->pParse = pParse; - while( 1 ){ + while (1) { n = sqlite3GetToken((u8*)zSql, &tokenType); mxSqlLen -= n; - if( mxSqlLen<0 ){ + 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 - ); + 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 ); + if (tokenType >= TK_SPACE) { + assert(tokenType == TK_SPACE || tokenType == TK_ILLEGAL); #endif /* SQLITE_OMIT_WINDOWFUNC */ - if( AtomicLoad(&db->u1.isInterrupted) ){ + if (AtomicLoad(&db->u1.isInterrupted)) { pParse->rc = SQLITE_INTERRUPT; pParse->nErr++; break; } - if( tokenType==TK_SPACE ){ + if (tokenType == TK_SPACE) { zSql += n; continue; } - if( zSql[0]==0 ){ + 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 ){ + if (lastTokenParsed == TK_SEMI) { tokenType = 0; - }else if( lastTokenParsed==0 ){ + } else if (lastTokenParsed == 0) { break; - }else{ + } else { tokenType = TK_SEMI; } n = 0; #ifndef SQLITE_OMIT_WINDOWFUNC - }else if( tokenType==TK_WINDOW ){ - assert( n==6 ); + } else if (tokenType == TK_WINDOW) { + assert(n == 6); tokenType = analyzeWindowKeyword((const u8*)&zSql[6]); - }else if( tokenType==TK_OVER ){ - assert( n==4 ); + } else if (tokenType == TK_OVER) { + assert(n == 4); tokenType = analyzeOverKeyword((const u8*)&zSql[4], lastTokenParsed); - }else if( tokenType==TK_FILTER ){ - assert( n==6 ); + } else if (tokenType == TK_FILTER) { + assert(n == 6); tokenType = analyzeFilterKeyword((const u8*)&zSql[6], lastTokenParsed); #endif /* SQLITE_OMIT_WINDOWFUNC */ - }else{ + } else { Token x; x.z = zSql; x.n = n; @@ -170123,15 +168378,14 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql){ 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(db->mallocFailed == 0 || pParse->rc != SQLITE_OK || startedWithOom); + if (pParse->rc != SQLITE_OK) + break; } - assert( nErr==0 ); + assert(nErr == 0); #ifdef YYTRACKMAXSTACKDEPTH sqlite3_mutex_enter(sqlite3MallocMutex()); - sqlite3StatusHighwater(SQLITE_STATUS_PARSER_STACK, - sqlite3ParserStackPeak(pEngine) - ); + sqlite3StatusHighwater(SQLITE_STATUS_PARSER_STACK, sqlite3ParserStackPeak(pEngine)); sqlite3_mutex_leave(sqlite3MallocMutex()); #endif /* YYDEBUG */ #ifdef sqlite3Parser_ENGINEALWAYSONSTACK @@ -170139,11 +168393,11 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql){ #else sqlite3ParserFree(pEngine, sqlite3_free); #endif - if( db->mallocFailed ){ + if (db->mallocFailed) { pParse->rc = SQLITE_NOMEM_BKPT; } - if( pParse->zErrMsg || (pParse->rc!=SQLITE_OK && pParse->rc!=SQLITE_DONE) ){ - if( pParse->zErrMsg==0 ){ + 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); @@ -170154,30 +168408,30 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql){ sqlite3_free(pParse->apVtabLock); #endif - if( pParse->pNewTable && !IN_SPECIAL_PARSE ){ + 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 ){ + if (pParse->pNewTrigger && !IN_RENAME_OBJECT) { sqlite3DeleteTrigger(db, pParse->pNewTrigger); } - if( pParse->pVList ) sqlite3DbFreeNN(db, pParse->pVList); + if (pParse->pVList) + sqlite3DbFreeNN(db, pParse->pVList); db->pParse = pParentParse; - assert( nErr==0 || pParse->rc!=SQLITE_OK ); + 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]) ){ +static void addSpaceSeparator(sqlite3_str* pStr) { + if (pStr->nChar && sqlite3IsIdChar(pStr->zText[pStr->nChar - 1])) { sqlite3_str_append(pStr, " ", 1); } } @@ -170187,11 +168441,10 @@ static void addSpaceSeparator(sqlite3_str *pStr){ ** 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 */ +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 */ @@ -170200,25 +168453,26 @@ SQLITE_PRIVATE char *sqlite3Normalize( 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 */ + 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 ){ + 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 ){ + 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 ){ + if (prevType == TK_IS || prevType == TK_NOT) { sqlite3_str_append(pStr, " NULL", 5); break; } @@ -170234,7 +168488,7 @@ SQLITE_PRIVATE char *sqlite3Normalize( } case TK_LP: { nParen++; - if( prevType==TK_IN ){ + if (prevType == TK_IN) { iStartIN = pStr->nChar; nParenAtIN = nParen; } @@ -170242,9 +168496,9 @@ SQLITE_PRIVATE char *sqlite3Normalize( break; } case TK_RP: { - if( iStartIN>0 && nParen==nParenAtIN ){ - assert( pStr->nChar>=(u32)iStartIN ); - pStr->nChar = iStartIN+1; + if (iStartIN > 0 && nParen == nParenAtIN) { + assert(pStr->nChar >= (u32)iStartIN); + pStr->nChar = iStartIN + 1; sqlite3_str_append(pStr, "?,?,?", 5); iStartIN = 0; } @@ -170255,30 +168509,31 @@ SQLITE_PRIVATE char *sqlite3Normalize( case TK_ID: { iStartIN = 0; j = pStr->nChar; - if( sqlite3Isquote(zSql[i]) ){ - char *zId = sqlite3DbStrNDup(db, zSql+i, n); + if (sqlite3Isquote(zSql[i])) { + char* zId = sqlite3DbStrNDup(db, zSql + i, n); int nId; int eType = 0; - if( zId==0 ) break; + if (zId == 0) + break; sqlite3Dequote(zId); - if( zSql[i]=='"' && sqlite3VdbeUsesDoubleQuotedString(pVdbe, 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 ){ + if (sqlite3GetToken((u8*)zId, &eType) == nId && eType == TK_ID) { addSpaceSeparator(pStr); sqlite3_str_append(pStr, zId, nId); - }else{ + } else { sqlite3_str_appendf(pStr, "\"%w\"", zId); } sqlite3DbFree(db, zId); - }else{ + } else { addSpaceSeparator(pStr); - sqlite3_str_append(pStr, zSql+i, n); + sqlite3_str_append(pStr, zSql + i, n); } - while( jnChar ){ + while (j < pStr->nChar) { pStr->zText[j] = sqlite3Tolower(pStr->zText[j]); j++; } @@ -170289,10 +168544,11 @@ SQLITE_PRIVATE char *sqlite3Normalize( /* fall through */ } default: { - if( sqlite3IsIdChar(zSql[i]) ) addSpaceSeparator(pStr); + if (sqlite3IsIdChar(zSql[i])) + addSpaceSeparator(pStr); j = pStr->nChar; - sqlite3_str_append(pStr, zSql+i, n); - while( jnChar ){ + sqlite3_str_append(pStr, zSql + i, n); + while (j < pStr->nChar) { pStr->zText[j] = sqlite3Toupper(pStr->zText[j]); j++; } @@ -170300,7 +168556,8 @@ SQLITE_PRIVATE char *sqlite3Normalize( } } } - if( tokenType!=TK_SEMI ) sqlite3_str_append(pStr, ";", 1); + if (tokenType != TK_SEMI) + sqlite3_str_append(pStr, ";", 1); return sqlite3_str_finish(pStr); } #endif /* SQLITE_ENABLE_NORMALIZE */ @@ -170333,28 +168590,27 @@ SQLITE_PRIVATE char *sqlite3Normalize( */ #ifndef SQLITE_AMALGAMATION #ifdef SQLITE_ASCII -#define IdChar(C) ((sqlite3CtypeMap[(unsigned char)C]&0x46)!=0) +#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])) +#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 +#define tkSEMI 0 +#define tkWS 1 +#define tkOTHER 2 #ifndef SQLITE_OMIT_TRIGGER #define tkEXPLAIN 3 -#define tkCREATE 4 -#define tkTEMP 5 +#define tkCREATE 4 +#define tkTEMP 5 #define tkTRIGGER 6 -#define tkEND 7 +#define tkEND 7 #endif /* @@ -170410,49 +168666,142 @@ SQLITE_PRIVATE const char sqlite3IsEbcdicIdChar[]; ** 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 */ +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, }, + /* 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, }, + /* 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 ){ + if (zSql == 0) { (void)SQLITE_MISUSE_BKPT; return 0; } #endif - while( *zSql ){ - switch( *zSql ){ - case ';': { /* A semicolon */ + while (*zSql) { + switch (*zSql) { + case ';': { /* A semicolon */ token = tkSEMI; break; } @@ -170460,46 +168809,58 @@ SQLITE_API int sqlite3_complete(const char *zSql){ case '\r': case '\t': case '\n': - case '\f': { /* White space is ignored */ + case '\f': { /* White space is ignored */ token = tkWS; break; } - case '/': { /* C-style comments */ - if( zSql[1]!='*' ){ + 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; + 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]!='-' ){ + 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; + while (*zSql && *zSql != '\n') { + zSql++; + } + if (*zSql == 0) + return state == 1; token = tkWS; break; } - case '[': { /* Microsoft-style identifiers in [...] */ + case '[': { /* Microsoft-style identifiers in [...] */ zSql++; - while( *zSql && *zSql!=']' ){ zSql++; } - if( *zSql==0 ) return 0; + 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 '`': /* 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; + while (*zSql && *zSql != c) { + zSql++; + } + if (*zSql == 0) + return 0; token = tkOTHER; break; } @@ -170507,42 +168868,46 @@ SQLITE_API int sqlite3_complete(const char *zSql){ #ifdef SQLITE_EBCDIC unsigned char c; #endif - if( IdChar((u8)*zSql) ){ + if (IdChar((u8)*zSql)) { /* Keywords and unquoted identifiers */ int nId; - for(nId=1; IdChar(zSql[nId]); 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 ){ + switch (*zSql) { + case 'c': + case 'C': { + if (nId == 6 && sqlite3StrNICmp(zSql, "create", 6) == 0) { token = tkCREATE; - }else{ + } else { token = tkOTHER; } break; } - case 't': case 'T': { - if( nId==7 && sqlite3StrNICmp(zSql, "trigger", 7)==0 ){ + case 't': + case 'T': { + if (nId == 7 && sqlite3StrNICmp(zSql, "trigger", 7) == 0) { token = tkTRIGGER; - }else if( nId==4 && sqlite3StrNICmp(zSql, "temp", 4)==0 ){ + } else if (nId == 4 && sqlite3StrNICmp(zSql, "temp", 4) == 0) { token = tkTEMP; - }else if( nId==9 && sqlite3StrNICmp(zSql, "temporary", 9)==0 ){ + } else if (nId == 9 && sqlite3StrNICmp(zSql, "temporary", 9) == 0) { token = tkTEMP; - }else{ + } else { token = tkOTHER; } break; } - case 'e': case 'E': { - if( nId==3 && sqlite3StrNICmp(zSql, "end", 3)==0 ){ + case 'e': + case 'E': { + if (nId == 3 && sqlite3StrNICmp(zSql, "end", 3) == 0) { token = tkEND; - }else + } else #ifndef SQLITE_OMIT_EXPLAIN - if( nId==7 && sqlite3StrNICmp(zSql, "explain", 7)==0 ){ + if (nId == 7 && sqlite3StrNICmp(zSql, "explain", 7) == 0) { token = tkEXPLAIN; - }else + } else #endif { token = tkOTHER; @@ -170555,8 +168920,8 @@ SQLITE_API int sqlite3_complete(const char *zSql){ } } #endif /* SQLITE_OMIT_TRIGGER */ - zSql += nId-1; - }else{ + zSql += nId - 1; + } else { /* Operators and special symbols */ token = tkOTHER; } @@ -170566,7 +168931,7 @@ SQLITE_API int sqlite3_complete(const char *zSql){ state = trans[state][token]; zSql++; } - return state==1; + return state == 1; } #ifndef SQLITE_OMIT_UTF16 @@ -170575,21 +168940,22 @@ SQLITE_API int sqlite3_complete(const char *zSql){ ** 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; +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; + if (rc) + return rc; #endif pVal = sqlite3ValueNew(0); sqlite3ValueSetStr(pVal, -1, zSql, SQLITE_UTF16NATIVE, SQLITE_STATIC); zSql8 = sqlite3ValueText(pVal, SQLITE_UTF8); - if( zSql8 ){ + if (zSql8) { rc = sqlite3_complete(zSql8); - }else{ + } else { rc = SQLITE_NOMEM_BKPT; } sqlite3ValueFree(pVal); @@ -170640,13 +169006,13 @@ SQLITE_API int sqlite3_complete16(const void *zSql){ #if 0 extern "C" { -#endif /* __cplusplus */ +#endif /* __cplusplus */ -SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db); +SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3* db); #if 0 } /* extern "C" */ -#endif /* __cplusplus */ +#endif /* __cplusplus */ /************** End of fts3.h ************************************************/ /************** Continuing where we left off in main.c ***********************/ @@ -170672,18 +169038,18 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db); /* #include "sqlite3.h" */ #ifdef SQLITE_OMIT_VIRTUALTABLE -# undef SQLITE_ENABLE_RTREE +#undef SQLITE_ENABLE_RTREE #endif #if 0 extern "C" { -#endif /* __cplusplus */ +#endif /* __cplusplus */ -SQLITE_PRIVATE int sqlite3RtreeInit(sqlite3 *db); +SQLITE_PRIVATE int sqlite3RtreeInit(sqlite3* db); #if 0 } /* extern "C" */ -#endif /* __cplusplus */ +#endif /* __cplusplus */ /************** End of rtree.h ***********************************************/ /************** Continuing where we left off in main.c ***********************/ @@ -170710,13 +169076,13 @@ SQLITE_PRIVATE int sqlite3RtreeInit(sqlite3 *db); #if 0 extern "C" { -#endif /* __cplusplus */ +#endif /* __cplusplus */ -SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db); +SQLITE_PRIVATE int sqlite3IcuInit(sqlite3* db); #if 0 } /* extern "C" */ -#endif /* __cplusplus */ +#endif /* __cplusplus */ /************** End of sqliteicu.h *******************************************/ /************** Continuing where we left off in main.c ***********************/ @@ -170727,12 +169093,11 @@ SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db); ** succeeds, except that it fails if the fault-simulation is set ** to 500. */ -static int sqlite3TestExtInit(sqlite3 *db){ +static int sqlite3TestExtInit(sqlite3* db) { (void)db; return sqlite3FaultSim(500); } - /* ** Forward declarations of external module initializer functions ** for modules that need them. @@ -170756,38 +169121,38 @@ SQLITE_PRIVATE int sqlite3StmtVtabInit(sqlite3*); */ static int (*const sqlite3BuiltinExtensions[])(sqlite3*) = { #ifdef SQLITE_ENABLE_FTS1 - sqlite3Fts1Init, + sqlite3Fts1Init, #endif #ifdef SQLITE_ENABLE_FTS2 - sqlite3Fts2Init, + sqlite3Fts2Init, #endif #ifdef SQLITE_ENABLE_FTS3 - sqlite3Fts3Init, + sqlite3Fts3Init, #endif #ifdef SQLITE_ENABLE_FTS5 - sqlite3Fts5Init, + sqlite3Fts5Init, #endif #if defined(SQLITE_ENABLE_ICU) || defined(SQLITE_ENABLE_ICU_COLLATIONS) - sqlite3IcuInit, + sqlite3IcuInit, #endif #ifdef SQLITE_ENABLE_RTREE - sqlite3RtreeInit, + sqlite3RtreeInit, #endif #ifdef SQLITE_ENABLE_DBPAGE_VTAB - sqlite3DbpageRegister, + sqlite3DbpageRegister, #endif #ifdef SQLITE_ENABLE_DBSTAT_VTAB - sqlite3DbstatRegister, + sqlite3DbstatRegister, #endif - sqlite3TestExtInit, + sqlite3TestExtInit, #if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_JSON) - sqlite3JsonTableFunctions, + sqlite3JsonTableFunctions, #endif #ifdef SQLITE_ENABLE_STMTVTAB - sqlite3StmtVtabInit, + sqlite3StmtVtabInit, #endif #ifdef SQLITE_ENABLE_BYTECODE_VTAB - sqlite3VdbeBytecodeVtabInit, + sqlite3VdbeBytecodeVtabInit, #endif }; @@ -170801,7 +169166,9 @@ SQLITE_API const char sqlite3_version[] = SQLITE_VERSION; /* 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; } +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 @@ -170814,13 +169181,17 @@ SQLITE_API const char *sqlite3_libversion(void){ return sqlite3_version; } /* 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; } +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; } +SQLITE_API int sqlite3_threadsafe(void) { + return SQLITE_THREADSAFE; +} /* ** When compiling the test fixture or with debugging enabled (on Win32), @@ -170828,10 +169199,10 @@ SQLITE_API int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; } ** 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; +#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) @@ -170841,7 +169212,7 @@ SQLITE_API int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; } ** 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; +SQLITE_API void(SQLITE_CDECL* sqlite3IoTrace)(const char*, ...) = 0; #endif /* @@ -170851,7 +169222,7 @@ SQLITE_API void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...) = 0; ** ** See also the "PRAGMA temp_store_directory" SQL command. */ -SQLITE_API char *sqlite3_temp_directory = 0; +SQLITE_API char* sqlite3_temp_directory = 0; /* ** If the following global variable points to a string which is the @@ -170860,7 +169231,7 @@ SQLITE_API char *sqlite3_temp_directory = 0; ** ** See also the "PRAGMA data_store_directory" SQL command. */ -SQLITE_API char *sqlite3_data_directory = 0; +SQLITE_API char* sqlite3_data_directory = 0; /* ** Initialize SQLite. @@ -170893,16 +169264,16 @@ SQLITE_API char *sqlite3_data_directory = 0; ** * 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 */ +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 */ + int bRunExtraInit = 0; /* Extra initialization needed */ #endif #ifdef SQLITE_OMIT_WSD rc = sqlite3_wsd_init(4096, 24); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } #endif @@ -170910,14 +169281,14 @@ SQLITE_API int sqlite3_initialize(void){ /* 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*) ); + 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 ){ + if (sqlite3GlobalConfig.isInit) { sqlite3MemoryBarrier(); return SQLITE_OK; } @@ -170931,7 +169302,8 @@ SQLITE_API int sqlite3_initialize(void){ ** initialization. */ rc = sqlite3MutexInit(); - if( rc ) return rc; + if (rc) + return rc; /* Initialize the malloc() system and the recursive pInitMutex mutex. ** This operation is protected by the STATIC_MAIN mutex. Note that @@ -170939,23 +169311,22 @@ SQLITE_API int sqlite3_initialize(void){ ** 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); ) + MUTEX_LOGIC(pMainMtx = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN);) sqlite3_mutex_enter(pMainMtx); sqlite3GlobalConfig.isMutexInit = 1; - if( !sqlite3GlobalConfig.isMallocInit ){ + if (!sqlite3GlobalConfig.isMallocInit) { rc = sqlite3MallocInit(); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { sqlite3GlobalConfig.isMallocInit = 1; - if( !sqlite3GlobalConfig.pInitMutex ){ - sqlite3GlobalConfig.pInitMutex = - sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE); - if( sqlite3GlobalConfig.bCoreMutex && !sqlite3GlobalConfig.pInitMutex ){ + if (!sqlite3GlobalConfig.pInitMutex) { + sqlite3GlobalConfig.pInitMutex = sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE); + if (sqlite3GlobalConfig.bCoreMutex && !sqlite3GlobalConfig.pInitMutex) { rc = SQLITE_NOMEM_BKPT; } } } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { sqlite3GlobalConfig.nRefInitMutex++; } sqlite3_mutex_leave(pMainMtx); @@ -170963,7 +169334,7 @@ SQLITE_API int sqlite3_initialize(void){ /* 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 ){ + if (rc != SQLITE_OK) { return rc; } @@ -170981,7 +169352,7 @@ SQLITE_API int sqlite3_initialize(void){ ** call to sqlite3PcacheInitialize(). */ sqlite3_mutex_enter(sqlite3GlobalConfig.pInitMutex); - if( sqlite3GlobalConfig.isInit==0 && sqlite3GlobalConfig.inProgress==0 ){ + if (sqlite3GlobalConfig.isInit == 0 && sqlite3GlobalConfig.inProgress == 0) { sqlite3GlobalConfig.inProgress = 1; #ifdef SQLITE_ENABLE_SQLLOG { @@ -170991,21 +169362,20 @@ SQLITE_API int sqlite3_initialize(void){ #endif memset(&sqlite3BuiltinFunctions, 0, sizeof(sqlite3BuiltinFunctions)); sqlite3RegisterBuiltinFunctions(); - if( sqlite3GlobalConfig.isPCacheInit==0 ){ + if (sqlite3GlobalConfig.isPCacheInit == 0) { rc = sqlite3PcacheInitialize(); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { sqlite3GlobalConfig.isPCacheInit = 1; rc = sqlite3OsInit(); } #ifndef SQLITE_OMIT_DESERIALIZE - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = sqlite3MemdbInit(); } #endif - if( rc==SQLITE_OK ){ - sqlite3PCacheBufferSetup( sqlite3GlobalConfig.pPage, - sqlite3GlobalConfig.szPage, sqlite3GlobalConfig.nPage); + if (rc == SQLITE_OK) { + sqlite3PCacheBufferSetup(sqlite3GlobalConfig.pPage, sqlite3GlobalConfig.szPage, sqlite3GlobalConfig.nPage); sqlite3MemoryBarrier(); sqlite3GlobalConfig.isInit = 1; #ifdef SQLITE_EXTRA_INIT @@ -171021,8 +169391,8 @@ SQLITE_API int sqlite3_initialize(void){ */ sqlite3_mutex_enter(pMainMtx); sqlite3GlobalConfig.nRefInitMutex--; - if( sqlite3GlobalConfig.nRefInitMutex<=0 ){ - assert( sqlite3GlobalConfig.nRefInitMutex==0 ); + if (sqlite3GlobalConfig.nRefInitMutex <= 0) { + assert(sqlite3GlobalConfig.nRefInitMutex == 0); sqlite3_mutex_free(sqlite3GlobalConfig.pInitMutex); sqlite3GlobalConfig.pInitMutex = 0; } @@ -171036,13 +169406,13 @@ SQLITE_API int sqlite3_initialize(void){ #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; + if (rc == SQLITE_OK) { + u64 x = (((u64)1) << 63) - 1; double y; - assert(sizeof(x)==8); - assert(sizeof(x)==sizeof(y)); + assert(sizeof(x) == 8); + assert(sizeof(x) == sizeof(y)); memcpy(&y, &x, 8); - assert( sqlite3IsNaN(y) ); + assert(sqlite3IsNaN(y)); } #endif #endif @@ -171051,7 +169421,7 @@ SQLITE_API int sqlite3_initialize(void){ ** compile-time option. */ #ifdef SQLITE_EXTRA_INIT - if( bRunExtraInit ){ + if (bRunExtraInit) { int SQLITE_EXTRA_INIT(const char*); rc = SQLITE_EXTRA_INIT(0); } @@ -171068,15 +169438,15 @@ SQLITE_API int sqlite3_initialize(void){ ** 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){ +SQLITE_API int sqlite3_shutdown(void) { #ifdef SQLITE_OMIT_WSD int rc = sqlite3_wsd_init(4096, 24); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } #endif - if( sqlite3GlobalConfig.isInit ){ + if (sqlite3GlobalConfig.isInit) { #ifdef SQLITE_EXTRA_SHUTDOWN void SQLITE_EXTRA_SHUTDOWN(void); SQLITE_EXTRA_SHUTDOWN(); @@ -171085,11 +169455,11 @@ SQLITE_API int sqlite3_shutdown(void){ sqlite3_reset_auto_extension(); sqlite3GlobalConfig.isInit = 0; } - if( sqlite3GlobalConfig.isPCacheInit ){ + if (sqlite3GlobalConfig.isPCacheInit) { sqlite3PcacheShutdown(); sqlite3GlobalConfig.isPCacheInit = 0; } - if( sqlite3GlobalConfig.isMallocInit ){ + if (sqlite3GlobalConfig.isMallocInit) { sqlite3MallocEnd(); sqlite3GlobalConfig.isMallocInit = 0; @@ -171105,7 +169475,7 @@ SQLITE_API int sqlite3_shutdown(void){ sqlite3_temp_directory = 0; #endif } - if( sqlite3GlobalConfig.isMutexInit ){ + if (sqlite3GlobalConfig.isMutexInit) { sqlite3MutexEnd(); sqlite3GlobalConfig.isMutexInit = 0; } @@ -171122,55 +169492,56 @@ SQLITE_API int sqlite3_shutdown(void){ ** threadsafe. Failure to heed these warnings can lead to unpredictable ** behavior. */ -SQLITE_API int sqlite3_config(int op, ...){ +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; + if (sqlite3GlobalConfig.isInit) + return SQLITE_MISUSE_BKPT; va_start(ap, op); - switch( op ){ + switch (op) { /* Mutex configuration options are only available in a threadsafe ** compile. */ -#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-54466-46756 */ +#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 */ + 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 */ +#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 */ + 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 */ +#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 */ + 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 */ +#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 */ +#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; @@ -171192,7 +169563,8 @@ SQLITE_API int sqlite3_config(int op, ...){ ** 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(); + if (sqlite3GlobalConfig.m.xMalloc == 0) + sqlite3MemSetDefault(); *va_arg(ap, sqlite3_mem_methods*) = sqlite3GlobalConfig.m; break; } @@ -171222,10 +169594,7 @@ SQLITE_API int sqlite3_config(int op, ...){ ** 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(); + *va_arg(ap, int*) = sqlite3HeaderSizeBtree() + sqlite3HeaderSizePcache() + sqlite3HeaderSizePcache1(); break; } @@ -171252,7 +169621,7 @@ SQLITE_API int sqlite3_config(int op, ...){ ** 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 ){ + if (sqlite3GlobalConfig.pcache2.xInit == 0) { sqlite3PCacheSetDefault(); } *va_arg(ap, sqlite3_pcache_methods2*) = sqlite3GlobalConfig.pcache2; @@ -171272,14 +169641,14 @@ SQLITE_API int sqlite3_config(int op, ...){ sqlite3GlobalConfig.nHeap = va_arg(ap, int); sqlite3GlobalConfig.mnReq = va_arg(ap, int); - if( sqlite3GlobalConfig.mnReq<1 ){ + if (sqlite3GlobalConfig.mnReq < 1) { sqlite3GlobalConfig.mnReq = 1; - }else if( sqlite3GlobalConfig.mnReq>(1<<12) ){ + } else if (sqlite3GlobalConfig.mnReq > (1 << 12)) { /* cap min request size at 2^12 */ - sqlite3GlobalConfig.mnReq = (1<<12); + sqlite3GlobalConfig.mnReq = (1 << 12); } - if( sqlite3GlobalConfig.pHeap==0 ){ + 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 @@ -171289,7 +169658,7 @@ SQLITE_API int sqlite3_config(int op, ...){ ** revert to its default implementation when sqlite3_initialize() is run */ memset(&sqlite3GlobalConfig.m, 0, sizeof(sqlite3GlobalConfig.m)); - }else{ + } 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. */ @@ -171319,7 +169688,7 @@ SQLITE_API int sqlite3_config(int op, ...){ ** http://support.microsoft.com/kb/47961 ** sqlite3GlobalConfig.xLog = va_arg(ap, void(*)(void*,int,const char*)); */ - typedef void(*LOGFUNC_t)(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; @@ -171350,9 +169719,9 @@ SQLITE_API int sqlite3_config(int op, ...){ #ifdef SQLITE_ENABLE_SQLLOG case SQLITE_CONFIG_SQLLOG: { - typedef void(*SQLLOGFUNC_t)(void*, sqlite3*, const char*, int); + typedef void (*SQLLOGFUNC_t)(void*, sqlite3*, const char*, int); sqlite3GlobalConfig.xSqllog = va_arg(ap, SQLLOGFUNC_t); - sqlite3GlobalConfig.pSqllogArg = va_arg(ap, void *); + sqlite3GlobalConfig.pSqllogArg = va_arg(ap, void*); break; } #endif @@ -171372,11 +169741,13 @@ SQLITE_API int sqlite3_config(int op, ...){ ** compile-time maximum mmap size set by the SQLITE_MAX_MMAP_SIZE ** compile-time option. */ - if( mxMmap<0 || mxMmap>SQLITE_MAX_MMAP_SIZE ){ + 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; + if (szMmap < 0) + szMmap = SQLITE_DEFAULT_MMAP_SIZE; + if (szMmap > mxMmap) + szMmap = mxMmap; sqlite3GlobalConfig.mxMmap = mxMmap; sqlite3GlobalConfig.szMmap = szMmap; break; @@ -171405,7 +169776,7 @@ SQLITE_API int sqlite3_config(int op, ...){ #ifdef SQLITE_ENABLE_SORTER_REFERENCES case SQLITE_CONFIG_SORTERREF_SIZE: { int iVal = va_arg(ap, int); - if( iVal<0 ){ + if (iVal < 0) { iVal = SQLITE_DEFAULT_SORTERREF_SIZE; } sqlite3GlobalConfig.szSorterRef = (u32)iVal; @@ -171440,66 +169811,69 @@ SQLITE_API int sqlite3_config(int op, ...){ ** 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){ +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 */ + 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 ){ + 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 ){ + 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 = 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 ){ + } else if (pBuf == 0) { sqlite3BeginBenignMalloc(); - pStart = sqlite3Malloc( szAlloc ); /* IMP: R-61949-35727 */ + pStart = sqlite3Malloc(szAlloc); /* IMP: R-61949-35727 */ sqlite3EndBenignMalloc(); - if( pStart ) szAlloc = sqlite3MallocSize(pStart); - }else{ + 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 + 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; - } + 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 ){ + if (pStart) { int i; - LookasideSlot *p; - assert( sz > (int)sizeof(LookasideSlot*) ); + 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]; @@ -171508,18 +169882,18 @@ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ 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 ); + 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.bMalloced = pBuf == 0 ? 1 : 0; + db->lookaside.nSlot = nBig + nSm; + } else { db->lookaside.pStart = db; #ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE db->lookaside.pSmallInit = 0; @@ -171532,7 +169906,7 @@ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ db->lookaside.bMalloced = 0; db->lookaside.nSlot = 0; } - assert( sqlite3LookasideUsed(db,0)==0 ); + assert(sqlite3LookasideUsed(db, 0) == 0); #endif /* SQLITE_OMIT_LOOKASIDE */ return SQLITE_OK; } @@ -171540,9 +169914,9 @@ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ /* ** Return the mutex associated with a database connection. */ -SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3 *db){ +SQLITE_API sqlite3_mutex* sqlite3_db_mutex(sqlite3* db) { #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ){ + if (!sqlite3SafetyCheckOk(db)) { (void)SQLITE_MISUSE_BKPT; return 0; } @@ -171554,18 +169928,19 @@ SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3 *db){ ** Free up as much memory as we can from the given database ** connection. */ -SQLITE_API int sqlite3_db_release_memory(sqlite3 *db){ +SQLITE_API int sqlite3_db_release_memory(sqlite3* db) { int i; #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; + 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); + for (i = 0; i < db->nDb; i++) { + Btree* pBt = db->aDb[i].pBt; + if (pBt) { + Pager* pPager = sqlite3BtreePager(pBt); sqlite3PagerShrink(pPager); } } @@ -171578,22 +169953,23 @@ SQLITE_API int sqlite3_db_release_memory(sqlite3 *db){ ** Flush any dirty pages in the pager-cache for any attached database ** to disk. */ -SQLITE_API int sqlite3_db_cacheflush(sqlite3 *db){ +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; + 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); + for (i = 0; rc == SQLITE_OK && i < db->nDb; 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 ){ + if (rc == SQLITE_BUSY) { bSeenBusy = 1; rc = SQLITE_OK; } @@ -171601,26 +169977,26 @@ SQLITE_API int sqlite3_db_cacheflush(sqlite3 *db){ } sqlite3BtreeLeaveAll(db); sqlite3_mutex_leave(db->mutex); - return ((rc==SQLITE_OK && bSeenBusy) ? SQLITE_BUSY : rc); + 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, ...){ +SQLITE_API int sqlite3_db_config(sqlite3* db, int op, ...) { va_list ap; int rc; va_start(ap, op); - switch( op ){ + switch (op) { case SQLITE_DBCONFIG_MAINDBNAME: { /* IMP: R-06824-28531 */ /* IMP: R-36257-52125 */ - db->aDb[0].zDbSName = va_arg(ap,char*); + 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 */ + 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); @@ -171628,44 +170004,43 @@ SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){ } default: { static const struct { - int op; /* The opcode */ - u32 mask; /* Mask of the bit in sqlite3.flags to set/clear */ + 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 }, + {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 ){ + if (onoff > 0) { db->flags |= aFlagOp[i].mask; - }else if( onoff==0 ){ + } else if (onoff == 0) { db->flags &= ~(u64)aFlagOp[i].mask; } - if( oldFlags!=db->flags ){ + if (oldFlags != db->flags) { sqlite3ExpirePreparedStatements(db, 0); } - if( pRes ){ - *pRes = (db->flags & aFlagOp[i].mask)!=0; + if (pRes) { + *pRes = (db->flags & aFlagOp[i].mask) != 0; } rc = SQLITE_OK; break; @@ -171682,20 +170057,16 @@ SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){ ** 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 -){ +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; +SQLITE_PRIVATE int sqlite3IsBinary(const CollSeq* p) { + assert(p == 0 || p->xCmp != binCollFunc || strcmp(p->zName, "BINARY") == 0); + return p == 0 || p->xCmp == binCollFunc; } /* @@ -171734,16 +170103,11 @@ SQLITE_PRIVATE int sqlite3IsBinary(const CollSeq *p){ ** ** 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, (nKey1nChange; } -SQLITE_API int sqlite3_changes(sqlite3 *db){ +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){ +SQLITE_API sqlite3_int64 sqlite3_total_changes64(sqlite3* db) { #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ){ + if (!sqlite3SafetyCheckOk(db)) { (void)SQLITE_MISUSE_BKPT; return 0; } #endif return db->nTotalChange; } -SQLITE_API int sqlite3_total_changes(sqlite3 *db){ +SQLITE_API int sqlite3_total_changes(sqlite3* db) { return (int)sqlite3_total_changes64(db); } @@ -171813,9 +170177,9 @@ SQLITE_API int sqlite3_total_changes(sqlite3 *db){ ** 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; +SQLITE_PRIVATE void sqlite3CloseSavepoints(sqlite3* db) { + while (db->pSavepoint) { + Savepoint* pTmp = db->pSavepoint; db->pSavepoint = pTmp->pNext; sqlite3DbFree(db, pTmp); } @@ -171830,13 +170194,13 @@ SQLITE_PRIVATE void sqlite3CloseSavepoints(sqlite3 *db){ ** 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 ); +static void functionDestroy(sqlite3* db, FuncDef* p) { + FuncDestructor* pDestructor; + assert((p->funcFlags & SQLITE_FUNC_BUILTIN) == 0); pDestructor = p->u.pDestructor; - if( pDestructor ){ + if (pDestructor) { pDestructor->nRef--; - if( pDestructor->nRef==0 ){ + if (pDestructor->nRef == 0) { pDestructor->xDestroy(pDestructor->pUserData); sqlite3DbFree(db, pDestructor); } @@ -171847,23 +170211,24 @@ static void functionDestroy(sqlite3 *db, FuncDef *p){ ** Disconnect all sqlite3_vtab objects that belong to database connection ** db. This is called when db is being closed. */ -static void disconnectAllVtab(sqlite3 *db){ +static void disconnectAllVtab(sqlite3* db) { #ifndef SQLITE_OMIT_VIRTUALTABLE int i; - HashElem *p; + 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 (i = 0; i < db->nDb; 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 ){ + for (p = sqliteHashFirst(&db->aModule); p; p = sqliteHashNext(p)) { + Module* pMod = (Module*)sqliteHashData(p); + if (pMod->pEpoTab) { sqlite3VtabDisconnect(db, pMod->pEpoTab); } } @@ -171878,13 +170243,15 @@ static void disconnectAllVtab(sqlite3 *db){ ** Return TRUE if database connection db has unfinalized prepared ** statements or unfinished sqlite3_backup objects. */ -static int connectionIsBusy(sqlite3 *db){ +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; + assert(sqlite3_mutex_held(db->mutex)); + if (db->pVdbe) + return 1; + for (j = 0; j < db->nDb; j++) { + Btree* pBt = db->aDb[j].pBt; + if (pBt && sqlite3BtreeIsInBackup(pBt)) + return 1; } return 0; } @@ -171892,17 +170259,17 @@ static int connectionIsBusy(sqlite3 *db){ /* ** Close an existing SQLite database */ -static int sqlite3Close(sqlite3 *db, int forceZombie){ - if( !db ){ +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) ){ + if (!sqlite3SafetyCheckSickOrOk(db)) { return SQLITE_MISUSE_BKPT; } sqlite3_mutex_enter(db->mutex); - if( db->mTrace & SQLITE_TRACE_CLOSE ){ + if (db->mTrace & SQLITE_TRACE_CLOSE) { db->trace.xV2(SQLITE_TRACE_CLOSE, db->pTraceArg, db, 0); } @@ -171921,22 +170288,23 @@ static int sqlite3Close(sqlite3 *db, int forceZombie){ /* 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"); + 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 ){ + 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; @@ -171946,27 +170314,29 @@ static int sqlite3Close(sqlite3 *db, int forceZombie){ ** 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){ +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) ){ + if (!sqlite3SafetyCheckOk(db)) { (void)SQLITE_MISUSE_BKPT; return -1; } #endif sqlite3_mutex_enter(db->mutex); - if( zSchema ){ + if (zSchema) { nDb = iDb = sqlite3FindDbName(db, zSchema); - if( iDb<0 ) nDb--; - }else{ + if (iDb < 0) + nDb--; + } else { iDb = 0; - nDb = db->nDb-1; + 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; + 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; @@ -171981,9 +170351,12 @@ SQLITE_API int sqlite3_txn_state(sqlite3 *db, const char *zSchema){ ** 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); } - +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. @@ -171993,15 +170366,15 @@ SQLITE_API int sqlite3_close_v2(sqlite3 *db){ return sqlite3Close(db,1); } ** 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 */ +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) ){ + if (db->eOpenState != SQLITE_STATE_ZOMBIE || connectionIsBusy(db)) { sqlite3_mutex_leave(db->mutex); return; } @@ -172022,48 +170395,48 @@ SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){ sqlite3CloseSavepoints(db); /* Close all database connections */ - for(j=0; jnDb; j++){ - struct Db *pDb = &db->aDb[j]; - if( pDb->pBt ){ + for (j = 0; j < db->nDb; j++) { + struct Db* pDb = &db->aDb[j]; + if (pDb->pBt) { sqlite3BtreeClose(pDb->pBt); pDb->pBt = 0; - if( j!=1 ){ + if (j != 1) { pDb->pSchema = 0; } } } /* Clear the TEMP schema separately and last */ - if( db->aDb[1].pSchema ){ + 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 ); + 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)){ + for (i = sqliteHashFirst(&db->aFunc); i; i = sqliteHashNext(i)) { FuncDef *pNext, *p; p = sqliteHashData(i); - do{ + do { functionDestroy(db, p); pNext = p->pNext; sqlite3DbFree(db, p); p = pNext; - }while( p ); + } while (p); } sqlite3HashClear(&db->aFunc); - for(i=sqliteHashFirst(&db->aCollSeq); i; i=sqliteHashNext(i)){ - CollSeq *pColl = (CollSeq *)sqliteHashData(i); + 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 ){ + for (j = 0; j < 3; j++) { + if (pColl[j].xDel) { pColl[j].xDel(pColl[j].pUser); } } @@ -172071,8 +170444,8 @@ SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){ } sqlite3HashClear(&db->aCollSeq); #ifndef SQLITE_OMIT_VIRTUALTABLE - for(i=sqliteHashFirst(&db->aModule); i; i=sqliteHashNext(i)){ - Module *pMod = (Module *)sqliteHashData(i); + for (i = sqliteHashFirst(&db->aModule); i; i = sqliteHashNext(i)) { + Module* pMod = (Module*)sqliteHashData(i); sqlite3VtabEponymousTableClear(db, pMod); sqlite3VtabModuleUnref(db, pMod); } @@ -172096,14 +170469,14 @@ SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){ ** structure? */ sqlite3DbFree(db, db->aDb[1].pSchema); - if( db->xAutovacDestr ){ + 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 ){ + assert(sqlite3LookasideUsed(db, 0) == 0); + if (db->lookaside.bMalloced) { sqlite3_free(db->lookaside.pStart); } sqlite3_free(db); @@ -172116,11 +170489,11 @@ SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){ ** 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){ +SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3* db, int tripCode) { int i; int inTrans = 0; int schemaChange; - assert( sqlite3_mutex_held(db->mutex) ); + assert(sqlite3_mutex_held(db->mutex)); sqlite3BeginBenignMalloc(); /* Obtain all b-tree mutexes before making any calls to BtreeRollback(). @@ -172130,12 +170503,12 @@ SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3 *db, int tripCode){ ** 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; + 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 ){ + for (i = 0; i < db->nDb; i++) { + Btree* p = db->aDb[i].pBt; + if (p) { + if (sqlite3BtreeTxnState(p) == SQLITE_TXN_WRITE) { inTrans = 1; } sqlite3BtreeRollback(p, tripCode, !schemaChange); @@ -172144,7 +170517,7 @@ SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3 *db, int tripCode){ sqlite3VtabRollback(db); sqlite3EndBenignMalloc(); - if( schemaChange ){ + if (schemaChange) { sqlite3ExpirePreparedStatements(db, 0); sqlite3ResetAllSchemasOfConnection(db); } @@ -172153,10 +170526,10 @@ SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3 *db, int tripCode){ /* Any deferred constraint violations have now been resolved. */ db->nDeferredCons = 0; db->nDeferredImmCons = 0; - db->flags &= ~(u64)(SQLITE_DeferFKs|SQLITE_CorruptRdOnly); + db->flags &= ~(u64)(SQLITE_DeferFKs | SQLITE_CorruptRdOnly); /* If one has been configured, invoke the rollback-hook callback */ - if( db->xRollbackCallback && (inTrans || !db->autoCommit) ){ + if (db->xRollbackCallback && (inTrans || !db->autoCommit)) { db->xRollbackCallback(db->pRollbackArg); } } @@ -172166,105 +170539,269 @@ SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3 *db, int tripCode){ ** specified in the argument. */ #if defined(SQLITE_NEED_ERR_NAME) -SQLITE_PRIVATE const char *sqlite3ErrName(int rc){ - const char *zName = 0; +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; + 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; + 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; + 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; + 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; + 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; + 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; + 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 ){ + if (zName == 0) { static char zBuf[50]; sqlite3_snprintf(sizeof(zBuf), zBuf, "SQLITE_UNKNOWN(%d)", origRc); zName = zBuf; @@ -172277,44 +170814,44 @@ SQLITE_PRIVATE const char *sqlite3ErrName(int rc){ ** Return a static string that describes the kind of error specified in the ** argument. */ -SQLITE_PRIVATE const char *sqlite3ErrStr(int rc){ +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", + /* 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", + /* SQLITE_NOLFS */ "large file support is disabled", #else - /* SQLITE_NOLFS */ 0, + /* 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", + /* 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 ){ + const char* zErr = "unknown error"; + switch (rc) { case SQLITE_ABORT_ROLLBACK: { zErr = "abort due to ROLLBACK"; break; @@ -172329,7 +170866,7 @@ SQLITE_PRIVATE const char *sqlite3ErrStr(int rc){ } default: { rc &= 0xff; - if( ALWAYS(rc>=0) && rc= 0) && rc < ArraySize(aMsg) && aMsg[rc] != 0) { zErr = aMsg[rc]; } break; @@ -172347,42 +170884,40 @@ SQLITE_PRIVATE const char *sqlite3ErrStr(int rc){ ** Return non-zero to retry the lock. Return zero to stop trying ** and cause SQLite to return SQLITE_BUSY. */ -static int sqliteDefaultBusyCallback( - void *ptr, /* Database connection */ - int count /* Number of times table has been busy */ -){ +static int sqliteDefaultBusyCallback(void* ptr, /* Database connection */ + int count /* Number of times table has been busy */ +) { #if SQLITE_OS_WIN || HAVE_USLEEP /* This case is for systems that have support for sleeping for fractions of ** a second. Examples: All windows systems, unix systems with usleep() */ - static const u8 delays[] = - { 1, 2, 5, 10, 15, 20, 25, 25, 25, 50, 50, 100 }; - static const u8 totals[] = - { 0, 1, 3, 8, 18, 33, 53, 78, 103, 128, 178, 228 }; -# define NDELAY ArraySize(delays) - sqlite3 *db = (sqlite3 *)ptr; + static const u8 delays[] = {1, 2, 5, 10, 15, 20, 25, 25, 25, 50, 50, 100}; + static const u8 totals[] = {0, 1, 3, 8, 18, 33, 53, 78, 103, 128, 178, 228}; +#define NDELAY ArraySize(delays) + sqlite3* db = (sqlite3*)ptr; int tmout = db->busyTimeout; int delay, prior; - assert( count>=0 ); - if( count < NDELAY ){ + 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)); + } else { + delay = delays[NDELAY - 1]; + prior = totals[NDELAY - 1] + delay * (count - (NDELAY - 1)); } - if( prior + delay > tmout ){ + if (prior + delay > tmout) { delay = tmout - prior; - if( delay<=0 ) return 0; + if (delay <= 0) + return 0; } - sqlite3OsSleep(db->pVfs, delay*1000); + 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 ){ + sqlite3* db = (sqlite3*)ptr; + int tmout = ((sqlite3*)ptr)->busyTimeout; + if ((count + 1) * 1000 > tmout) { return 0; } sqlite3OsSleep(db->pVfs, 1000000); @@ -172399,13 +170934,14 @@ static int sqliteDefaultBusyCallback( ** 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){ +SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler* p) { int rc; - if( p->xBusyHandler==0 || p->nBusy<0 ) return 0; + if (p->xBusyHandler == 0 || p->nBusy < 0) + return 0; rc = p->xBusyHandler(p->pBusyArg, p->nBusy); - if( rc==0 ){ + if (rc == 0) { p->nBusy = -1; - }else{ + } else { p->nBusy++; } return rc; @@ -172415,13 +170951,10 @@ SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler *p){ ** 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 -){ +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; + if (!sqlite3SafetyCheckOk(db)) + return SQLITE_MISUSE_BKPT; #endif sqlite3_mutex_enter(db->mutex); db->busyHandler.xBusyHandler = xBusy; @@ -172438,24 +170971,19 @@ SQLITE_API int sqlite3_busy_handler( ** 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 -){ +SQLITE_API void sqlite3_progress_handler(sqlite3* db, int nOps, int (*xProgress)(void*), void* pArg) { #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ){ + if (!sqlite3SafetyCheckOk(db)) { (void)SQLITE_MISUSE_BKPT; return; } #endif sqlite3_mutex_enter(db->mutex); - if( nOps>0 ){ + if (nOps > 0) { db->xProgress = xProgress; db->nProgressOps = (unsigned)nOps; db->pProgressArg = pArg; - }else{ + } else { db->xProgress = 0; db->nProgressOps = 0; db->pProgressArg = 0; @@ -172464,20 +170992,19 @@ SQLITE_API void sqlite3_progress_handler( } #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){ +SQLITE_API int sqlite3_busy_timeout(sqlite3* db, int ms) { #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; + if (!sqlite3SafetyCheckOk(db)) + return SQLITE_MISUSE_BKPT; #endif - if( ms>0 ){ - sqlite3_busy_handler(db, (int(*)(void*,int))sqliteDefaultBusyCallback, - (void*)db); + if (ms > 0) { + sqlite3_busy_handler(db, (int (*)(void*, int))sqliteDefaultBusyCallback, (void*)db); db->busyTimeout = ms; - }else{ + } else { sqlite3_busy_handler(db, 0, 0); } return SQLITE_OK; @@ -172486,9 +171013,9 @@ SQLITE_API int sqlite3_busy_timeout(sqlite3 *db, int ms){ /* ** Cause any pending operation to stop at its earliest opportunity. */ -SQLITE_API void sqlite3_interrupt(sqlite3 *db){ +SQLITE_API void sqlite3_interrupt(sqlite3* db) { #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) && (db==0 || db->eOpenState!=SQLITE_STATE_ZOMBIE) ){ + if (!sqlite3SafetyCheckOk(db) && (db == 0 || db->eOpenState != SQLITE_STATE_ZOMBIE)) { (void)SQLITE_MISUSE_BKPT; return; } @@ -172496,53 +171023,40 @@ SQLITE_API void sqlite3_interrupt(sqlite3 *db){ 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; +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) - || (255mutex)); + 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) || (255 < sqlite3Strlen30(zFunctionName))) { return SQLITE_MISUSE_BKPT; } - assert( SQLITE_FUNC_CONSTANT==SQLITE_DETERMINISTIC ); - assert( SQLITE_FUNC_DIRECT==SQLITE_DIRECTONLY ); - extraFlags = enc & (SQLITE_DETERMINISTIC|SQLITE_DIRECTONLY| - SQLITE_SUBTYPE|SQLITE_INNOCUOUS); - enc &= (SQLITE_FUNC_ENCMASK|SQLITE_ANY); + assert(SQLITE_FUNC_CONSTANT == SQLITE_DETERMINISTIC); + assert(SQLITE_FUNC_DIRECT == SQLITE_DIRECTONLY); + extraFlags = enc & (SQLITE_DETERMINISTIC | SQLITE_DIRECTONLY | SQLITE_SUBTYPE | SQLITE_INNOCUOUS); + enc &= (SQLITE_FUNC_ENCMASK | SQLITE_ANY); /* The SQLITE_INNOCUOUS flag is the same bit as SQLITE_FUNC_UNSAFE. But ** the meaning is inverted. So flip the bit. */ - assert( SQLITE_FUNC_UNSAFE==SQLITE_INNOCUOUS ); + assert(SQLITE_FUNC_UNSAFE == SQLITE_INNOCUOUS); extraFlags ^= SQLITE_FUNC_UNSAFE; - #ifndef SQLITE_OMIT_UTF16 /* If SQLITE_UTF16 is specified as the encoding type, transform this ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the @@ -172551,21 +171065,19 @@ SQLITE_PRIVATE int sqlite3CreateFunc( ** If SQLITE_ANY is specified, add three versions of the function ** to the hash table. */ - switch( enc ){ + switch (enc) { case SQLITE_UTF16: enc = SQLITE_UTF16NATIVE; break; case SQLITE_ANY: { int rc; - rc = sqlite3CreateFunc(db, zFunctionName, nArg, - (SQLITE_UTF8|extraFlags)^SQLITE_FUNC_UNSAFE, - pUserData, xSFunc, xStep, xFinal, xValue, xInverse, pDestructor); - if( rc==SQLITE_OK ){ - rc = sqlite3CreateFunc(db, zFunctionName, nArg, - (SQLITE_UTF16LE|extraFlags)^SQLITE_FUNC_UNSAFE, - pUserData, xSFunc, xStep, xFinal, xValue, xInverse, pDestructor); - } - if( rc!=SQLITE_OK ){ + rc = sqlite3CreateFunc(db, zFunctionName, nArg, (SQLITE_UTF8 | extraFlags) ^ SQLITE_FUNC_UNSAFE, pUserData, xSFunc, xStep, xFinal, + xValue, xInverse, pDestructor); + if (rc == SQLITE_OK) { + rc = sqlite3CreateFunc(db, zFunctionName, nArg, (SQLITE_UTF16LE | extraFlags) ^ SQLITE_FUNC_UNSAFE, pUserData, xSFunc, xStep, + xFinal, xValue, xInverse, pDestructor); + } + if (rc != SQLITE_OK) { return rc; } enc = SQLITE_UTF16BE; @@ -172589,16 +171101,15 @@ SQLITE_PRIVATE int sqlite3CreateFunc( ** operation to continue but invalidate all precompiled statements. */ p = sqlite3FindFunction(db, zFunctionName, nArg, (u8)enc, 0); - if( p && (p->funcFlags & 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 ); + if (p && (p->funcFlags & 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{ + } else { sqlite3ExpirePreparedStatements(db, 0); } - }else if( xSFunc==0 && xFinal==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; @@ -172606,7 +171117,7 @@ SQLITE_PRIVATE int sqlite3CreateFunc( p = sqlite3FindFunction(db, zFunctionName, nArg, (u8)enc, 1); assert(p || db->mallocFailed); - if( !p ){ + if (!p) { return SQLITE_NOMEM_BKPT; } @@ -172614,13 +171125,13 @@ SQLITE_PRIVATE int sqlite3CreateFunc( ** being replaced invoke the destructor function here. */ functionDestroy(db, p); - if( pDestructor ){ + 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 ); + testcase(p->funcFlags & SQLITE_DETERMINISTIC); + testcase(p->funcFlags & SQLITE_DIRECTONLY); p->xSFunc = xSFunc ? xSFunc : xStep; p->xFinalize = xFinal; p->xValue = xValue; @@ -172637,31 +171148,22 @@ SQLITE_PRIVATE int sqlite3CreateFunc( ** 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*) -){ +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; + FuncDestructor* pArg = 0; #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ){ + if (!sqlite3SafetyCheckOk(db)) { return SQLITE_MISUSE_BKPT; } #endif sqlite3_mutex_enter(db->mutex); - if( xDestroy ){ - pArg = (FuncDestructor *)sqlite3Malloc(sizeof(FuncDestructor)); - if( !pArg ){ + if (xDestroy) { + pArg = (FuncDestructor*)sqlite3Malloc(sizeof(FuncDestructor)); + if (!pArg) { sqlite3OomFault(db); xDestroy(p); goto out; @@ -172670,16 +171172,14 @@ static int createFunctionApi( 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) ); + 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: +out: rc = sqlite3ApiExit(db, rc); sqlite3_mutex_leave(db->mutex); return rc; @@ -172688,70 +171188,39 @@ static int createFunctionApi( /* ** 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); +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*) -){ +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; + char* zFunc8; #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) || zFunctionName==0 ) return SQLITE_MISUSE_BKPT; + if (!sqlite3SafetyCheckOk(db) || zFunctionName == 0) + return SQLITE_MISUSE_BKPT; #endif sqlite3_mutex_enter(db->mutex); - assert( !db->mallocFailed ); + assert(!db->mallocFailed); zFunc8 = sqlite3Utf16to8(db, zFunctionName, -1, SQLITE_UTF16NATIVE); - rc = sqlite3CreateFunc(db, zFunc8, nArg, eTextRep, p, xSFunc,xStep,xFinal,0,0,0); + 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); @@ -172759,7 +171228,6 @@ SQLITE_API int sqlite3_create_function16( } #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 @@ -172768,16 +171236,14 @@ SQLITE_API int sqlite3_create_function16( ** 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; +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); + zErr = sqlite3_mprintf("unable to use function %s in the requested context", zName); sqlite3_result_error(context, zErr, -1); sqlite3_free(zErr); } @@ -172794,27 +171260,24 @@ static void sqlite3InvalidFunction( ** 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 -){ +SQLITE_API int sqlite3_overload_function(sqlite3* db, const char* zName, int nArg) { int rc; - char *zCopy; + char* zCopy; #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) || zName==0 || nArg<-2 ){ + 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; + rc = sqlite3FindFunction(db, zName, nArg, SQLITE_UTF8, 0) != 0; sqlite3_mutex_leave(db->mutex); - if( rc ) return SQLITE_OK; + 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); + 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 @@ -172827,11 +171290,11 @@ SQLITE_API int sqlite3_overload_function( ** SQL statement. */ #ifndef SQLITE_OMIT_DEPRECATED -SQLITE_API void *sqlite3_trace(sqlite3 *db, void(*xTrace)(void*,const char*), void *pArg){ - void *pOld; +SQLITE_API void* sqlite3_trace(sqlite3* db, void (*xTrace)(void*, const char*), void* pArg) { + void* pOld; #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ){ + if (!sqlite3SafetyCheckOk(db)) { (void)SQLITE_MISUSE_BKPT; return 0; } @@ -172847,21 +171310,22 @@ SQLITE_API void *sqlite3_trace(sqlite3 *db, void(*xTrace)(void*,const char*), vo #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 */ -){ + */ +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) ){ + if (!sqlite3SafetyCheckOk(db)) { return SQLITE_MISUSE_BKPT; } #endif sqlite3_mutex_enter(db->mutex); - if( mTrace==0 ) xTrace = 0; - if( xTrace==0 ) mTrace = 0; + if (mTrace == 0) + xTrace = 0; + if (xTrace == 0) + mTrace = 0; db->mTrace = mTrace; db->trace.xV2 = xTrace; db->pTraceArg = pArg; @@ -172878,15 +171342,11 @@ SQLITE_API int sqlite3_trace_v2( ** 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; +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) ){ + if (!sqlite3SafetyCheckOk(db)) { (void)SQLITE_MISUSE_BKPT; return 0; } @@ -172896,7 +171356,8 @@ SQLITE_API void *sqlite3_profile( db->xProfile = xProfile; db->pProfileArg = pArg; db->mTrace &= SQLITE_TRACE_NONLEGACY_MASK; - if( db->xProfile ) db->mTrace |= SQLITE_TRACE_XPROFILE; + if (db->xProfile) + db->mTrace |= SQLITE_TRACE_XPROFILE; sqlite3_mutex_leave(db->mutex); return pOld; } @@ -172908,15 +171369,14 @@ SQLITE_API void *sqlite3_profile( ** 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; +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) ){ + if (!sqlite3SafetyCheckOk(db)) { (void)SQLITE_MISUSE_BKPT; return 0; } @@ -172933,15 +171393,14 @@ SQLITE_API void *sqlite3_commit_hook( ** 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; +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) ){ + if (!sqlite3SafetyCheckOk(db)) { (void)SQLITE_MISUSE_BKPT; return 0; } @@ -172958,15 +171417,14 @@ SQLITE_API void *sqlite3_update_hook( ** 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; +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) ){ + if (!sqlite3SafetyCheckOk(db)) { (void)SQLITE_MISUSE_BKPT; return 0; } @@ -172984,13 +171442,12 @@ SQLITE_API void *sqlite3_rollback_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; +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; @@ -173004,20 +171461,20 @@ SQLITE_API void *sqlite3_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 */ -){ +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); + if (!sqlite3SafetyCheckOk(db)) { + if (xDestructor) + xDestructor(pArg); return SQLITE_MISUSE_BKPT; } #endif sqlite3_mutex_enter(db->mutex); - if( db->xAutovacDestr ){ + if (db->xAutovacDestr) { db->xAutovacDestr(db->pAutovacPagesArg); } db->xAutovacPages = xCallback; @@ -173027,7 +171484,6 @@ SQLITE_API int sqlite3_autovacuum_pages( return SQLITE_OK; } - #ifndef SQLITE_OMIT_WAL /* ** The sqlite3_wal_hook() callback registered by sqlite3_wal_autocheckpoint(). @@ -173035,13 +171491,12 @@ SQLITE_API int sqlite3_autovacuum_pages( ** 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) ){ +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(); @@ -173061,17 +171516,18 @@ SQLITE_PRIVATE int sqlite3WalDefaultHook( ** using sqlite3_wal_hook() disables the automatic checkpoint mechanism ** configured by this function. */ -SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int nFrame){ +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; + if (!sqlite3SafetyCheckOk(db)) + return SQLITE_MISUSE_BKPT; #endif - if( nFrame>0 ){ + if (nFrame > 0) { sqlite3_wal_hook(db, sqlite3WalDefaultHook, SQLITE_INT_TO_PTR(nFrame)); - }else{ + } else { sqlite3_wal_hook(db, 0, 0); } #endif @@ -173082,15 +171538,13 @@ SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int nFrame){ ** 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() */ -){ +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; + void* pRet; #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ){ + if (!sqlite3SafetyCheckOk(db)) { (void)SQLITE_MISUSE_BKPT; return 0; } @@ -173109,47 +171563,49 @@ SQLITE_API void *sqlite3_wal_hook( /* ** 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 */ -){ +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 */ + int rc; /* Return code */ + int iDb; /* Schema to checkpoint */ #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; + 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 ){ + 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 (eMode < SQLITE_CHECKPOINT_PASSIVE || eMode > SQLITE_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] ){ + if (zDb && zDb[0]) { iDb = sqlite3FindDbName(db, zDb); - }else{ - iDb = SQLITE_MAX_DB; /* This means process all schemas */ + } else { + iDb = SQLITE_MAX_DB; /* This means process all schemas */ } - if( iDb<0 ){ + if (iDb < 0) { rc = SQLITE_ERROR; sqlite3ErrorWithMsg(db, SQLITE_ERROR, "unknown database: %s", zDb); - }else{ + } else { db->busyHandler.nBusy = 0; rc = sqlite3Checkpoint(db, iDb, eMode, pnLog, pnCkpt); sqlite3Error(db, rc); @@ -173158,7 +171614,7 @@ SQLITE_API int sqlite3_wal_checkpoint_v2( /* If there are no active statements, clear the interrupt flag at this ** point. */ - if( db->nVdbeActive==0 ){ + if (db->nVdbeActive == 0) { AtomicStore(&db->u1.isInterrupted, 0); } @@ -173167,16 +171623,15 @@ SQLITE_API int sqlite3_wal_checkpoint_v2( #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){ +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); + return sqlite3_wal_checkpoint_v2(db, zDb, SQLITE_CHECKPOINT_PASSIVE, 0, 0); } #ifndef SQLITE_OMIT_WAL @@ -173200,30 +171655,30 @@ SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb){ ** 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 */ +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 ); + 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 ){ + for (i = 0; i < db->nDb && 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 ){ + if (rc == SQLITE_BUSY) { bBusy = 1; rc = SQLITE_OK; } } } - return (rc==SQLITE_OK && bBusy) ? SQLITE_BUSY : rc; + return (rc == SQLITE_OK && bBusy) ? SQLITE_BUSY : rc; } #endif /* SQLITE_OMIT_WAL */ @@ -173246,18 +171701,18 @@ SQLITE_PRIVATE int sqlite3Checkpoint(sqlite3 *db, int iDb, int eMode, int *pnLog ** 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 ); +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 ); +#if SQLITE_TEMP_STORE == 2 + return (db->temp_store != 1); #endif -#if SQLITE_TEMP_STORE==3 +#if SQLITE_TEMP_STORE == 3 UNUSED_PARAMETER(db); return 1; #endif -#if SQLITE_TEMP_STORE<1 || SQLITE_TEMP_STORE>3 +#if SQLITE_TEMP_STORE < 1 || SQLITE_TEMP_STORE > 3 UNUSED_PARAMETER(db); return 0; #endif @@ -173267,22 +171722,22 @@ SQLITE_PRIVATE int sqlite3TempInMemory(const sqlite3 *db){ ** 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 ){ +SQLITE_API const char* sqlite3_errmsg(sqlite3* db) { + const char* z; + if (!db) { return sqlite3ErrStr(SQLITE_NOMEM_BKPT); } - if( !sqlite3SafetyCheckSickOrOk(db) ){ + if (!sqlite3SafetyCheckSickOrOk(db)) { return sqlite3ErrStr(SQLITE_MISUSE_BKPT); } sqlite3_mutex_enter(db->mutex); - if( db->mallocFailed ){ + if (db->mallocFailed) { z = sqlite3ErrStr(SQLITE_NOMEM_BKPT); - }else{ - testcase( db->pErr==0 ); + } else { + testcase(db->pErr == 0); z = db->errCode ? (char*)sqlite3_value_text(db->pErr) : 0; - assert( !db->mallocFailed ); - if( z==0 ){ + assert(!db->mallocFailed); + if (z == 0) { z = sqlite3ErrStr(db->errCode); } } @@ -173293,9 +171748,9 @@ SQLITE_API const char *sqlite3_errmsg(sqlite3 *db){ /* ** Return the byte offset of the most recent error */ -SQLITE_API int sqlite3_error_offset(sqlite3 *db){ +SQLITE_API int sqlite3_error_offset(sqlite3* db) { int iOffset = -1; - if( db && sqlite3SafetyCheckSickOrOk(db) && db->errCode ){ + if (db && sqlite3SafetyCheckSickOrOk(db) && db->errCode) { sqlite3_mutex_enter(db->mutex); iOffset = db->errByteOffset; sqlite3_mutex_leave(db->mutex); @@ -173308,29 +171763,24 @@ SQLITE_API int sqlite3_error_offset(sqlite3 *db){ ** 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 - }; +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; + const void* z; + if (!db) { + return (void*)outOfMem; } - if( !sqlite3SafetyCheckSickOrOk(db) ){ - return (void *)misuse; + if (!sqlite3SafetyCheckSickOrOk(db)) { + return (void*)misuse; } sqlite3_mutex_enter(db->mutex); - if( db->mallocFailed ){ - z = (void *)outOfMem; - }else{ + if (db->mallocFailed) { + z = (void*)outOfMem; + } else { z = sqlite3_value_text16(db->pErr); - if( z==0 ){ + if (z == 0) { sqlite3ErrorWithMsg(db, db->errCode, sqlite3ErrStr(db->errCode)); z = sqlite3_value_text16(db->pErr); } @@ -173350,25 +171800,25 @@ SQLITE_API const void *sqlite3_errmsg16(sqlite3 *db){ ** 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) ){ +SQLITE_API int sqlite3_errcode(sqlite3* db) { + if (db && !sqlite3SafetyCheckSickOrOk(db)) { return SQLITE_MISUSE_BKPT; } - if( !db || db->mallocFailed ){ + 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) ){ +SQLITE_API int sqlite3_extended_errcode(sqlite3* db) { + if (db && !sqlite3SafetyCheckSickOrOk(db)) { return SQLITE_MISUSE_BKPT; } - if( !db || db->mallocFailed ){ + if (!db || db->mallocFailed) { return SQLITE_NOMEM_BKPT; } return db->errCode; } -SQLITE_API int sqlite3_system_errno(sqlite3 *db){ +SQLITE_API int sqlite3_system_errno(sqlite3* db) { return db ? db->iSysErrno : 0; } @@ -173377,7 +171827,7 @@ SQLITE_API int sqlite3_system_errno(sqlite3 *db){ ** argument. For now, this simply calls the internal sqlite3ErrStr() ** function. */ -SQLITE_API const char *sqlite3_errstr(int rc){ +SQLITE_API const char* sqlite3_errstr(int rc) { return sqlite3ErrStr(rc); } @@ -173385,30 +171835,24 @@ SQLITE_API const char *sqlite3_errstr(int 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; +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) ); + 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 ){ + testcase(enc2 == SQLITE_UTF16); + testcase(enc2 == SQLITE_UTF16_ALIGNED); + if (enc2 == SQLITE_UTF16 || enc2 == SQLITE_UTF16_ALIGNED) { enc2 = SQLITE_UTF16NATIVE; } - if( enc2SQLITE_UTF16BE ){ + if (enc2 < SQLITE_UTF8 || enc2 > SQLITE_UTF16BE) { return SQLITE_MISUSE_BKPT; } @@ -173417,10 +171861,9 @@ static int createCollation( ** 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"); + 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); @@ -173431,13 +171874,13 @@ static int createCollation( ** Also, collation destructor - CollSeq.xDel() - function may need ** to be called. */ - if( (pColl->enc & ~SQLITE_UTF16_ALIGNED)==enc2 ){ - CollSeq *aColl = sqlite3HashFind(&db->aCollSeq, zName); + 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 ){ + 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; @@ -173447,7 +171890,8 @@ static int createCollation( } pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, 1); - if( pColl==0 ) return SQLITE_NOMEM_BKPT; + if (pColl == 0) + return SQLITE_NOMEM_BKPT; pColl->xCmp = xCompare; pColl->pUser = pCtx; pColl->xDel = xDel; @@ -173456,65 +171900,56 @@ static int createCollation( 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, + 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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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 +#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. @@ -173525,11 +171960,11 @@ static const int aHardLimit[] = { ** It merely prevents new constructs that exceed the limit ** from forming. */ -SQLITE_API int sqlite3_limit(sqlite3 *db, int limitId, int newLimit){ +SQLITE_API int sqlite3_limit(sqlite3* db, int limitId, int newLimit) { int oldLimit; #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ){ + if (!sqlite3SafetyCheckOk(db)) { (void)SQLITE_MISUSE_BKPT; return -1; } @@ -173540,35 +171975,33 @@ SQLITE_API int sqlite3_limit(sqlite3 *db, int limitId, int newLimit){ ** 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 ){ + 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 ){ + 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 */ + return oldLimit; /* IMP: R-53341-35419 */ } /* @@ -173597,65 +172030,68 @@ SQLITE_API int sqlite3_limit(sqlite3 *db, int limitId, int newLimit){ ** 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) */ -){ +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; + const char* zVfs = zDefaultVfs; + char* zFile; char c; int nUri = sqlite3Strlen30(zUri); - assert( *pzErrMsg==0 ); + 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 */ + 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 ){ + assert(octet >= 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!='&') - ){ + while ((c = zUri[iIn]) != 0 && c != '#' && (eState != 0 || c != '?') && (eState != 1 || (c != '=' && c != '&')) && + (eState != 2 || c != '&')) { iIn++; } continue; @@ -173705,94 +172135,88 @@ SQLITE_PRIVATE int sqlite3ParseUri( #endif } c = octet; - }else if( eState==1 && (c=='&' || c=='=') ){ - if( zFile[iOut-1]==0 ){ + } 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++; + while (zUri[iIn] && zUri[iIn] != '#' && zUri[iIn - 1] != '&') + iIn++; continue; } - if( c=='&' ){ + if (c == '&') { zFile[iOut++] = '\0'; - }else{ + } else { eState = 2; } c = 0; - }else if( (eState==0 && c=='?') || (eState==2 && c=='&') ){ + } 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 */ + 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] ){ + zOpt = &zFile[sqlite3Strlen30(zFile) + 1]; + while (zOpt[0]) { int nOpt = sqlite3Strlen30(zOpt); - char *zVal = &zOpt[nOpt+1]; + char* zVal = &zOpt[nOpt + 1]; int nVal = sqlite3Strlen30(zVal); - if( nOpt==3 && memcmp("vfs", zOpt, 3)==0 ){ + if (nOpt == 3 && memcmp("vfs", zOpt, 3) == 0) { zVfs = zVal; - }else{ + } else { struct OpenMode { - const char *z; + const char* z; int mode; - } *aMode = 0; - char *zModeType = 0; + }* 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 } - }; + 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; + 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 } - }; + 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; + mask = SQLITE_OPEN_READONLY | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_MEMORY; aMode = aOpenMode; limit = mask & flags; zModeType = "access"; } - if( aMode ){ + 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) ){ + 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 ){ + 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); + if ((mode & ~SQLITE_OPEN_MEMORY) > limit) { + *pzErrMsg = sqlite3_mprintf("%s mode not allowed: %s", zModeType, zVal); rc = SQLITE_PERM; goto parse_uri_out; } @@ -173800,28 +172224,29 @@ SQLITE_PRIVATE int sqlite3ParseUri( } } - zOpt = &zVal[nVal+1]; + zOpt = &zVal[nVal + 1]; } - }else{ - zFile = sqlite3_malloc64(nUri+8); - if( !zFile ) return SQLITE_NOMEM_BKPT; + } else { + zFile = sqlite3_malloc64(nUri + 8); + if (!zFile) + return SQLITE_NOMEM_BKPT; memset(zFile, 0, 4); zFile += 4; - if( nUri ){ + if (nUri) { memcpy(zFile, zUri, nUri); } - memset(zFile+nUri, 0, 4); + memset(zFile + nUri, 0, 4); flags &= ~SQLITE_OPEN_URI; } *ppVfs = sqlite3_vfs_find(zVfs); - if( *ppVfs==0 ){ + if (*ppVfs == 0) { *pzErrMsg = sqlite3_mprintf("no such vfs: %s", zVfs); rc = SQLITE_ERROR; } - parse_uri_out: - if( rc!=SQLITE_OK ){ +parse_uri_out: + if (rc != SQLITE_OK) { sqlite3_free_filename(zFile); zFile = 0; } @@ -173834,59 +172259,59 @@ SQLITE_PRIVATE int sqlite3ParseUri( ** 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){ +static const char* uriParameter(const char* zFilename, const char* zParam) { zFilename += sqlite3Strlen30(zFilename) + 1; - while( ALWAYS(zFilename!=0) && zFilename[0] ){ + while (ALWAYS(zFilename != 0) && zFilename[0]) { int x = strcmp(zFilename, zParam); zFilename += sqlite3Strlen30(zFilename) + 1; - if( x==0 ) return zFilename; + if (x == 0) + return zFilename; zFilename += sqlite3Strlen30(zFilename) + 1; } return 0; } - - /* ** This routine does the work of opening a database on behalf of ** sqlite3_open() and sqlite3_open16(). The database filename "zFilename" ** is UTF-8 encoded. */ -static int openDatabase( - const char *zFilename, /* Database filename UTF-8 encoded */ - sqlite3 **ppDb, /* OUT: Returned database handle */ - unsigned int flags, /* Operational flags */ - const char *zVfs /* Name of the VFS to use */ -){ - sqlite3 *db; /* Store allocated handle here */ - int rc; /* Return code */ - int isThreadsafe; /* True for threadsafe connections */ - char *zOpen = 0; /* Filename argument to pass to BtreeOpen() */ - char *zErrMsg = 0; /* Error message from sqlite3ParseUri() */ - int i; /* Loop counter */ +static int openDatabase(const char* zFilename, /* Database filename UTF-8 encoded */ + sqlite3** ppDb, /* OUT: Returned database handle */ + unsigned int flags, /* Operational flags */ + const char* zVfs /* Name of the VFS to use */ +) { + sqlite3* db; /* Store allocated handle here */ + int rc; /* Return code */ + int isThreadsafe; /* True for threadsafe connections */ + char* zOpen = 0; /* Filename argument to pass to BtreeOpen() */ + char* zErrMsg = 0; /* Error message from sqlite3ParseUri() */ + int i; /* Loop counter */ #ifdef SQLITE_ENABLE_API_ARMOR - if( ppDb==0 ) return SQLITE_MISUSE_BKPT; + if (ppDb == 0) + return SQLITE_MISUSE_BKPT; #endif *ppDb = 0; #ifndef SQLITE_OMIT_AUTOINIT rc = sqlite3_initialize(); - if( rc ) return rc; + if (rc) + return rc; #endif - if( sqlite3GlobalConfig.bCoreMutex==0 ){ + if (sqlite3GlobalConfig.bCoreMutex == 0) { isThreadsafe = 0; - }else if( flags & SQLITE_OPEN_NOMUTEX ){ + } else if (flags & SQLITE_OPEN_NOMUTEX) { isThreadsafe = 0; - }else if( flags & SQLITE_OPEN_FULLMUTEX ){ + } else if (flags & SQLITE_OPEN_FULLMUTEX) { isThreadsafe = 1; - }else{ + } else { isThreadsafe = sqlite3GlobalConfig.bFullMutex; } - if( flags & SQLITE_OPEN_PRIVATECACHE ){ + if (flags & SQLITE_OPEN_PRIVATECACHE) { flags &= ~SQLITE_OPEN_SHAREDCACHE; - }else if( sqlite3GlobalConfig.sharedCacheEnabled ){ + } else if (sqlite3GlobalConfig.sharedCacheEnabled) { flags |= SQLITE_OPEN_SHAREDCACHE; } @@ -173899,47 +172324,38 @@ static int openDatabase( ** SQLITE_OPEN_PRIVATECACHE, SQLITE_OPEN_EXRESCODE, and some reserved ** bits. Silently mask off all other flags. */ - flags &= ~( SQLITE_OPEN_DELETEONCLOSE | - SQLITE_OPEN_EXCLUSIVE | - SQLITE_OPEN_MAIN_DB | - SQLITE_OPEN_TEMP_DB | - SQLITE_OPEN_TRANSIENT_DB | - SQLITE_OPEN_MAIN_JOURNAL | - SQLITE_OPEN_TEMP_JOURNAL | - SQLITE_OPEN_SUBJOURNAL | - SQLITE_OPEN_SUPER_JOURNAL | - SQLITE_OPEN_NOMUTEX | - SQLITE_OPEN_FULLMUTEX | - SQLITE_OPEN_WAL - ); + flags &= ~(SQLITE_OPEN_DELETEONCLOSE | SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_MAIN_DB | SQLITE_OPEN_TEMP_DB | SQLITE_OPEN_TRANSIENT_DB | + SQLITE_OPEN_MAIN_JOURNAL | SQLITE_OPEN_TEMP_JOURNAL | SQLITE_OPEN_SUBJOURNAL | SQLITE_OPEN_SUPER_JOURNAL | + SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_FULLMUTEX | SQLITE_OPEN_WAL); /* Allocate the sqlite data structure */ - db = sqlite3MallocZero( sizeof(sqlite3) ); - if( db==0 ) goto opendb_out; - if( isThreadsafe + db = sqlite3MallocZero(sizeof(sqlite3)); + if (db == 0) + goto opendb_out; + if (isThreadsafe #ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS - || sqlite3GlobalConfig.bCoreMutex + || sqlite3GlobalConfig.bCoreMutex #endif - ){ + ) { db->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE); - if( db->mutex==0 ){ + if (db->mutex == 0) { sqlite3_free(db); db = 0; goto opendb_out; } - if( isThreadsafe==0 ){ + if (isThreadsafe == 0) { sqlite3MutexWarnOnContention(db->mutex); } } sqlite3_mutex_enter(db->mutex); - db->errMask = (flags & SQLITE_OPEN_EXRESCODE)!=0 ? 0xffffffff : 0xff; + 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) ); + 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; @@ -173955,12 +172371,9 @@ static int openDatabase( ** 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 + 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. @@ -173978,50 +172391,50 @@ static int openDatabase( ** -DSQLITE_DQS=0 (best) or -DSQLITE_DQS=1 (second choice) if possible. */ #if !defined(SQLITE_DQS) -# define SQLITE_DQS 3 +#define SQLITE_DQS 3 #endif -#if (SQLITE_DQS&1)==1 - | SQLITE_DqsDML +#if (SQLITE_DQS & 1) == 1 + | SQLITE_DqsDML #endif -#if (SQLITE_DQS&2)==2 - | SQLITE_DqsDDL +#if (SQLITE_DQS & 2) == 2 + | SQLITE_DqsDDL #endif #if !defined(SQLITE_DEFAULT_AUTOMATIC_INDEX) || SQLITE_DEFAULT_AUTOMATIC_INDEX - | SQLITE_AutoIndex + | SQLITE_AutoIndex #endif #if SQLITE_DEFAULT_CKPTFULLFSYNC - | SQLITE_CkptFullFSync + | SQLITE_CkptFullFSync #endif -#if SQLITE_DEFAULT_FILE_FORMAT<4 - | SQLITE_LegacyFileFmt +#if SQLITE_DEFAULT_FILE_FORMAT < 4 + | SQLITE_LegacyFileFmt #endif #ifdef SQLITE_ENABLE_LOAD_EXTENSION - | SQLITE_LoadExtension + | SQLITE_LoadExtension #endif #if SQLITE_DEFAULT_RECURSIVE_TRIGGERS - | SQLITE_RecTriggers + | SQLITE_RecTriggers #endif #if defined(SQLITE_DEFAULT_FOREIGN_KEYS) && SQLITE_DEFAULT_FOREIGN_KEYS - | SQLITE_ForeignKeys + | SQLITE_ForeignKeys #endif #if defined(SQLITE_REVERSE_UNORDERED_SELECTS) - | SQLITE_ReverseOrder + | SQLITE_ReverseOrder #endif #if defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK) - | SQLITE_CellSizeCk + | SQLITE_CellSizeCk #endif #if defined(SQLITE_ENABLE_FTS3_TOKENIZER) - | SQLITE_Fts3Tokenizer + | SQLITE_Fts3Tokenizer #endif #if defined(SQLITE_ENABLE_QPSG) - | SQLITE_EnableQPSG + | SQLITE_EnableQPSG #endif #if defined(SQLITE_DEFAULT_DEFENSIVE) - | SQLITE_Defensive + | SQLITE_Defensive #endif #if defined(SQLITE_DEFAULT_LEGACY_ALTER_TABLE) - | SQLITE_LegacyAlter + | SQLITE_LegacyAlter #endif ; sqlite3HashInit(&db->aCollSeq); @@ -174041,7 +172454,7 @@ static int openDatabase( 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 ){ + if (db->mallocFailed) { goto opendb_out; } @@ -174058,29 +172471,29 @@ static int openDatabase( ** 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{ + 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); + 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 = 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); @@ -174088,7 +172501,7 @@ static int openDatabase( } sqlite3BtreeEnter(db->aDb[0].pBt); db->aDb[0].pSchema = sqlite3SchemaGet(db, db->aDb[0].pBt); - if( !db->mallocFailed ){ + if (!db->mallocFailed) { sqlite3SetTextEncoding(db, SCHEMA_ENC(db)); } sqlite3BtreeLeave(db->aDb[0].pBt); @@ -174098,12 +172511,12 @@ static int openDatabase( ** 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[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 ){ + if (db->mallocFailed) { goto opendb_out; } @@ -174115,19 +172528,18 @@ static int openDatabase( sqlite3RegisterPerConnectionBuiltinFunctions(db); rc = sqlite3_errcode(db); - /* Load compiled-in extensions */ - for(i=0; rc==SQLITE_OK && idfltLockMode = SQLITE_DEFAULT_LOCKING_MODE; - sqlite3PagerLockingMode(sqlite3BtreePager(db->aDb[0].pBt), - SQLITE_DEFAULT_LOCKING_MODE); + sqlite3PagerLockingMode(sqlite3BtreePager(db->aDb[0].pBt), SQLITE_DEFAULT_LOCKING_MODE); #endif - if( rc ) sqlite3Error(db, rc); + if (rc) + sqlite3Error(db, rc); /* Enable the lookaside-malloc subsystem */ - setupLookaside(db, 0, sqlite3GlobalConfig.szLookaside, - sqlite3GlobalConfig.nLookaside); + 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 ); + 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 ){ + assert(db != 0 || (rc & 0xff) == SQLITE_NOMEM); + if ((rc & 0xff) == SQLITE_NOMEM) { sqlite3_close(db); db = 0; - }else if( rc!=SQLITE_OK ){ + } else if (rc != SQLITE_OK) { db->eOpenState = SQLITE_STATE_SICK; } *ppDb = db; #ifdef SQLITE_ENABLE_SQLLOG - if( sqlite3GlobalConfig.xSqllog ){ + if (sqlite3GlobalConfig.xSqllog) { /* Opening a db handle. Fourth parameter is passed 0. */ - void *pArg = sqlite3GlobalConfig.pSqllogArg; + void* pArg = sqlite3GlobalConfig.pSqllogArg; sqlite3GlobalConfig.xSqllog(pArg, db, zFilename, 0); } #endif @@ -174183,23 +172593,17 @@ static int openDatabase( 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 */ -){ +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); } @@ -174207,34 +172611,33 @@ SQLITE_API int sqlite3_open_v2( /* ** 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; +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; + if (ppDb == 0) + return SQLITE_MISUSE_BKPT; #endif *ppDb = 0; #ifndef SQLITE_OMIT_AUTOINIT rc = sqlite3_initialize(); - if( rc ) return rc; + if (rc) + return rc; #endif - if( zFilename==0 ) zFilename = "\000\000"; + 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) ){ + 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{ + } else { rc = SQLITE_NOMEM_BKPT; } sqlite3ValueFree(pVal); @@ -174246,34 +172649,24 @@ SQLITE_API int sqlite3_open16( /* ** 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*) -){ +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*) -){ +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; + if (!sqlite3SafetyCheckOk(db) || zName == 0) + return SQLITE_MISUSE_BKPT; #endif sqlite3_mutex_enter(db->mutex); - assert( !db->mallocFailed ); + assert(!db->mallocFailed); rc = createCollation(db, zName, (u8)enc, pCtx, xCompare, xDel); rc = sqlite3ApiExit(db, rc); sqlite3_mutex_leave(db->mutex); @@ -174284,23 +172677,19 @@ SQLITE_API int sqlite3_create_collation_v2( /* ** 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*) -){ +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; + char* zName8; #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) || zName==0 ) return SQLITE_MISUSE_BKPT; + if (!sqlite3SafetyCheckOk(db) || zName == 0) + return SQLITE_MISUSE_BKPT; #endif sqlite3_mutex_enter(db->mutex); - assert( !db->mallocFailed ); + assert(!db->mallocFailed); zName8 = sqlite3Utf16to8(db, zName, -1, SQLITE_UTF16NATIVE); - if( zName8 ){ + if (zName8) { rc = createCollation(db, zName8, (u8)enc, pCtx, xCompare, 0); sqlite3DbFree(db, zName8); } @@ -174314,13 +172703,11 @@ SQLITE_API int sqlite3_create_collation16( ** 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*) -){ +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; + if (!sqlite3SafetyCheckOk(db)) + return SQLITE_MISUSE_BKPT; #endif sqlite3_mutex_enter(db->mutex); db->xCollNeeded = xCollNeeded; @@ -174335,13 +172722,11 @@ SQLITE_API int sqlite3_collation_needed( ** 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*) -){ +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; + if (!sqlite3SafetyCheckOk(db)) + return SQLITE_MISUSE_BKPT; #endif sqlite3_mutex_enter(db->mutex); db->xCollNeeded = 0; @@ -174357,7 +172742,7 @@ SQLITE_API int sqlite3_collation_needed16( ** 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){ +SQLITE_API int sqlite3_global_recover(void) { return SQLITE_OK; } #endif @@ -174368,9 +172753,9 @@ SQLITE_API int sqlite3_global_recover(void){ ** 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){ +SQLITE_API int sqlite3_get_autocommit(sqlite3* db) { #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ){ + if (!sqlite3SafetyCheckOk(db)) { (void)SQLITE_MISUSE_BKPT; return 0; } @@ -174389,38 +172774,37 @@ SQLITE_API int sqlite3_get_autocommit(sqlite3 *db){ ** 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()); +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 ); +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 ); +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 ); +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){ +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 ); + testcase(sqlite3GlobalConfig.xLog != 0); return sqlite3ReportError(SQLITE_CORRUPT, lineno, zMsg); } #endif #ifdef SQLITE_DEBUG -SQLITE_PRIVATE int sqlite3NomemError(int lineno){ - testcase( sqlite3GlobalConfig.xLog!=0 ); +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 ); +SQLITE_PRIVATE int sqlite3IoerrnomemError(int lineno) { + testcase(sqlite3GlobalConfig.xLog != 0); return sqlite3ReportError(SQLITE_IOERR_NOMEM, lineno, "I/O OOM error"); } #endif @@ -174433,39 +172817,36 @@ SQLITE_PRIVATE int sqlite3IoerrnomemError(int lineno){ ** 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){ -} +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 */ -){ +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; + char* zErrMsg = 0; + Table* pTab = 0; + Column* pCol = 0; int iCol = 0; - char const *zDataType = 0; - char const *zCollSeq = 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 ){ + if (!sqlite3SafetyCheckOk(db) || zTableName == 0) { return SQLITE_MISUSE_BKPT; } #endif @@ -174474,32 +172855,32 @@ SQLITE_API int sqlite3_table_column_metadata( sqlite3_mutex_enter(db->mutex); sqlite3BtreeEnterAll(db); rc = sqlite3Init(db, &zErrMsg); - if( SQLITE_OK!=rc ){ + if (SQLITE_OK != rc) { goto error_out; } /* Locate the table in question */ pTab = sqlite3FindTable(db, zTableName, zDbName); - if( !pTab || IsView(pTab) ){ + if (!pTab || IsView(pTab)) { pTab = 0; goto error_out; } /* Find the column for which info is requested */ - if( zColumnName==0 ){ + if (zColumnName == 0) { /* Query for existance of table only */ - }else{ - for(iCol=0; iColnCol; iCol++){ + } else { + for (iCol = 0; iCol < pTab->nCol; iCol++) { pCol = &pTab->aCol[iCol]; - if( 0==sqlite3StrICmp(pCol->zCnName, zColumnName) ){ + if (0 == sqlite3StrICmp(pCol->zCnName, zColumnName)) { break; } } - if( iCol==pTab->nCol ){ - if( HasRowid(pTab) && sqlite3IsRowid(zColumnName) ){ + if (iCol == pTab->nCol) { + if (HasRowid(pTab) && sqlite3IsRowid(zColumnName)) { iCol = pTab->iPKey; - pCol = iCol>=0 ? &pTab->aCol[iCol] : 0; - }else{ + pCol = iCol >= 0 ? &pTab->aCol[iCol] : 0; + } else { pTab = 0; goto error_out; } @@ -174516,17 +172897,17 @@ SQLITE_API int sqlite3_table_column_metadata( ** 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); + 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{ + 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 ){ + if (!zCollSeq) { zCollSeq = sqlite3StrBINARY; } @@ -174537,19 +172918,23 @@ SQLITE_API int sqlite3_table_column_metadata( ** 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 ){ + 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); + zErrMsg = sqlite3MPrintf(db, "no such table column: %s.%s", zTableName, zColumnName); rc = SQLITE_ERROR; } - sqlite3ErrorWithMsg(db, rc, (zErrMsg?"%s":0), zErrMsg); + sqlite3ErrorWithMsg(db, rc, (zErrMsg ? "%s" : 0), zErrMsg); sqlite3DbFree(db, zErrMsg); rc = sqlite3ApiExit(db, rc); sqlite3_mutex_leave(db->mutex); @@ -174559,25 +172944,27 @@ SQLITE_API int sqlite3_table_column_metadata( /* ** Sleep for a little while. Return the amount of time slept. */ -SQLITE_API int sqlite3_sleep(int ms){ - sqlite3_vfs *pVfs; +SQLITE_API int sqlite3_sleep(int ms) { + sqlite3_vfs* pVfs; int rc; pVfs = sqlite3_vfs_find(0); - if( pVfs==0 ) return 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); + 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){ +SQLITE_API int sqlite3_extended_result_codes(sqlite3* db, int onoff) { #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; + if (!sqlite3SafetyCheckOk(db)) + return SQLITE_MISUSE_BKPT; #endif sqlite3_mutex_enter(db->mutex); db->errMask = onoff ? 0xffffffff : 0xff; @@ -174588,43 +172975,44 @@ SQLITE_API int sqlite3_extended_result_codes(sqlite3 *db, int onoff){ /* ** Invoke the xFileControl method on a particular database. */ -SQLITE_API int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, void *pArg){ +SQLITE_API int sqlite3_file_control(sqlite3* db, const char* zDbName, int op, void* pArg) { int rc = SQLITE_ERROR; - Btree *pBtree; + Btree* pBtree; #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; + if (!sqlite3SafetyCheckOk(db)) + return SQLITE_MISUSE_BKPT; #endif sqlite3_mutex_enter(db->mutex); pBtree = sqlite3DbNameToBtree(db, zDbName); - if( pBtree ){ - Pager *pPager; - sqlite3_file *fd; + if (pBtree) { + Pager* pPager; + sqlite3_file* fd; sqlite3BtreeEnter(pBtree); pPager = sqlite3BtreePager(pBtree); - assert( pPager!=0 ); + assert(pPager != 0); fd = sqlite3PagerFile(pPager); - assert( fd!=0 ); - if( op==SQLITE_FCNTL_FILE_POINTER ){ + assert(fd != 0); + if (op == SQLITE_FCNTL_FILE_POINTER) { *(sqlite3_file**)pArg = fd; rc = SQLITE_OK; - }else if( op==SQLITE_FCNTL_VFS_POINTER ){ + } else if (op == SQLITE_FCNTL_VFS_POINTER) { *(sqlite3_vfs**)pArg = sqlite3PagerVfs(pPager); rc = SQLITE_OK; - }else if( op==SQLITE_FCNTL_JOURNAL_POINTER ){ + } else if (op == SQLITE_FCNTL_JOURNAL_POINTER) { *(sqlite3_file**)pArg = sqlite3PagerJrnlFile(pPager); rc = SQLITE_OK; - }else if( op==SQLITE_FCNTL_DATA_VERSION ){ + } else if (op == SQLITE_FCNTL_DATA_VERSION) { *(unsigned int*)pArg = sqlite3PagerDataVersion(pPager); rc = SQLITE_OK; - }else if( op==SQLITE_FCNTL_RESERVE_BYTES ){ + } else if (op == SQLITE_FCNTL_RESERVE_BYTES) { int iNew = *(int*)pArg; *(int*)pArg = sqlite3BtreeGetRequestedReserve(pBtree); - if( iNew>=0 && iNew<=255 ){ + if (iNew >= 0 && iNew <= 255) { sqlite3BtreeSetPageSize(pBtree, 0, iNew, 0); } rc = SQLITE_OK; - }else{ + } else { int nSave = db->busyHandler.nBusy; rc = sqlite3OsFileControl(fd, op, pArg); db->busyHandler.nBusy = nSave; @@ -174638,14 +173026,14 @@ SQLITE_API int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, vo /* ** Interface to the testing logic. */ -SQLITE_API int sqlite3_test_control(int op, ...){ +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 ){ + switch (op) { /* ** Save the current state of the PRNG. @@ -174689,11 +173077,13 @@ SQLITE_API int sqlite3_test_control(int op, ...){ 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; } + 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); + sqlite3_randomness(0, 0); break; } #endif @@ -174708,7 +173098,7 @@ SQLITE_API int sqlite3_test_control(int op, ...){ */ case SQLITE_TESTCTRL_BITVEC_TEST: { int sz = va_arg(ap, int); - int *aProg = va_arg(ap, int*); + int* aProg = va_arg(ap, int*); rc = sqlite3BitvecBuiltinTest(sz, aProg); break; } @@ -174733,7 +173123,7 @@ SQLITE_API int sqlite3_test_control(int op, ...){ ** of the link above to see the original text. ** sqlite3GlobalConfig.xTestCallback = va_arg(ap, int(*)(int)); */ - typedef int(*sqlite3FaultFuncType)(int); + typedef int (*sqlite3FaultFuncType)(int); sqlite3GlobalConfig.xTestCallback = va_arg(ap, sqlite3FaultFuncType); rc = sqlite3FaultSim(0); break; @@ -174772,7 +173162,8 @@ SQLITE_API int sqlite3_test_control(int op, ...){ #ifndef SQLITE_OMIT_WSD { unsigned int newVal = va_arg(ap, unsigned int); - if( newVal ) sqlite3PendingByte = newVal; + if (newVal) + sqlite3PendingByte = newVal; } #endif break; @@ -174791,12 +173182,12 @@ SQLITE_API int sqlite3_test_control(int op, ...){ */ case SQLITE_TESTCTRL_ASSERT: { volatile int x = 0; - assert( /*side-effects-ok*/ (x = va_arg(ap,int))!=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 ){ + if (x == 9999) { sqlite3ShowExpr(0); sqlite3ShowExpr(0); sqlite3ShowExprList(0); @@ -174818,7 +173209,6 @@ SQLITE_API int sqlite3_test_control(int op, ...){ break; } - /* ** sqlite3_test_control(SQLITE_TESTCTRL_ALWAYS, int X) ** @@ -174847,7 +173237,7 @@ SQLITE_API int sqlite3_test_control(int op, ...){ ** } */ case SQLITE_TESTCTRL_ALWAYS: { - int x = va_arg(ap,int); + int x = va_arg(ap, int); rc = x ? ALWAYS(x) : 0; break; } @@ -174864,7 +173254,7 @@ SQLITE_API int sqlite3_test_control(int op, ...){ ** 123410 little-endian, determined at compile-time */ case SQLITE_TESTCTRL_BYTEORDER: { - rc = SQLITE_BYTEORDER*100 + SQLITE_LITTLEENDIAN*10 + SQLITE_BIGENDIAN; + rc = SQLITE_BYTEORDER * 100 + SQLITE_LITTLEENDIAN * 10 + SQLITE_BIGENDIAN; break; } @@ -174878,7 +173268,7 @@ SQLITE_API int sqlite3_test_control(int op, ...){ ** is obtained in every case. */ case SQLITE_TESTCTRL_OPTIMIZATIONS: { - sqlite3 *db = va_arg(ap, sqlite3*); + sqlite3* db = va_arg(ap, sqlite3*); db->dbOptFlags = va_arg(ap, u32); break; } @@ -174898,10 +173288,10 @@ SQLITE_API int sqlite3_test_control(int op, ...){ */ case SQLITE_TESTCTRL_LOCALTIME_FAULT: { sqlite3GlobalConfig.bLocaltimeFault = va_arg(ap, int); - if( sqlite3GlobalConfig.bLocaltimeFault==2 ){ - typedef int(*sqlite3LocaltimeType)(const void*,void*); + if (sqlite3GlobalConfig.bLocaltimeFault == 2) { + typedef int (*sqlite3LocaltimeType)(const void*, void*); sqlite3GlobalConfig.xAltLocaltime = va_arg(ap, sqlite3LocaltimeType); - }else{ + } else { sqlite3GlobalConfig.xAltLocaltime = 0; } break; @@ -174913,7 +173303,7 @@ SQLITE_API int sqlite3_test_control(int op, ...){ ** the database connection given in the argument. */ case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: { - sqlite3 *db = va_arg(ap, sqlite3*); + sqlite3* db = va_arg(ap, sqlite3*); db->mDbFlags ^= DBFLAG_InternalFunc; break; } @@ -174965,17 +173355,16 @@ SQLITE_API int sqlite3_test_control(int op, ...){ */ 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*); + 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*); + sqlite3* db = va_arg(ap, sqlite3*); db->nMaxSorterMmap = va_arg(ap, int); break; } @@ -174986,7 +173375,8 @@ SQLITE_API int sqlite3_test_control(int op, ...){ ** not. */ case SQLITE_TESTCTRL_ISINIT: { - if( sqlite3GlobalConfig.isInit==0 ) rc = SQLITE_ERROR; + if (sqlite3GlobalConfig.isInit == 0) + rc = SQLITE_ERROR; break; } @@ -175007,15 +173397,15 @@ SQLITE_API int sqlite3_test_control(int op, ...){ ** effect of erasing all imposter tables. */ case SQLITE_TESTCTRL_IMPOSTER: { - sqlite3 *db = va_arg(ap, sqlite3*); + sqlite3* db = va_arg(ap, sqlite3*); int iDb; sqlite3_mutex_enter(db->mutex); - iDb = sqlite3FindDbName(db, va_arg(ap,const char*)); - if( iDb>=0 ){ + 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 ){ + 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); } } @@ -175033,8 +173423,9 @@ SQLITE_API int sqlite3_test_control(int op, ...){ ** return code SQLITE_ERROR. */ case SQLITE_TESTCTRL_PARSER_COVERAGE: { - FILE *out = va_arg(ap, FILE*); - if( sqlite3ParserCoverage(out) ) rc = SQLITE_ERROR; + FILE* out = va_arg(ap, FILE*); + if (sqlite3ParserCoverage(out)) + rc = SQLITE_ERROR; break; } #endif /* defined(YYCOVERAGE) */ @@ -175050,7 +173441,7 @@ SQLITE_API int sqlite3_test_control(int op, ...){ ** for testing purposes. */ case SQLITE_TESTCTRL_RESULT_INTREAL: { - sqlite3_context *pCtx = va_arg(ap, sqlite3_context*); + sqlite3_context* pCtx = va_arg(ap, sqlite3_context*); sqlite3ResultIntReal(pCtx); break; } @@ -175065,10 +173456,10 @@ SQLITE_API int sqlite3_test_control(int op, ...){ ** 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*); + 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 */ + (void)db; /* Silence harmless unused variable warning */ break; } @@ -175082,15 +173473,23 @@ SQLITE_API int sqlite3_test_control(int op, ...){ ** 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; + 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, @@ -175105,16 +173504,15 @@ SQLITE_API int sqlite3_test_control(int op, ...){ 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*); + 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) ** @@ -175133,12 +173531,12 @@ SQLITE_API int sqlite3_test_control(int op, ...){ */ case SQLITE_TESTCTRL_TUNE: { int id = va_arg(ap, int); - int *piValue = va_arg(ap, int*); - if( id>0 && id<=SQLITE_NTUNE ){ + int* piValue = va_arg(ap, int*); + if (id > 0 && id <= SQLITE_NTUNE) { Tuning(id) = *piValue; - }else if( id<0 && id>=-SQLITE_NTUNE ){ + } else if (id < 0 && id >= -SQLITE_NTUNE) { *piValue = Tuning(-id); - }else{ + } else { rc = SQLITE_NOTFOUND; } break; @@ -175158,8 +173556,8 @@ SQLITE_API int sqlite3_test_control(int op, ...){ ** ** 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 ){ +static const char* databaseName(const char* zName) { + while (zName[-1] != 0 || zName[-2] != 0 || zName[-3] != 0 || zName[-4] != 0) { zName--; } return zName; @@ -175169,10 +173567,10 @@ static const char *databaseName(const char *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){ +static char* appendText(char* p, const char* z) { size_t n = strlen(z); - memcpy(p, z, n+1); - return p+n+1; + memcpy(p, z, n + 1); + return p + n + 1; } /* @@ -175184,26 +173582,21 @@ static char *appendText(char *p, const char *z){ ** 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 -){ +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 ){ + while (ALWAYS(zFilename) && zFilename[0] && (N--) > 0) { zFilename += sqlite3Strlen30(zFilename) + 1; zFilename += sqlite3Strlen30(zFilename) + 1; } @@ -175261,23 +173656,22 @@ SQLITE_API const char *sqlite3_uri_key(const char *zFilename, int N){ /* ** 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; +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); +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 ){ + if (z && sqlite3DecOrHexToI64(z, &v) == 0) { bDflt = v; } return bDflt; @@ -175293,26 +173687,29 @@ SQLITE_API sqlite3_int64 sqlite3_uri_int64( ** 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; +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; +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] ){ + 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){ +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; + if (zFilename) + zFilename += sqlite3Strlen30(zFilename) + 1; return zFilename; #endif } @@ -175320,25 +173717,25 @@ SQLITE_API const char *sqlite3_filename_wal(const char *zFilename){ /* ** Return the Btree pointer identified by zDbName. Return NULL if not found. */ -SQLITE_PRIVATE Btree *sqlite3DbNameToBtree(sqlite3 *db, const char *zDbName){ +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 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){ +SQLITE_API const char* sqlite3_db_name(sqlite3* db, int N) { #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ){ + if (!sqlite3SafetyCheckOk(db)) { (void)SQLITE_MISUSE_BKPT; return 0; } #endif - if( N<0 || N>=db->nDb ){ + if (N < 0 || N >= db->nDb) { return 0; - }else{ + } else { return db->aDb[N].zDbSName; } } @@ -175347,10 +173744,10 @@ SQLITE_API const char *sqlite3_db_name(sqlite3 *db, int N){ ** 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; +SQLITE_API const char* sqlite3_db_filename(sqlite3* db, const char* zDbName) { + Btree* pBt; #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ){ + if (!sqlite3SafetyCheckOk(db)) { (void)SQLITE_MISUSE_BKPT; return 0; } @@ -175363,10 +173760,10 @@ SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName){ ** 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; +SQLITE_API int sqlite3_db_readonly(sqlite3* db, const char* zDbName) { + Btree* pBt; #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ){ + if (!sqlite3SafetyCheckOk(db)) { (void)SQLITE_MISUSE_BKPT; return -1; } @@ -175380,28 +173777,24 @@ SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName){ ** 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 -){ +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) ){ + if (!sqlite3SafetyCheckOk(db)) { return SQLITE_MISUSE_BKPT; } #endif sqlite3_mutex_enter(db->mutex); - if( db->autoCommit==0 ){ + 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) ){ + 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 ){ + if (rc == SQLITE_OK) { rc = sqlite3PagerSnapshotGet(sqlite3BtreePager(pBt), ppSnapshot); } } @@ -175409,54 +173802,50 @@ SQLITE_API int sqlite3_snapshot_get( } sqlite3_mutex_leave(db->mutex); -#endif /* SQLITE_OMIT_WAL */ +#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 -){ +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) ){ + if (!sqlite3SafetyCheckOk(db)) { return SQLITE_MISUSE_BKPT; } #endif sqlite3_mutex_enter(db->mutex); - if( db->autoCommit==0 ){ + 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); + 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 ){ + if (sqlite3BtreeTxnState(pBt) != SQLITE_TXN_NONE) { + if (db->nVdbeActive == 0) { rc = sqlite3PagerSnapshotCheck(pPager, pSnapshot); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { bUnlock = 1; rc = sqlite3BtreeCommit(pBt); } } - }else{ + } else { rc = SQLITE_OK; } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = sqlite3PagerSnapshotOpen(pPager, pSnapshot); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = sqlite3BtreeBeginTrans(pBt, 0, 0); sqlite3PagerSnapshotOpen(pPager, 0); } - if( bUnlock ){ + if (bUnlock) { sqlite3PagerSnapshotUnlock(pPager); } } @@ -175464,7 +173853,7 @@ SQLITE_API int sqlite3_snapshot_open( } sqlite3_mutex_leave(db->mutex); -#endif /* SQLITE_OMIT_WAL */ +#endif /* SQLITE_OMIT_WAL */ return rc; } @@ -175472,38 +173861,38 @@ SQLITE_API int sqlite3_snapshot_open( ** 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){ +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) ){ + 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) ){ + 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 ){ + if (rc == SQLITE_OK) { rc = sqlite3PagerSnapshotRecover(sqlite3BtreePager(pBt)); sqlite3BtreeCommit(pBt); } } } sqlite3_mutex_leave(db->mutex); -#endif /* SQLITE_OMIT_WAL */ +#endif /* SQLITE_OMIT_WAL */ return rc; } /* ** Free a snapshot handle obtained from sqlite3_snapshot_get(). */ -SQLITE_API void sqlite3_snapshot_free(sqlite3_snapshot *pSnapshot){ +SQLITE_API void sqlite3_snapshot_free(sqlite3_snapshot* pSnapshot) { sqlite3_free(pSnapshot); } #endif /* SQLITE_ENABLE_SNAPSHOT */ @@ -175516,13 +173905,13 @@ SQLITE_API void sqlite3_snapshot_free(sqlite3_snapshot *pSnapshot){ ** 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){ +SQLITE_API int sqlite3_compileoption_used(const char* zOptName) { int i, n; int nOpt; - const char **azCompileOpt; + const char** azCompileOpt; #if SQLITE_ENABLE_API_ARMOR - if( zOptName==0 ){ + if (zOptName == 0) { (void)SQLITE_MISUSE_BKPT; return 0; } @@ -175530,15 +173919,14 @@ SQLITE_API int sqlite3_compileoption_used(const char *zOptName){ azCompileOpt = sqlite3CompileOptions(&nOpt); - if( sqlite3StrNICmp(zOptName, "SQLITE_", 7)==0 ) zOptName += 7; + 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 && N= 0 && N < nOpt) { return azCompileOpt[N]; } return 0; @@ -175592,8 +173980,7 @@ SQLITE_API const char *sqlite3_compileoption_get(int N){ ** sqlite3_unlock_notify() */ -#define assertMutexHeld() \ - assert( sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN)) ) +#define assertMutexHeld() assert(sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN))) /* ** Head of a linked list of all sqlite3 objects created by this process @@ -175601,7 +173988,7 @@ SQLITE_API const char *sqlite3_compileoption_get(int N){ ** is not NULL. This variable may only accessed while the STATIC_MAIN ** mutex is held. */ -static sqlite3 *SQLITE_WSD sqlite3BlockedList = 0; +static sqlite3* SQLITE_WSD sqlite3BlockedList = 0; #ifndef NDEBUG /* @@ -175618,37 +174005,38 @@ static sqlite3 *SQLITE_WSD sqlite3BlockedList = 0; ** blocked connections list have pUnlockConnection or pBlockingConnection ** set to db. This is used when closing connection db. */ -static void checkListProperties(sqlite3 *db){ - sqlite3 *p; - for(p=sqlite3BlockedList; p; p=p->pNextBlocked){ +static void checkListProperties(sqlite3* db) { + sqlite3* p; + for (p = sqlite3BlockedList; p; p = p->pNextBlocked) { int seen = 0; - sqlite3 *p2; + sqlite3* p2; /* Verify property (1) */ - assert( p->pUnlockConnection || p->pBlockingConnection ); + 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 ); + 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) +#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; +static void removeFromBlockedList(sqlite3* db) { + sqlite3** pp; assertMutexHeld(); - for(pp=&sqlite3BlockedList; *pp; pp = &(*pp)->pNextBlocked){ - if( *pp==db ){ + for (pp = &sqlite3BlockedList; *pp; pp = &(*pp)->pNextBlocked) { + if (*pp == db) { *pp = (*pp)->pNextBlocked; break; } @@ -175659,14 +174047,11 @@ static void removeFromBlockedList(sqlite3 *db){ ** 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; +static void addToBlockedList(sqlite3* db) { + sqlite3** pp; assertMutexHeld(); - for( - pp=&sqlite3BlockedList; - *pp && (*pp)->xUnlockNotify!=db->xUnlockNotify; - pp=&(*pp)->pNextBlocked - ); + for (pp = &sqlite3BlockedList; *pp && (*pp)->xUnlockNotify != db->xUnlockNotify; pp = &(*pp)->pNextBlocked) + ; db->pNextBlocked = *pp; *pp = db; } @@ -175674,7 +174059,7 @@ static void addToBlockedList(sqlite3 *db){ /* ** Obtain the STATIC_MAIN mutex. */ -static void enterMutex(void){ +static void enterMutex(void) { sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN)); checkListProperties(0); } @@ -175682,7 +174067,7 @@ static void enterMutex(void){ /* ** Release the STATIC_MAIN mutex. */ -static void leaveMutex(void){ +static void leaveMutex(void) { assertMutexHeld(); checkListProperties(0); sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN)); @@ -175709,35 +174094,32 @@ static void leaveMutex(void){ ** 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 -){ +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 ){ + if (xNotify == 0) { removeFromBlockedList(db); db->pBlockingConnection = 0; db->pUnlockConnection = 0; db->xUnlockNotify = 0; db->pUnlockArg = 0; - }else if( 0==db->pBlockingConnection ){ + } 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; + } else { + sqlite3* p; - for(p=db->pBlockingConnection; p && p!=db; p=p->pUnlockConnection){} - if( p ){ - rc = SQLITE_LOCKED; /* Deadlock detected. */ - }else{ + 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; @@ -175747,8 +174129,8 @@ SQLITE_API int sqlite3_unlock_notify( } leaveMutex(); - assert( !db->mallocFailed ); - sqlite3ErrorWithMsg(db, rc, (rc?"database is deadlocked":0)); + assert(!db->mallocFailed); + sqlite3ErrorWithMsg(db, rc, (rc ? "database is deadlocked" : 0)); sqlite3_mutex_leave(db->mutex); return rc; } @@ -175759,9 +174141,9 @@ SQLITE_API int sqlite3_unlock_notify( ** 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){ +SQLITE_PRIVATE void sqlite3ConnectionBlocked(sqlite3* db, sqlite3* pBlocker) { enterMutex(); - if( db->pBlockingConnection==0 && db->pUnlockConnection==0 ){ + if (db->pBlockingConnection == 0 && db->pUnlockConnection == 0) { addToBlockedList(db); } db->pBlockingConnection = pBlocker; @@ -175787,47 +174169,45 @@ SQLITE_PRIVATE void sqlite3ConnectionBlocked(sqlite3 *db, sqlite3 *pBlocker){ ** 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 */ +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 */ + 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; + for (pp = &sqlite3BlockedList; *pp; /* no-op */) { + sqlite3* p = *pp; /* Step 1. */ - if( p->pBlockingConnection==db ){ + if (p->pBlockingConnection == db) { p->pBlockingConnection = 0; } /* Step 2. */ - if( p->pUnlockConnection==db ){ - assert( p->xUnlockNotify ); - if( p->xUnlockNotify!=xUnlockNotify && nArg!=0 ){ + 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*))) - ){ + 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 *)); + void** pNew = (void**)sqlite3Malloc(nArg * sizeof(void*) * 2); + if (pNew) { + memcpy(pNew, aArg, nArg * sizeof(void*)); sqlite3_free(aDyn); aDyn = aArg = pNew; - }else{ + } 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 @@ -175866,27 +174246,27 @@ SQLITE_PRIVATE void sqlite3ConnectionUnlocked(sqlite3 *db){ } /* Step 3. */ - if( p->pBlockingConnection==0 && p->pUnlockConnection==0 ){ + if (p->pBlockingConnection == 0 && p->pUnlockConnection == 0) { /* Remove connection p from the blocked connections list. */ *pp = p->pNextBlocked; p->pNextBlocked = 0; - }else{ + } else { pp = &p->pNextBlocked; } } - if( nArg!=0 ){ + if (nArg != 0) { xUnlockNotify(aArg, nArg); } sqlite3_free(aDyn); - leaveMutex(); /* Leave STATIC_MAIN mutex */ + 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){ +SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3* db) { sqlite3ConnectionUnlocked(db); enterMutex(); removeFromBlockedList(db); @@ -176206,13 +174586,13 @@ SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db){ #define _FTSINT_H #if !defined(NDEBUG) && !defined(SQLITE_DEBUG) -# define NDEBUG 1 +#define NDEBUG 1 #endif /* FTS3/FTS4 require virtual tables */ #ifdef SQLITE_OMIT_VIRTUALTABLE -# undef SQLITE_ENABLE_FTS3 -# undef SQLITE_ENABLE_FTS4 +#undef SQLITE_ENABLE_FTS3 +#undef SQLITE_ENABLE_FTS4 #endif /* @@ -176221,7 +174601,7 @@ SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db){ ** 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 +#define SQLITE_ENABLE_FTS3 #endif #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) @@ -176310,34 +174690,32 @@ struct sqlite3_tokenizer_module { ** 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 */ + 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); + 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 */ + 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); + int (*xClose)(sqlite3_tokenizer_cursor* pCursor); /* ** Retrieve the next token from the tokenizer cursor pCursor. This @@ -176363,12 +174741,11 @@ struct sqlite3_tokenizer_module { ** 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 */ + 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 */ ); /*********************************************************************** @@ -176378,23 +174755,22 @@ struct sqlite3_tokenizer_module { /* ** Configure the language id of a tokenizer cursor. */ - int (*xLanguageid)(sqlite3_tokenizer_cursor *pCsr, int iLangid); + int (*xLanguageid)(sqlite3_tokenizer_cursor* pCsr, int iLangid); }; struct sqlite3_tokenizer { - const sqlite3_tokenizer_module *pModule; /* The module for this 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. */ + 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 **************************************/ @@ -176433,15 +174809,15 @@ typedef struct Fts3HashElem Fts3HashElem; ** 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; + 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 @@ -176452,8 +174828,9 @@ struct Fts3Hash { */ 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 */ + void* data; /* Data associated with this element */ + void* pKey; + int nKey; /* Key associated with this element */ }; /* @@ -176468,25 +174845,25 @@ struct Fts3HashElem { ** ** 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 +#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 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); +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 fts3HashInit sqlite3Fts3HashInit +#define fts3HashInsert sqlite3Fts3HashInsert +#define fts3HashFind sqlite3Fts3HashFind +#define fts3HashClear sqlite3Fts3HashClear #define fts3HashFindElem sqlite3Fts3HashFindElem /* @@ -176501,16 +174878,16 @@ SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem(const Fts3Hash *, const voi ** // 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 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) +#define fts3HashCount(H) ((H)->count) #endif /* _FTS3_HASH_H_ */ @@ -176525,10 +174902,9 @@ SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem(const Fts3Hash *, const voi ** of stack space (perhaps causing a stack overflow). */ #ifndef SQLITE_FTS3_MAX_EXPR_DEPTH -# define SQLITE_FTS3_MAX_EXPR_DEPTH 12 +#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 @@ -176544,21 +174920,20 @@ SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem(const Fts3Hash *, const voi ** 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) +#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]))) - +#define SizeofArray(X) ((int)(sizeof(X) / sizeof(X[0]))) #ifndef MIN -# define MIN(x,y) ((x)<(y)?(x):(y)) +#define MIN(x, y) ((x) < (y) ? (x) : (y)) #endif #ifndef MAX -# define MAX(x,y) ((x)>(y)?(x):(y)) +#define MAX(x, y) ((x) > (y) ? (x) : (y)) #endif /* @@ -176584,7 +174959,7 @@ SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem(const Fts3Hash *, const voi ** 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 1024 #define FTS3_SEGDIR_MAXLEVEL_STR "1024" /* @@ -176592,14 +174967,14 @@ SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem(const Fts3Hash *, const voi ** make it a no-op. */ #ifndef testcase -# define testcase(X) +#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 */ +#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 @@ -176608,9 +174983,9 @@ SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem(const Fts3Hash *, const voi */ #ifdef SQLITE_DEBUG SQLITE_API extern int sqlite3_fts3_may_be_corrupt; -# define assert_fts3_nc(x) assert(sqlite3_fts3_may_be_corrupt || (x)) +#define assert_fts3_nc(x) assert(sqlite3_fts3_may_be_corrupt || (x)) #else -# define assert_fts3_nc(x) assert(x) +#define assert_fts3_nc(x) assert(x) #endif /* @@ -176624,27 +174999,27 @@ SQLITE_API extern int sqlite3_fts3_may_be_corrupt; ** false. */ #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) -# define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1 +#define SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS 1 #endif #if defined(SQLITE_OMIT_AUXILIARY_SAFETY_CHECKS) -# define ALWAYS(X) (1) -# define NEVER(X) (0) +#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) +#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) +#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 */ +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. @@ -176655,7 +175030,7 @@ typedef sqlite3_int64 i64; /* 8-byte signed integer */ ** Activate assert() only if SQLITE_TEST is enabled. */ #if !defined(NDEBUG) && !defined(SQLITE_DEBUG) -# define NDEBUG 1 +#define NDEBUG 1 #endif /* @@ -176664,13 +175039,13 @@ typedef sqlite3_int64 i64; /* 8-byte signed integer */ ** within testcase() and assert() macros. */ #if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) -# define TESTONLY(X) X +#define TESTONLY(X) X #else -# define TESTONLY(X) +#define TESTONLY(X) #endif -#define LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32)) -#define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64) +#define LARGEST_INT64 (0xffffffff | (((i64)0x7fffffff) << 32)) +#define SMALLEST_INT64 (((i64) - 1) - LARGEST_INT64) #define deliberate_fall_through @@ -176678,9 +175053,9 @@ typedef sqlite3_int64 i64; /* 8-byte signed integer */ #ifdef SQLITE_DEBUG SQLITE_PRIVATE int sqlite3Fts3Corrupt(void); -# define FTS_CORRUPT_VTAB sqlite3Fts3Corrupt() +#define FTS_CORRUPT_VTAB sqlite3Fts3Corrupt() #else -# define FTS_CORRUPT_VTAB SQLITE_CORRUPT_VTAB +#define FTS_CORRUPT_VTAB SQLITE_CORRUPT_VTAB #endif typedef struct Fts3Table Fts3Table; @@ -176705,38 +175080,38 @@ typedef struct MatchinfoBuffer MatchinfoBuffer; ** 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 */ + 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() */ + sqlite3_stmt* aStmt[40]; + sqlite3_stmt* pSeekStmt; /* Cache for fts3CursorSeekStmt() */ - char *zReadExprlist; - char *zWriteExprlist; + 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 */ + 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 @@ -176755,16 +175130,16 @@ struct Fts3Table { ** tables are flushed to disk. Variable iPrevDocid is the docid of the most ** recently inserted record. */ - int nIndex; /* Size of aIndex[] */ + 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 */ + 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 @@ -176772,8 +175147,8 @@ struct Fts3Table { ** 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 */ + int inTransaction; /* True after xBegin but before xCommit/xRollback */ + int mxSavepoint; /* Largest valid xSavepoint integer */ #endif #if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) @@ -176788,9 +175163,9 @@ struct Fts3Table { /* Macro to find the number of segments to merge */ #if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) -# define MergeCount(P) ((P)->nMergeCount) +#define MergeCount(P) ((P)->nMergeCount) #else -# define MergeCount(P) FTS3_MERGE_COUNT +#define MergeCount(P) FTS3_MERGE_COUNT #endif /* @@ -176799,32 +175174,32 @@ struct Fts3Table { ** 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 */ + 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_FILTER 0 +#define FTS3_EVAL_NEXT 1 #define FTS3_EVAL_MATCHINFO 2 /* @@ -176842,9 +175217,9 @@ struct Fts3Cursor { ** 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 */ +#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 @@ -176852,19 +175227,19 @@ struct Fts3Cursor { ** 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<=? */ +#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 */ + 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 */ }; /* @@ -176874,27 +175249,27 @@ struct Fts3Doclist { ** 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 */ + 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 */ + 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 bIncr; /* True if doclist is loaded incrementally */ int iDoclistToken; /* Used by sqlite3Fts3EvalPhrasePoslist() if this is a descendent of an ** OR condition. */ - char *pOrPoslist; + char* pOrPoslist; i64 iOrDocid; /* Variables below this point are populated by fts3_expr.c when parsing @@ -176927,22 +175302,22 @@ struct Fts3Phrase { ** 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 */ + 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 */ + 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 */ + int iPhrase; /* Index of this phrase in matchinfo() results */ + u32* aMI; /* See above */ }; /* @@ -176956,68 +175331,64 @@ struct Fts3Expr { ** ** "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_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 **); +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 *); +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 +#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 *); +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 +#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 sqlite3Fts3SegReaderStep(Fts3Table*, Fts3MultiSegReader*); +SQLITE_PRIVATE void sqlite3Fts3SegReaderFinish(Fts3MultiSegReader*); -SQLITE_PRIVATE int sqlite3Fts3SegReaderCursor(Fts3Table *, - int, int, int, const char *, int, int, int, 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_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 +#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; + const char* zTerm; int nTerm; int iCol; int flags; @@ -177025,95 +175396,83 @@ struct Fts3SegFilter { 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 */ - i64 nBuffer; /* Allocated size of aBuffer[] in bytes */ - - int iColFilter; /* If >=0, filter for this column */ + 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 */ + i64 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. */ + 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 */ + 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); +SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table*, int, int); -#define fts3GetVarint32(p, piVal) ( \ - (*(u8*)(p)&0x80) ? sqlite3Fts3GetVarint32(p, piVal) : (*piVal=*(u8*)(p), 1) \ -) +#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 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 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); +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 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); +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 *); +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); +SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3* db, Fts3Hash*); +SQLITE_PRIVATE int sqlite3Fts3InitTerm(sqlite3* db); #endif -SQLITE_PRIVATE void *sqlite3Fts3MallocZero(i64 nByte); +SQLITE_PRIVATE void* sqlite3Fts3MallocZero(i64 nByte); -SQLITE_PRIVATE int sqlite3Fts3OpenTokenizer(sqlite3_tokenizer *, int, const char *, int, - sqlite3_tokenizer_cursor ** -); +SQLITE_PRIVATE int sqlite3Fts3OpenTokenizer(sqlite3_tokenizer*, int, const char*, int, sqlite3_tokenizer_cursor**); /* fts3_aux.c */ -SQLITE_PRIVATE int sqlite3Fts3InitAux(sqlite3 *db); +SQLITE_PRIVATE int sqlite3Fts3InitAux(sqlite3* db); -SQLITE_PRIVATE void sqlite3Fts3EvalPhraseCleanup(Fts3Phrase *); +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); +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*)); +SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3*, Fts3Hash*, void (*xDestroy)(void*)); /* fts3_unicode2.c (functions generated by parsing unicode text files) */ #ifndef SQLITE_DISABLE_FTS3_UNICODE @@ -177130,7 +175489,7 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeIsdiacritic(int); #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) #if defined(SQLITE_ENABLE_FTS3) && !defined(SQLITE_CORE) -# define SQLITE_CORE 1 +#define SQLITE_CORE 1 #endif /* #include */ @@ -177143,19 +175502,18 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeIsdiacritic(int); /* #include "fts3.h" */ #ifndef SQLITE_CORE /* # include "sqlite3ext.h" */ - SQLITE_EXTENSION_INIT1 +SQLITE_EXTENSION_INIT1 #endif typedef struct Fts3HashWrapper Fts3HashWrapper; struct Fts3HashWrapper { - Fts3Hash hash; /* Hash table */ - int nRef; /* Number of pointers to this object */ + 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 **); +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 @@ -177172,42 +175530,49 @@ SQLITE_API int sqlite3_fts3_may_be_corrupt = 1; ** 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_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); + 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; + } 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_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 ); + b = (a & 0x0FFFFFFF); - for(shift=28; shift<=63; shift+=7){ + for (shift = 28; shift <= 63; shift += 7) { u64 c = *p++; - b += (c&0x7F) << shift; - if( (c & 0x80)==0 ) break; + b += (c & 0x7F) << shift; + if ((c & 0x80) == 0) + break; } *v = b; return (int)(p - pStart); @@ -177218,7 +175583,7 @@ SQLITE_PRIVATE int sqlite3Fts3GetVarintU(const char *pBuf, sqlite_uint64 *v){ ** 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){ +SQLITE_PRIVATE int sqlite3Fts3GetVarint(const char* pBuf, sqlite_int64* v) { return sqlite3Fts3GetVarintU(pBuf, (sqlite3_uint64*)v); } @@ -177228,21 +175593,18 @@ SQLITE_PRIVATE int sqlite3Fts3GetVarint(const char *pBuf, sqlite_int64 *v){ ** 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; +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 ); + assert(0 == (a & 0x80000000)); + assert(*pi >= 0); return 5; } /* ** Return the number of bytes required to encode v as a varint */ -SQLITE_PRIVATE int sqlite3Fts3VarintLen(sqlite3_uint64 v){ +SQLITE_PRIVATE int sqlite3Fts3VarintLen(sqlite3_uint64 v) { int i = 0; - do{ + do { i++; v >>= 7; - }while( v!=0 ); + } while (v != 0); return i; } @@ -177299,23 +175661,25 @@ SQLITE_PRIVATE int sqlite3Fts3VarintLen(sqlite3_uint64 v){ ** `mno` becomes mno ** */ -SQLITE_PRIVATE void sqlite3Fts3Dequote(char *z){ - char quote; /* Quote character (if any ) */ +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 (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 = ']'; + if (quote == '[') + quote = ']'; - while( z[iIn] ){ - if( z[iIn]==quote ){ - if( z[iIn+1]!=quote ) break; + while (z[iIn]) { + if (z[iIn] == quote) { + if (z[iIn + 1] != quote) + break; z[iOut++] = quote; iIn += 2; - }else{ + } else { z[iOut++] = z[iIn++]; } } @@ -177328,7 +175692,7 @@ SQLITE_PRIVATE void sqlite3Fts3Dequote(char *z){ ** 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){ +static void fts3GetDeltaVarint(char** pp, sqlite3_int64* pVal) { sqlite3_int64 iVal; *pp += sqlite3Fts3GetVarint(*pp, &iVal); *pVal += iVal; @@ -177343,18 +175707,15 @@ static void fts3GetDeltaVarint(char **pp, sqlite3_int64 *pVal){ ** 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 -){ +static void fts3GetReverseVarint(char** pp, char* pStart, sqlite3_int64* pVal) { sqlite3_int64 iVal; - char *p; + 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--); + for (p = (*pp) - 2; p >= pStart && *p & 0x80; p--) + ; p++; *pp = p; @@ -177365,16 +175726,16 @@ static void fts3GetReverseVarint( /* ** The xDisconnect() virtual table method. */ -static int fts3DisconnectMethod(sqlite3_vtab *pVtab){ - Fts3Table *p = (Fts3Table *)pVtab; +static int fts3DisconnectMethod(sqlite3_vtab* pVtab) { + Fts3Table* p = (Fts3Table*)pVtab; int i; - assert( p->nPendingData==0 ); - assert( p->pSegments==0 ); + assert(p->nPendingData == 0); + assert(p->pSegments == 0); /* Free any prepared statements held */ sqlite3_finalize(p->pSeekStmt); - for(i=0; iaStmt); i++){ + for (i = 0; i < SizeofArray(p->aStmt); i++) { sqlite3_finalize(p->aStmt[i]); } sqlite3_free(p->zSegmentsTbl); @@ -177393,7 +175754,7 @@ static int fts3DisconnectMethod(sqlite3_vtab *pVtab){ /* ** Write an error message into *pzErr */ -SQLITE_PRIVATE void sqlite3Fts3ErrMsg(char **pzErr, const char *zFormat, ...){ +SQLITE_PRIVATE void sqlite3Fts3ErrMsg(char** pzErr, const char* zFormat, ...) { va_list ap; sqlite3_free(*pzErr); va_start(ap, zFormat); @@ -177408,21 +175769,21 @@ SQLITE_PRIVATE void sqlite3Fts3ErrMsg(char **pzErr, const char *zFormat, ...){ ** ** 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 */ -){ +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; + char* zSql; + if (*pRc) + return; va_start(ap, zFormat); zSql = sqlite3_vmprintf(zFormat, ap); va_end(ap); - if( zSql==0 ){ + if (zSql == 0) { *pRc = SQLITE_NOMEM; - }else{ + } else { *pRc = sqlite3_exec(db, zSql, 0, 0, 0); sqlite3_free(zSql); } @@ -177431,34 +175792,28 @@ static void fts3DbExec( /* ** 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 */ +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 - ); + "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); + 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() @@ -177468,31 +175823,28 @@ static int fts3DestroyMethod(sqlite3_vtab *pVtab){ ** 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; +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++){ + for (i = 1; zCols && i < p->nColumn; 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 ){ + zSql = sqlite3_mprintf("CREATE TABLE x(%s %Q HIDDEN, docid HIDDEN, %Q HIDDEN)", zCols, p->zName, zLanguageid); + if (!zCols || !zSql) { rc = SQLITE_NOMEM; - }else{ + } else { rc = sqlite3_declare_vtab(p->db, zSql); } @@ -177505,13 +175857,13 @@ static void fts3DeclareVtab(int *pRc, Fts3Table *p){ /* ** Create the %_stat table if it does not already exist. */ -SQLITE_PRIVATE void sqlite3Fts3CreateStatTable(int *pRc, Fts3Table *p){ +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 TABLE IF NOT EXISTS %Q.'%q_stat'" + "(id INTEGER PRIMARY KEY, value BLOB);", + p->zDb, p->zName); + if ((*pRc) == SQLITE_OK) + p->bHasStat = 1; } /* @@ -177523,59 +175875,50 @@ SQLITE_PRIVATE void sqlite3Fts3CreateStatTable(int *pRc, Fts3Table *p){ ** 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 */ +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 */ + 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]; + for (i = 0; zContentCols && i < p->nColumn; i++) { + char* z = p->azColumn[i]; zContentCols = sqlite3_mprintf("%z, 'c%d%q'", zContentCols, i, z); } - if( zLanguageid && zContentCols ){ + if (zLanguageid && zContentCols) { zContentCols = sqlite3_mprintf("%z, langid", zContentCols, zLanguageid); } - if( zContentCols==0 ) rc = SQLITE_NOMEM; + if (zContentCols == 0) + rc = SQLITE_NOMEM; /* Create the content table */ - fts3DbExec(&rc, db, - "CREATE TABLE %Q.'%q_content'(%s)", - p->zDb, p->zName, zContentCols - ); + 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_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 ){ + "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; @@ -177588,27 +175931,27 @@ static int fts3CreateTables(Fts3Table *p){ ** 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 */ +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 ){ + if (!zSql) { rc = SQLITE_NOMEM; - }else{ + } else { rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { sqlite3_step(pStmt); p->nPgsz = sqlite3_column_int(pStmt, 0); rc = sqlite3_finalize(pStmt); - }else if( rc==SQLITE_AUTH ){ + } else if (rc == SQLITE_AUTH) { p->nPgsz = 1024; rc = SQLITE_OK; } } - assert( p->nPgsz>0 || rc!=SQLITE_OK ); + assert(p->nPgsz > 0 || rc != SQLITE_OK); sqlite3_free(zSql); *pRc = rc; } @@ -177622,22 +175965,19 @@ static void fts3DatabasePageSize(int *pRc, Fts3Table *p){ ** 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; +static int fts3IsSpecialColumn(const char* z, int* pnKey, char** pzValue) { + char* zValue; + const char* zCsr = z; - while( *zCsr!='=' ){ - if( *zCsr=='\0' ) return 0; + while (*zCsr != '=') { + if (*zCsr == '\0') + return 0; zCsr++; } - *pnKey = (int)(zCsr-z); + *pnKey = (int)(zCsr - z); zValue = sqlite3_mprintf("%s", &zCsr[1]); - if( zValue ){ + if (zValue) { sqlite3Fts3Dequote(zValue); } *pzValue = zValue; @@ -177647,24 +175987,24 @@ static int fts3IsSpecialColumn( /* ** 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 ){ +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; + 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); + if (z && *pz) { + char* z2 = sqlite3_mprintf("%s%s", *pz, z); sqlite3_free(z); z = z2; } - if( z==0 ) *pRc = SQLITE_NOMEM; + if (z == 0) + *pRc = SQLITE_NOMEM; sqlite3_free(*pz); *pz = z; } @@ -177680,17 +176020,18 @@ static void fts3Appendf( ** is the callers responsibility to call sqlite3_free() to release this ** memory. */ -static char *fts3QuoteId(char const *zInput){ +static char* fts3QuoteId(char const* zInput) { sqlite3_int64 nRet; - char *zRet; - nRet = 2 + (int)strlen(zInput)*2 + 1; + char* zRet; + nRet = 2 + (int)strlen(zInput) * 2 + 1; zRet = sqlite3_malloc64(nRet); - if( zRet ){ + if (zRet) { int i; - char *z = zRet; + char* z = zRet; *(z++) = '"'; - for(i=0; zInput[i]; i++){ - if( zInput[i]=='"' ) *(z++) = '"'; + for (i = 0; zInput[i]; i++) { + if (zInput[i] == '"') + *(z++) = '"'; *(z++) = zInput[i]; } *(z++) = '"'; @@ -177722,40 +176063,37 @@ static char *fts3QuoteId(char const *zInput){ ** 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; +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 ){ + if (p->zContentTbl == 0) { + if (!zFunc) { zFunction = ""; - }else{ + } else { zFree = zFunction = fts3QuoteId(zFunc); } fts3Appendf(pRc, &zRet, "docid"); - for(i=0; inColumn; i++){ + for (i = 0; i < p->nColumn; i++) { fts3Appendf(pRc, &zRet, ",%s(x.'c%d%q')", zFunction, i, p->azColumn[i]); } - if( p->zLanguageid ){ + if (p->zLanguageid) { fts3Appendf(pRc, &zRet, ", x.%Q", "langid"); } sqlite3_free(zFree); - }else{ + } else { fts3Appendf(pRc, &zRet, "rowid"); - for(i=0; inColumn; i++){ + for (i = 0; i < p->nColumn; i++) { fts3Appendf(pRc, &zRet, ", x.'%q'", p->azColumn[i]); } - if( p->zLanguageid ){ + 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") - ); + fts3Appendf(pRc, &zRet, " FROM '%q'.'%q%s' AS x", p->zDb, (p->zContentTbl ? p->zContentTbl : p->zName), + (p->zContentTbl ? "" : "_content")); return zRet; } @@ -177779,22 +176117,22 @@ static char *fts3ReadExprList(Fts3Table *p, const char *zFunc, int *pRc){ ** 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; +static char* fts3WriteExprList(Fts3Table* p, const char* zFunc, int* pRc) { + char* zRet = 0; + char* zFree = 0; + char* zFunction; int i; - if( !zFunc ){ + if (!zFunc) { zFunction = ""; - }else{ + } else { zFree = zFunction = fts3QuoteId(zFunc); } fts3Appendf(pRc, &zRet, "?"); - for(i=0; inColumn; i++){ + for (i = 0; i < p->nColumn; i++) { fts3Appendf(pRc, &zRet, ",%s(?)", zFunction); } - if( p->zLanguageid ){ + if (p->zLanguageid) { fts3Appendf(pRc, &zRet, ", ?"); } sqlite3_free(zFree); @@ -177806,12 +176144,13 @@ static char *fts3WriteExprList(Fts3Table *p, const char *zFunc, int *pRc){ ** 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){ +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; + 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; @@ -177830,15 +176169,15 @@ SQLITE_PRIVATE int sqlite3Fts3ReadInt(const char *z, int *pnOut){ ** ** This function is used when parsing the "prefix=" FTS4 parameter. */ -static int fts3GobbleInt(const char **pp, int *pnOut){ +static int fts3GobbleInt(const char** pp, int* pnOut) { const int MAX_NPREFIX = 10000000; - int nInt = 0; /* Output value */ + int nInt = 0; /* Output value */ int nByte; nByte = sqlite3Fts3ReadInt(*pp, &nInt); - if( nInt>MAX_NPREFIX ){ + if (nInt > MAX_NPREFIX) { nInt = 0; } - if( nByte==0 ){ + if (nByte == 0) { return SQLITE_ERROR; } *pnOut = nInt; @@ -177863,40 +176202,41 @@ static int fts3GobbleInt(const char **pp, int *pnOut){ ** 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 */ +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; + if (zParam && zParam[0]) { + const char* p; nIndex++; - for(p=zParam; *p; p++){ - if( *p==',' ) nIndex++; + for (p = zParam; *p; p++) { + if (*p == ',') + nIndex++; } } aIndex = sqlite3_malloc64(sizeof(struct Fts3Index) * nIndex); *apIndex = aIndex; - if( !aIndex ){ + if (!aIndex) { return SQLITE_NOMEM; } memset(aIndex, 0, sizeof(struct Fts3Index) * nIndex); - if( zParam ){ - const char *p = zParam; + if (zParam) { + const char* p = zParam; int i; - for(i=1; i=0 ); - if( nPrefix==0 ){ + if (fts3GobbleInt(&p, &nPrefix)) + return SQLITE_ERROR; + assert(nPrefix >= 0); + if (nPrefix == 0) { nIndex--; i--; - }else{ + } else { aIndex[i].nPrefix = nPrefix; } p++; @@ -177932,54 +176272,53 @@ static int fts3PrefixParameter( ** 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 */ +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 ){ + if (!zSql) { rc = SQLITE_NOMEM; - }else{ + } else { rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0); - if( rc!=SQLITE_OK ){ + 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 */ + 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 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 */ +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) - ); + 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 ){ + nByte = sizeof(const char*) * (argc - 2); + aCol = (const char**)sqlite3_malloc64(nByte); + if (aCol) { memset((void*)aCol, 0, nByte); - azNotindexed = (char **)sqlite3_malloc64(nByte); + azNotindexed = (char**)sqlite3_malloc64(nByte); } - if( azNotindexed ){ + if (azNotindexed) { memset(azNotindexed, 0, nByte); } - if( !aCol || !azNotindexed ){ + if (!aCol || !azNotindexed) { rc = SQLITE_NOMEM; goto fts3_init_out; } @@ -178078,103 +176414,97 @@ static int fts3InitVtab( ** + 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]) - ){ + if (!pTokenizer && strlen(z) > 8 && 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) ){ + else if (isFts4 && fts3IsSpecialColumn(z, &nKey, &zVal)) { struct Fts4Option { - const char *zOpt; + 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 */ + {"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 ){ + if (!zVal) { rc = SQLITE_NOMEM; - }else{ - for(iOpt=0; iOptnOpt && !sqlite3_strnicmp(z, pOp->zOpt, pOp->nOpt) ){ + } else { + for (iOpt = 0; iOpt < SizeofArray(aFts4Opt); iOpt++) { + struct Fts4Option* pOp = &aFts4Opt[iOpt]; + if (nKey == pOp->nOpt && !sqlite3_strnicmp(z, pOp->zOpt, pOp->nOpt)) { break; } } - switch( iOpt ){ - case 0: /* MATCHINFO */ - if( strlen(zVal)!=4 || sqlite3_strnicmp(zVal, "fts3", 4) ){ + 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 */ + case 1: /* PREFIX */ sqlite3_free(zPrefix); zPrefix = zVal; zVal = 0; break; - case 2: /* COMPRESS */ + case 2: /* COMPRESS */ sqlite3_free(zCompress); zCompress = zVal; zVal = 0; break; - case 3: /* UNCOMPRESS */ + 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)) - ){ + 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'); + bDescIdx = (zVal[0] == 'd' || zVal[0] == 'D'); break; - case 5: /* CONTENT */ + case 5: /* CONTENT */ sqlite3_free(zContent); zContent = zVal; zVal = 0; break; - case 6: /* LANGUAGEID */ - assert( iOpt==6 ); + case 6: /* LANGUAGEID */ + assert(iOpt == 6); sqlite3_free(zLanguageid); zLanguageid = zVal; zVal = 0; break; - case 7: /* NOTINDEXED */ + case 7: /* NOTINDEXED */ azNotindexed[nNotindexed++] = zVal; zVal = 0; break; default: - assert( iOpt==SizeofArray(aFts4Opt) ); + assert(iOpt == SizeofArray(aFts4Opt)); sqlite3Fts3ErrMsg(pzErr, "unrecognized parameter: %s", z); rc = SQLITE_ERROR; break; @@ -178197,24 +176527,25 @@ static int fts3InitVtab( ** 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 ){ + if (rc == SQLITE_OK && zContent) { sqlite3_free(zCompress); sqlite3_free(zUncompress); zCompress = 0; zUncompress = 0; - if( nCol==0 ){ + if (nCol == 0) { sqlite3_free((void*)aCol); aCol = 0; - rc = fts3ContentColumns(db, argv[1], zContent,&aCol,&nCol,&nString,pzErr); + 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 ){ + if (rc == SQLITE_OK && zLanguageid) { int j; - for(j=0; jdb = db; p->nColumn = nCol; p->nPendingData = 0; - p->azColumn = (char **)&p[1]; + p->azColumn = (char**)&p[1]; p->pTokenizer = pTokenizer; p->nMaxPendingData = FTS3_MAX_PENDING_DATA; - p->bHasDocsize = (isFts4 && bNoDocsize==0); + 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->nAutoincrmerge = 0xff; /* 0xff means setting unknown */ p->zContentTbl = zContent; p->zLanguageid = zLanguageid; zContent = 0; zLanguageid = 0; - TESTONLY( p->inTransaction = -1 ); - TESTONLY( p->mxSavepoint = -1 ); + TESTONLY(p->inTransaction = -1); + TESTONLY(p->mxSavepoint = -1); - p->aIndex = (struct Fts3Index *)&p->azColumn[nCol]; + 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]; + p->abNotindexed = (u8*)&p->aIndex[nIndex]; /* Fill in the zName and zDb fields of the vtab structure. */ - zCsr = (char *)&p->abNotindexed[nCol]; + zCsr = (char*)&p->abNotindexed[nCol]; p->zName = zCsr; memcpy(zCsr, argv[2], nName); zCsr += nName; @@ -178294,70 +176628,69 @@ static int fts3InitVtab( zCsr += nDb; /* Fill in the azColumn array */ - for(iCol=0; iCol0 ){ + z = (char*)sqlite3Fts3NextToken(aCol[iCol], &n); + if (n > 0) { memcpy(zCsr, z, n); } zCsr[n] = '\0'; sqlite3Fts3Dequote(zCsr); p->azColumn[iCol] = zCsr; - zCsr += n+1; - assert( zCsr <= &((char *)p)[nByte] ); + 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) - ){ + for (i = 0; i < nNotindexed; i++) { + char* zNot = azNotindexed[i]; + if (zNot && n == (int)strlen(zNot) && 0 == sqlite3_strnicmp(p->azColumn[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 (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 ){ + 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 ){ + 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; + p->nNodeSize = p->nPgsz - 35; -#if defined(SQLITE_DEBUG)||defined(SQLITE_TEST) +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) p->nMergeCount = FTS3_MERGE_COUNT; #endif @@ -178371,17 +176704,18 @@ static int fts3InitVtab( sqlite3_free(zUncompress); sqlite3_free(zContent); sqlite3_free(zLanguageid); - for(i=0; ipModule->xDestroy(pTokenizer); } - }else{ - assert( p->pSegments==0 ); + } else { + assert(p->pSegments == 0); *ppVTab = &p->base; } return rc; @@ -178391,24 +176725,22 @@ static int fts3InitVtab( ** 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 */ -){ +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 */ -){ +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); } @@ -178417,9 +176749,9 @@ static int fts3CreateMethod( ** 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 ){ +static void fts3SetEstimatedRows(sqlite3_index_info* pIdxInfo, i64 nRow) { +#if SQLITE_VERSION_NUMBER >= 3008002 + if (sqlite3_libversion_number() >= 3008002) { pIdxInfo->estimatedRows = nRow; } #endif @@ -178430,9 +176762,9 @@ static void fts3SetEstimatedRows(sqlite3_index_info *pIdxInfo, i64 nRow){ ** 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 ){ +static void fts3SetUniqueFlag(sqlite3_index_info* pIdxInfo) { +#if SQLITE_VERSION_NUMBER >= 3008012 + if (sqlite3_libversion_number() >= 3008012) { pIdxInfo->idxFlags |= SQLITE_INDEX_SCAN_UNIQUE; } #endif @@ -178446,17 +176778,17 @@ static void fts3SetUniqueFlag(sqlite3_index_info *pIdxInfo){ ** 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 */ +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 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 ){ + if (p->bLock) { return SQLITE_ERROR; } @@ -178466,11 +176798,11 @@ static int fts3BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ */ 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 ){ + for (i = 0; i < pInfo->nConstraint; 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 @@ -178484,10 +176816,10 @@ static int fts3BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ continue; } - bDocid = (pCons->iColumn<0 || pCons->iColumn==p->nColumn+1); + 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 ){ + if (iCons < 0 && pCons->op == SQLITE_INDEX_CONSTRAINT_EQ && bDocid) { pInfo->idxNum = FTS3_DOCID_SEARCH; pInfo->estimatedCost = 1.0; iCons = i; @@ -178502,23 +176834,19 @@ static int fts3BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ ** 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 - ){ + 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 - ){ + if (pCons->op == SQLITE_INDEX_CONSTRAINT_EQ && pCons->iColumn == p->nColumn + 2) { iLangidCons = i; } - if( bDocid ){ - switch( pCons->op ){ + if (bDocid) { + switch (pCons->op) { case SQLITE_INDEX_CONSTRAINT_GE: case SQLITE_INDEX_CONSTRAINT_GT: iDocidGe = i; @@ -178533,22 +176861,23 @@ static int fts3BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ } /* If using a docid=? or rowid=? strategy, set the UNIQUE flag. */ - if( pInfo->idxNum==FTS3_DOCID_SEARCH ) fts3SetUniqueFlag(pInfo); + if (pInfo->idxNum == FTS3_DOCID_SEARCH) + fts3SetUniqueFlag(pInfo); iIdx = 1; - if( iCons>=0 ){ + if (iCons >= 0) { pInfo->aConstraintUsage[iCons].argvIndex = iIdx++; pInfo->aConstraintUsage[iCons].omit = 1; } - if( iLangidCons>=0 ){ + if (iLangidCons >= 0) { pInfo->idxNum |= FTS3_HAVE_LANGID; pInfo->aConstraintUsage[iLangidCons].argvIndex = iIdx++; } - if( iDocidGe>=0 ){ + if (iDocidGe >= 0) { pInfo->idxNum |= FTS3_HAVE_DOCID_GE; pInfo->aConstraintUsage[iDocidGe].argvIndex = iIdx++; } - if( iDocidLe>=0 ){ + if (iDocidLe >= 0) { pInfo->idxNum |= FTS3_HAVE_DOCID_LE; pInfo->aConstraintUsage[iDocidLe].argvIndex = iIdx++; } @@ -178556,27 +176885,27 @@ static int fts3BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ /* 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 ){ + 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{ + } else { pInfo->idxStr = "ASC"; } pInfo->orderByConsumed = 1; } } - assert( p->pSegments==0 ); + 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 */ +static int fts3OpenMethod(sqlite3_vtab* pVTab, sqlite3_vtab_cursor** ppCsr) { + sqlite3_vtab_cursor* pCsr; /* Allocated cursor */ UNUSED_PARAMETER(pVTab); @@ -178584,8 +176913,8 @@ static int fts3OpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ ** 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 ){ + *ppCsr = pCsr = (sqlite3_vtab_cursor*)sqlite3_malloc(sizeof(Fts3Cursor)); + if (!pCsr) { return SQLITE_NOMEM; } memset(pCsr, 0, sizeof(Fts3Cursor)); @@ -178599,10 +176928,10 @@ static int fts3OpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ ** 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 ){ +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; @@ -178616,24 +176945,24 @@ static void fts3CursorFinalizeStmt(Fts3Cursor *pCsr){ ** Free all resources currently held by the cursor passed as the only ** argument. */ -static void fts3ClearCursor(Fts3Cursor *pCsr){ +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)); + 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 ); +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 ); + assert(((Fts3Table*)pCsr->base.pVtab)->pSegments == 0); sqlite3_free(pCsr); return SQLITE_OK; } @@ -178647,25 +176976,25 @@ static int fts3CloseMethod(sqlite3_vtab_cursor *pCursor){ ** (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){ +static int fts3CursorSeekStmt(Fts3Cursor* pCsr) { int rc = SQLITE_OK; - if( pCsr->pStmt==0 ){ - Fts3Table *p = (Fts3Table *)pCsr->base.pVtab; - char *zSql; - if( p->pSeekStmt ){ + if (pCsr->pStmt == 0) { + Fts3Table* p = (Fts3Table*)pCsr->base.pVtab; + char* zSql; + if (p->pSeekStmt) { pCsr->pStmt = p->pSeekStmt; p->pSeekStmt = 0; - }else{ + } else { zSql = sqlite3_mprintf("SELECT %s WHERE rowid = ?", p->zReadExprlist); - if( !zSql ) return SQLITE_NOMEM; + if (!zSql) + return SQLITE_NOMEM; p->bLock++; - rc = sqlite3_prepare_v3( - p->db, zSql,-1,SQLITE_PREPARE_PERSISTENT,&pCsr->pStmt,0 - ); + 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; + if (rc == SQLITE_OK) + pCsr->bSeekStmt = 1; } return rc; } @@ -178675,22 +177004,22 @@ static int fts3CursorSeekStmt(Fts3Cursor *pCsr){ ** of the %_content table that contains the last match. Return ** SQLITE_OK on success. */ -static int fts3CursorSeek(sqlite3_context *pContext, Fts3Cursor *pCsr){ +static int fts3CursorSeek(sqlite3_context* pContext, Fts3Cursor* pCsr) { int rc = SQLITE_OK; - if( pCsr->isRequireSeek ){ + if (pCsr->isRequireSeek) { rc = fts3CursorSeekStmt(pCsr); - if( rc==SQLITE_OK ){ - Fts3Table *pTab = (Fts3Table*)pCsr->base.pVtab; + 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) ){ + if (SQLITE_ROW == sqlite3_step(pCsr->pStmt)) { pTab->bLock--; return SQLITE_OK; - }else{ + } else { pTab->bLock--; rc = sqlite3_reset(pCsr->pStmt); - if( rc==SQLITE_OK && ((Fts3Table *)pCsr->base.pVtab)->zContentTbl==0 ){ + 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. */ @@ -178701,7 +177030,7 @@ static int fts3CursorSeek(sqlite3_context *pContext, Fts3Cursor *pCsr){ } } - if( rc!=SQLITE_OK && pContext ){ + if (rc != SQLITE_OK && pContext) { sqlite3_result_error_code(pContext, rc); } return rc; @@ -178722,22 +177051,21 @@ static int fts3CursorSeek(sqlite3_context *pContext, Fts3Cursor *pCsr){ ** ** 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 */ +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 @@ -178754,20 +177082,20 @@ static int fts3ScanInteriorNode( */ zCsr += sqlite3Fts3GetVarintU(zCsr, &iChild); zCsr += sqlite3Fts3GetVarintU(zCsr, &iChild); - if( zCsr>zEnd ){ + if (zCsr > zEnd) { return FTS_CORRUPT_VTAB; } - while( zCsrnBuffer ){ + if (nPrefix > nBuffer) { rc = FTS_CORRUPT_VTAB; goto finish_scan; } @@ -178775,22 +177103,22 @@ static int fts3ScanInteriorNode( isFirstTerm = 0; zCsr += fts3GetVarint32(zCsr, &nSuffix); - assert( nPrefix>=0 && nSuffix>=0 ); - if( nPrefix>zCsr-zNode || nSuffix>zEnd-zCsr || nSuffix==0 ){ + 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 ){ + 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 ); + assert(zBuffer); memcpy(&zBuffer[nPrefix], zCsr, nSuffix); nBuffer = nPrefix + nSuffix; zCsr += nSuffix; @@ -178804,13 +177132,13 @@ static int fts3ScanInteriorNode( ** 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)) ){ + 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 ){ + if (piLast && cmp < 0) { *piLast = (i64)iChild; piLast = 0; } @@ -178818,15 +177146,16 @@ static int fts3ScanInteriorNode( iChild++; }; - if( piFirst ) *piFirst = (i64)iChild; - if( piLast ) *piLast = (i64)iChild; + if (piFirst) + *piFirst = (i64)iChild; + if (piLast) + *piLast = (i64)iChild; - finish_scan: +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) @@ -178848,31 +177177,30 @@ static int fts3ScanInteriorNode( ** ** 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 */ +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 ); + assert(piLeaf || piLeaf2); fts3GetVarint32(zNode, &iHeight); rc = fts3ScanInteriorNode(zTerm, nTerm, zNode, nNode, piLeaf, piLeaf2); - assert_fts3_nc( !piLeaf2 || !piLeaf || rc!=SQLITE_OK || (*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 (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) ){ + if (piLeaf && piLeaf2 && (*piLeaf != *piLeaf2)) { rc = sqlite3Fts3ReadBlock(p, *piLeaf, &zBlob, &nBlob, 0); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = fts3SelectLeaf(p, zTerm, nTerm, zBlob, nBlob, piLeaf, 0); } sqlite3_free(zBlob); @@ -178880,15 +177208,15 @@ static int fts3SelectLeaf( zBlob = 0; } - if( rc==SQLITE_OK ){ - rc = sqlite3Fts3ReadBlock(p, piLeaf?*piLeaf:*piLeaf2, &zBlob, &nBlob, 0); + if (rc == SQLITE_OK) { + rc = sqlite3Fts3ReadBlock(p, piLeaf ? *piLeaf : *piLeaf2, &zBlob, &nBlob, 0); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { int iNewHeight = 0; fts3GetVarint32(zBlob, &iNewHeight); - if( iNewHeight>=iHeight ){ + if (iNewHeight >= iHeight) { rc = FTS_CORRUPT_VTAB; - }else{ + } else { rc = fts3SelectLeaf(p, zTerm, nTerm, zBlob, nBlob, piLeaf, piLeaf2); } } @@ -178902,13 +177230,12 @@ static int fts3SelectLeaf( ** 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); +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; } @@ -178926,8 +177253,8 @@ static void fts3PutDeltaVarint( ** 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; +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 @@ -178940,15 +177267,15 @@ static void fts3PoslistCopy(char **pp, char **ppPoslist){ ** pEnd once more so that it points to the byte immediately following the ** last byte in the position-list. */ - while( *pEnd | c ){ + while (*pEnd | c) { c = *pEnd++ & 0x80; - testcase( c!=0 && (*pEnd)==0 ); + testcase(c != 0 && (*pEnd) == 0); } - pEnd++; /* Advance past the POS_END terminator byte */ + pEnd++; /* Advance past the POS_END terminator byte */ - if( pp ){ + if (pp) { int n = (int)(pEnd - *ppPoslist); - char *p = *pp; + char* p = *pp; memcpy(p, *ppPoslist, n); p += n; *pp = p; @@ -178973,20 +177300,20 @@ static void fts3PoslistCopy(char **pp, char **ppPoslist){ ** 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; +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) ){ + while (0xFE & (*pEnd | c)) { c = *pEnd++ & 0x80; - testcase( c!=0 && ((*pEnd)&0xfe)==0 ); + testcase(c != 0 && ((*pEnd) & 0xfe) == 0); } - if( pp ){ + if (pp) { int n = (int)(pEnd - *ppPoslist); - char *p = *pp; + char* p = *pp; memcpy(p, *ppPoslist, n); p += n; *pp = p; @@ -179019,16 +177346,15 @@ static void fts3ColumnlistCopy(char **pp, char **ppPoslist){ ** 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 ){ +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{ + } else { *pi = POSITION_LIST_END; } } @@ -179042,10 +177368,10 @@ static void fts3ReadNextPos( ** 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 */ +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]; @@ -179060,36 +177386,39 @@ static int fts3PutColNumber(char **pp, int iCol){ ** 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; +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 */ + while (*p1 || *p2) { + int iCol1; /* The current column index in pp1 */ + int iCol2; /* The current column index in pp2 */ - if( *p1==POS_COLUMN ){ + 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 (iCol1 == 0) + return FTS_CORRUPT_VTAB; + } else if (*p1 == POS_END) + iCol1 = 0x7fffffff; + else + iCol1 = 0; - if( *p2==POS_COLUMN ){ + 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 */ + 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; @@ -179106,25 +177435,25 @@ static int fts3PoslistMerge( */ fts3GetDeltaVarint(&p1, &i1); fts3GetDeltaVarint(&p2, &i2); - if( i1<2 || i2<2 ){ + if (i1 < 2 || i2 < 2) { break; } do { - fts3PutDeltaVarint(&p, &iPrev, (i1iPos1 && iPos2<=iPos1+nToken) - ){ + 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; + fts3PutDeltaVarint(&p, &iPrev, iSave + 2); + iPrev -= 2; pSave = 0; - assert( p ); + 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 ((!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 ); + 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; + assert((*p1 & 0xFE) == 0 && (*p2 & 0xFE) == 0); + if (0 == *p1 || 0 == *p2) + break; p1++; p1 += fts3GetVarint32(p1, &iCol1); @@ -179243,14 +177578,16 @@ static int fts3PoslistPhraseMerge( ** end of the position list, or the 0x01 that precedes the next ** column-number in the position list. */ - else if( iCol1=pEnd ){ +static void fts3GetDeltaVarint3(char** pp, /* IN/OUT: Point to read varint from */ + char* pEnd, /* End of buffer */ + int bDescIdx, /* True if docids are descending */ + sqlite3_int64* pVal /* IN/OUT: Integer value */ +) { + if (*pp >= pEnd) { *pp = 0; - }else{ + } else { u64 iVal; *pp += sqlite3Fts3GetVarintU(*pp, &iVal); - if( bDescIdx ){ + if (bDescIdx) { *pVal = (i64)((u64)*pVal - iVal); - }else{ + } else { *pVal = (i64)((u64)*pVal + iVal); } } @@ -179375,29 +177710,27 @@ static void fts3GetDeltaVarint3( ** 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 */ -){ +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 ); + if (bDescIdx == 0 || *pbFirst == 0) { + assert_fts3_nc(*pbFirst == 0 || iVal >= *piPrev); iWrite = (u64)iVal - (u64)*piPrev; - }else{ - assert_fts3_nc( *piPrev>=iVal ); + } else { + assert_fts3_nc(*piPrev >= iVal); iWrite = (u64)*piPrev - (u64)iVal; } - assert( *pbFirst || *piPrev==0 ); - assert_fts3_nc( *pbFirst==0 || iWrite>0 ); + 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 @@ -179408,7 +177741,7 @@ static void fts3PutDeltaVarint3( ** 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))) +#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 @@ -179424,22 +177757,21 @@ static void fts3PutDeltaVarint3( ** 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 */ -){ +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; + char* pEnd1 = &a1[n1]; + char* pEnd2 = &a2[n2]; + char* p1 = a1; + char* p2 = a2; + char* p; + char* aOut; int bFirstOut = 0; *paOut = 0; @@ -179474,43 +177806,45 @@ static int fts3DoclistOrMerge( ** 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; + 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 ){ + while (p1 || p2) { sqlite3_int64 iDiff = DOCID_CMP(i1, i2); - if( p2 && p1 && iDiff==0 ){ + if (p2 && p1 && iDiff == 0) { fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i1); rc = fts3PoslistMerge(&p, &p1, &p2); - if( rc ) break; + if (rc) + break; fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1); fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2); - }else if( !p2 || (p1 && iDiff<0) ){ + } else if (!p2 || (p1 && iDiff < 0)) { fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i1); fts3PoslistCopy(&p, &p1); fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1); - }else{ + } 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) ); + assert((p - aOut) <= ((p1 ? (p1 - a1) : n1) + (p2 ? (p2 - a2) : n2) + FTS3_VARINT_MAX - 1)); } - if( rc!=SQLITE_OK ){ + 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); + } else { + assert((p - aOut) <= n1 + n2 + FTS3_VARINT_MAX - 1); + memset(&aOut[(p - aOut)], 0, FTS3_BUFFER_PADDING); } *paOut = aOut; - *pnOut = (int)(p-aOut); + *pnOut = (int)(p - aOut); return rc; } @@ -179526,29 +177860,29 @@ static int fts3DoclistOrMerge( ** ** 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 */ -){ +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; + char* aRight = *paRight; + char* pEnd1 = &aLeft[nLeft]; + char* pEnd2 = &aRight[*pnRight]; + char* p1 = aLeft; + char* p2 = aRight; + char* p; int bFirstOut = 0; - char *aOut; + char* aOut; - assert( nDist>0 ); - if( bDescDoclist ){ + assert(nDist > 0); + if (bDescDoclist) { aOut = sqlite3_malloc64((sqlite3_int64)*pnRight + FTS3_VARINT_MAX); - if( aOut==0 ) return SQLITE_NOMEM; - }else{ + if (aOut == 0) + return SQLITE_NOMEM; + } else { aOut = aRight; } p = aOut; @@ -179556,32 +177890,32 @@ static int fts3DoclistPhraseMerge( fts3GetDeltaVarint3(&p1, pEnd1, 0, &i1); fts3GetDeltaVarint3(&p2, pEnd2, 0, &i2); - while( p1 && p2 ){ + while (p1 && p2) { sqlite3_int64 iDiff = DOCID_CMP(i1, i2); - if( iDiff==0 ){ - char *pSave = p; + 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) ){ + 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 ){ + } else if (iDiff < 0) { fts3PoslistCopy(0, &p1); fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1); - }else{ + } else { fts3PoslistCopy(0, &p2); fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2); } } *pnRight = (int)(p - aOut); - if( bDescDoclist ){ + if (bDescDoclist) { sqlite3_free(aRight); *paRight = aOut; } @@ -179597,19 +177931,18 @@ static int fts3DoclistPhraseMerge( ** 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 */ -){ +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]; + int bWritten = 0; /* True once iDelta has been written */ + char* p = pList; + char* pEnd = &pList[nList]; - if( *p!=0x01 ){ - if( *p==0x02 ){ + if (*p != 0x01) { + if (*p == 0x02) { nOut += sqlite3Fts3PutVarint(&pOut[nOut], iDelta); pOut[nOut++] = 0x02; bWritten = 1; @@ -179617,12 +177950,12 @@ SQLITE_PRIVATE int sqlite3Fts3FirstFilter( fts3ColumnlistCopy(0, &p); } - while( paaOutput); i++){ - if( pTS->aaOutput[i] ){ - if( !aOut ){ + for (i = 0; i < SizeofArray(pTS->aaOutput); i++) { + if (pTS->aaOutput[i]) { + if (!aOut) { aOut = pTS->aaOutput[i]; nOut = pTS->anOutput[i]; pTS->aaOutput[i] = 0; - }else{ + } else { int nNew; - char *aNew; + char* aNew; - int rc = fts3DoclistOrMerge(p->bDescIdx, - pTS->aaOutput[i], pTS->anOutput[i], aOut, nOut, &aNew, &nNew - ); - if( rc!=SQLITE_OK ){ + int rc = fts3DoclistOrMerge(p->bDescIdx, pTS->aaOutput[i], pTS->anOutput[i], aOut, nOut, &aNew, &nNew); + if (rc != SQLITE_OK) { sqlite3_free(aOut); return rc; } @@ -179703,13 +178033,12 @@ static int fts3TermSelectFinishMerge(Fts3Table *p, TermSelect *pTS){ ** 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 ){ +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(). ** @@ -179728,42 +178057,42 @@ static int fts3TermSelectMerge( */ pTS->aaOutput[0] = sqlite3_malloc64((i64)nDoclist + FTS3_VARINT_MAX + 1); pTS->anOutput[0] = nDoclist; - if( pTS->aaOutput[0] ){ + if (pTS->aaOutput[0]) { memcpy(pTS->aaOutput[0], aDoclist, nDoclist); memset(&pTS->aaOutput[0][nDoclist], 0, FTS3_VARINT_MAX); - }else{ + } else { return SQLITE_NOMEM; } - }else{ - char *aMerge = aDoclist; + } else { + char* aMerge = aDoclist; int nMerge = nDoclist; int iOut; - for(iOut=0; iOutaaOutput); iOut++){ - if( pTS->aaOutput[iOut]==0 ){ - assert( iOut>0 ); + for (iOut = 0; iOut < SizeofArray(pTS->aaOutput); iOut++) { + if (pTS->aaOutput[iOut] == 0) { + assert(iOut > 0); pTS->aaOutput[iOut] = aMerge; pTS->anOutput[iOut] = nMerge; break; - }else{ - char *aNew; + } 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); + 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); + 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) ){ + if ((iOut + 1) == SizeofArray(pTS->aaOutput)) { pTS->aaOutput[iOut] = aMerge; pTS->anOutput[iOut] = nMerge; } @@ -179776,15 +178105,12 @@ static int fts3TermSelectMerge( /* ** 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 ){ +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; } @@ -179801,20 +178127,19 @@ static int fts3SegReaderCursorAppend( ** 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() */ +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 @@ -179822,51 +178147,52 @@ static int fts3SegReaderCursor( ** 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 ){ + 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 ){ + 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; + 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); + 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); + 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; + 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 = 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: +finished: rc2 = sqlite3_reset(pStmt); - if( rc==SQLITE_DONE ) rc = rc2; + if (rc == SQLITE_DONE) + rc = rc2; return rc; } @@ -179875,30 +178201,24 @@ static int fts3SegReaderCursor( ** 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( iLevelnIndex-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 && iIndex < p->nIndex); + assert(iLevel == FTS3_SEGCURSOR_ALL || iLevel == FTS3_SEGCURSOR_PENDING || iLevel >= 0); + assert(iLevel < FTS3_SEGDIR_MAXLEVEL); + assert(FTS3_SEGCURSOR_ALL < 0 && FTS3_SEGCURSOR_PENDING < 0); + assert(isPrefix == 0 || isScan == 0); memset(pCsr, 0, sizeof(Fts3MultiSegReader)); - return fts3SegReaderCursor( - p, iLangid, iIndex, iLevel, zTerm, nTerm, isPrefix, isScan, pCsr - ); + return fts3SegReaderCursor(p, iLangid, iIndex, iLevel, zTerm, nTerm, isPrefix, isScan, pCsr); } /* @@ -179907,16 +178227,12 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderCursor( ** ** SQLITE_OK is returned if no error occurs, otherwise an SQLite error code. */ -static int fts3SegReaderCursorAddZero( - Fts3Table *p, /* FTS virtual table handle */ - int iLangid, - const char *zTerm, /* Term to scan doclist of */ - int nTerm, /* Number of bytes in zTerm */ - Fts3MultiSegReader *pCsr /* Fts3MultiSegReader to modify */ -){ - return fts3SegReaderCursor(p, - iLangid, 0, FTS3_SEGCURSOR_ALL, zTerm, nTerm, 0, 0,pCsr - ); +static int fts3SegReaderCursorAddZero(Fts3Table* p, /* FTS virtual table handle */ + int iLangid, const char* zTerm, /* Term to scan doclist of */ + int nTerm, /* Number of bytes in zTerm */ + Fts3MultiSegReader* pCsr /* Fts3MultiSegReader to modify */ +) { + return fts3SegReaderCursor(p, iLangid, 0, FTS3_SEGCURSOR_ALL, zTerm, nTerm, 0, 0, pCsr); } /* @@ -179932,52 +178248,43 @@ static int fts3SegReaderCursorAddZero( ** SQLITE_OK is returned if no error occurs, otherwise an SQLite error code. ** Output parameter *ppSegcsr is set to 0 if an error occurs. */ -static int fts3TermSegReaderCursor( - Fts3Cursor *pCsr, /* Virtual table cursor handle */ - const char *zTerm, /* Term to query for */ - int nTerm, /* Size of zTerm in bytes */ - int isPrefix, /* True for a prefix search */ - Fts3MultiSegReader **ppSegcsr /* OUT: Allocated seg-reader cursor */ -){ - Fts3MultiSegReader *pSegcsr; /* Object to allocate and return */ - int rc = SQLITE_NOMEM; /* Return code */ +static int fts3TermSegReaderCursor(Fts3Cursor* pCsr, /* Virtual table cursor handle */ + const char* zTerm, /* Term to query for */ + int nTerm, /* Size of zTerm in bytes */ + int isPrefix, /* True for a prefix search */ + Fts3MultiSegReader** ppSegcsr /* OUT: Allocated seg-reader cursor */ +) { + Fts3MultiSegReader* pSegcsr; /* Object to allocate and return */ + int rc = SQLITE_NOMEM; /* Return code */ pSegcsr = sqlite3_malloc(sizeof(Fts3MultiSegReader)); - if( pSegcsr ){ + if (pSegcsr) { int i; - int bFound = 0; /* True once an index has been found */ - Fts3Table *p = (Fts3Table *)pCsr->base.pVtab; + int bFound = 0; /* True once an index has been found */ + Fts3Table* p = (Fts3Table*)pCsr->base.pVtab; - if( isPrefix ){ - for(i=1; bFound==0 && inIndex; i++){ - if( p->aIndex[i].nPrefix==nTerm ){ + if (isPrefix) { + for (i = 1; bFound == 0 && i < p->nIndex; i++) { + if (p->aIndex[i].nPrefix == nTerm) { bFound = 1; - rc = sqlite3Fts3SegReaderCursor(p, pCsr->iLangid, - i, FTS3_SEGCURSOR_ALL, zTerm, nTerm, 0, 0, pSegcsr - ); + 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 ){ + for (i = 1; bFound == 0 && i < p->nIndex; 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 - ); + 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 - ); + if (bFound == 0) { + rc = sqlite3Fts3SegReaderCursor(p, pCsr->iLangid, 0, FTS3_SEGCURSOR_ALL, zTerm, nTerm, isPrefix, 0, pSegcsr); pSegcsr->bLookup = !isPrefix; } } @@ -179989,7 +178296,7 @@ static int fts3TermSegReaderCursor( /* ** Free an Fts3MultiSegReader allocated by fts3TermSegReaderCursor(). */ -static void fts3SegReaderCursorFree(Fts3MultiSegReader *pSegcsr){ +static void fts3SegReaderCursorFree(Fts3MultiSegReader* pSegcsr) { sqlite3Fts3SegReaderFinish(pSegcsr); sqlite3_free(pSegcsr); } @@ -179998,45 +178305,40 @@ static void fts3SegReaderCursorFree(Fts3MultiSegReader *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 */ +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.flags = FTS3_SEGMENT_IGNORE_EMPTY | FTS3_SEGMENT_REQUIRE_POS | (pTok->isPrefix ? FTS3_SEGMENT_PREFIX : 0) | + (pTok->bFirst ? FTS3_SEGMENT_FIRST : 0) | (iColumn < p->nColumn ? 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)) - ){ + while (SQLITE_OK == rc && SQLITE_ROW == (rc = sqlite3Fts3SegReaderStep(p, pSegcsr))) { rc = fts3TermSelectMerge(p, &tsc, pSegcsr->aDoclist, pSegcsr->nDoclist); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = fts3TermSelectFinishMerge(p, &tsc); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { *ppOut = tsc.aaOutput[0]; *pnOut = tsc.anOutput[0]; - }else{ + } else { int i; - for(i=0; ieSearch==FTS3_DOCID_SEARCH || pCsr->eSearch==FTS3_FULLSCAN_SEARCH ){ - Fts3Table *pTab = (Fts3Table*)pCursor->pVtab; + Fts3Cursor* pCsr = (Fts3Cursor*)pCursor; + if (pCsr->eSearch == FTS3_DOCID_SEARCH || pCsr->eSearch == FTS3_FULLSCAN_SEARCH) { + Fts3Table* pTab = (Fts3Table*)pCursor->pVtab; pTab->bLock++; - if( SQLITE_ROW!=sqlite3_step(pCsr->pStmt) ){ + if (SQLITE_ROW != sqlite3_step(pCsr->pStmt)) { pCsr->isEof = 1; rc = sqlite3_reset(pCsr->pStmt); - }else{ + } else { pCsr->iPrevId = sqlite3_column_int64(pCsr->pStmt, 0); rc = SQLITE_OK; } pTab->bLock--; - }else{ - rc = fts3EvalNext((Fts3Cursor *)pCursor); + } else { + rc = fts3EvalNext((Fts3Cursor*)pCursor); } - assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 ); + assert(((Fts3Table*)pCsr->base.pVtab)->pSegments == 0); return rc; } @@ -180107,10 +178410,10 @@ static int fts3NextMethod(sqlite3_vtab_cursor *pCursor){ ** 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 ){ +static sqlite3_int64 fts3DocidRange(sqlite3_value* pVal, i64 iDefault) { + if (pVal) { int eType = sqlite3_value_numeric_type(pVal); - if( eType==SQLITE_INTEGER ){ + if (eType == SQLITE_INTEGER) { return sqlite3_value_int64(pVal); } } @@ -180133,43 +178436,46 @@ static sqlite3_int64 fts3DocidRange(sqlite3_value *pVal, i64 iDefault){ ** 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 */ -){ +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 */ + char* zSql; /* SQL statement used to access %_content */ int eSearch; - Fts3Table *p = (Fts3Table *)pCursor->pVtab; - Fts3Cursor *pCsr = (Fts3Cursor *)pCursor; + 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 */ + 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 ){ + if (p->bLock) { return SQLITE_ERROR; } eSearch = (idxNum & 0x0000FFFF); - assert( eSearch>=0 && eSearch<=(FTS3_FULLTEXT_SEARCH+p->nColumn) ); - assert( p->pSegments==0 ); + 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 ); + 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); @@ -180178,36 +178484,36 @@ static int fts3FilterMethod( pCsr->iMinDocid = fts3DocidRange(pDocidGe, SMALLEST_INT64); pCsr->iMaxDocid = fts3DocidRange(pDocidLe, LARGEST_INT64); - if( idxStr ){ - pCsr->bDesc = (idxStr[0]=='D'); - }else{ + 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 (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 ){ + if (zQuery == 0 && sqlite3_value_type(pCons) != SQLITE_NULL) { return SQLITE_NOMEM; } pCsr->iLangid = 0; - if( pLangid ) pCsr->iLangid = sqlite3_value_int(pLangid); + 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 ){ + 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; + if (rc != SQLITE_OK) + return rc; pCsr->pNextId = pCsr->aDoclist; pCsr->iPrevId = 0; } @@ -180217,35 +178523,29 @@ static int fts3FilterMethod( ** 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 (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 ){ + if (zSql) { p->bLock++; - rc = sqlite3_prepare_v3( - p->db,zSql,-1,SQLITE_PREPARE_PERSISTENT,&pCsr->pStmt,0 - ); + rc = sqlite3_prepare_v3(p->db, zSql, -1, SQLITE_PREPARE_PERSISTENT, &pCsr->pStmt, 0); p->bLock--; sqlite3_free(zSql); - }else{ + } else { rc = SQLITE_NOMEM; } - }else if( eSearch==FTS3_DOCID_SEARCH ){ + } else if (eSearch == FTS3_DOCID_SEARCH) { rc = fts3CursorSeekStmt(pCsr); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = sqlite3_bind_value(pCsr->pStmt, 1, pCons); } } - if( rc!=SQLITE_OK ) return rc; + if (rc != SQLITE_OK) + return rc; return fts3NextMethod(pCursor); } @@ -180254,9 +178554,9 @@ static int fts3FilterMethod( ** 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 ){ +static int fts3EofMethod(sqlite3_vtab_cursor* pCursor) { + Fts3Cursor* pCsr = (Fts3Cursor*)pCursor; + if (pCsr->isEof) { fts3ClearCursor(pCsr); pCsr->isEof = 1; } @@ -180269,8 +178569,8 @@ static int fts3EofMethod(sqlite3_vtab_cursor *pCursor){ ** 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; +static int fts3RowidMethod(sqlite3_vtab_cursor* pCursor, sqlite_int64* pRowid) { + Fts3Cursor* pCsr = (Fts3Cursor*)pCursor; *pRowid = pCsr->iPrevId; return SQLITE_OK; } @@ -180286,19 +178586,18 @@ static int fts3RowidMethod(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ ** (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; +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 ); + assert(iCol >= 0 && iCol <= p->nColumn + 2); - switch( iCol-p->nColumn ){ + switch (iCol - p->nColumn) { case 0: /* The special 'table-name' column */ sqlite3_result_pointer(pCtx, pCsr, "fts3cursor", 0); @@ -180310,13 +178609,13 @@ static int fts3ColumnMethod( break; case 2: - if( pCsr->pExpr ){ + if (pCsr->pExpr) { sqlite3_result_int64(pCtx, pCsr->iLangid); break; - }else if( p->zLanguageid==0 ){ + } else if (p->zLanguageid == 0) { sqlite3_result_int(pCtx, 0); break; - }else{ + } else { iCol = p->nColumn; /* no break */ deliberate_fall_through } @@ -180325,13 +178624,13 @@ static int fts3ColumnMethod( /* 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)); + 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 ); + assert(((Fts3Table*)pCsr->base.pVtab)->pSegments == 0); return rc; } @@ -180340,12 +178639,11 @@ static int fts3ColumnMethod( ** 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 */ -){ +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); } @@ -180353,7 +178651,7 @@ static int fts3UpdateMethod( ** Implementation of xSync() method. Flush the contents of the pending-terms ** hash-table to the database. */ -static int fts3SyncMethod(sqlite3_vtab *pVtab){ +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 @@ -180374,25 +178672,23 @@ static int fts3SyncMethod(sqlite3_vtab *pVtab){ ** 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 */ + const u32 nMinMerge = 64; /* Minimum amount of incr-merge work to do */ - Fts3Table *p = (Fts3Table*)pVtab; + 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 */ + 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 ); + assert(rc == SQLITE_OK || mxLevel == 0); A = p->nLeafAdd * mxLevel; - A += (A/2); - if( A>(int)nMinMerge ) rc = sqlite3Fts3Incrmerge(p, A, p->nAutoincrmerge); + A += (A / 2); + if (A > (int)nMinMerge) + rc = sqlite3Fts3Incrmerge(p, A, p->nAutoincrmerge); } sqlite3Fts3SegmentsClose(p); sqlite3_set_last_insert_rowid(p->db, iLastRowid); @@ -180405,15 +178701,15 @@ static int fts3SyncMethod(sqlite3_vtab *pVtab){ ** to 0 or 1). Return SQLITE_OK if successful, or an SQLite error code ** if an error occurs. */ -static int fts3SetHasStat(Fts3Table *p){ +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); + 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{ + p->bHasStat = (res == SQLITE_OK); + } else { rc = SQLITE_NOMEM; } } @@ -180423,17 +178719,17 @@ static int fts3SetHasStat(Fts3Table *p){ /* ** Implementation of xBegin() method. */ -static int fts3BeginMethod(sqlite3_vtab *pVtab){ - Fts3Table *p = (Fts3Table*)pVtab; +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 ); + 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 ){ + if (rc == SQLITE_OK) { p->inTransaction = 1; p->mxSavepoint = -1; } @@ -180446,14 +178742,14 @@ static int fts3BeginMethod(sqlite3_vtab *pVtab){ ** 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 ); +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; ); + assert(p->nPendingData == 0); + assert(p->inTransaction != 0); + assert(p->pSegments == 0); + TESTONLY(p->inTransaction = 0); + TESTONLY(p->mxSavepoint = -1;); return SQLITE_OK; } @@ -180461,12 +178757,12 @@ static int fts3CommitMethod(sqlite3_vtab *pVtab){ ** 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; +static int fts3RollbackMethod(sqlite3_vtab* pVtab) { + Fts3Table* p = (Fts3Table*)pVtab; sqlite3Fts3PendingTermsClear(p); - assert( p->inTransaction!=0 ); - TESTONLY( p->inTransaction = 0 ); - TESTONLY( p->mxSavepoint = -1; ); + assert(p->inTransaction != 0); + TESTONLY(p->inTransaction = 0); + TESTONLY(p->mxSavepoint = -1;); return SQLITE_OK; } @@ -180476,20 +178772,21 @@ static int fts3RollbackMethod(sqlite3_vtab *pVtab){ ** 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]; +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 ); + 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 ){ + while (p > pStart && (*p & 0x80) | c) { c = *p--; } - assert( p==pStart || c==0 ); + 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 @@ -180504,8 +178801,11 @@ static void fts3ReversePoslist(char *pStart, char **ppPoslist){ ** ** 0x0A 0x00 */ - if( p>pStart || (c==0 && *ppPoslist>&p[2]) ){ p = &p[2]; } - while( *p++&0x80 ); + if (p > pStart || (c == 0 && *ppPoslist > &p[2])) { + p = &p[2]; + } + while (*p++ & 0x80) + ; *ppPoslist = p; } @@ -180519,18 +178819,17 @@ static void fts3ReversePoslist(char *pStart, char **ppPoslist){ ** 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 */ -){ +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 ){ + if ((*ppCsr) != 0) { rc = SQLITE_OK; - }else{ - char *zErr = sqlite3_mprintf("illegal first argument to %s", zFunc); + } else { + char* zErr = sqlite3_mprintf("illegal first argument to %s", zFunc); sqlite3_result_error(pContext, zErr, -1); sqlite3_free(zErr); rc = SQLITE_ERROR; @@ -180541,46 +178840,46 @@ static int fts3FunctionArg( /* ** 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 = "..."; +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 */ + 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 ); + assert(nVal >= 1); - if( nVal>6 ){ - sqlite3_result_error(pContext, - "wrong number of arguments to function snippet()", -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; + 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 ){ + 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 ){ + } else if (nToken == 0) { sqlite3_result_text(pContext, "", -1, SQLITE_STATIC); - }else if( SQLITE_OK==fts3CursorSeek(pContext, pCsr) ){ + } else if (SQLITE_OK == fts3CursorSeek(pContext, pCsr)) { sqlite3Fts3Snippet(pContext, pCsr, zStart, zEnd, zEllipsis, iCol, nToken); } } @@ -180588,19 +178887,19 @@ static void fts3SnippetFunc( /* ** 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] */ +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) ){ + assert(nVal == 1); + if (fts3FunctionArg(pContext, "offsets", apVal[0], &pCsr)) + return; + assert(pCsr); + if (SQLITE_OK == fts3CursorSeek(pContext, pCsr)) { sqlite3Fts3Offsets(pContext, pCsr); } } @@ -180614,25 +178913,25 @@ static void fts3OffsetsFunc( ** ** 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] */ +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 ); + assert(nVal == 1); + if (fts3FunctionArg(pContext, "optimize", apVal[0], &pCursor)) + return; + p = (Fts3Table*)pCursor->base.pVtab; + assert(p); rc = sqlite3Fts3Optimize(p); - switch( rc ){ + switch (rc) { case SQLITE_OK: sqlite3_result_text(pContext, "Index optimized", -1, SQLITE_STATIC); break; @@ -180648,17 +178947,16 @@ static void fts3OptimizeFunc( /* ** 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]); +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); } @@ -180668,30 +178966,29 @@ static void fts3MatchinfoFunc( ** 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 */ -){ +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**); + const char* zName; + void (*xFunc)(sqlite3_context*, int, sqlite3_value**); } aOverload[] = { - { "snippet", fts3SnippetFunc }, - { "offsets", fts3OffsetsFunc }, - { "optimize", fts3OptimizeFunc }, - { "matchinfo", fts3MatchinfoFunc }, + {"snippet", fts3SnippetFunc}, + {"offsets", fts3OffsetsFunc}, + {"optimize", fts3OptimizeFunc}, + {"matchinfo", fts3MatchinfoFunc}, }; - int i; /* Iterator variable */ + int i; /* Iterator variable */ UNUSED_PARAMETER(pVtab); UNUSED_PARAMETER(nArg); UNUSED_PARAMETER(ppArg); - for(i=0; idb; /* Database connection */ - int rc; /* Return Code */ +static int fts3RenameMethod(sqlite3_vtab* pVtab, /* Virtual table handle */ + const char* zName /* New name of table */ +) { + Fts3Table* p = (Fts3Table*)pVtab; + sqlite3* db = p->db; /* 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. */ @@ -180722,38 +179018,23 @@ static int fts3RenameMethod( ** 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 ){ + 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->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->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 - ); + 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 - ); + 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; } @@ -180762,13 +179043,13 @@ static int fts3RenameMethod( ** ** Flush the contents of the pending-terms table to disk. */ -static int fts3SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ +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 ){ + assert(((Fts3Table*)pVtab)->inTransaction); + assert(((Fts3Table*)pVtab)->mxSavepoint <= iSavepoint); + TESTONLY(((Fts3Table*)pVtab)->mxSavepoint = iSavepoint); + if (((Fts3Table*)pVtab)->bIgnoreSavepoint == 0) { rc = fts3SyncMethod(pVtab); } return rc; @@ -180779,13 +179060,13 @@ static int fts3SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ ** ** This is a no-op. */ -static int fts3ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ - TESTONLY( Fts3Table *p = (Fts3Table*)pVtab ); +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 ); + assert(p->inTransaction); + assert(p->mxSavepoint >= iSavepoint); + TESTONLY(p->mxSavepoint = iSavepoint - 1); return SQLITE_OK; } @@ -180794,11 +179075,11 @@ static int fts3ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ ** ** Discard the contents of the pending terms table. */ -static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ - Fts3Table *p = (Fts3Table*)pVtab; +static int fts3RollbackToMethod(sqlite3_vtab* pVtab, int iSavepoint) { + Fts3Table* p = (Fts3Table*)pVtab; UNUSED_PARAMETER(iSavepoint); - assert( p->inTransaction ); - TESTONLY( p->mxSavepoint = iSavepoint ); + assert(p->inTransaction); + TESTONLY(p->mxSavepoint = iSavepoint); sqlite3Fts3PendingTermsClear(p); return SQLITE_OK; } @@ -180807,42 +179088,43 @@ static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ ** 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", +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 ){ + if (pHash->nRef <= 0) { sqlite3Fts3HashClear(&pHash->hash); sqlite3_free(pHash); } @@ -180869,13 +179151,13 @@ static void hashDestroy(void *p){ ** 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); +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); +SQLITE_PRIVATE void sqlite3Fts3UnicodeTokenizer(sqlite3_tokenizer_module const** ppModule); #endif #ifdef SQLITE_ENABLE_ICU -SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule(sqlite3_tokenizer_module const**ppModule); +SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule(sqlite3_tokenizer_module const** ppModule); #endif /* @@ -180884,17 +179166,17 @@ SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule(sqlite3_tokenizer_module const ** 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){ +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; + 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; + const sqlite3_tokenizer_module* pUnicode = 0; #endif #ifdef SQLITE_ENABLE_ICU - const sqlite3_tokenizer_module *pIcu = 0; + const sqlite3_tokenizer_module* pIcu = 0; sqlite3Fts3IcuTokenizerModule(&pIcu); #endif @@ -180904,42 +179186,43 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){ #ifdef SQLITE_TEST rc = sqlite3Fts3InitTerm(db); - if( rc!=SQLITE_OK ) return rc; + if (rc != SQLITE_OK) + return rc; #endif rc = sqlite3Fts3InitAux(db); - if( rc!=SQLITE_OK ) return rc; + 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 ){ + if (!pHash) { rc = SQLITE_NOMEM; - }else{ + } 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) + 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) + || sqlite3Fts3HashInsert(&pHash->hash, "unicode61", 10, (void*)pUnicode) #endif #ifdef SQLITE_ENABLE_ICU - || (pIcu && sqlite3Fts3HashInsert(&pHash->hash, "icu", 4, (void *)pIcu)) + || (pIcu && sqlite3Fts3HashInsert(&pHash->hash, "icu", 4, (void*)pIcu)) #endif - ){ + ) { rc = SQLITE_NOMEM; } } #ifdef SQLITE_TEST - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = sqlite3Fts3ExprInitTestInterface(db, &pHash->hash); } #endif @@ -180948,35 +179231,27 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){ ** 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)) - ){ + 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 ){ + 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 - ); + rc = sqlite3_create_module_v2(db, "fts4", &fts3Module, (void*)pHash, hashDestroy); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pHash->nRef++; - rc = sqlite3Fts3InitTok(db, (void *)pHash, hashDestroy); + 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 ){ + assert(rc != SQLITE_OK); + if (pHash) { sqlite3Fts3HashClear(&pHash->hash); sqlite3_free(pHash); } @@ -180998,32 +179273,29 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){ ** 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 ){ +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 ){ + for (i = 0; i < nToken; i++) { + Fts3PhraseToken* pToken = &pExpr->pPhrase->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 ); + assert(pExpr->pPhrase->iDoclistToken == 0); pExpr->pPhrase->iDoclistToken = -1; - }else{ - *pnOr += (pExpr->eType==FTSQUERY_OR); + } else { + *pnOr += (pExpr->eType == FTSQUERY_OR); fts3EvalAllocateReaders(pCsr, pExpr->pLeft, pnToken, pnOr, pRc); fts3EvalAllocateReaders(pCsr, pExpr->pRight, pnToken, pnOr, pRc); } @@ -181040,45 +179312,44 @@ static void fts3EvalAllocateReaders( ** ** 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 */ -){ +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 ); + assert(iToken != p->iDoclistToken); - if( pList==0 ){ + if (pList == 0) { sqlite3_free(p->doclist.aAll); p->doclist.aAll = 0; p->doclist.nAll = 0; } - else if( p->iDoclistToken<0 ){ + else if (p->iDoclistToken < 0) { p->doclist.aAll = pList; p->doclist.nAll = nList; } - else if( p->doclist.aAll==0 ){ + else if (p->doclist.aAll == 0) { sqlite3_free(pList); } else { - char *pLeft; - char *pRight; + char* pLeft; + char* pRight; int nLeft; int nRight; int nDiff; - if( p->iDoclistTokeniDoclistToken < iToken) { pLeft = p->doclist.aAll; nLeft = p->doclist.nAll; pRight = pList; nRight = nList; nDiff = iToken - p->iDoclistToken; - }else{ + } else { pRight = p->doclist.aAll; nRight = p->doclist.nAll; pLeft = pList; @@ -181086,15 +179357,14 @@ static int fts3EvalPhraseMergeToken( nDiff = p->iDoclistToken - iToken; } - rc = fts3DoclistPhraseMerge( - pTab->bDescIdx, nDiff, pLeft, nLeft, &pRight, &nRight - ); + 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; + if (iToken > p->iDoclistToken) + p->iDoclistToken = iToken; return rc; } @@ -181104,27 +179374,26 @@ static int fts3EvalPhraseMergeToken( ** ** 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; +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 ); + for (iToken = 0; rc == SQLITE_OK && iToken < p->nToken; iToken++) { + Fts3PhraseToken* pToken = &p->aToken[iToken]; + assert(pToken->pDeferred == 0 || pToken->pSegcsr == 0); - if( pToken->pSegcsr ){ + if (pToken->pSegcsr) { int nThis = 0; - char *pThis = 0; + char* pThis = 0; rc = fts3TermSelect(pTab, pToken, p->iColumn, &nThis, &pThis); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = fts3EvalPhraseMergeToken(pTab, p, iToken, pThis, nThis); } } - assert( pToken->pSegcsr==0 ); + assert(pToken->pSegcsr == 0); } return rc; @@ -181141,45 +179410,46 @@ static int fts3EvalPhraseLoad( ** ** 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); +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; + for (iToken = 0; iToken < pPhrase->nToken; iToken++) { + Fts3PhraseToken* pToken = &pPhrase->aToken[iToken]; + Fts3DeferredToken* pDeferred = pToken->pDeferred; - if( pDeferred ){ - char *pList; + if (pDeferred) { + char* pList; int nList; int rc = sqlite3Fts3DeferredTokenList(pDeferred, &pList, &nList); - if( rc!=SQLITE_OK ) return rc; + if (rc != SQLITE_OK) + return rc; - if( pList==0 ){ + if (pList == 0) { sqlite3_free(aPoslist); sqlite3_free(aFree); pPhrase->doclist.pList = 0; pPhrase->doclist.nList = 0; return SQLITE_OK; - }else if( aPoslist==0 ){ + } else if (aPoslist == 0) { aPoslist = pList; nPoslist = nList; - }else{ - char *aOut = pList; - char *p1 = aPoslist; - char *p2 = aOut; + } else { + char* aOut = pList; + char* p1 = aPoslist; + char* p2 = aOut; - assert( iPrev>=0 ); - fts3PoslistPhraseMerge(&aOut, iToken-iPrev, 0, 1, &p1, &p2); + assert(iPrev >= 0); + fts3PoslistPhraseMerge(&aOut, iToken - iPrev, 0, 1, &p1, &p2); sqlite3_free(aPoslist); aPoslist = pList; nPoslist = (int)(aOut - aPoslist); - if( nPoslist==0 ){ + if (nPoslist == 0) { sqlite3_free(aPoslist); sqlite3_free(aFree); pPhrase->doclist.pList = 0; @@ -181191,41 +179461,41 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){ } } - if( iPrev>=0 ){ + if (iPrev >= 0) { int nMaxUndeferred = pPhrase->iDoclistToken; - if( nMaxUndeferred<0 ){ + if (nMaxUndeferred < 0) { pPhrase->doclist.pList = aPoslist; pPhrase->doclist.nList = nPoslist; pPhrase->doclist.iDocid = pCsr->iPrevId; pPhrase->doclist.bFreeList = 1; - }else{ + } else { int nDistance; - char *p1; - char *p2; - char *aOut; + char* p1; + char* p2; + char* aOut; - if( nMaxUndeferred>iPrev ){ + if (nMaxUndeferred > iPrev) { p1 = aPoslist; p2 = pPhrase->doclist.pList; nDistance = nMaxUndeferred - iPrev; - }else{ + } else { p1 = pPhrase->doclist.pList; p2 = aPoslist; nDistance = iPrev - nMaxUndeferred; } - aOut = (char *)sqlite3Fts3MallocZero(nPoslist+FTS3_BUFFER_PADDING); - if( !aOut ){ + aOut = (char*)sqlite3Fts3MallocZero(nPoslist + FTS3_BUFFER_PADDING); + if (!aOut) { sqlite3_free(aPoslist); return SQLITE_NOMEM; } pPhrase->doclist.pList = aOut; - assert( p1 && p2 ); - if( fts3PoslistPhraseMerge(&aOut, nDistance, 0, 1, &p1, &p2) ){ + assert(p1 && p2); + if (fts3PoslistPhraseMerge(&aOut, nDistance, 0, 1, &p1, &p2)) { pPhrase->doclist.bFreeList = 1; pPhrase->doclist.nList = (int)(aOut - pPhrase->doclist.pList); - }else{ + } else { sqlite3_free(aOut); pPhrase->doclist.pList = 0; pPhrase->doclist.nList = 0; @@ -181234,7 +179504,8 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){ } } - if( pPhrase->doclist.pList!=aFree ) sqlite3_free(aFree); + if (pPhrase->doclist.pList != aFree) + sqlite3_free(aFree); return SQLITE_OK; } #endif /* SQLITE_DISABLE_FTS4_DEFERRED */ @@ -181257,9 +179528,9 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){ ** ** 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 */ +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 @@ -181268,39 +179539,38 @@ static int fts3EvalPhraseStart(Fts3Cursor *pCsr, int bOptOk, Fts3Phrase *p){ ** 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 + 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 + && 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) ){ + for (i = 0; bIncrOk == 1 && i < p->nToken; i++) { + Fts3PhraseToken* pToken = &p->aToken[i]; + if (pToken->bFirst || (pToken->pSegcsr != 0 && !pToken->pSegcsr->bLookup)) { bIncrOk = 0; } - if( pToken->pSegcsr ) bHaveIncr = 1; + if (pToken->pSegcsr) + bHaveIncr = 1; } - if( bIncrOk && bHaveIncr ){ + 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 ){ + for (i = 0; rc == SQLITE_OK && i < p->nToken; 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{ + } 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 ); + assert(rc != SQLITE_OK || p->nToken < 1 || p->aToken[0].pSegcsr == 0 || p->bIncr); return rc; } @@ -181314,52 +179584,52 @@ static int fts3EvalPhraseStart(Fts3Cursor *pCsr, int bOptOk, Fts3Phrase *p){ ** 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; +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]) ); + assert(nDoclist > 0); + assert(*pbEof == 0); + assert_fts3_nc(p || *piDocid == 0); + assert(!p || (p > aDoclist && p < &aDoclist[nDoclist])); - if( p==0 ){ + if (p == 0) { sqlite3_int64 iDocid = 0; - char *pNext = 0; - char *pDocid = aDoclist; - char *pEnd = &aDoclist[nDoclist]; + 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]) ); + assert(nDoclist > 0); + assert(*pbEof == 0); + assert_fts3_nc(p || *piDocid == 0); + assert(!p || (p >= aDoclist && p <= &aDoclist[nDoclist])); - if( p==0 ){ + if (p == 0) { p = aDoclist; p += sqlite3Fts3GetVarint(p, piDocid); - }else{ + } else { fts3PoslistCopy(0, &p); - while( p<&aDoclist[nDoclist] && *p==0 ) p++; - if( p>=&aDoclist[nDoclist] ){ + while (p < &aDoclist[nDoclist] && *p == 0) + p++; + if (p >= &aDoclist[nDoclist]) { *pbEof = 1; - }else{ + } else { sqlite3_int64 iVar; p += sqlite3Fts3GetVarint(p, &iVar); *piDocid += ((bDescIdx ? -1 : 1) * iVar); @@ -181407,30 +179677,26 @@ SQLITE_PRIVATE void sqlite3Fts3DoclistNext( ** 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 */ +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 ){ + if (pDL->pNextDocid) { pIter = pDL->pNextDocid; - assert( pDL->aAll!=0 || pIter==0 ); - }else{ + assert(pDL->aAll != 0 || pIter == 0); + } else { pIter = pDL->aAll; } - if( pIter==0 || pIter>=(pEnd = pDL->aAll + pDL->nAll) ){ + if (pIter == 0 || pIter >= (pEnd = pDL->aAll + pDL->nAll)) { /* We have already reached the end of this doclist. EOF. */ *pbEof = 1; - }else{ + } else { sqlite3_int64 iDelta; pIter += sqlite3Fts3GetVarint(pIter, &iDelta); - if( pTab->bDescIdx==0 || pDL->pNextDocid==0 ){ + if (pTab->bDescIdx == 0 || pDL->pNextDocid == 0) { pDL->iDocid += iDelta; - }else{ + } else { pDL->iDocid -= iDelta; } pDL->pList = pIter; @@ -181443,10 +179709,11 @@ static void fts3EvalDlPhraseNext( ** 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 ); + assert(pIter >= &pDL->aAll[pDL->nAll] || *pIter); *pbEof = 0; } } @@ -181458,7 +179725,7 @@ typedef struct TokenDoclist TokenDoclist; struct TokenDoclist { int bIgnore; sqlite3_int64 iDocid; - char *pList; + char* pList; int nList; }; @@ -181471,33 +179738,31 @@ struct TokenDoclist { ** 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 */ -){ +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 ); + 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{ + } 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; } } @@ -181505,7 +179770,6 @@ static int incrPhraseTokenNext( return rc; } - /* ** The phrase iterator passed as the second argument: ** @@ -181523,56 +179787,52 @@ static int incrPhraseTokenNext( ** 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 */ -){ +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; + 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 ); + 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{ + 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 <= MAX_INCR_PHRASE_TOKENS); + assert(p->iDoclistToken < MAX_INCR_PHRASE_TOKENS); - while( bEof==0 ){ + while (bEof == 0) { int bMaxSet = 0; - sqlite3_int64 iMax = 0; /* Largest docid for all iterators */ - int i; /* Used to iterate through tokens */ + sqlite3_int64 iMax = 0; /* Largest docid for all iterators */ + int i; /* Used to iterate through tokens */ /* Advance the iterator for each token in the phrase once. */ - for(i=0; rc==SQLITE_OK && inToken && bEof==0; i++){ + for (i = 0; rc == SQLITE_OK && i < p->nToken && 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) ){ + 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 ); + 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 - ){ + for (i = 0; i < p->nToken; 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 ){ + if (DOCID_CMP(a[i].iDocid, iMax) > 0) { iMax = a[i].iDocid; i = 0; } @@ -181580,26 +179840,28 @@ static int fts3EvalIncrPhraseNext( } /* Check if the current entries really are a phrase match */ - if( bEof==0 ){ + if (bEof == 0) { int nList = 0; - int nByte = a[p->nToken-1].nList; - char *aDoclist = sqlite3_malloc64((i64)nByte+FTS3_BUFFER_PADDING); - if( !aDoclist ) return SQLITE_NOMEM; - memcpy(aDoclist, a[p->nToken-1].pList, nByte+1); + int nByte = a[p->nToken - 1].nList; + char* aDoclist = sqlite3_malloc64((i64)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; + 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; + if (res == 0) + break; nList = (int)(pOut - aDoclist); } } - if( i==(p->nToken-1) ){ + if (i == (p->nToken - 1)) { pDL->iDocid = iMax; pDL->pList = aDoclist; pDL->nList = nList; @@ -181624,23 +179886,20 @@ static int fts3EvalIncrPhraseNext( ** 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 */ -){ +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; + Fts3Doclist* pDL = &p->doclist; + Fts3Table* pTab = (Fts3Table*)pCsr->base.pVtab; - if( p->bIncr ){ + 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 - ); + } 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{ + } else { fts3EvalDlPhraseNext(pTab, pDL, pbEof); } @@ -181663,23 +179922,23 @@ static int fts3EvalPhraseNext( ** 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 ){ +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 ){ + if (nToken) { int i; - for(i=0; ipPhrase->aToken[i].pDeferred==0 ) break; + for (i = 0; i < nToken; i++) { + if (pExpr->pPhrase->aToken[i].pDeferred == 0) + break; } - pExpr->bDeferred = (i==nToken); + pExpr->bDeferred = (i == nToken); } *pRc = fts3EvalPhraseStart(pCsr, 1, pExpr->pPhrase); - }else{ + } else { fts3EvalStartReaders(pCsr, pExpr->pLeft, pRc); fts3EvalStartReaders(pCsr, pExpr->pRight, pRc); pExpr->bDeferred = (pExpr->pLeft->bDeferred && pExpr->pRight->bDeferred); @@ -181701,12 +179960,12 @@ static void fts3EvalStartReaders( */ 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 */ + 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 */ }; /* @@ -181716,20 +179975,19 @@ struct Fts3TokenAndCost { ** 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; +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)++; + for (i = 0; *pRc == SQLITE_OK && i < pPhrase->nToken; i++) { + Fts3TokenAndCost* pTC = (*ppTC)++; pTC->pPhrase = pPhrase; pTC->iToken = i; pTC->pRoot = pRoot; @@ -181737,19 +179995,16 @@ static void fts3EvalTokenCosts( 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 ){ + } 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 ){ + if (pExpr->eType == FTSQUERY_OR) { pRoot = pExpr->pRight; **ppOr = pRoot; (*ppOr)++; @@ -181770,9 +180025,9 @@ static void fts3EvalTokenCosts( ** 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){ +static int fts3EvalAverageDocsize(Fts3Cursor* pCsr, int* pnPage) { int rc = SQLITE_OK; - if( pCsr->nRowAvg==0 ){ + 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. @@ -181784,32 +180039,33 @@ static int fts3EvalAverageDocsize(Fts3Cursor *pCsr, int *pnPage){ ** data stored in all rows of each column of the table, from left ** to right. */ - Fts3Table *p = (Fts3Table*)pCsr->base.pVtab; - sqlite3_stmt *pStmt; + Fts3Table* p = (Fts3Table*)pCsr->base.pVtab; + sqlite3_stmt* pStmt; sqlite3_int64 nDoc = 0; sqlite3_int64 nByte = 0; - const char *pEnd; - const char *a; + const char* pEnd; + const char* a; rc = sqlite3Fts3SelectDoctotal(p, &pStmt); - if( rc!=SQLITE_OK ) return rc; + if (rc != SQLITE_OK) + return rc; a = sqlite3_column_blob(pStmt, 0); - testcase( a==0 ); /* If %_stat.value set to X'' */ - if( a ){ + 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 ); + assert(pCsr->nRowAvg > 0); rc = sqlite3_reset(pStmt); } @@ -181831,46 +180087,45 @@ static int fts3EvalAverageDocsize(Fts3Cursor *pCsr, int *pnPage){ ** 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 */ +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. */ + 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 ){ + 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 ); - + assert(rc != SQLITE_OK || nDocSize > 0); /* 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 @@ -181894,55 +180149,51 @@ static int fts3EvalSelectDeferred( ** ** (nMinEst + 4^nOther - 1) / (4^nOther) */ - for(ii=0; iinOvfl) - ){ + for (iTC = 0; iTC < nTC; iTC++) { + if (aTC[iTC].pToken && aTC[iTC].pRoot == pRoot && (!pTC || aTC[iTC].nOvfl < pTC->nOvfl)) { pTC = &aTC[iTC]; } } - assert( pTC ); + assert(pTC); - if( ii && pTC->nOvfl>=((nMinEst+(nLoad4/4)-1)/(nLoad4/4))*nDocSize ){ + 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; + Fts3PhraseToken* pToken = pTC->pToken; rc = sqlite3Fts3DeferToken(pCsr, pToken, pTC->iCol); fts3SegReaderCursorFree(pToken->pSegcsr); pToken->pSegcsr = 0; - }else{ + } 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 < 12) + nLoad4 = nLoad4 * 4; - if( ii==0 || (pTC->pPhrase->nToken>1 && ii!=nToken-1) ){ + 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; + Fts3PhraseToken* pToken = pTC->pToken; int nList = 0; - char *pList = 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 - ); + assert(rc == SQLITE_OK || pList == 0); + if (rc == SQLITE_OK) { + rc = fts3EvalPhraseMergeToken(pTab, pTC->pPhrase, pTC->iToken, pList, nList); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { int nCount; - nCount = fts3DoclistCountDocids( - pTC->pPhrase->doclist.aAll, pTC->pPhrase->doclist.nAll - ); - if( ii==0 || nCountpPhrase->doclist.aAll, pTC->pPhrase->doclist.nAll); + if (ii == 0 || nCount < nMinEst) + nMinEst = nCount; } } } @@ -181964,8 +180215,8 @@ static int fts3EvalSelectDeferred( ** ... return row pCsr->iPrevId to the caller ... ** } */ -static int fts3EvalStart(Fts3Cursor *pCsr){ - Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; +static int fts3EvalStart(Fts3Cursor* pCsr) { + Fts3Table* pTab = (Fts3Table*)pCsr->base.pVtab; int rc = SQLITE_OK; int nToken = 0; int nOr = 0; @@ -181975,28 +180226,25 @@ static int fts3EvalStart(Fts3Cursor *pCsr){ /* 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 (rc == SQLITE_OK && nToken > 1 && pTab->bFts4) { + Fts3TokenAndCost* aTC; + aTC = (Fts3TokenAndCost*)sqlite3_malloc64(sizeof(Fts3TokenAndCost) * nToken + sizeof(Fts3Expr*) * nOr * 2); - if( !aTC ){ + if (!aTC) { rc = SQLITE_NOMEM; - }else{ - Fts3Expr **apOr = (Fts3Expr **)&aTC[nToken]; + } else { + Fts3Expr** apOr = (Fts3Expr**)&aTC[nToken]; int ii; - Fts3TokenAndCost *pTC = aTC; - Fts3Expr **ppOr = apOr; + Fts3TokenAndCost* pTC = aTC; + Fts3Expr** ppOr = apOr; fts3EvalTokenCosts(pCsr, 0, pCsr->pExpr, &pTC, &ppOr, &rc); - nToken = (int)(pTC-aTC); - nOr = (int)(ppOr-apOr); + nToken = (int)(pTC - aTC); + nOr = (int)(ppOr - apOr); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = fts3EvalSelectDeferred(pCsr, 0, aTC, nToken); - for(ii=0; rc==SQLITE_OK && iidoclist.bFreeList ){ +static void fts3EvalInvalidatePoslist(Fts3Phrase* pPhrase) { + if (pPhrase->doclist.bFreeList) { sqlite3_free(pPhrase->doclist.pList); } pPhrase->doclist.pList = 0; @@ -182044,31 +180292,28 @@ static void fts3EvalInvalidatePoslist(Fts3Phrase *pPhrase){ ** 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 */ -){ +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; + char* p2; + char* pOut; int res; - assert( pPhrase->doclist.pList ); + assert(pPhrase->doclist.pList); p2 = pOut = pPhrase->doclist.pList; - res = fts3PoslistNearMerge( - &pOut, aTmp, nParam1, nParam2, paPoslist, &p2 - ); - if( res ){ + 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' ); + 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; } @@ -182120,62 +180365,62 @@ static int fts3EvalNearTrim( ** 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 ); +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 ){ + switch (pExpr->eType) { case FTSQUERY_NEAR: case FTSQUERY_AND: { - Fts3Expr *pLeft = pExpr->pLeft; - Fts3Expr *pRight = pExpr->pRight; - assert( !pLeft->bDeferred || !pRight->bDeferred ); + Fts3Expr* pLeft = pExpr->pLeft; + Fts3Expr* pRight = pExpr->pRight; + assert(!pLeft->bDeferred || !pRight->bDeferred); - if( pLeft->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 ){ + } 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{ + } else { /* Neither the RHS or LHS are deferred. */ fts3EvalNextRow(pCsr, pLeft, pRc); fts3EvalNextRow(pCsr, pRight, pRc); - while( !pLeft->bEof && !pRight->bEof && *pRc==SQLITE_OK ){ + while (!pLeft->bEof && !pRight->bEof && *pRc == SQLITE_OK) { sqlite3_int64 iDiff = DOCID_CMP(pLeft->iDocid, pRight->iDocid); - if( iDiff==0 ) break; - if( iDiff<0 ){ + if (iDiff == 0) + break; + if (iDiff < 0) { fts3EvalNextRow(pCsr, pLeft, pRc); - }else{ + } 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 ){ + 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 ){ + 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); } @@ -182187,27 +180432,27 @@ static void fts3EvalNextRow( } case FTSQUERY_OR: { - Fts3Expr *pLeft = pExpr->pLeft; - Fts3Expr *pRight = pExpr->pRight; + 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 ); + 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) ){ + if (pRight->bEof || (pLeft->bEof == 0 && iCmp < 0)) { fts3EvalNextRow(pCsr, pLeft, pRc); - }else if( pLeft->bEof || iCmp>0 ){ + } else if (pLeft->bEof || iCmp > 0) { fts3EvalNextRow(pCsr, pRight, pRc); - }else{ + } 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) ){ + if (pRight->bEof || (pLeft->bEof == 0 && iCmp < 0)) { pExpr->iDocid = pLeft->iDocid; - }else{ + } else { pExpr->iDocid = pRight->iDocid; } @@ -182215,20 +180460,17 @@ static void fts3EvalNextRow( } case FTSQUERY_NOT: { - Fts3Expr *pLeft = pExpr->pLeft; - Fts3Expr *pRight = pExpr->pRight; + Fts3Expr* pLeft = pExpr->pLeft; + Fts3Expr* pRight = pExpr->pRight; - if( pRight->bStart==0 ){ + if (pRight->bStart == 0) { fts3EvalNextRow(pCsr, pRight, pRc); - assert( *pRc!=SQLITE_OK || pRight->bStart ); + 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 - ){ + if (pLeft->bEof == 0) { + while (!*pRc && !pRight->bEof && DOCID_CMP(pLeft->iDocid, pRight->iDocid) > 0) { fts3EvalNextRow(pCsr, pRight, pRc); } } @@ -182238,7 +180480,7 @@ static void fts3EvalNextRow( } default: { - Fts3Phrase *pPhrase = pExpr->pPhrase; + Fts3Phrase* pPhrase = pExpr->pPhrase; fts3EvalInvalidatePoslist(pPhrase); *pRc = fts3EvalPhraseNext(pCsr, pPhrase, &pExpr->bEof); pExpr->iDocid = pPhrase->doclist.iDocid; @@ -182263,7 +180505,7 @@ static void fts3EvalNextRow( ** 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){ +static int fts3EvalNearTest(Fts3Expr* pExpr, int* pRc) { int res = 1; /* The following block runs if pExpr is the root of a NEAR query. @@ -182286,44 +180528,39 @@ static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){ ** 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() */ + 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 ); + 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 ){ + aTmp = sqlite3_malloc64(nTmp * 2); + if (!aTmp) { *pRc = SQLITE_NOMEM; res = 0; - }else{ - char *aPoslist = p->pPhrase->doclist.pList; + } 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; + 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){ + for (p = pExpr->pLeft; p && res; p = p->pLeft) { int nNear; - Fts3Phrase *pPhrase; - assert( p->pParent && p->pParent->pLeft==p ); + Fts3Phrase* pPhrase; + assert(p->pParent && p->pParent->pLeft == p); nNear = p->pParent->nNear; - pPhrase = ( - p->eType==FTSQUERY_NEAR ? p->pRight->pPhrase : p->pPhrase - ); + pPhrase = (p->eType == FTSQUERY_NEAR ? p->pRight->pPhrase : p->pPhrase); res = fts3EvalNearTrim(nNear, aTmp, &aPoslist, &nToken, pPhrase); } } @@ -182345,21 +180582,16 @@ static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){ ** 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 ){ +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) - ); + 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(), @@ -182376,17 +180608,14 @@ static int fts3EvalTestExpr( ** 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 ){ + 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 ){ + if (p->iDocid == pCsr->iPrevId) { fts3EvalInvalidatePoslist(p->pPhrase); } } @@ -182401,31 +180630,23 @@ static int fts3EvalTestExpr( } case FTSQUERY_NOT: - bHit = ( - fts3EvalTestExpr(pCsr, pExpr->pLeft, pRc) - && !fts3EvalTestExpr(pCsr, pExpr->pRight, pRc) - ); + 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 ){ + 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); + bHit = (pPhrase->doclist.pList != 0); pExpr->iDocid = pCsr->iPrevId; - }else + } else #endif { - bHit = ( - pExpr->bEof==0 && pExpr->iDocid==pCsr->iPrevId - && pExpr->pPhrase->doclist.nList>0 - ); + bHit = (pExpr->bEof == 0 && pExpr->iDocid == pCsr->iPrevId && pExpr->pPhrase->doclist.nList > 0); } break; } @@ -182458,10 +180679,10 @@ static int fts3EvalTestExpr( ** 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){ +SQLITE_PRIVATE int sqlite3Fts3EvalTestDeferred(Fts3Cursor* pCsr, int* pRc) { int rc = *pRc; int bMiss = 0; - if( rc==SQLITE_OK ){ + 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 @@ -182469,51 +180690,48 @@ SQLITE_PRIVATE int sqlite3Fts3EvalTestDeferred(Fts3Cursor *pCsr, int *pRc){ ** tokens and NEAR operators (neither of which were taken into account ** earlier, by fts3EvalNextRow()). */ - if( pCsr->pDeferred ){ + if (pCsr->pDeferred) { rc = fts3CursorSeek(0, pCsr); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = sqlite3Fts3CacheDeferredDoclists(pCsr); } } - bMiss = (0==fts3EvalTestExpr(pCsr, pCsr->pExpr, &rc)); + 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); + 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 ){ +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{ + } else { do { - if( pCsr->isRequireSeek==0 ){ + if (pCsr->isRequireSeek == 0) { sqlite3_reset(pCsr->pStmt); } - assert( sqlite3_data_count(pCsr->pStmt)==0 ); + 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) ); + } 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) - )){ + if (rc == SQLITE_OK && ((pCsr->bDesc == 0 && pCsr->iPrevId > pCsr->iMaxDocid) || (pCsr->bDesc != 0 && pCsr->iPrevId < pCsr->iMinDocid))) { pCsr->isEof = 1; } @@ -182529,22 +180747,18 @@ static int fts3EvalNext(Fts3Cursor *pCsr){ ** 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; +static void fts3EvalRestart(Fts3Cursor* pCsr, Fts3Expr* pExpr, int* pRc) { + if (pExpr && *pRc == SQLITE_OK) { + Fts3Phrase* pPhrase = pExpr->pPhrase; - if( pPhrase ){ + if (pPhrase) { fts3EvalInvalidatePoslist(pPhrase); - if( pPhrase->bIncr ){ + if (pPhrase->bIncr) { int i; - for(i=0; inToken; i++){ - Fts3PhraseToken *pToken = &pPhrase->aToken[i]; - assert( pToken->pDeferred==0 ); - if( pToken->pSegcsr ){ + for (i = 0; i < pPhrase->nToken; i++) { + Fts3PhraseToken* pToken = &pPhrase->aToken[i]; + assert(pToken->pDeferred == 0); + if (pToken->pSegcsr) { sqlite3Fts3MsrIncrRestart(pToken->pSegcsr); } } @@ -182572,30 +180786,32 @@ static void fts3EvalRestart( ** 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 ){ +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; + char* p = pPhrase->doclist.pList; - do{ + do { u8 c = 0; int iCnt = 0; - while( 0xFE & (*p | c) ){ - if( (c&0x80)==0 ) iCnt++; + 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; + 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); @@ -182614,17 +180830,16 @@ static void fts3EvalUpdateCounts(Fts3Expr *pExpr, int nCol){ ** 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 */ +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 */ + 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; @@ -182632,30 +180847,32 @@ static int fts3EvalGatherStats( /* Find the root of the NEAR expression */ pRoot = pExpr; - while( pRoot->pParent && pRoot->pParent->eType==FTSQUERY_NEAR ){ + while (pRoot->pParent && pRoot->pParent->eType == FTSQUERY_NEAR) { pRoot = pRoot->pParent; } iDocid = pRoot->iDocid; bEof = pRoot->bEof; - assert( pRoot->bStart ); + 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; + 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 ){ + 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 ); + if (pCsr->isRequireSeek == 0) + sqlite3_reset(pCsr->pStmt); + assert(sqlite3_data_count(pCsr->pStmt) == 0); /* Advance to the next document */ fts3EvalNextRow(pCsr, pRoot, &rc); @@ -182663,12 +180880,9 @@ static int fts3EvalGatherStats( pCsr->isRequireSeek = 1; pCsr->isMatchinfoNeeded = 1; pCsr->iPrevId = pRoot->iDocid; - }while( pCsr->isEof==0 - && pRoot->eType==FTSQUERY_NEAR - && sqlite3Fts3EvalTestDeferred(pCsr, &rc) - ); + } while (pCsr->isEof == 0 && pRoot->eType == FTSQUERY_NEAR && sqlite3Fts3EvalTestDeferred(pCsr, &rc)); - if( rc==SQLITE_OK && pCsr->isEof==0 ){ + if (rc == SQLITE_OK && pCsr->isEof == 0) { fts3EvalUpdateCounts(pRoot, pTab->nColumn); } } @@ -182676,9 +180890,9 @@ static int fts3EvalGatherStats( pCsr->isEof = 0; pCsr->iPrevId = iPrevId; - if( bEof ){ + if (bEof) { pRoot->bEof = bEof; - }else{ + } 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: @@ -182688,9 +180902,10 @@ static int fts3EvalGatherStats( fts3EvalRestart(pCsr, pRoot, &rc); do { fts3EvalNextRow(pCsr, pRoot, &rc); - assert_fts3_nc( pRoot->bEof==0 ); - if( pRoot->bEof ) rc = FTS_CORRUPT_VTAB; - }while( pRoot->iDocid!=iDocid && rc==SQLITE_OK ); + assert_fts3_nc(pRoot->bEof == 0); + if (pRoot->bEof) + rc = FTS_CORRUPT_VTAB; + } while (pRoot->iDocid != iDocid && rc == SQLITE_OK); } } return rc; @@ -182726,28 +180941,27 @@ static int fts3EvalGatherStats( ** * 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; +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; + if (pExpr->bDeferred && pExpr->pParent->eType != FTSQUERY_NEAR) { + assert(pCsr->nDoc > 0); + for (iCol = 0; iCol < pTab->nColumn; iCol++) { + aiOut[iCol * 3 + 1] = (u32)pCsr->nDoc; + aiOut[iCol * 3 + 2] = (u32)pCsr->nDoc; } - }else{ + } 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]; + if (rc == SQLITE_OK) { + assert(pExpr->aMI); + for (iCol = 0; iCol < pTab->nColumn; iCol++) { + aiOut[iCol * 3 + 1] = pExpr->aMI[iCol * 3 + 1]; + aiOut[iCol * 3 + 2] = pExpr->aMI[iCol * 3 + 2]; } } } @@ -182774,35 +180988,34 @@ SQLITE_PRIVATE int sqlite3Fts3EvalPhraseStats( ** 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; +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) ){ + assert(iCol >= 0 && iCol < pTab->nColumn); + if ((pPhrase->iColumn < pTab->nColumn && pPhrase->iColumn != iCol)) { return SQLITE_OK; } iDocid = pExpr->iDocid; pIter = pPhrase->doclist.pList; - if( iDocid!=pCsr->iPrevId || pExpr->bEof ){ + if (iDocid != pCsr->iPrevId || pExpr->bEof) { int rc = SQLITE_OK; - int bDescDoclist = pTab->bDescIdx; /* For DOCID_CMP macro */ + 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) */ + 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, @@ -182811,96 +181024,99 @@ SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist( ** 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; + 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 ){ + if (pPhrase->bIncr) { int bEofSave = pNear->bEof; fts3EvalRestart(pCsr, pNear, &rc); - while( rc==SQLITE_OK && !pNear->bEof ){ + while (rc == SQLITE_OK && !pNear->bEof) { fts3EvalNextRow(pCsr, pNear, &rc); - if( bEofSave==0 && pNear->iDocid==iDocid ) break; + if (bEofSave == 0 && pNear->iDocid == iDocid) + break; } - assert( rc!=SQLITE_OK || pPhrase->bIncr==0 ); - if( rc==SQLITE_OK && pNear->bEof!=bEofSave ){ + 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 ){ + if (bTreeEof) { + while (rc == SQLITE_OK && !pNear->bEof) { fts3EvalNextRow(pCsr, pNear, &rc); } } - if( rc!=SQLITE_OK ) return rc; + if (rc != SQLITE_OK) + return rc; bMatch = 1; - for(p=pNear; p; p=p->pLeft){ + 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 ); + 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 - ); + 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 ){ + } 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 - ); + 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 (bEof || iDocid != pCsr->iPrevId) + bMatch = 0; } - if( bMatch ){ + if (bMatch) { pIter = pPhrase->pOrPoslist; - }else{ + } else { pIter = 0; } } - if( pIter==0 ) return SQLITE_OK; + if (pIter == 0) + return SQLITE_OK; - if( *pIter==0x01 ){ + if (*pIter == 0x01) { pIter++; pIter += fts3GetVarint32(pIter, &iThis); - }else{ + } else { iThis = 0; } - while( iThisdoclist, and ** * any Fts3MultiSegReader objects held by phrase tokens. */ -SQLITE_PRIVATE void sqlite3Fts3EvalPhraseCleanup(Fts3Phrase *pPhrase){ - if( pPhrase ){ +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++){ + for (i = 0; i < pPhrase->nToken; i++) { fts3SegReaderCursorFree(pPhrase->aToken[i].pSegcsr); pPhrase->aToken[i].pSegcsr = 0; } } } - /* ** Return SQLITE_CORRUPT_VTAB. */ #ifdef SQLITE_DEBUG -SQLITE_PRIVATE int sqlite3Fts3Corrupt(){ +SQLITE_PRIVATE int sqlite3Fts3Corrupt() { return SQLITE_CORRUPT_VTAB; } #endif @@ -182941,11 +181156,8 @@ SQLITE_PRIVATE int sqlite3Fts3Corrupt(){ #ifdef _WIN32 __declspec(dllexport) #endif -SQLITE_API int sqlite3_fts3_init( - sqlite3 *db, - char **pzErrMsg, - const sqlite3_api_routines *pApi -){ +SQLITE_API int +sqlite3_fts3_init(sqlite3* db, char** pzErrMsg, const sqlite3_api_routines* pApi) { SQLITE_EXTENSION_INIT2(pApi) return sqlite3Fts3Init(db); } @@ -182978,54 +181190,52 @@ typedef struct Fts3auxTable Fts3auxTable; typedef struct Fts3auxCursor Fts3auxCursor; struct Fts3auxTable { - sqlite3_vtab base; /* Base class used by SQLite core */ - Fts3Table *pFts3Tab; + 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" */ + 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 */ + 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; + 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)" +#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 */ +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); @@ -183034,45 +181244,48 @@ static int fts3auxConnectMethod( ** 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; + 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) ){ + if (argc == 5) { + if (nDb == 4 && 0 == sqlite3_strnicmp("temp", zDb, 4)) { zDb = argv[3]; nDb = (int)strlen(zDb); zFts3 = argv[4]; - }else{ + } else { goto bad_args; } - }else{ + } else { zFts3 = argv[3]; } nFts3 = (int)strlen(zFts3); rc = sqlite3_declare_vtab(db, FTS3_AUX_SCHEMA); - if( rc!=SQLITE_OK ) return rc; + if (rc != SQLITE_OK) + return rc; nByte = sizeof(Fts3auxTable) + sizeof(Fts3Table) + nDb + nFts3 + 2; - p = (Fts3auxTable *)sqlite3_malloc64(nByte); - if( !p ) return SQLITE_NOMEM; + 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 = (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); + memcpy((char*)p->pFts3Tab->zDb, zDb, nDb); + memcpy((char*)p->pFts3Tab->zName, zFts3, nFts3); + sqlite3Fts3Dequote((char*)p->pFts3Tab->zName); - *ppVtab = (sqlite3_vtab *)p; + *ppVtab = (sqlite3_vtab*)p; return SQLITE_OK; - bad_args: +bad_args: sqlite3Fts3ErrMsg(pzErr, "invalid arguments to fts4aux constructor"); return SQLITE_ERROR; } @@ -183082,13 +181295,13 @@ static int fts3auxConnectMethod( ** 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; +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++){ + for (i = 0; i < SizeofArray(pFts3->aStmt); i++) { sqlite3_finalize(pFts3->aStmt[i]); } sqlite3_free(pFts3->zSegmentsTbl); @@ -183103,66 +181316,66 @@ static int fts3auxDisconnectMethod(sqlite3_vtab *pVtab){ /* ** xBestIndex - Analyze a WHERE and ORDER BY clause. */ -static int fts3auxBestIndexMethod( - sqlite3_vtab *pVTab, - sqlite3_index_info *pInfo -){ +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 */ + 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 - ){ + 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 ){ + for (i = 0; i < pInfo->nConstraint; 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 == 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 (iCol == 4) { + if (op == SQLITE_INDEX_CONSTRAINT_EQ) + iLangid = i; } } } - if( iEq>=0 ){ + if (iEq >= 0) { pInfo->idxNum = FTS4AUX_EQ_CONSTRAINT; pInfo->aConstraintUsage[iEq].argvIndex = iNext++; pInfo->estimatedCost = 5; - }else{ + } else { pInfo->idxNum = 0; pInfo->estimatedCost = 20000; - if( iGe>=0 ){ + if (iGe >= 0) { pInfo->idxNum += FTS4AUX_GE_CONSTRAINT; pInfo->aConstraintUsage[iGe].argvIndex = iNext++; pInfo->estimatedCost /= 2; } - if( iLe>=0 ){ + if (iLe >= 0) { pInfo->idxNum += FTS4AUX_LE_CONSTRAINT; pInfo->aConstraintUsage[iLe].argvIndex = iNext++; pInfo->estimatedCost /= 2; } } - if( iLangid>=0 ){ + if (iLangid >= 0) { pInfo->aConstraintUsage[iLangid].argvIndex = iNext++; pInfo->estimatedCost--; } @@ -183173,45 +181386,43 @@ static int fts3auxBestIndexMethod( /* ** xOpen - Open a cursor. */ -static int fts3auxOpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ - Fts3auxCursor *pCsr; /* Pointer to cursor object to return */ +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; + pCsr = (Fts3auxCursor*)sqlite3_malloc(sizeof(Fts3auxCursor)); + if (!pCsr) + return SQLITE_NOMEM; memset(pCsr, 0, sizeof(Fts3auxCursor)); - *ppCsr = (sqlite3_vtab_cursor *)pCsr; + *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; +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((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) - ); +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; } @@ -183221,46 +181432,48 @@ static int fts3auxGrowStatArray(Fts3auxCursor *pCsr, int nSize){ /* ** 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; +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; + for (pCsr->iCol++; pCsr->iCol < pCsr->nStat; pCsr->iCol++) { + if (pCsr->aStat[pCsr->iCol].nDoc > 0) + return SQLITE_OK; } rc = sqlite3Fts3SegReaderStep(pFts3, &pCsr->csr); - if( rc==SQLITE_ROW ){ + if (rc == SQLITE_ROW) { int i = 0; int nDoclist = pCsr->csr.nDoclist; - char *aDoclist = pCsr->csr.aDoclist; + char* aDoclist = pCsr->csr.aDoclist; int iCol; int eState = 0; - if( pCsr->zStop ){ - int n = (pCsr->nStopcsr.nTerm) ? pCsr->nStop : pCsr->csr.nTerm; + if (pCsr->zStop) { + int n = (pCsr->nStop < pCsr->csr.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) ){ + if (mc < 0 || (mc == 0 && pCsr->csr.nTerm > pCsr->nStop)) { pCsr->isEof = 1; return SQLITE_OK; } } - if( fts3auxGrowStatArray(pCsr, 2) ) return SQLITE_NOMEM; + 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++; @@ -183277,40 +181490,42 @@ static int fts3auxNextMethod(sqlite3_vtab_cursor *pCursor){ ** increment the column 0 "nDoc" count for this term. */ case 1: - assert( iCol==0 ); - if( v>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. */ + if (v == 0) { /* 0x00. Next integer will be a docid. */ eState = 0; - }else if( v==1 ){ /* 0x01. Next integer will be a column number. */ + } 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++; + } 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 ); + default: + assert(eState == 3); iCol = (int)v; - if( iCol<1 ){ + if (iCol < 1) { rc = SQLITE_CORRUPT_VTAB; break; } - if( fts3auxGrowStatArray(pCsr, iCol+2) ) return SQLITE_NOMEM; - pCsr->aStat[iCol+1].nDoc++; + if (fts3auxGrowStatArray(pCsr, iCol + 2)) + return SQLITE_NOMEM; + pCsr->aStat[iCol + 1].nDoc++; eState = 2; break; } } pCsr->iCol = 0; - }else{ + } else { pCsr->isEof = 1; } return rc; @@ -183319,77 +181534,77 @@ static int fts3auxNextMethod(sqlite3_vtab_cursor *pCursor){ /* ** 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; +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 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 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) - ); + 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 ){ + if (idxNum == FTS4AUX_EQ_CONSTRAINT) { iEq = iNext++; - }else{ + } else { isScan = 1; - if( idxNum & FTS4AUX_GE_CONSTRAINT ){ + if (idxNum & FTS4AUX_GE_CONSTRAINT) { iGe = iNext++; } - if( idxNum & FTS4AUX_LE_CONSTRAINT ){ + if (idxNum & FTS4AUX_LE_CONSTRAINT) { iLe = iNext++; } } - if( iNextfilter.zTerm); sqlite3Fts3SegReaderFinish(&pCsr->csr); - sqlite3_free((void *)pCsr->filter.zTerm); + 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; + 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 ){ + 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; + if (pCsr->filter.zTerm == 0) + return SQLITE_NOMEM; pCsr->filter.nTerm = (int)strlen(pCsr->filter.zTerm); } } - if( iLe>=0 ){ + if (iLe >= 0) { pCsr->zStop = sqlite3_mprintf("%s", sqlite3_value_text(apVal[iLe])); - if( pCsr->zStop==0 ) return SQLITE_NOMEM; + if (pCsr->zStop == 0) + return SQLITE_NOMEM; pCsr->nStop = (int)strlen(pCsr->zStop); } - if( iLangid>=0 ){ + if (iLangid >= 0) { iLangVal = sqlite3_value_int(apVal[iLangid]); /* If the user specified a negative value for the languageid, use zero @@ -183397,49 +181612,48 @@ static int fts3auxFilterMethod( ** 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; + 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 = 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); + 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; +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; +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 ){ + 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{ + if (p->iCol) { + sqlite3_result_int(pCtx, p->iCol - 1); + } else { sqlite3_result_text(pCtx, "*", -1, SQLITE_STATIC); } break; @@ -183453,7 +181667,7 @@ static int fts3auxColumnMethod( break; default: /* languageid */ - assert( iCol==4 ); + assert(iCol == 4); sqlite3_result_int(pCtx, p->iLangid); break; } @@ -183464,11 +181678,10 @@ static int fts3auxColumnMethod( /* ** 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; +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; } @@ -183477,34 +181690,34 @@ static int fts3auxRowidMethod( ** 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){ +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 */ + 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 */ + int rc; /* Return code */ rc = sqlite3_create_module(db, "fts4aux", &fts3aux_module, 0); return rc; @@ -183582,11 +181795,11 @@ SQLITE_PRIVATE int sqlite3Fts3InitAux(sqlite3 *db){ #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 +#ifdef SQLITE_ENABLE_FTS3_PARENTHESIS +#define sqlite3_fts3_enable_parentheses 1 +#else +#define sqlite3_fts3_enable_parentheses 0 +#endif #endif /* @@ -183607,15 +181820,15 @@ SQLITE_API int sqlite3_fts3_enable_parentheses = 0; */ 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 */ + 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 */ }; /* @@ -183629,8 +181842,8 @@ struct ParseContext { ** 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'; +static int fts3isspace(char c) { + return c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\v' || c == '\f'; } /* @@ -183638,30 +181851,26 @@ static int fts3isspace(char c){ ** 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); +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; +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 ){ + assert(rc == SQLITE_OK || pCsr == 0); + if (rc == SQLITE_OK) { pCsr->pTokenizer = pTokenizer; - if( pModule->iVersion>=1 ){ + if (pModule->iVersion >= 1) { rc = pModule->xLanguageid(pCsr, iLangid); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { pModule->xClose(pCsr); pCsr = 0; } @@ -183675,7 +181884,7 @@ SQLITE_PRIVATE int sqlite3Fts3OpenTokenizer( ** 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 *); +static int fts3ExprParse(ParseContext*, const char*, int, Fts3Expr**, int*); /* ** Extract the next token from buffer z (length n) using the tokenizer @@ -183689,70 +181898,68 @@ static int fts3ExprParse(ParseContext *, const char *, int, Fts3Expr **, int *); ** 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; +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; + 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; + if (rc == SQLITE_OK) { + const char* zToken; int nToken = 0, iStart = 0, iEnd = 0, iPosition = 0; - sqlite3_int64 nByte; /* total space to allocate */ + sqlite3_int64 nByte; /* total space to allocate */ rc = pModule->xNext(pCursor, &zToken, &nToken, &iStart, &iEnd, &iPosition); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { nByte = sizeof(Fts3Expr) + sizeof(Fts3Phrase) + nToken; - pRet = (Fts3Expr *)sqlite3Fts3MallocZero(nByte); - if( !pRet ){ + pRet = (Fts3Expr*)sqlite3Fts3MallocZero(nByte); + if (!pRet) { rc = SQLITE_NOMEM; - }else{ + } else { pRet->eType = FTSQUERY_PHRASE; - pRet->pPhrase = (Fts3Phrase *)&pRet[1]; + 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]; + 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]=='-' - ){ + 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]=='^' ){ + } else if (pParse->bFts4 && iStart > 0 && z[iStart - 1] == '^') { pRet->pPhrase->aToken[0].bFirst = 1; iStart--; - }else{ + } else { break; } } - } *pnConsumed = iEnd; - }else if( i && rc==SQLITE_DONE ){ + } else if (i && rc == SQLITE_DONE) { rc = SQLITE_OK; } @@ -183763,14 +181970,13 @@ static int getNextToken( 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 ){ +static void* fts3ReallocOrFree(void* pOrig, sqlite3_int64 nNew) { + void* pRet = sqlite3_realloc64(pOrig, nNew); + if (!pRet) { sqlite3_free(pOrig); } return pRet; @@ -183788,17 +181994,16 @@ static void *fts3ReallocOrFree(void *pOrig, sqlite3_int64 nNew){ ** 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; +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; + Fts3Expr* p = 0; + sqlite3_tokenizer_cursor* pCursor = 0; + char* zTemp = 0; int nTemp = 0; const int nSpace = sizeof(Fts3Expr) + sizeof(Fts3Phrase); @@ -183823,34 +182028,35 @@ static int getNextString( ** 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 ){ + rc = sqlite3Fts3OpenTokenizer(pTokenizer, pParse->iLangid, zInput, nInput, &pCursor); + if (rc == SQLITE_OK) { int ii; - for(ii=0; rc==SQLITE_OK; ii++){ - const char *zByte; + 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; + if (rc == SQLITE_OK) { + Fts3PhraseToken* pToken; - p = fts3ReallocOrFree(p, nSpace + ii*sizeof(Fts3PhraseToken)); - if( !p ) goto no_mem; + p = fts3ReallocOrFree(p, nSpace + ii * sizeof(Fts3PhraseToken)); + if (!p) + goto no_mem; zTemp = fts3ReallocOrFree(zTemp, nTemp + nByte); - if( !zTemp ) goto no_mem; + if (!zTemp) + goto no_mem; - assert( nToken==ii ); - pToken = &((Fts3Phrase *)(&p[1]))->aToken[ii]; + 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; + pToken->isPrefix = (iEnd < nInput && zInput[iEnd] == '*'); + pToken->bFirst = (iBegin > 0 && zInput[iBegin - 1] == '^'); + nToken = ii + 1; } } @@ -183858,27 +182064,28 @@ static int getNextString( pCursor = 0; } - if( rc==SQLITE_DONE ){ + if (rc == SQLITE_DONE) { int jj; - char *zBuf = 0; + 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 = 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 = (Fts3Phrase*)&p[1]; p->pPhrase->iColumn = pParse->iDefaultCol; p->pPhrase->nToken = nToken; - zBuf = (char *)&p->pPhrase->aToken[nToken]; - if( zTemp ){ + zBuf = (char*)&p->pPhrase->aToken[nToken]; + if (zTemp) { memcpy(zBuf, zTemp, nTemp); sqlite3_free(zTemp); - }else{ - assert( nTemp==0 ); + } else { + assert(nTemp == 0); } - for(jj=0; jjpPhrase->nToken; jj++){ + for (jj = 0; jj < p->pPhrase->nToken; jj++) { p->pPhrase->aToken[jj].z = zBuf; zBuf += p->pPhrase->aToken[jj].n; } @@ -183889,7 +182096,7 @@ static int getNextString( return rc; no_mem: - if( pCursor ){ + if (pCursor) { pModule->xClose(pCursor); } sqlite3_free(zTemp); @@ -183906,30 +182113,24 @@ static int getNextString( ** 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 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 } - }; + 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; + Fts3Expr* pRet = 0; - const char *zInput = z; + const char* zInput = z; int nInput = n; pParse->isNot = 0; @@ -183937,32 +182138,32 @@ static int getNextNode( /* Skip over any whitespace before checking for a keyword, an open or ** close bracket, or a quoted string. */ - while( nInput>0 && fts3isspace(*zInput) ){ + while (nInput > 0 && fts3isspace(*zInput)) { nInput--; zInput++; } - if( nInput==0 ){ + 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]; + 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 ){ + if ((pKey->parenOnly & ~sqlite3_fts3_enable_parentheses) != 0) { continue; } - if( nInput>=pKey->n && 0==memcmp(zInput, pKey->z, pKey->n) ){ + 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); + if (pKey->eType == FTSQUERY_NEAR) { + assert(nKey == 4); + if (zInput[4] == '/' && zInput[5] >= '0' && zInput[5] <= '9') { + nKey += 1 + sqlite3Fts3ReadInt(&zInput[nKey + 1], &nNear); } } @@ -183971,11 +182172,9 @@ static int getNextNode( ** parenthesis, a quote character, or EOF. */ cNext = zInput[nKey]; - if( fts3isspace(cNext) - || cNext=='"' || cNext=='(' || cNext==')' || cNext==0 - ){ - pRet = (Fts3Expr *)sqlite3Fts3MallocZero(sizeof(Fts3Expr)); - if( !pRet ){ + if (fts3isspace(cNext) || cNext == '"' || cNext == '(' || cNext == ')' || cNext == 0) { + pRet = (Fts3Expr*)sqlite3Fts3MallocZero(sizeof(Fts3Expr)); + if (!pRet) { return SQLITE_NOMEM; } pRet->eType = pKey->eType; @@ -183996,28 +182195,31 @@ static int getNextNode( ** 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; + 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); + rc = fts3ExprParse(pParse, zInput + 1, nInput - 1, ppExpr, &nConsumed); *pnConsumed = (int)(zInput - z) + 1 + nConsumed; return rc; - }else if( *zInput==')' ){ + } else if (*zInput == ')') { pParse->nNest--; *pnConsumed = (int)((zInput - z) + 1); *ppExpr = 0; @@ -184038,18 +182240,16 @@ static int getNextNode( */ iCol = pParse->iDefaultCol; iColLen = 0; - for(ii=0; iinCol; ii++){ - const char *zStr = pParse->azCol[ii]; + for (ii = 0; ii < pParse->nCol; ii++) { + const char* zStr = pParse->azCol[ii]; int nStr = (int)strlen(zStr); - if( nInput>nStr && zInput[nStr]==':' - && sqlite3_strnicmp(zStr, zInput, nStr)==0 - ){ + 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); + rc = getNextToken(pParse, iCol, &z[iColLen], n - iColLen, ppExpr, pnConsumed); *pnConsumed += iColLen; return rc; } @@ -184073,16 +182273,16 @@ static int getNextNode( ** 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 ){ +static int opPrecedence(Fts3Expr* p) { + assert(p->eType != FTSQUERY_PHRASE); + if (sqlite3_fts3_enable_parentheses) { return p->eType; - }else if( p->eType==FTSQUERY_NEAR ){ + } else if (p->eType == FTSQUERY_NEAR) { return 1; - }else if( p->eType==FTSQUERY_OR ){ + } else if (p->eType == FTSQUERY_OR) { return 2; } - assert( p->eType==FTSQUERY_AND ); + assert(p->eType == FTSQUERY_AND); return 3; } @@ -184094,21 +182294,20 @@ static int opPrecedence(Fts3Expr *p){ ** 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) ){ +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 ); + if (pSplit->pParent) { + assert(pSplit->pParent->pRight == pSplit); pSplit->pParent->pRight = pNew; pNew->pParent = pSplit->pParent; - }else{ + } else { *ppHead = pNew; } pNew->pLeft = pSplit; @@ -184125,36 +182324,33 @@ static void insertBinaryOperator( ** 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 */ +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; + const char* zIn = z; int rc = SQLITE_OK; int isRequirePhrase = 1; - while( rc==SQLITE_OK ){ - Fts3Expr *p = 0; + 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 ){ + 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 - ){ + if (!sqlite3_fts3_enable_parentheses && p->eType == FTSQUERY_PHRASE && pParse->isNot) { /* Create an implicit NOT operator. */ - Fts3Expr *pNot = sqlite3Fts3MallocZero(sizeof(Fts3Expr)); - if( !pNot ){ + Fts3Expr* pNot = sqlite3Fts3MallocZero(sizeof(Fts3Expr)); + if (!pNot) { sqlite3Fts3ExprFree(p); rc = SQLITE_NOMEM; goto exprparse_out; @@ -184162,33 +182358,33 @@ static int fts3ExprParse( pNot->eType = FTSQUERY_NOT; pNot->pRight = p; p->pParent = pNot; - if( pNotBranch ){ + if (pNotBranch) { pNot->pLeft = pNotBranch; pNotBranch->pParent = pNot; } pNotBranch = pNot; p = pPrev; - }else{ + } else { int eType = p->eType; - isPhrase = (eType==FTSQUERY_PHRASE || p->pLeft); + 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 ){ + if (!isPhrase && isRequirePhrase) { sqlite3Fts3ExprFree(p); rc = SQLITE_ERROR; goto exprparse_out; } - if( isPhrase && !isRequirePhrase ){ + if (isPhrase && !isRequirePhrase) { /* Insert an implicit AND operator. */ - Fts3Expr *pAnd; - assert( pRet && pPrev ); + Fts3Expr* pAnd; + assert(pRet && pPrev); pAnd = sqlite3Fts3MallocZero(sizeof(Fts3Expr)); - if( !pAnd ){ + if (!pAnd) { sqlite3Fts3ExprFree(p); rc = SQLITE_NOMEM; goto exprparse_out; @@ -184207,49 +182403,47 @@ static int fts3ExprParse( ** ** Return an error in either case. */ - if( pPrev && ( - (eType==FTSQUERY_NEAR && !isPhrase && pPrev->eType!=FTSQUERY_PHRASE) - || (eType!=FTSQUERY_PHRASE && isPhrase && pPrev->eType==FTSQUERY_NEAR) - )){ + 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 ); + if (isPhrase) { + if (pRet) { + assert(pPrev && pPrev->pLeft && pPrev->pRight == 0); pPrev->pRight = p; p->pParent = pPrev; - }else{ + } else { pRet = p; } - }else{ + } else { insertBinaryOperator(&pRet, pPrev, p); } isRequirePhrase = !isPhrase; } pPrev = p; } - assert( nByte>0 ); + assert(nByte > 0); } - assert( rc!=SQLITE_OK || (nByte>0 && nByte<=nIn) ); + assert(rc != SQLITE_OK || (nByte > 0 && nByte <= nIn)); nIn -= nByte; zIn += nByte; } - if( rc==SQLITE_DONE && pRet && isRequirePhrase ){ + if (rc == SQLITE_DONE && pRet && isRequirePhrase) { rc = SQLITE_ERROR; } - if( rc==SQLITE_DONE ){ + if (rc == SQLITE_DONE) { rc = SQLITE_OK; - if( !sqlite3_fts3_enable_parentheses && pNotBranch ){ - if( !pRet ){ + if (!sqlite3_fts3_enable_parentheses && pNotBranch) { + if (!pRet) { rc = SQLITE_ERROR; - }else{ - Fts3Expr *pIter = pNotBranch; - while( pIter->pLeft ){ + } else { + Fts3Expr* pIter = pNotBranch; + while (pIter->pLeft) { pIter = pIter->pLeft; } pIter->pLeft = pRet; @@ -184261,7 +182455,7 @@ static int fts3ExprParse( *pnConsumed = n - nIn; exprparse_out: - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { sqlite3Fts3ExprFree(pRet); sqlite3Fts3ExprFree(pNotBranch); pRet = 0; @@ -184274,15 +182468,15 @@ static int fts3ExprParse( ** 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){ +static int fts3ExprCheckDepth(Fts3Expr* p, int nMaxDepth) { int rc = SQLITE_OK; - if( p ){ - if( nMaxDepth<0 ){ + 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); + } else { + rc = fts3ExprCheckDepth(p->pLeft, nMaxDepth - 1); + if (rc == SQLITE_OK) { + rc = fts3ExprCheckDepth(p->pRight, nMaxDepth - 1); } } } @@ -184300,57 +182494,58 @@ static int fts3ExprCheckDepth(Fts3Expr *p, int nMaxDepth){ ** 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 */ +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 ){ + 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 ){ + 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); + } else { + memset(apLeaf, 0, sizeof(Fts3Expr*) * nMaxDepth); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { int i; - Fts3Expr *p; + 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 ); + 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 ){ + while (1) { int iLvl; - Fts3Expr *pParent = p->pParent; /* Current parent of p */ + Fts3Expr* pParent = p->pParent; /* Current parent of p */ - assert( pParent==0 || pParent->pLeft==p ); + assert(pParent == 0 || pParent->pLeft == p); p->pParent = 0; - if( pParent ){ + if (pParent) { pParent->pLeft = 0; - }else{ + } else { pRoot = 0; } - rc = fts3ExprBalance(&p, nMaxDepth-1); - if( rc!=SQLITE_OK ) break; + rc = fts3ExprBalance(&p, nMaxDepth - 1); + if (rc != SQLITE_OK) + break; - for(iLvl=0; p && iLvlpLeft = apLeaf[iLvl]; pFree->pRight = p; pFree->pLeft->pParent = pFree; @@ -184362,25 +182557,27 @@ static int fts3ExprBalance(Fts3Expr **pp, int nMaxDepth){ apLeaf[iLvl] = 0; } } - if( p ){ + if (p) { sqlite3Fts3ExprFree(p); rc = SQLITE_TOOBIG; break; } /* If that was the last leaf node, break out of the loop */ - if( pParent==0 ) break; + 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); + for (p = pParent->pRight; p->eType == eType; p = p->pLeft) + ; /* Remove pParent from the original tree. */ - assert( pParent->pParent==0 || pParent->pParent->pLeft==pParent ); + assert(pParent->pParent == 0 || pParent->pParent->pLeft == pParent); pParent->pRight->pParent = pParent->pParent; - if( pParent->pParent ){ + if (pParent->pParent) { pParent->pParent->pLeft = pParent->pRight; - }else{ - assert( pParent==pRoot ); + } else { + assert(pParent == pRoot); pRoot = pParent->pRight; } @@ -184390,15 +182587,15 @@ static int fts3ExprBalance(Fts3Expr **pp, int nMaxDepth){ pFree = pParent; } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { p = 0; - for(i=0; ipParent = 0; - }else{ - assert( pFree!=0 ); + } else { + assert(pFree != 0); pFree->pRight = p; pFree->pLeft = apLeaf[i]; pFree->pLeft->pParent = pFree; @@ -184411,42 +182608,42 @@ static int fts3ExprBalance(Fts3Expr **pp, int nMaxDepth){ } } pRoot = p; - }else{ + } 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 ); + assert(pFree == 0); + sqlite3_free(apLeaf); } - }else if( eType==FTSQUERY_NOT ){ - Fts3Expr *pLeft = pRoot->pLeft; - Fts3Expr *pRight = pRoot->pRight; + } 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); + rc = fts3ExprBalance(&pLeft, nMaxDepth - 1); + if (rc == SQLITE_OK) { + rc = fts3ExprBalance(&pRight, nMaxDepth - 1); } - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { sqlite3Fts3ExprFree(pRight); sqlite3Fts3ExprFree(pLeft); - }else{ - assert( pLeft && pRight ); + } else { + assert(pLeft && pRight); pRoot->pLeft = pLeft; pLeft->pParent = pRoot; pRoot->pRight = pRight; @@ -184455,7 +182652,7 @@ static int fts3ExprBalance(Fts3Expr **pp, int nMaxDepth){ } } - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { sqlite3Fts3ExprFree(pRoot); pRoot = 0; } @@ -184474,16 +182671,15 @@ static int fts3ExprBalance(Fts3Expr **pp, int nMaxDepth){ ** 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 */ -){ +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; @@ -184491,22 +182687,22 @@ static int fts3ExprParseUnbalanced( memset(&sParse, 0, sizeof(ParseContext)); sParse.pTokenizer = pTokenizer; sParse.iLangid = iLangid; - sParse.azCol = (const char **)azCol; + sParse.azCol = (const char**)azCol; sParse.nCol = nCol; sParse.iDefaultCol = iDefaultCol; sParse.bFts4 = bFts4; - if( z==0 ){ + if (z == 0) { *ppExpr = 0; return SQLITE_OK; } - if( n<0 ){ + if (n < 0) { n = (int)strlen(z); } rc = fts3ExprParse(&sParse, z, n, ppExpr, &nParsed); - assert( rc==SQLITE_OK || *ppExpr==0 ); + assert(rc == SQLITE_OK || *ppExpr == 0); /* Check for mismatched parenthesis */ - if( rc==SQLITE_OK && sParse.nNest ){ + if (rc == SQLITE_OK && sParse.nNest) { rc = SQLITE_ERROR; } @@ -184537,40 +182733,34 @@ static int fts3ExprParseUnbalanced( ** 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 - ); +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 ){ + if (rc == SQLITE_OK && *ppExpr) { rc = fts3ExprBalance(ppExpr, SQLITE_FTS3_MAX_EXPR_DEPTH); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = fts3ExprCheckDepth(*ppExpr, SQLITE_FTS3_MAX_EXPR_DEPTH); } } - if( rc!=SQLITE_OK ){ + 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 - ); + 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 ){ + } else if (rc == SQLITE_ERROR) { sqlite3Fts3ErrMsg(pzErr, "malformed MATCH expression: [%s]", z); } } @@ -184581,8 +182771,8 @@ SQLITE_PRIVATE int sqlite3Fts3ExprParse( /* ** Free a single node of an expression tree. */ -static void fts3FreeExprNode(Fts3Expr *p){ - assert( p->eType==FTSQUERY_PHRASE || p->pPhrase==0 ); +static void fts3FreeExprNode(Fts3Expr* p) { + assert(p->eType == FTSQUERY_PHRASE || p->pPhrase == 0); sqlite3Fts3EvalPhraseCleanup(p->pPhrase); sqlite3_free(p->aMI); sqlite3_free(p); @@ -184595,22 +182785,22 @@ static void fts3FreeExprNode(Fts3Expr *p){ ** 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 ); +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; + while (p) { + Fts3Expr* pParent = p->pParent; fts3FreeExprNode(p); - if( pParent && p==pParent->pLeft && pParent->pRight ){ + 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 ); + while (p && (p->pLeft || p->pRight)) { + assert(p == p->pParent->pRight || p == p->pParent->pLeft); p = (p->pLeft ? p->pLeft : p->pRight); } - }else{ + } else { p = pParent; } } @@ -184635,21 +182825,17 @@ SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *pDel){ ** 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 ){ +static char* exprToString(Fts3Expr* pExpr, char* zBuf) { + if (pExpr == 0) { return sqlite3_mprintf(""); } - switch( pExpr->eType ){ + switch (pExpr->eType) { case FTSQUERY_PHRASE: { - Fts3Phrase *pPhrase = pExpr->pPhrase; + 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?"+":"") - ); + zBuf = sqlite3_mprintf("%zPHRASE %d 0", zBuf, pPhrase->iColumn); + for (i = 0; zBuf && i < pPhrase->nToken; i++) { + zBuf = sqlite3_mprintf("%z %.*s%s", zBuf, pPhrase->aToken[i].n, pPhrase->aToken[i].z, (pPhrase->aToken[i].isPrefix ? "+" : "")); } return zBuf; } @@ -184668,12 +182854,17 @@ static char *exprToString(Fts3Expr *pExpr, char *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 = 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); + if (zBuf) + zBuf = exprToString(pExpr->pRight, zBuf); + if (zBuf) + zBuf = sqlite3_mprintf("%z}", zBuf); return zBuf; } @@ -184692,75 +182883,64 @@ static char *exprToString(Fts3Expr *pExpr, char *zBuf){ ** ** 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; +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; + 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 - ); + 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 ){ + if (rc != SQLITE_OK) { + if (rc == SQLITE_NOMEM) { sqlite3_result_error_nomem(context); - }else{ + } else { sqlite3_result_error(context, zErr, -1); } sqlite3_free(zErr); return; } - zExpr = (const char *)sqlite3_value_text(argv[1]); + 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 ){ + 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 -){ +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 -){ +static void fts3ExprTestRebalance(sqlite3_context* context, int argc, sqlite3_value** argv) { fts3ExprTestCommon(1, context, argc, argv); } @@ -184793,14 +182965,10 @@ static void fts3ExprTestRebalance( ** 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 - ); +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; } @@ -184847,14 +183015,14 @@ SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db, Fts3Hash *pHash /* ** Malloc and Free functions */ -static void *fts3HashMalloc(sqlite3_int64 n){ - void *p = sqlite3_malloc64(n); - if( p ){ +static void* fts3HashMalloc(sqlite3_int64 n) { + void* p = sqlite3_malloc64(n); + if (p) { memset(p, 0, n); } return p; } -static void fts3HashFree(void *p){ +static void fts3HashFree(void* p) { sqlite3_free(p); } @@ -184868,9 +183036,9 @@ static void fts3HashFree(void *p){ ** 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 ); +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; @@ -184883,18 +183051,18 @@ SQLITE_PRIVATE void sqlite3Fts3HashInit(Fts3Hash *pNew, char keyClass, char copy ** 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 */ +SQLITE_PRIVATE void sqlite3Fts3HashClear(Fts3Hash* pH) { + Fts3HashElem* elem; /* For looping over all elements of the table */ - assert( pH!=0 ); + 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 ){ + while (elem) { + Fts3HashElem* next_elem = elem->next; + if (pH->copyKey && elem->pKey) { fts3HashFree(elem->pKey); } fts3HashFree(elem); @@ -184906,35 +183074,38 @@ SQLITE_PRIVATE void sqlite3Fts3HashClear(Fts3Hash *pH){ /* ** 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; +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++; + 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); +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){ +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++); + 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); +static int fts3BinCompare(const void* pKey1, int n1, const void* pKey2, int n2) { + if (n1 != n2) + return 1; + return memcmp(pKey1, pKey2, n1); } /* @@ -184949,11 +183120,11 @@ static int fts3BinCompare(const void *pKey1, int n1, const void *pKey2, int n2){ ** 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 ){ +static int (*ftsHashFunction(int keyClass))(const void*, int) { + if (keyClass == FTS3_HASH_STRING) { return &fts3StrHash; - }else{ - assert( keyClass==FTS3_HASH_BINARY ); + } else { + assert(keyClass == FTS3_HASH_BINARY); return &fts3BinHash; } } @@ -184964,33 +183135,37 @@ static int (*ftsHashFunction(int keyClass))(const void*,int){ ** 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 ){ +static int (*ftsCompareFunction(int keyClass))(const void*, int, const void*, int) { + if (keyClass == FTS3_HASH_STRING) { return &fts3StrCompare; - }else{ - assert( keyClass==FTS3_HASH_BINARY ); + } 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 */ + */ +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 ){ + if (pHead) { pNew->next = pHead; pNew->prev = pHead->prev; - if( pHead->prev ){ pHead->prev->next = pNew; } - else { pH->first = pNew; } + if (pHead->prev) { + pHead->prev->next = pNew; + } else { + pH->first = pNew; + } pHead->prev = pNew; - }else{ + } else { pNew->next = pH->first; - if( pH->first ){ pH->first->prev = pNew; } + if (pH->first) { + pH->first->prev = pNew; + } pNew->prev = 0; pH->first = pNew; } @@ -184998,27 +183173,27 @@ static void fts3HashInsertElement( 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 */ +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; + 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); + 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); } @@ -185029,23 +183204,21 @@ static int fts3Rehash(Fts3Hash *pH, int new_size){ ** 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 */ +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]; + 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 ){ + while (count-- && elem) { + if ((*xCompare)(elem->pKey, elem->nKey, pKey, nKey) == 0) { return elem; } elem = elem->next; @@ -185057,54 +183230,50 @@ static Fts3HashElem *fts3FindElementByHash( /* 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 ){ +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{ + } else { pH->first = elem->next; } - if( elem->next ){ + if (elem->next) { elem->next->prev = elem->prev; } pEntry = &pH->ht[h]; - if( pEntry->chain==elem ){ + if (pEntry->chain == elem) { pEntry->chain = elem->next; } pEntry->count--; - if( pEntry->count<=0 ){ + if (pEntry->count <= 0) { pEntry->chain = 0; } - if( pH->copyKey && elem->pKey ){ + if (pH->copyKey && elem->pKey) { fts3HashFree(elem->pKey); } - fts3HashFree( elem ); + fts3HashFree(elem); pH->count--; - if( pH->count<=0 ){ - assert( pH->first==0 ); - assert( pH->count==0 ); + 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 -){ +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 */ + int (*xHash)(const void*, int); /* The hash function */ - if( pH==0 || pH->ht==0 ) return 0; + 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)); + assert(xHash != 0); + h = (*xHash)(pKey, nKey); + assert((pH->htsize & (pH->htsize - 1)) == 0); + return fts3FindElementByHash(pH, pKey, nKey, h & (pH->htsize - 1)); } /* @@ -185112,8 +183281,8 @@ SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem( ** 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) */ +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; @@ -185134,59 +183303,58 @@ SQLITE_PRIVATE void *sqlite3Fts3HashFind(const Fts3Hash *pH, const void *pKey, i ** 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 */ +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 ); + assert(pH != 0); xHash = ftsHashFunction(pH->keyClass); - assert( xHash!=0 ); + 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{ + 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)) - ){ + 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 ){ + 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{ + } 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); + 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; @@ -185234,7 +183402,7 @@ SQLITE_PRIVATE void *sqlite3Fts3HashInsert( ** Class derived from sqlite3_tokenizer */ typedef struct porter_tokenizer { - sqlite3_tokenizer base; /* Base class */ + sqlite3_tokenizer base; /* Base class */ } porter_tokenizer; /* @@ -185242,29 +183410,26 @@ typedef struct porter_tokenizer { */ 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 */ + 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; +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; + t = (porter_tokenizer*)sqlite3_malloc(sizeof(*t)); + if (t == NULL) + return SQLITE_NOMEM; memset(t, 0, sizeof(*t)); *ppTokenizer = &t->base; return SQLITE_OK; @@ -185273,7 +183438,7 @@ static int porterCreate( /* ** Destroy a tokenizer */ -static int porterDestroy(sqlite3_tokenizer *pTokenizer){ +static int porterDestroy(sqlite3_tokenizer* pTokenizer) { sqlite3_free(pTokenizer); return SQLITE_OK; } @@ -185284,29 +183449,29 @@ static int porterDestroy(sqlite3_tokenizer *pTokenizer){ ** 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; +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 = (porter_tokenizer_cursor*)sqlite3_malloc(sizeof(*c)); + if (c == NULL) + return SQLITE_NOMEM; c->zInput = zInput; - if( zInput==0 ){ + if (zInput == 0) { c->nInput = 0; - }else if( nInput<0 ){ + } else if (nInput < 0) { c->nInput = (int)strlen(zInput); - }else{ + } else { c->nInput = nInput; } - c->iOffset = 0; /* start tokenizing at the beginning */ + c->iOffset = 0; /* start tokenizing at the beginning */ c->iToken = 0; - c->zToken = NULL; /* no space allocated, yet. */ + c->zToken = NULL; /* no space allocated, yet. */ c->nAllocated = 0; *ppCursor = &c->base; @@ -185317,8 +183482,8 @@ static int porterOpen( ** 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; +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; @@ -185326,10 +183491,7 @@ static int porterClose(sqlite3_tokenizer_cursor *pCursor){ /* ** 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 -}; +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 @@ -185345,22 +183507,26 @@ static const char cType[] = { ** consonent. */ static int isVowel(const char*); -static int isConsonant(const char *z){ +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); + 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){ +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; + if (x == 0) + return 0; + assert(x >= 'a' && x <= 'z'); + j = cType[x - 'a']; + if (j < 2) + return 1 - j; return isConsonant(z + 1); } @@ -185383,47 +183549,76 @@ static int isVowel(const char *z){ ** 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; +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; +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; +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; +static int hasVowel(const char* z) { + while (isConsonant(z)) { + z++; + } + return *z != 0; } /* @@ -185432,8 +183627,8 @@ static int hasVowel(const char *z){ ** 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]; +static int doubleConsonant(const char* z) { + return isConsonant(z) && z[0] == z[1]; } /* @@ -185444,12 +183639,8 @@ static int doubleConsonant(const char *z){ ** 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); +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); } /* @@ -185464,17 +183655,21 @@ static int star_oh(const char *z){ ** 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 ){ +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; @@ -185489,21 +183684,22 @@ static int stem( ** 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){ +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' ){ + if (c >= 'A' && c <= 'Z') { zOut[i] = c - 'A' + 'a'; - }else{ - if( c>='0' && c<='9' ) hasDigit = 1; + } 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 mx * 2) { + for (j = mx, i = nIn - mx; i < nIn; i++, j++) { zOut[j] = zOut[i]; } i = j; @@ -185512,7 +183708,6 @@ static void copy_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ *pnOut = i; } - /* ** Stem the input word zIn[0..nIn-1]. Store the output in zOut. ** zOut is at least big enough to hold nIn bytes. Write the actual @@ -185536,226 +183731,202 @@ static void copy_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ ** Stemming never increases the length of the word. So there is ** no chance of overflowing the zOut buffer. */ -static void porter_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ +static void porter_stemmer(const char* zIn, int nIn, char* zOut, int* pnOut) { int i, j; char zReverse[28]; char *z, *z2; - if( nIn<3 || nIn>=(int)sizeof(zReverse)-7 ){ + if (nIn < 3 || nIn >= (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' ){ + if (c >= 'A' && c <= 'Z') { zReverse[j] = c + 'a' - 'A'; - }else if( c>='a' && c<='z' ){ + } else if (c >= 'a' && c <= 'z') { zReverse[j] = c; - }else{ + } 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]; - + 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) - ){ + 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) ){ + 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'; - } + } 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) ){ + 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; + 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; + 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; + 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) ){ + if (z[0] == 'e') { + if (m_gt_1(z + 1)) { z++; - }else if( m_eq_1(z+1) && !star_oh(z+1) ){ + } 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' ){ + if (m_gt_1(z) && z[0] == 'l' && z[1] == 'l') { z++; } @@ -185764,7 +183935,7 @@ static void porter_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ */ *pnOut = i = (int)strlen(z); zOut[i] = 0; - while( *z ){ + while (*z) { zOut[--i] = *(z++); } } @@ -185776,51 +183947,51 @@ static void porter_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ ** 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 */ + /* 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])) +#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; +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 ){ + while (c->iOffset < c->nInput) { int iStartOffset, ch; /* Scan past delimiter characters */ - while( c->iOffsetnInput && isDelim(z[c->iOffset]) ){ + while (c->iOffset < c->nInput && isDelim(z[c->iOffset])) { c->iOffset++; } /* Count non-delimiter characters. */ iStartOffset = c->iOffset; - while( c->iOffsetnInput && !isDelim(z[c->iOffset]) ){ + while (c->iOffset < c->nInput && !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; + if (c->iOffset > iStartOffset) { + int n = c->iOffset - iStartOffset; + if (n > c->nAllocated) { + char* pNew; + c->nAllocated = n + 20; pNew = sqlite3_realloc64(c->zToken, c->nAllocated); - if( !pNew ) return SQLITE_NOMEM; + if (!pNew) + return SQLITE_NOMEM; c->zToken = pNew; } porter_stemmer(&z[iStartOffset], n, c->zToken, pnBytes); @@ -185837,23 +184008,13 @@ static int porterNext( /* ** The set of routines that implement the porter-stemmer tokenizer */ -static const sqlite3_tokenizer_module porterTokenizerModule = { - 0, - porterCreate, - porterDestroy, - porterOpen, - porterClose, - porterNext, - 0 -}; +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 -){ +SQLITE_PRIVATE void sqlite3Fts3PorterTokenizerModule(sqlite3_tokenizer_module const** ppModule) { *ppModule = &porterTokenizerModule; } @@ -185897,10 +184058,10 @@ SQLITE_PRIVATE void sqlite3Fts3PorterTokenizerModule( ** 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); +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); + sqlite3_db_config(db, SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, -1, &isEnabled); return isEnabled; } @@ -185924,175 +184085,175 @@ static int fts3TokenizerEnabled(sqlite3_context *context){ ** 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; +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 ); + assert(argc == 1 || argc == 2); - pHash = (Fts3Hash *)sqlite3_user_data(context); + pHash = (Fts3Hash*)sqlite3_user_data(context); zName = sqlite3_value_text(argv[0]); - nName = sqlite3_value_bytes(argv[0])+1; + nName = sqlite3_value_bytes(argv[0]) + 1; - if( argc==2 ){ - if( fts3TokenizerEnabled(context) || sqlite3_value_frombind(argv[1]) ){ - void *pOld; + 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) ){ + 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 ){ + 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{ + } else { sqlite3_result_error(context, "fts3tokenize disabled", -1); return; } - }else{ - if( zName ){ + } else { + if (zName) { pPtr = sqlite3Fts3HashFind(pHash, zName, nName); } - if( !pPtr ){ - char *zErr = sqlite3_mprintf("unknown tokenizer: %s", zName); + 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); + if (fts3TokenizerEnabled(context) || sqlite3_value_frombind(argv[0])) { + sqlite3_result_blob(context, (void*)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT); } } -SQLITE_PRIVATE int sqlite3Fts3IsIdChar(char c){ +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 */ + 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)]); + return (c & 0x80 || isFtsIdChar[(int)(c)]); } -SQLITE_PRIVATE const char *sqlite3Fts3NextToken(const char *zStr, int *pn){ - const char *z1; - const char *z2 = 0; +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 ){ + while (z2 == 0) { char c = *z1; - switch( c ){ - case '\0': return 0; /* No more tokens here */ + switch (c) { + case '\0': + return 0; /* No more tokens here */ case '\'': case '"': case '`': { z2 = z1; - while( *++z2 && (*z2!=c || *++z2==c) ); + while (*++z2 && (*z2 != c || *++z2 == c)) + ; break; } case '[': z2 = &z1[1]; - while( *z2 && z2[0]!=']' ) z2++; - if( *z2 ) z2++; + while (*z2 && z2[0] != ']') + z2++; + if (*z2) + z2++; break; default: - if( sqlite3Fts3IsIdChar(*z1) ){ + if (sqlite3Fts3IsIdChar(*z1)) { z2 = &z1[1]; - while( sqlite3Fts3IsIdChar(*z2) ) z2++; - }else{ + while (sqlite3Fts3IsIdChar(*z2)) + z2++; + } else { z1++; } } } - *pn = (int)(z2-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 */ -){ +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; + char* z = (char*)zArg; int n = 0; - char *zCopy; - char *zEnd; /* Pointer to nul-term of zCopy */ - sqlite3_tokenizer_module *m; + char* zCopy; + char* zEnd; /* Pointer to nul-term of zCopy */ + sqlite3_tokenizer_module* m; zCopy = sqlite3_mprintf("%s", zArg); - if( !zCopy ) return SQLITE_NOMEM; + if (!zCopy) + return SQLITE_NOMEM; zEnd = &zCopy[strlen(zCopy)]; - z = (char *)sqlite3Fts3NextToken(zCopy, &n); - if( z==0 ){ - assert( n==0 ); + 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 ){ + 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; + } 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 ){ + assert(rc != SQLITE_OK || *ppTok); + if (rc != SQLITE_OK) { sqlite3Fts3ErrMsg(pzErr, "unknown tokenizer"); - }else{ + } else { (*ppTok)->pModule = m; } - sqlite3_free((void *)aArg); + sqlite3_free((void*)aArg); } sqlite3_free(zCopy); return rc; } - #ifdef SQLITE_TEST #if defined(INCLUDE_SQLITE_TCL_H) -# include "sqlite_tcl.h" +#include "sqlite_tcl.h" #else -# include "tcl.h" +#include "tcl.h" #endif /* #include */ @@ -186121,49 +184282,45 @@ SQLITE_PRIVATE int sqlite3Fts3InitTokenizer( ** "{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; +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* zErr = 0; - const char *zName; + const char* zName; int nName; - const char *zInput; + const char* zInput; int nInput; - const char *azArg[64]; + const char* azArg[64]; - const char *zToken; + const char* zToken; int nToken = 0; int iStart = 0; int iEnd = 0; int iPos = 0; int i; - Tcl_Obj *pRet; + Tcl_Obj* pRet; - if( argc<2 ){ + 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]); + 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); + 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); + if (!p) { + char* zErr2 = sqlite3_mprintf("unknown tokenizer: %s", zName); sqlite3_result_error(context, zErr2, -1); sqlite3_free(zErr2); return; @@ -186172,58 +184329,53 @@ static void testFunc( pRet = Tcl_NewObj(); Tcl_IncrRefCount(pRet); - for(i=1; ixCreate(argc-2, azArg, &pTokenizer) ){ + if (SQLITE_OK != p->xCreate(argc - 2, azArg, &pTokenizer)) { zErr = "error in xCreate()"; goto finish; } pTokenizer->pModule = p; - if( sqlite3Fts3OpenTokenizer(pTokenizer, 0, zInput, nInput, &pCsr) ){ + if (sqlite3Fts3OpenTokenizer(pTokenizer, 0, zInput, nInput, &pCsr)) { zErr = "error in xOpen()"; goto finish; } - while( SQLITE_OK==p->xNext(pCsr, &zToken, &nToken, &iStart, &iEnd, &iPos) ){ + 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; + nToken = iEnd - iStart; Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zToken, nToken)); } - if( SQLITE_OK!=p->xClose(pCsr) ){ + if (SQLITE_OK != p->xClose(pCsr)) { zErr = "error in xClose()"; goto finish; } - if( SQLITE_OK!=p->xDestroy(pTokenizer) ){ + if (SQLITE_OK != p->xDestroy(pTokenizer)) { zErr = "error in xDestroy()"; goto finish; } finish: - if( zErr ){ + if (zErr) { sqlite3_result_error(context, zErr, -1); - }else{ + } 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 -){ +static int registerTokenizer(sqlite3* db, char* zName, const sqlite3_tokenizer_module* p) { int rc; - sqlite3_stmt *pStmt; + sqlite3_stmt* pStmt; const char zSql[] = "SELECT fts3_tokenizer(?, ?)"; rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } @@ -186234,36 +184386,28 @@ int registerTokenizer( return sqlite3_finalize(pStmt); } - -static -int queryTokenizer( - sqlite3 *db, - char *zName, - const sqlite3_tokenizer_module **pp -){ +static int queryTokenizer(sqlite3* db, char* zName, const sqlite3_tokenizer_module** pp) { int rc; - sqlite3_stmt *pStmt; + sqlite3_stmt* pStmt; const char zSql[] = "SELECT fts3_tokenizer(?)"; *pp = 0; rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); - if( rc!=SQLITE_OK ){ + 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)); + 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); +SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule(sqlite3_tokenizer_module const** ppModule); /* ** Implementation of the scalar function fts3_tokenizer_internal_test(). @@ -186283,15 +184427,11 @@ SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule(sqlite3_tokenizer_module co ** SELECT fts3_tokenizer_internal_test(); ** */ -static void intTestFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ +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); + const sqlite3_tokenizer_module* p1; + const sqlite3_tokenizer_module* p2; + sqlite3* db = (sqlite3*)sqlite3_user_data(context); UNUSED_PARAMETER(argc); UNUSED_PARAMETER(argv); @@ -186299,20 +184439,20 @@ static void intTestFunc( /* Test the query function */ sqlite3Fts3SimpleTokenizerModule(&p1); rc = queryTokenizer(db, "simple", &p2); - assert( rc==SQLITE_OK ); - assert( p1==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") ); + assert(rc == SQLITE_ERROR); + assert(p2 == 0); + assert(0 == strcmp(sqlite3_errmsg(db), "unknown tokenizer: nosuchtokenizer")); /* Test the storage function */ - if( fts3TokenizerEnabled(context) ){ + if (fts3TokenizerEnabled(context)) { rc = registerTokenizer(db, "nosuchtokenizer", p1); - assert( rc==SQLITE_OK ); + assert(rc == SQLITE_OK); rc = queryTokenizer(db, "nosuchtokenizer", &p2); - assert( rc==SQLITE_OK ); - assert( p2==p1 ); + assert(rc == SQLITE_OK); + assert(p2 == p1); } sqlite3_result_text(context, "ok", -1, SQLITE_STATIC); @@ -186337,37 +184477,33 @@ static void intTestFunc( ** 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 -){ +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; + void* p = (void*)pHash; + const int any = SQLITE_UTF8 | SQLITE_DIRECTONLY; #ifdef SQLITE_TEST - char *zTest = 0; - char *zTest2 = 0; - void *pdb = (void *)db; + 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 ){ + if (!zTest || !zTest2) { rc = SQLITE_NOMEM; } #endif - if( SQLITE_OK==rc ){ + if (SQLITE_OK == rc) { rc = sqlite3_create_function(db, zName, 1, any, p, fts3TokenizerFunc, 0, 0); } - if( SQLITE_OK==rc ){ + if (SQLITE_OK == rc) { rc = sqlite3_create_function(db, zName, 2, any, p, fts3TokenizerFunc, 0, 0); } #ifdef SQLITE_TEST - if( SQLITE_OK==rc ){ + if (SQLITE_OK == rc) { rc = sqlite3_create_function(db, zTest, -1, any, p, testFunc, 0, 0); } - if( SQLITE_OK==rc ){ + if (SQLITE_OK == rc) { rc = sqlite3_create_function(db, zTest2, 0, any, pdb, intTestFunc, 0, 0); } #endif @@ -186420,38 +184556,35 @@ SQLITE_PRIVATE int sqlite3Fts3InitHashTable( typedef struct simple_tokenizer { sqlite3_tokenizer base; - char delim[128]; /* flag ASCII delimiters */ + 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 */ + 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 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'); +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; +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; + 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, @@ -186459,12 +184592,12 @@ static int simpleCreate( ** track such information in the database, then we'd only want this ** information on the initial create. */ - if( argc>1 ){ + if (argc > 1) { int i, n = (int)strlen(argv[1]); - for(i=0; i=0x80 ){ + if (ch >= 0x80) { sqlite3_free(t); return SQLITE_ERROR; } @@ -186473,7 +184606,7 @@ static int simpleCreate( } else { /* Mark non-alphanumeric ASCII characters as delimiters */ int i; - for(i=1; i<0x80; i++){ + for (i = 1; i < 0x80; i++) { t->delim[i] = !fts3_isalnum(i) ? -1 : 0; } } @@ -186485,7 +184618,7 @@ static int simpleCreate( /* ** Destroy a tokenizer */ -static int simpleDestroy(sqlite3_tokenizer *pTokenizer){ +static int simpleDestroy(sqlite3_tokenizer* pTokenizer) { sqlite3_free(pTokenizer); return SQLITE_OK; } @@ -186496,29 +184629,29 @@ static int simpleDestroy(sqlite3_tokenizer *pTokenizer){ ** 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; +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 = (simple_tokenizer_cursor*)sqlite3_malloc(sizeof(*c)); + if (c == NULL) + return SQLITE_NOMEM; c->pInput = pInput; - if( pInput==0 ){ + if (pInput == 0) { c->nBytes = 0; - }else if( nBytes<0 ){ + } else if (nBytes < 0) { c->nBytes = (int)strlen(pInput); - }else{ + } else { c->nBytes = nBytes; } - c->iOffset = 0; /* start tokenizing at the beginning */ + c->iOffset = 0; /* start tokenizing at the beginning */ c->iToken = 0; - c->pToken = NULL; /* no space allocated, yet. */ + c->pToken = NULL; /* no space allocated, yet. */ c->nTokenAllocated = 0; *ppCursor = &c->base; @@ -186529,8 +184662,8 @@ static int simpleOpen( ** 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; +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; @@ -186540,47 +184673,47 @@ static int simpleClose(sqlite3_tokenizer_cursor *pCursor){ ** 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; +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 ){ + while (c->iOffset < c->nBytes) { int iStartOffset; /* Scan past delimiter characters */ - while( c->iOffsetnBytes && simpleDelim(t, p[c->iOffset]) ){ + while (c->iOffset < c->nBytes && simpleDelim(t, p[c->iOffset])) { c->iOffset++; } /* Count non-delimiter characters. */ iStartOffset = c->iOffset; - while( c->iOffsetnBytes && !simpleDelim(t, p[c->iOffset]) ){ + while (c->iOffset < c->nBytes && !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; + if (c->iOffset > iStartOffset) { + int i, n = c->iOffset - iStartOffset; + if (n > c->nTokenAllocated) { + char* pNew; + c->nTokenAllocated = n + 20; pNew = sqlite3_realloc64(c->pToken, c->nTokenAllocated); - if( !pNew ) return SQLITE_NOMEM; + if (!pNew) + return SQLITE_NOMEM; c->pToken = pNew; } - for(i=0; ipToken[i] = (char)((ch>='A' && ch<='Z') ? ch-'A'+'a' : ch); + unsigned char ch = p[iStartOffset + i]; + c->pToken[i] = (char)((ch >= 'A' && ch <= 'Z') ? ch - 'A' + 'a' : ch); } *ppToken = c->pToken; *pnBytes = n; @@ -186598,22 +184731,14 @@ static int simpleNext( ** The set of routines that implement the simple tokenizer */ static const sqlite3_tokenizer_module simpleTokenizerModule = { - 0, - simpleCreate, - simpleDestroy, - simpleOpen, - simpleClose, - simpleNext, - 0, + 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 -){ +SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule(sqlite3_tokenizer_module const** ppModule) { *ppModule = &simpleTokenizerModule; } @@ -186674,9 +184799,9 @@ 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; + sqlite3_vtab base; /* Base class used by SQLite core */ + const sqlite3_tokenizer_module* pMod; + sqlite3_tokenizer* pTok; }; /* @@ -186684,10 +184809,10 @@ struct Fts3tokTable { */ 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 */ + char* zInput; /* Input string */ + sqlite3_tokenizer_cursor* pCsr; /* Cursor to iterate through zInput */ int iRowid; /* Current 'rowid' value */ - const char *zToken; /* Current 'token' value */ + const char* zToken; /* Current 'token' value */ int nToken; /* Size of zToken in bytes */ int iStart; /* Current 'start' value */ int iEnd; /* Current 'end' value */ @@ -186697,17 +184822,12 @@ struct Fts3tokCursor { /* ** 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; +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 ){ + p = (sqlite3_tokenizer_module*)sqlite3Fts3HashFind(pHash, zName, nName + 1); + if (!p) { sqlite3Fts3ErrMsg(pzErr, "unknown tokenizer: %s", zName); return SQLITE_ERROR; } @@ -186728,34 +184848,33 @@ static int fts3tokQueryTokenizer( ** 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 ){ +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{ + } else { int i; int nByte = 0; - char **azDequote; + char** azDequote; - for(i=0; i1 ) azArg = (const char * const *)&azDequote[1]; - rc = pMod->xCreate((nDequote>1 ? nDequote-1 : 0), azArg, &pTok); + assert((rc == SQLITE_OK) == (pMod != 0)); + if (rc == SQLITE_OK) { + const char* const* azArg = 0; + if (nDequote > 1) + 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 ){ + if (rc == SQLITE_OK) { + pTab = (Fts3tokTable*)sqlite3_malloc(sizeof(Fts3tokTable)); + if (pTab == 0) { rc = SQLITE_NOMEM; } } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { memset(pTab, 0, sizeof(Fts3tokTable)); pTab->pMod = pMod; pTab->pTok = pTok; *ppVtab = &pTab->base; - }else{ - if( pTok ){ + } else { + if (pTok) { pMod->xDestroy(pTok); } } @@ -186843,8 +184963,8 @@ static int fts3tokConnectMethod( ** 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; +static int fts3tokDisconnectMethod(sqlite3_vtab* pVtab) { + Fts3tokTable* pTab = (Fts3tokTable*)pVtab; pTab->pMod->xDestroy(pTab->pTok); sqlite3_free(pTab); @@ -186854,18 +184974,12 @@ static int fts3tokDisconnectMethod(sqlite3_vtab *pVtab){ /* ** xBestIndex - Analyze a WHERE and ORDER BY clause. */ -static int fts3tokBestIndexMethod( - sqlite3_vtab *pVTab, - sqlite3_index_info *pInfo -){ +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 - ){ + for (i = 0; i < pInfo->nConstraint; 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; @@ -186875,7 +184989,7 @@ static int fts3tokBestIndexMethod( } pInfo->idxNum = 0; - assert( pInfo->estimatedCost>1000000.0 ); + assert(pInfo->estimatedCost > 1000000.0); return SQLITE_OK; } @@ -186883,17 +184997,17 @@ static int fts3tokBestIndexMethod( /* ** xOpen - Open a cursor. */ -static int fts3tokOpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ - Fts3tokCursor *pCsr; +static int fts3tokOpenMethod(sqlite3_vtab* pVTab, sqlite3_vtab_cursor** ppCsr) { + Fts3tokCursor* pCsr; UNUSED_PARAMETER(pVTab); - pCsr = (Fts3tokCursor *)sqlite3_malloc(sizeof(Fts3tokCursor)); - if( pCsr==0 ){ + pCsr = (Fts3tokCursor*)sqlite3_malloc(sizeof(Fts3tokCursor)); + if (pCsr == 0) { return SQLITE_NOMEM; } memset(pCsr, 0, sizeof(Fts3tokCursor)); - *ppCsr = (sqlite3_vtab_cursor *)pCsr; + *ppCsr = (sqlite3_vtab_cursor*)pCsr; return SQLITE_OK; } @@ -186901,9 +185015,9 @@ static int fts3tokOpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ ** 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); +static void fts3tokResetCursor(Fts3tokCursor* pCsr) { + if (pCsr->pCsr) { + Fts3tokTable* pTab = (Fts3tokTable*)(pCsr->base.pVtab); pTab->pMod->xClose(pCsr->pCsr); pCsr->pCsr = 0; } @@ -186920,8 +185034,8 @@ static void fts3tokResetCursor(Fts3tokCursor *pCsr){ /* ** xClose - Close a cursor. */ -static int fts3tokCloseMethod(sqlite3_vtab_cursor *pCursor){ - Fts3tokCursor *pCsr = (Fts3tokCursor *)pCursor; +static int fts3tokCloseMethod(sqlite3_vtab_cursor* pCursor) { + Fts3tokCursor* pCsr = (Fts3tokCursor*)pCursor; fts3tokResetCursor(pCsr); sqlite3_free(pCsr); @@ -186931,20 +185045,18 @@ static int fts3tokCloseMethod(sqlite3_vtab_cursor *pCursor){ /* ** 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 */ +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 - ); + rc = pTab->pMod->xNext(pCsr->pCsr, &pCsr->zToken, &pCsr->nToken, &pCsr->iStart, &pCsr->iEnd, &pCsr->iPos); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { fts3tokResetCursor(pCsr); - if( rc==SQLITE_DONE ) rc = SQLITE_OK; + if (rc == SQLITE_DONE) + rc = SQLITE_OK; } return rc; @@ -186953,60 +185065,60 @@ static int fts3tokNextMethod(sqlite3_vtab_cursor *pCursor){ /* ** 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 */ -){ +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); + 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]); + 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 ){ + pCsr->zInput = sqlite3_malloc64(nByte + 1); + if (pCsr->zInput == 0) { rc = SQLITE_NOMEM; - }else{ - if( nByte>0 ) memcpy(pCsr->zInput, zByte, nByte); + } 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 ){ + if (rc == SQLITE_OK) { pCsr->pCsr->pTokenizer = pTab->pTok; } } } - if( rc!=SQLITE_OK ) return rc; + 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); +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; +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 ){ + switch (iCol) { case 0: sqlite3_result_text(pCtx, pCsr->zInput, -1, SQLITE_TRANSIENT); break; @@ -187020,7 +185132,7 @@ static int fts3tokColumnMethod( sqlite3_result_int(pCtx, pCsr->iEnd); break; default: - assert( iCol==4 ); + assert(iCol == 4); sqlite3_result_int(pCtx, pCsr->iPos); break; } @@ -187030,11 +185142,10 @@ static int fts3tokColumnMethod( /* ** 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; +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; } @@ -187043,38 +185154,36 @@ static int fts3tokRowidMethod( ** 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*)){ +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 */ + 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 */ + int rc; /* Return code */ - rc = sqlite3_create_module_v2( - db, "fts3tokenize", &fts3tok_module, (void*)pHash, xDestroy - ); + rc = sqlite3_create_module_v2(db, "fts3tokenize", &fts3tok_module, (void*)pHash, xDestroy); return rc; } @@ -187121,7 +185230,7 @@ SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3 *db, Fts3Hash *pHash, void(*xDestr ** 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) +#define FTS3_NODE_PADDING (FTS3_VARINT_MAX * 2) /* ** Under certain circumstances, b-tree nodes (doclists) can be loaded into @@ -187141,20 +185250,20 @@ SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3 *db, Fts3Hash *pHash, void(*xDestr ** 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 +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) +#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_DOCTOTAL 0 #define FTS_STAT_INCRMERGEHINT 1 #define FTS_STAT_AUTOINCRMERGE 2 @@ -187165,14 +185274,13 @@ int test_fts3_node_chunk_threshold = (4*1024)*4; ** systems. */ #ifdef FTS3_LOG_MERGES -static void fts3LogMerge(int nMerge, sqlite3_int64 iAbsLevel){ +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; @@ -187183,22 +185291,21 @@ typedef struct SegmentWriter SegmentWriter; */ struct PendingList { int nData; - char *aData; + 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 */ + 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 */ }; /* @@ -187219,43 +185326,43 @@ struct Fts3DeferredToken { ** 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 */ + 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) */ + 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 */ + 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; + 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 */ + 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 */ + 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) +#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 @@ -187267,17 +185374,17 @@ struct Fts3SegReader { ** 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 */ + 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 */ }; /* @@ -187299,63 +185406,63 @@ struct SegmentWriter { ** 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 */ + 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 +#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 @@ -187368,168 +185475,173 @@ struct SegmentNode { ** 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" +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; + sqlite3_stmt* pStmt; - assert( SizeofArray(azSql)==SizeofArray(p->aStmt) ); - assert( eStmt=0 ); + assert(SizeofArray(azSql) == SizeofArray(p->aStmt)); + assert(eStmt < SizeofArray(azSql) && eStmt >= 0); pStmt = p->aStmt[eStmt]; - if( !pStmt ){ - int f = SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_NO_VTAB; - char *zSql; - if( eStmt==SQL_CONTENT_INSERT ){ + 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 ){ + } else if (eStmt == SQL_SELECT_CONTENT_BY_ROWID) { f &= ~SQLITE_PREPARE_NO_VTAB; zSql = sqlite3_mprintf(azSql[eStmt], p->zReadExprlist); - }else{ + } else { zSql = sqlite3_mprintf(azSql[eStmt], p->zDb, p->zName); } - if( !zSql ){ + if (!zSql) { rc = SQLITE_NOMEM; - }else{ + } else { rc = sqlite3_prepare_v3(p->db, zSql, -1, f, &pStmt, NULL); sqlite3_free(zSql); - assert( rc==SQLITE_OK || pStmt==0 ); + assert(rc == SQLITE_OK || pStmt == 0); p->aStmt[eStmt] = pStmt; } } - if( apVal ){ + if (apVal) { int i; int nParam = sqlite3_bind_parameter_count(pStmt); - for(i=0; rc==SQLITE_OK && inPendingData==0 ){ - sqlite3_stmt *pStmt; + if (p->nPendingData == 0) { + sqlite3_stmt* pStmt; rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_LEVEL, &pStmt, 0); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { sqlite3_bind_null(pStmt, 1); sqlite3_step(pStmt); rc = sqlite3_reset(pStmt); @@ -187646,16 +185754,15 @@ static int fts3Writelock(Fts3Table *p){ ** 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 ); +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 && iIndex < p->nIndex); iBase = ((sqlite3_int64)iLangid * p->nIndex + iIndex) * FTS3_SEGDIR_MAXLEVEL; return iBase + iLevel; @@ -187678,41 +185785,37 @@ static sqlite3_int64 getAbsoluteLevel( ** 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 */ -){ +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; + sqlite3_stmt* pStmt = 0; - assert( iLevel==FTS3_SEGCURSOR_ALL || iLevel>=0 ); - assert( iLevel=0 && iIndexnIndex ); + assert(iLevel == FTS3_SEGCURSOR_ALL || iLevel >= 0); + assert(iLevel < FTS3_SEGDIR_MAXLEVEL); + assert(iIndex >= 0 && iIndex < p->nIndex); - if( iLevel<0 ){ + 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 ){ + 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) - ); + sqlite3_bind_int64(pStmt, 2, getAbsoluteLevel(p, iLangid, iIndex, FTS3_SEGDIR_MAXLEVEL - 1)); } - }else{ + } 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)); + 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. @@ -187725,32 +185828,30 @@ SQLITE_PRIVATE int sqlite3Fts3AllSegdirs( ** 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; +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 ){ + if (!p) { p = sqlite3_malloc64(sizeof(*p) + 100); - if( !p ){ + if (!p) { return SQLITE_NOMEM; } p->nSpace = 100; - p->aData = (char *)&p[1]; + p->aData = (char*)&p[1]; p->nData = 0; - } - else if( p->nData+FTS3_VARINT_MAX+1>p->nSpace ){ + } else if (p->nData + FTS3_VARINT_MAX + 1 > p->nSpace) { i64 nNew = p->nSpace * 2; p = sqlite3_realloc64(p, sizeof(*p) + nNew); - if( !p ){ + if (!p) { sqlite3_free(*pp); *pp = 0; return SQLITE_NOMEM; } p->nSpace = (int)nNew; - p->aData = (char *)&p[1]; + p->aData = (char*)&p[1]; } /* Append the new serialized varint to the end of the list. */ @@ -187769,52 +185870,49 @@ static int fts3PendingListAppendVarint( ** 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; +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 ); + assert(!p || p->iLastDocid <= iDocid); - if( !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 ); + if (p) { + assert(p->nData < p->nSpace); + assert(p->aData[p->nData] == 0); p->nData++; } - if( SQLITE_OK!=(rc = fts3PendingListAppendVarint(&p, iDelta)) ){ + 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)) - ){ + 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 ){ + 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: +pendinglistappend_out: *pRc = rc; - if( p!=*pp ){ + if (p != *pp) { *pp = p; return 1; } @@ -187824,39 +185922,33 @@ static int fts3PendingListAppend( /* ** Free a PendingList object allocated by fts3PendingListAppend(). */ -static void fts3PendingListDelete(PendingList *pList){ +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; +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 ){ + 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) ){ + 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) ); + assert(0 == fts3HashFind(pHash, zToken, nToken)); sqlite3_free(pList); rc = SQLITE_NOMEM; } } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { p->nPendingData += (pList->nData + nToken + sizeof(Fts3HashElem)); } return rc; @@ -187869,77 +185961,71 @@ static int fts3PendingTermsAddOne( ** ** 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 */ -){ +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; + 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*); + 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 ); + 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 ){ + if (zText == 0) { *pnWord = 0; return SQLITE_OK; } rc = sqlite3Fts3OpenTokenizer(pTokenizer, iLangid, zText, -1, &pCsr); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } xNext = pModule->xNext; - while( SQLITE_OK==rc - && SQLITE_OK==(rc = xNext(pCsr, &zToken, &nToken, &iStart, &iEnd, &iPos)) - ){ + while (SQLITE_OK == rc && SQLITE_OK == (rc = xNext(pCsr, &zToken, &nToken, &iStart, &iEnd, &iPos))) { int i; - if( iPos>=nWord ) nWord = iPos+1; + 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 ){ + 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 - ); + 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 - ); + for (i = 1; rc == SQLITE_OK && i < p->nIndex; i++) { + struct Fts3Index* pIndex = &p->aIndex[i]; + if (nToken < pIndex->nPrefix) + continue; + rc = fts3PendingTermsAddOne(p, iCol, iPos, &pIndex->hPending, zToken, pIndex->nPrefix); } } pModule->xClose(pCsr); *pnWord += nWord; - return (rc==SQLITE_DONE ? SQLITE_OK : rc); + return (rc == SQLITE_DONE ? SQLITE_OK : rc); } /* @@ -187947,14 +186033,13 @@ static int fts3PendingTermsAdd( ** 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 ); +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 @@ -187962,13 +186047,11 @@ static int fts3PendingTermsDocid( ** 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 - ){ + if (iDocid < p->iPrevDocid || (iDocid == p->iPrevDocid && p->bPrevDelete == 0) || p->iPrevLangid != iLangid || + p->nPendingData > p->nMaxPendingData) { int rc = sqlite3Fts3PendingTermsFlush(p); - if( rc!=SQLITE_OK ) return rc; + if (rc != SQLITE_OK) + return rc; } p->iPrevDocid = iDocid; p->iPrevLangid = iLangid; @@ -187979,13 +186062,13 @@ static int fts3PendingTermsDocid( /* ** Discard the contents of the pending-terms hash tables. */ -SQLITE_PRIVATE void sqlite3Fts3PendingTermsClear(Fts3Table *p){ +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); + for (i = 0; i < p->nIndex; 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); @@ -188001,19 +186084,14 @@ SQLITE_PRIVATE void sqlite3Fts3PendingTermsClear(Fts3Table *p){ ** 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]); +static int fts3InsertTerms(Fts3Table* p, int iLangid, sqlite3_value** apVal, u32* aSz) { + int i; /* Iterator variable */ + for (i = 2; i < p->nColumn + 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 ){ + if (rc != SQLITE_OK) { return rc; } aSz[p->nColumn] += sqlite3_value_bytes(apVal[i]); @@ -188036,20 +186114,19 @@ static int fts3InsertTerms( ** 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(...) */ +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 ){ + 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 ){ + if (sqlite3_value_type(pRowid) != SQLITE_INTEGER) { return SQLITE_CONSTRAINT; } *piDocid = sqlite3_value_int64(pRowid); @@ -188065,13 +186142,11 @@ static int fts3InsertData( ** 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 && p->zLanguageid) { + rc = sqlite3_bind_int(pContentInsert, p->nColumn + 2, sqlite3_value_int(apVal[p->nColumn + 4])); } - if( rc!=SQLITE_OK ) return rc; + 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. @@ -188083,15 +186158,14 @@ static int fts3InsertData( ** 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]) - ){ + 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; + 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 @@ -188104,28 +186178,27 @@ static int fts3InsertData( 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 */ +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); + 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 ){ + if (p->bHasDocsize) { fts3SqlExec(&rc, p, SQL_DELETE_ALL_DOCSIZE, 0); } - if( p->bHasStat ){ + if (p->bHasStat) { fts3SqlExec(&rc, p, SQL_DELETE_ALL_STAT, 0); } return rc; @@ -188134,9 +186207,10 @@ static int fts3DeleteAll(Fts3Table *p, int bContent){ /* ** */ -static int langidFromSelect(Fts3Table *p, sqlite3_stmt *pSelect){ +static int langidFromSelect(Fts3Table* p, sqlite3_stmt* pSelect) { int iLangid = 0; - if( p->zLanguageid ) iLangid = sqlite3_column_int(pSelect, p->nColumn+1); + if (p->zLanguageid) + iLangid = sqlite3_column_int(pSelect, p->nColumn + 1); return iLangid; } @@ -188145,34 +186219,34 @@ static int langidFromSelect(Fts3Table *p, sqlite3_stmt *pSelect){ ** (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 */ -){ +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; + sqlite3_stmt* pSelect; - assert( *pbFound==0 ); - if( *pRC ) return; + 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) ){ + 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); + 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 ){ + if (rc != SQLITE_OK) { sqlite3_reset(pSelect); *pRC = rc; return; @@ -188180,7 +186254,7 @@ static void fts3DeleteTerms( *pbFound = 1; } rc = sqlite3_reset(pSelect); - }else{ + } else { sqlite3_reset(pSelect); } *pRC = rc; @@ -188190,7 +186264,7 @@ static void fts3DeleteTerms( ** Forward declaration to account for the circular dependency between ** functions fts3SegmentMerge() and fts3AllocateSegdirIdx(). */ -static int fts3SegmentMerge(Fts3Table *, int, int, int); +static int fts3SegmentMerge(Fts3Table*, int, int, int); /* ** This function allocates a new level iLevel index in the segdir table. @@ -188207,43 +186281,37 @@ static int fts3SegmentMerge(Fts3Table *, int, int, int); ** 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 */ +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 ); + 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) ){ + 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 (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) ){ + if (iNext >= MergeCount(p)) { fts3LogMerge(16, getAbsoluteLevel(p, iLangid, iIndex, iLevel)); rc = fts3SegmentMerge(p, iLangid, iIndex, iLevel); *piIdx = 0; - }else{ + } else { *piIdx = iNext; } } @@ -188278,52 +186346,50 @@ static int fts3AllocateSegdirIdx( ** 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 */ +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 ); + assert(pnBlob); - if( p->pSegments ){ + if (p->pSegments) { rc = sqlite3_blob_reopen(p->pSegments, iBlockid); - }else{ - if( 0==p->zSegmentsTbl ){ + } else { + if (0 == p->zSegmentsTbl) { p->zSegmentsTbl = sqlite3_mprintf("%s_segments", p->zName); - if( 0==p->zSegmentsTbl ) return SQLITE_NOMEM; + if (0 == p->zSegmentsTbl) + return SQLITE_NOMEM; } - rc = sqlite3_blob_open( - p->db, p->zDb, p->zSegmentsTbl, "block", iBlockid, 0, &p->pSegments - ); + rc = sqlite3_blob_open(p->db, p->zDb, p->zSegmentsTbl, "block", iBlockid, 0, &p->pSegments); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { int nByte = sqlite3_blob_bytes(p->pSegments); *pnBlob = nByte; - if( paBlob ){ - char *aByte = sqlite3_malloc64((i64)nByte + FTS3_NODE_PADDING); - if( !aByte ){ + if (paBlob) { + char* aByte = sqlite3_malloc64((i64)nByte + FTS3_NODE_PADDING); + if (!aByte) { rc = SQLITE_NOMEM; - }else{ - if( pnLoad && nByte>(FTS3_NODE_CHUNK_THRESHOLD) ){ + } 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 ){ + if (rc != SQLITE_OK) { sqlite3_free(aByte); aByte = 0; } } *paBlob = aByte; } - }else if( rc==SQLITE_ERROR ){ + } else if (rc == SQLITE_ERROR) { rc = FTS_CORRUPT_VTAB; } @@ -188334,27 +186400,22 @@ SQLITE_PRIVATE int sqlite3Fts3ReadBlock( ** 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){ +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 */ +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 - ); + rc = sqlite3_blob_read(pReader->pBlob, &pReader->aNode[pReader->nPopulate], nRead, pReader->nPopulate); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pReader->nPopulate += nRead; memset(&pReader->aNode[pReader->nPopulate], 0, FTS3_NODE_PADDING); - if( pReader->nPopulate==pReader->nNode ){ + if (pReader->nPopulate == pReader->nNode) { sqlite3_blob_close(pReader->pBlob); pReader->pBlob = 0; pReader->nPopulate = 0; @@ -188363,14 +186424,10 @@ static int fts3SegReaderIncrRead(Fts3SegReader *pReader){ return rc; } -static int fts3SegReaderRequire(Fts3SegReader *pReader, char *pFrom, int nByte){ +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 - ){ + 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; @@ -188379,8 +186436,8 @@ static int fts3SegReaderRequire(Fts3SegReader *pReader, char *pFrom, int nByte){ /* ** Set an Fts3SegReader cursor to point at EOF. */ -static void fts3SegReaderSetEof(Fts3SegReader *pSeg){ - if( !fts3SegReaderIsRootOnly(pSeg) ){ +static void fts3SegReaderSetEof(Fts3SegReader* pSeg) { + if (!fts3SegReaderIsRootOnly(pSeg)) { sqlite3_free(pSeg->aNode); sqlite3_blob_close(pSeg->pBlob); pSeg->pBlob = 0; @@ -188393,51 +186450,49 @@ static void fts3SegReaderSetEof(Fts3SegReader *pSeg){ ** 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 */ +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 ){ + if (!pReader->aDoclist) { pNext = pReader->aNode; - }else{ + } else { pNext = &pReader->aDoclist[pReader->nDoclist]; } - if( !pNext || pNext>=&pReader->aNode[pReader->nNode] ){ + if (!pNext || pNext >= &pReader->aNode[pReader->nNode]) { - if( fts3SegReaderIsPending(pReader) ){ - Fts3HashElem *pElem = *(pReader->ppNextElem); + 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; + if (pElem) { + char* aCopy; + PendingList* pList = (PendingList*)fts3HashData(pElem); + int nCopy = pList->nData + 1; int nTerm = fts3HashKeysize(pElem); - if( (nTerm+1)>pReader->nTermAlloc ){ + if ((nTerm + 1) > pReader->nTermAlloc) { sqlite3_free(pReader->zTerm); - pReader->zTerm = (char*)sqlite3_malloc64(((i64)nTerm+1)*2); - if( !pReader->zTerm ) return SQLITE_NOMEM; - pReader->nTermAlloc = (nTerm+1)*2; + pReader->zTerm = (char*)sqlite3_malloc64(((i64)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_malloc64(nCopy); - if( !aCopy ) return SQLITE_NOMEM; + 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 ); + assert(pReader->aNode); } return SQLITE_OK; } @@ -188447,59 +186502,56 @@ static int fts3SegReaderNext( /* 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 ); + assert(pReader->iCurrentBlock <= pReader->iLeafEndBlock || CORRUPT_DB); #endif - if( pReader->iCurrentBlock>=pReader->iLeafEndBlock ){ + 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 ){ + 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->nPopulate < pReader->nNode) { pReader->pBlob = p->pSegments; p->pSegments = 0; } pNext = pReader->aNode; } - assert( !fts3SegReaderIsPending(pReader) ); + assert(!fts3SegReaderIsPending(pReader)); - rc = fts3SegReaderRequire(pReader, pNext, FTS3_VARINT_MAX*2); - if( rc!=SQLITE_OK ) return rc; + 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 - ){ + if (nSuffix <= 0 || (&pReader->aNode[pReader->nNode] - pNext) < nSuffix || nPrefix > 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 ){ + 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; + rc = fts3SegReaderRequire(pReader, pNext, nSuffix + FTS3_VARINT_MAX); + if (rc != SQLITE_OK) + return rc; memcpy(&pReader->zTerm[nPrefix], pNext, nSuffix); - pReader->nTerm = nPrefix+nSuffix; + pReader->nTerm = nPrefix + nSuffix; pNext += nSuffix; pNext += fts3GetVarint32(pNext, &pReader->nDoclist); pReader->aDoclist = pNext; @@ -188509,10 +186561,8 @@ static int fts3SegReaderNext( ** 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 - ){ + 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; @@ -188522,21 +186572,18 @@ static int fts3SegReaderNext( ** Set the SegReader to point to the first docid in the doclist associated ** with the current term. */ -static int fts3SegReaderFirstDocid(Fts3Table *pTab, Fts3SegReader *pReader){ +static int fts3SegReaderFirstDocid(Fts3Table* pTab, Fts3SegReader* pReader) { int rc = SQLITE_OK; - assert( pReader->aDoclist ); - assert( !pReader->pOffsetList ); - if( pTab->bDescIdx && fts3SegReaderIsPending(pReader) ){ + 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{ + 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 ){ + if (rc == SQLITE_OK) { int n = sqlite3Fts3GetVarint(pReader->aDoclist, &pReader->iDocid); pReader->pOffsetList = &pReader->aDoclist[n]; } @@ -188554,43 +186601,38 @@ static int fts3SegReaderFirstDocid(Fts3Table *pTab, Fts3SegReader *pReader){ ** *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 */ -){ +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* p = pReader->pOffsetList; char c = 0; - assert( p ); + assert(p); - if( pTab->bDescIdx && fts3SegReaderIsPending(pReader) ){ + 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 ){ + if (ppOffsetList) { *ppOffsetList = pReader->pOffsetList; *pnOffsetList = pReader->nOffsetList - 1; } - sqlite3Fts3DoclistPrev(0, - pReader->aDoclist, pReader->nDoclist, &p, &pReader->iDocid, - &pReader->nOffsetList, &bEof - ); - if( bEof ){ + sqlite3Fts3DoclistPrev(0, pReader->aDoclist, pReader->nDoclist, &p, &pReader->iDocid, &pReader->nOffsetList, &bEof); + if (bEof) { pReader->pOffsetList = 0; - }else{ + } else { pReader->pOffsetList = p; } - }else{ - char *pEnd = &pReader->aDoclist[pReader->nDoclist]; + } 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 ){ + 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 @@ -188598,41 +186640,45 @@ static int fts3SegReaderNextDocid( ** 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 ); + while (*p | c) + c = *p++ & 0x80; + assert(*p == 0); - if( pReader->pBlob==0 || p<&pReader->aNode[pReader->nPopulate] ) break; + if (pReader->pBlob == 0 || p < &pReader->aNode[pReader->nPopulate]) + break; rc = fts3SegReaderIncrRead(pReader); - if( rc!=SQLITE_OK ) return rc; + 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 ){ + if (ppOffsetList) { *ppOffsetList = pReader->pOffsetList; *pnOffsetList = (int)(p - pReader->pOffsetList - 1); } /* List may have been edited in place by fts3EvalNearTrim() */ - while( p=pEnd ){ + if (p >= pEnd) { pReader->pOffsetList = 0; - }else{ + } else { rc = fts3SegReaderRequire(pReader, p, FTS3_VARINT_MAX); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { u64 iDelta; pReader->pOffsetList = p + sqlite3Fts3GetVarintU(p, &iDelta); - if( pTab->bDescIdx ){ + if (pTab->bDescIdx) { pReader->iDocid = (i64)((u64)pReader->iDocid - iDelta); - }else{ + } else { pReader->iDocid = (i64)((u64)pReader->iDocid + iDelta); } } @@ -188642,33 +186688,27 @@ static int fts3SegReaderNextDocid( return rc; } - -SQLITE_PRIVATE int sqlite3Fts3MsrOvfl( - Fts3Cursor *pCsr, - Fts3MultiSegReader *pMsr, - int *pnOvfl -){ - Fts3Table *p = (Fts3Table*)pCsr->base.pVtab; +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 ); + assert(p->bFts4); + assert(pgsz > 0); - for(ii=0; rc==SQLITE_OK && iinSegment; ii++){ - Fts3SegReader *pReader = pMsr->apSegment[ii]; - if( !fts3SegReaderIsPending(pReader) - && !fts3SegReaderIsRootOnly(pReader) - ){ + for (ii = 0; rc == SQLITE_OK && ii < pMsr->nSegment; ii++) { + Fts3SegReader* pReader = pMsr->apSegment[ii]; + if (!fts3SegReaderIsPending(pReader) && !fts3SegReaderIsRootOnly(pReader)) { sqlite3_int64 jj; - for(jj=pReader->iStartBlock; jj<=pReader->iLeafEndBlock; 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; + if (rc != SQLITE_OK) + break; + if ((nBlob + 35) > pgsz) { + nOvfl += (nBlob + 34) / pgsz; } } } @@ -188681,10 +186721,10 @@ SQLITE_PRIVATE int sqlite3Fts3MsrOvfl( ** Free all allocations associated with the iterator passed as the ** second argument. */ -SQLITE_PRIVATE void sqlite3Fts3SegReaderFree(Fts3SegReader *pReader){ - if( pReader ){ +SQLITE_PRIVATE void sqlite3Fts3SegReaderFree(Fts3SegReader* pReader) { + if (pReader) { sqlite3_free(pReader->zTerm); - if( !fts3SegReaderIsRootOnly(pReader) ){ + if (!fts3SegReaderIsRootOnly(pReader)) { sqlite3_free(pReader->aNode); } sqlite3_blob_close(pReader->pBlob); @@ -188695,49 +186735,50 @@ SQLITE_PRIVATE void sqlite3Fts3SegReaderFree(Fts3SegReader *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 */ +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 ); + assert(zRoot != 0 || nRoot == 0); #ifdef CORRUPT_DB - assert( zRoot!=0 || CORRUPT_DB ); + assert(zRoot != 0 || CORRUPT_DB); #endif - if( iStartLeaf==0 ){ - if( iEndLeaf!=0 ) return FTS_CORRUPT_VTAB; + if (iStartLeaf == 0) { + if (iEndLeaf != 0) + return FTS_CORRUPT_VTAB; nExtra = nRoot + FTS3_NODE_PADDING; } - pReader = (Fts3SegReader *)sqlite3_malloc64(sizeof(Fts3SegReader) + nExtra); - if( !pReader ){ + pReader = (Fts3SegReader*)sqlite3_malloc64(sizeof(Fts3SegReader) + nExtra); + if (!pReader) { return SQLITE_NOMEM; } memset(pReader, 0, sizeof(Fts3SegReader)); pReader->iIdx = iAge; - pReader->bLookup = bLookup!=0; + pReader->bLookup = bLookup != 0; pReader->iStartBlock = iStartLeaf; pReader->iLeafEndBlock = iEndLeaf; pReader->iEndBlock = iEndBlock; - if( nExtra ){ + if (nExtra) { /* The entire segment is stored in the root node. */ - pReader->aNode = (char *)&pReader[1]; + pReader->aNode = (char*)&pReader[1]; pReader->rootOnly = 1; pReader->nNode = nRoot; - if( nRoot ) memcpy(pReader->aNode, zRoot, nRoot); + if (nRoot) + memcpy(pReader->aNode, zRoot, nRoot); memset(&pReader->aNode[nRoot], 0, FTS3_NODE_PADDING); - }else{ - pReader->iCurrentBlock = iStartLeaf-1; + } else { + pReader->iCurrentBlock = iStartLeaf - 1; } *ppReader = pReader; return SQLITE_OK; @@ -188748,18 +186789,15 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderNew( ** 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); +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; +SQLITE_PRIVATE int sqlite3Fts3SegReaderPending(Fts3Table* p, /* Virtual table handle */ + int iIndex, /* Index for p->aIndex */ + 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 */ + if (bPrefix) { + int nAlloc = 0; /* Size of allocated array at aElem */ - for(pE=fts3HashFirst(pHash); pE; pE=fts3HashNext(pE)){ - char *zKey = (char *)fts3HashKey(pE); + 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; + if (nTerm == 0 || (nKey >= nTerm && 0 == memcmp(zKey, zTerm, nTerm))) { + if (nElem == nAlloc) { + Fts3HashElem** aElem2; nAlloc += 16; - aElem2 = (Fts3HashElem **)sqlite3_realloc64( - aElem, nAlloc*sizeof(Fts3HashElem *) - ); - if( !aElem2 ){ + aElem2 = (Fts3HashElem**)sqlite3_realloc64(aElem, nAlloc * sizeof(Fts3HashElem*)); + if (!aElem2) { rc = SQLITE_NOMEM; nElem = 0; break; @@ -188829,11 +186864,11 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderPending( ** 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); + if (nElem > 1) { + qsort(aElem, nElem, sizeof(Fts3HashElem*), fts3CompareElemByTerm); } - }else{ + } 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. ** @@ -188842,27 +186877,27 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderPending( ** within this entire function, not just this "else{...}" block. */ pE = fts3HashFindElem(pHash, zTerm, nTerm); - if( pE ){ + if (pE) { aElem = &pE; nElem = 1; } } - if( nElem>0 ){ + if (nElem > 0) { sqlite3_int64 nByte; - nByte = sizeof(Fts3SegReader) + (nElem+1)*sizeof(Fts3HashElem *); - pReader = (Fts3SegReader *)sqlite3_malloc64(nByte); - if( !pReader ){ + nByte = sizeof(Fts3SegReader) + (nElem + 1) * sizeof(Fts3HashElem*); + pReader = (Fts3SegReader*)sqlite3_malloc64(nByte); + if (!pReader) { rc = SQLITE_NOMEM; - }else{ + } else { memset(pReader, 0, nByte); pReader->iIdx = 0x7FFFFFFF; - pReader->ppNextElem = (Fts3HashElem **)&pReader[1]; - memcpy(pReader->ppNextElem, aElem, nElem*sizeof(Fts3HashElem *)); + pReader->ppNextElem = (Fts3HashElem**)&pReader[1]; + memcpy(pReader->ppNextElem, aElem, nElem * sizeof(Fts3HashElem*)); } } - if( bPrefix ){ + if (bPrefix) { sqlite3_free(aElem); } *ppReader = pReader; @@ -188881,25 +186916,25 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderPending( ** ** 3) By segment age. An older segment is considered larger. */ -static int fts3SegReaderCmp(Fts3SegReader *pLhs, Fts3SegReader *pRhs){ +static int fts3SegReaderCmp(Fts3SegReader* pLhs, Fts3SegReader* pRhs) { int rc; - if( pLhs->aNode && pRhs->aNode ){ + if (pLhs->aNode && pRhs->aNode) { int rc2 = pLhs->nTerm - pRhs->nTerm; - if( rc2<0 ){ + if (rc2 < 0) { rc = memcmp(pLhs->zTerm, pRhs->zTerm, pLhs->nTerm); - }else{ + } else { rc = memcmp(pLhs->zTerm, pRhs->zTerm, pRhs->nTerm); } - if( rc==0 ){ + if (rc == 0) { rc = rc2; } - }else{ - rc = (pLhs->aNode==0) - (pRhs->aNode==0); + } else { + rc = (pLhs->aNode == 0) - (pRhs->aNode == 0); } - if( rc==0 ){ + if (rc == 0) { rc = pRhs->iIdx - pLhs->iIdx; } - assert_fts3_nc( rc!=0 ); + assert_fts3_nc(rc != 0); return rc; } @@ -188914,28 +186949,28 @@ static int fts3SegReaderCmp(Fts3SegReader *pLhs, Fts3SegReader *pRhs){ ** ** 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 ){ +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{ + } else { rc = (pLhs->iDocid > pRhs->iDocid) ? 1 : -1; } } - assert( pLhs->aNode && pRhs->aNode ); + 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 ){ +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{ + } else { rc = (pLhs->iDocid < pRhs->iDocid) ? 1 : -1; } } - assert( pLhs->aNode && pRhs->aNode ); + assert(pLhs->aNode && pRhs->aNode); return rc; } @@ -188947,20 +186982,19 @@ static int fts3SegReaderDoclistCmpRev(Fts3SegReader *pLhs, Fts3SegReader *pRhs){ ** -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 */ -){ +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 ){ + if (pSeg->aNode) { + if (pSeg->nTerm > nTerm) { res = memcmp(pSeg->zTerm, zTerm, nTerm); - }else{ + } else { res = memcmp(pSeg->zTerm, zTerm, pSeg->nTerm); } - if( res==0 ){ - res = pSeg->nTerm-nTerm; + if (res == 0) { + res = pSeg->nTerm - nTerm; } } return res; @@ -188972,32 +187006,33 @@ static int fts3SegReaderTermCmp( ** (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 */ +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 ); + assert(nSuspect <= nSegment); - if( nSuspect==nSegment ) nSuspect--; - for(i=nSuspect-1; i>=0; i--){ + 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]; + 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 ); + for (i = 0; i < (nSuspect - 1); i++) { + assert(xCmp(apSegment[i], apSegment[i + 1]) < 0); } #endif } @@ -189005,15 +187040,14 @@ static void fts3SegReaderSort( /* ** 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; +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 ){ + if (rc == SQLITE_OK) { sqlite3_bind_int64(pStmt, 1, iBlock); sqlite3_bind_blob(pStmt, 2, z, n, SQLITE_STATIC); sqlite3_step(pStmt); @@ -189028,14 +187062,14 @@ static int fts3WriteSegment( ** *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){ +SQLITE_PRIVATE int sqlite3Fts3MaxLevel(Fts3Table* p, int* pnMax) { int rc; int mxLevel = 0; - sqlite3_stmt *pStmt = 0; + sqlite3_stmt* pStmt = 0; rc = fts3SqlStmt(p, SQL_SELECT_MXLEVEL, &pStmt, 0); - if( rc==SQLITE_OK ){ - if( SQLITE_ROW==sqlite3_step(pStmt) ){ + if (rc == SQLITE_OK) { + if (SQLITE_ROW == sqlite3_step(pStmt)) { mxLevel = sqlite3_column_int(pStmt, 0); } rc = sqlite3_reset(pStmt); @@ -189047,29 +187081,29 @@ SQLITE_PRIVATE int sqlite3Fts3MaxLevel(Fts3Table *p, int *pnMax){ /* ** 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; +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 ){ + 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 ){ + if (nLeafData == 0) { sqlite3_bind_int64(pStmt, 5, iEndBlock); - }else{ - char *zEnd = sqlite3_mprintf("%lld %lld", iEndBlock, nLeafData); - if( !zEnd ) return SQLITE_NOMEM; + } 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); @@ -189088,15 +187122,15 @@ static int fts3WriteSegdir( ** 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 */ -){ +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 */ + if (pTree) { + int nData = pTree->nData; /* 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; + 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; + if (nSuffix <= 0) + return FTS_CORRUPT_VTAB; - nReq += sqlite3Fts3VarintLen(nPrefix)+sqlite3Fts3VarintLen(nSuffix)+nSuffix; - if( nReq<=p->nNodeSize || !pTree->zTerm ){ + nReq += sqlite3Fts3VarintLen(nPrefix) + sqlite3Fts3VarintLen(nSuffix) + nSuffix; + if (nReq <= p->nNodeSize || !pTree->zTerm) { - if( nReq>p->nNodeSize ){ + 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 @@ -189143,14 +187177,14 @@ static int fts3NodeAddTerm( ** 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_malloc64(nReq); - if( !pTree->aData ){ + assert(pTree->aData == (char*)&pTree[1]); + pTree->aData = (char*)sqlite3_malloc64(nReq); + if (!pTree->aData) { return SQLITE_NOMEM; } } - if( pTree->zTerm ){ + if (pTree->zTerm) { /* There is no prefix-length field for first term in a node */ nData += sqlite3Fts3PutVarint(&pTree->aData[nData], nPrefix); } @@ -189160,20 +187194,20 @@ static int fts3NodeAddTerm( pTree->nData = nData + nSuffix; pTree->nEntry++; - if( isCopyTerm ){ - if( pTree->nMalloczMalloc, (i64)nTerm*2); - if( !zNew ){ + if (isCopyTerm) { + if (pTree->nMalloc < nTerm) { + char* zNew = sqlite3_realloc64(pTree->zMalloc, (i64)nTerm * 2); + if (!zNew) { return SQLITE_NOMEM; } - pTree->nMalloc = nTerm*2; + pTree->nMalloc = nTerm * 2; pTree->zMalloc = zNew; } pTree->zTerm = pTree->zMalloc; memcpy(pTree->zTerm, zTerm, nTerm); pTree->nTerm = nTerm; - }else{ - pTree->zTerm = (char *)zTerm; + } else { + pTree->zTerm = (char*)zTerm; pTree->nTerm = nTerm; } return SQLITE_OK; @@ -189188,18 +187222,18 @@ static int fts3NodeAddTerm( ** now. Instead, the term is inserted into the parent of pTree. If pTree ** has no parent, one is created here. */ - pNew = (SegmentNode *)sqlite3_malloc64(sizeof(SegmentNode) + p->nNodeSize); - if( !pNew ){ + pNew = (SegmentNode*)sqlite3_malloc64(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]; + pNew->aData = (char*)&pNew[1]; - if( pTree ){ - SegmentNode *pParent = pTree->pParent; + if (pTree) { + SegmentNode* pParent = pTree->pParent; rc = fts3NodeAddTerm(p, &pParent, isCopyTerm, zTerm, nTerm); - if( pTree->pParent==0 ){ + if (pTree->pParent == 0) { pTree->pParent = pParent; } pTree->pRight = pNew; @@ -189208,7 +187242,7 @@ static int fts3NodeAddTerm( pNew->zMalloc = pTree->zMalloc; pNew->nMalloc = pTree->nMalloc; pTree->zMalloc = 0; - }else{ + } else { pNew->pLeftmost = pNew; rc = fts3NodeAddTerm(p, &pNew, isCopyTerm, zTerm, nTerm); } @@ -189220,16 +187254,12 @@ static int fts3NodeAddTerm( /* ** Helper function for fts3NodeWrite(). */ -static int fts3TreeFinishNode( - SegmentNode *pTree, - int iHeight, - sqlite3_int64 iLeftChild -){ +static int fts3TreeFinishNode(SegmentNode* pTree, int iHeight, sqlite3_int64 iLeftChild) { int nStart; - assert( iHeight>=1 && iHeight<128 ); + assert(iHeight >= 1 && iHeight < 128); nStart = FTS3_VARINT_MAX - sqlite3Fts3VarintLen(iLeftChild); pTree->aData[nStart] = (char)iHeight; - sqlite3Fts3PutVarint(&pTree->aData[nStart+1], iLeftChild); + sqlite3Fts3PutVarint(&pTree->aData[nStart + 1], iLeftChild); return nStart; } @@ -189246,41 +187276,38 @@ static int fts3TreeFinishNode( ** 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 */ -){ +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 ){ + if (!pTree->pParent) { /* Root node of the tree. */ int nStart = fts3TreeFinishNode(pTree, iHeight, iLeaf); - *piLast = iFree-1; + *piLast = iFree - 1; *pnRoot = pTree->nData - nStart; *paRoot = &pTree->aData[nStart]; - }else{ - SegmentNode *pIter; + } else { + SegmentNode* pIter; sqlite3_int64 iNextFree = iFree; sqlite3_int64 iNextLeaf = iLeaf; - for(pIter=pTree->pLeftmost; pIter && rc==SQLITE_OK; pIter=pIter->pRight){ + 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); + iNextLeaf += (pIter->nEntry + 1); } - if( rc==SQLITE_OK ){ - assert( iNextLeaf==iFree ); - rc = fts3NodeWrite( - p, pTree->pParent, iHeight+1, iFree, iNextFree, piLast, paRoot, pnRoot - ); + if (rc == SQLITE_OK) { + assert(iNextLeaf == iFree); + rc = fts3NodeWrite(p, pTree->pParent, iHeight + 1, iFree, iNextFree, piLast, paRoot, pnRoot); } } @@ -189290,16 +187317,16 @@ static int fts3NodeWrite( /* ** Free all memory allocations associated with the tree pTree. */ -static void fts3NodeFree(SegmentNode *pTree){ - if( pTree ){ - SegmentNode *p = pTree->pLeftmost; +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] ){ + while (p) { + SegmentNode* pRight = p->pRight; + if (p->aData != (char*)&p[1]) { sqlite3_free(p->aData); } - assert( pRight==0 || p->zMalloc==0 ); + assert(pRight == 0 || p->zMalloc == 0); sqlite3_free(p->zMalloc); sqlite3_free(p); p = pRight; @@ -189315,70 +187342,76 @@ static void fts3NodeFree(SegmentNode *pTree){ ** ** 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 */ - i64 nReq; /* Number of bytes required on leaf page */ +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 */ + i64 nReq; /* Number of bytes required on leaf page */ int nData; - SegmentWriter *pWriter = *ppWriter; + SegmentWriter* pWriter = *ppWriter; - if( !pWriter ){ + if (!pWriter) { int rc; - sqlite3_stmt *pStmt; + sqlite3_stmt* pStmt; /* Allocate the SegmentWriter structure */ - pWriter = (SegmentWriter *)sqlite3_malloc64(sizeof(SegmentWriter)); - if( !pWriter ) return SQLITE_NOMEM; + pWriter = (SegmentWriter*)sqlite3_malloc64(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_malloc64(p->nNodeSize); - if( !pWriter->aData ) return SQLITE_NOMEM; + pWriter->aData = (char*)sqlite3_malloc64(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) ){ + 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; + if (rc != SQLITE_OK) + return rc; } nData = pWriter->nData; nPrefix = fts3PrefixCompress(pWriter->zTerm, pWriter->nTerm, zTerm, nTerm); - nSuffix = nTerm-nPrefix; + 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; + 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 */ + 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 ){ + 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; + if (pWriter->iFree == LARGEST_INT64) + return FTS_CORRUPT_VTAB; rc = fts3WriteSegment(p, pWriter->iFree++, pWriter->aData, nData); - if( rc!=SQLITE_OK ) return rc; + if (rc != SQLITE_OK) + return rc; p->nLeafAdd++; /* Add the current term to the interior node tree. The term added to @@ -189393,9 +187426,10 @@ static int fts3SegWriterAdd( ** 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; + assert(nPrefix < nTerm); + rc = fts3NodeAddTerm(p, &pWriter->pTree, isCopyTerm, zTerm, nPrefix + 1); + if (rc != SQLITE_OK) + return rc; nData = 0; pWriter->nTerm = 0; @@ -189403,10 +187437,10 @@ static int fts3SegWriterAdd( 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 */ + 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. */ @@ -189415,22 +187449,23 @@ static int fts3SegWriterAdd( /* 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_realloc64(pWriter->aData, nReq); - if( !aNew ) return SQLITE_NOMEM; + if (nReq > pWriter->nSize) { + char* aNew = sqlite3_realloc64(pWriter->aData, nReq); + if (!aNew) + return SQLITE_NOMEM; pWriter->aData = aNew; pWriter->nSize = nReq; } - assert( nData+nReq<=pWriter->nSize ); + 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 ); + assert(nSuffix > 0); memcpy(&pWriter->aData[nData], &zTerm[nPrefix], nSuffix); nData += nSuffix; nData += sqlite3Fts3PutVarint(&pWriter->aData[nData], nDoclist); - assert( nDoclist>0 ); + assert(nDoclist > 0); memcpy(&pWriter->aData[nData], aDoclist, nDoclist); pWriter->nData = nData + nDoclist; @@ -189439,21 +187474,21 @@ static int fts3SegWriterAdd( ** 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_realloc64(pWriter->zMalloc, (i64)nTerm*2); - if( !zNew ){ + if (isCopyTerm) { + if (nTerm > pWriter->nMalloc) { + char* zNew = sqlite3_realloc64(pWriter->zMalloc, (i64)nTerm * 2); + if (!zNew) { return SQLITE_NOMEM; } - pWriter->nMalloc = nTerm*2; + pWriter->nMalloc = nTerm * 2; pWriter->zMalloc = zNew; pWriter->zTerm = zNew; } - assert( pWriter->zTerm==pWriter->zMalloc ); - assert( nTerm>0 ); + assert(pWriter->zTerm == pWriter->zMalloc); + assert(nTerm > 0); memcpy(pWriter->zTerm, zTerm, nTerm); - }else{ - pWriter->zTerm = (char *)zTerm; + } else { + pWriter->zTerm = (char*)zTerm; } pWriter->nTerm = nTerm; @@ -189466,33 +187501,29 @@ static int fts3SegWriterAdd( ** 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 */ +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 = 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); + if (rc == SQLITE_OK) { + rc = fts3WriteSegdir(p, iLevel, iIdx, pWriter->iFirst, iLastLeaf, iLast, pWriter->nLeafData, zRoot, nRoot); } - }else{ + } 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); + rc = fts3WriteSegdir(p, iLevel, iIdx, 0, 0, 0, pWriter->nLeafData, pWriter->aData, pWriter->nData); } p->nLeafAdd++; return rc; @@ -189502,8 +187533,8 @@ static int fts3SegWriterFlush( ** Release all memory held by the SegmentWriter object passed as the ** first argument. */ -static void fts3SegWriterFree(SegmentWriter *pWriter){ - if( pWriter ){ +static void fts3SegWriterFree(SegmentWriter* pWriter) { + if (pWriter) { sqlite3_free(pWriter->aData); sqlite3_free(pWriter->zMalloc); fts3NodeFree(pWriter->pTree); @@ -189521,17 +187552,17 @@ static void fts3SegWriterFree(SegmentWriter *pWriter){ ** 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; +static int fts3IsEmpty(Fts3Table* p, sqlite3_value* pRowid, int* pisEmpty) { + sqlite3_stmt* pStmt; int rc; - if( p->zContentTbl ){ + if (p->zContentTbl) { /* If using the content=xxx option, assume the table is never empty */ *pisEmpty = 0; rc = SQLITE_OK; - }else{ + } else { rc = fts3SqlStmt(p, SQL_IS_EMPTY, &pStmt, &pRowid); - if( rc==SQLITE_OK ){ - if( SQLITE_ROW==sqlite3_step(pStmt) ){ + if (rc == SQLITE_OK) { + if (SQLITE_ROW == sqlite3_step(pStmt)) { *pisEmpty = sqlite3_column_int(pStmt, 0); } rc = sqlite3_reset(pStmt); @@ -189548,15 +187579,10 @@ static int fts3IsEmpty(Fts3Table *p, sqlite3_value *pRowid, int *pisEmpty){ ** ** 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; +static int fts3SegmentMaxLevel(Fts3Table* p, int iLangid, int iIndex, sqlite3_int64* pnMax) { + sqlite3_stmt* pStmt; int rc; - assert( iIndex>=0 && iIndexnIndex ); + assert(iIndex >= 0 && iIndex < p->nIndex); /* Set pStmt to the compiled version of: ** @@ -189565,12 +187591,11 @@ static int fts3SegmentMaxLevel( ** (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; + 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) ){ + 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); @@ -189584,7 +187609,7 @@ static int fts3SegmentMaxLevel( ** 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){ +static int fts3SegmentIsMaxLevel(Fts3Table* p, i64 iAbsLevel, int* pbMax) { /* Set pStmt to the compiled version of: ** @@ -189592,17 +187617,16 @@ static int fts3SegmentIsMaxLevel(Fts3Table *p, i64 iAbsLevel, int *pbMax){ ** ** (1024 is actually the value of macro FTS3_SEGDIR_PREFIXLEVEL_STR). */ - sqlite3_stmt *pStmt; + 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 - ); + 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; + if (SQLITE_ROW == sqlite3_step(pStmt)) { + *pbMax = sqlite3_column_type(pStmt, 0) == SQLITE_NULL; } return sqlite3_reset(pStmt); } @@ -189612,15 +187636,14 @@ static int fts3SegmentIsMaxLevel(Fts3Table *p, i64 iAbsLevel, int *pbMax){ ** 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 */ +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 ){ + if (rc == SQLITE_OK) { sqlite3_bind_int64(pDelete, 1, pSeg->iStartBlock); sqlite3_bind_int64(pDelete, 2, pSeg->iEndBlock); sqlite3_step(pDelete); @@ -189644,44 +187667,39 @@ static int fts3DeleteSegment( ** ** 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 */ +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 ){ + assert(iLevel >= 0 || iLevel == FTS3_SEGCURSOR_ALL); + if (iLevel == FTS3_SEGCURSOR_ALL) { rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_RANGE, &pDelete, 0); - if( rc==SQLITE_OK ){ + 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) - ); + sqlite3_bind_int64(pDelete, 2, getAbsoluteLevel(p, iLangid, iIndex, FTS3_SEGDIR_MAXLEVEL - 1)); } - }else{ + } 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_bind_int64(pDelete, 1, getAbsoluteLevel(p, iLangid, iIndex, iLevel)); } } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { sqlite3_step(pDelete); rc = sqlite3_reset(pDelete); } @@ -189701,38 +187719,38 @@ static int fts3DeleteSegdir( ** 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; +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]; + char* pEnd = &pList[nList]; int iCurrent = 0; - char *p = pList; + char* p = pList; - assert( iCol>=0 ); - while( 1 ){ + assert(iCol >= 0); + while (1) { char c = 0; - while( p0){ + if (bZero && (pEnd - &pList[nList]) > 0) { memset(&pList[nList], 0, pEnd - &pList[nList]); } *ppList = pList; @@ -189746,81 +187764,74 @@ static void fts3ColumnFilter( ** 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, - i64 nList -){ - if( nList>pMsr->nBuffer ){ - char *pNew; - pMsr->nBuffer = nList*2; - pNew = (char *)sqlite3_realloc64(pMsr->aBuffer, pMsr->nBuffer); - if( !pNew ) return SQLITE_NOMEM; +static int fts3MsrBufferData(Fts3MultiSegReader* pMsr, /* Multi-segment-reader handle */ + char* pList, i64 nList) { + if (nList > pMsr->nBuffer) { + char* pNew; + pMsr->nBuffer = nList * 2; + pNew = (char*)sqlite3_realloc64(pMsr->aBuffer, pMsr->nBuffer); + if (!pNew) + return SQLITE_NOMEM; pMsr->aBuffer = pNew; } - assert( nList>0 ); + 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 */ -){ +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 - ); + Fts3SegReader** apSegment = pMsr->apSegment; + int (*xCmp)(Fts3SegReader*, Fts3SegReader*) = (p->bDescIdx ? fts3SegReaderDoclistCmpRev : fts3SegReaderDoclistCmp); - if( nMerge==0 ){ + if (nMerge == 0) { *paPoslist = 0; return SQLITE_OK; } - while( 1 ){ - Fts3SegReader *pSeg; + while (1) { + Fts3SegReader* pSeg; pSeg = pMsr->apSegment[0]; - if( pSeg->pOffsetList==0 ){ + if (pSeg->pOffsetList == 0) { *paPoslist = 0; break; - }else{ + } else { int rc; - char *pList; + 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 - ){ + while (rc == SQLITE_OK && j < nMerge && apSegment[j]->pOffsetList && apSegment[j]->iDocid == iDocid) { rc = fts3SegReaderNextDocid(p, apSegment[j], 0, 0); j++; } - if( rc!=SQLITE_OK ) return rc; + if (rc != SQLITE_OK) + return rc; fts3SegReaderSort(pMsr->apSegment, nMerge, j, xCmp); - if( nList>0 && fts3SegReaderIsPending(apSegment[0]) ){ - rc = fts3MsrBufferData(pMsr, pList, (i64)nList+1); - if( rc!=SQLITE_OK ) return rc; - assert( (pMsr->aBuffer[nList] & 0xFE)==0x00 ); + if (nList > 0 && fts3SegReaderIsPending(apSegment[0])) { + rc = fts3MsrBufferData(pMsr, pList, (i64)nList + 1); + if (rc != SQLITE_OK) + return rc; + assert((pMsr->aBuffer[nList] & 0xFE) == 0x00); pList = pMsr->aBuffer; } - if( pMsr->iColFilter>=0 ){ + if (pMsr->iColFilter >= 0) { fts3ColumnFilter(pMsr->iColFilter, 1, &pList, &nList); } - if( nList>0 ){ + if (nList > 0) { *paPoslist = pList; *piDocid = iDocid; *pnPoslist = nList; @@ -189832,12 +187843,11 @@ SQLITE_PRIVATE int sqlite3Fts3MsrIncrNext( 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 */ -){ +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; @@ -189847,15 +187857,16 @@ static int fts3SegReaderStart( ** 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++){ + for (i = 0; pCsr->bRestart == 0 && i < pCsr->nSegment; i++) { int res = 0; - Fts3SegReader *pSeg = pCsr->apSegment[i]; + 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 (rc != SQLITE_OK) + return rc; + } while (zTerm && (res = fts3SegReaderTermCmp(pSeg, zTerm, nTerm)) < 0); - if( pSeg->bLookup && res!=0 ){ + if (pSeg->bLookup && res != 0) { fts3SegReaderSetEof(pSeg); } } @@ -189864,53 +187875,51 @@ static int fts3SegReaderStart( return SQLITE_OK; } -SQLITE_PRIVATE int sqlite3Fts3SegReaderStart( - Fts3Table *p, /* Virtual table handle */ - Fts3MultiSegReader *pCsr, /* Cursor object */ - Fts3SegFilter *pFilter /* Restrictions on range of iteration */ -){ +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 */ -){ +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 - ); + int (*xCmp)(Fts3SegReader*, Fts3SegReader*) = (p->bDescIdx ? fts3SegReaderDoclistCmpRev : fts3SegReaderDoclistCmp); - assert( pCsr->pFilter==0 ); - assert( zTerm && nTerm>0 ); + 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; + 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) ){ + for (i = 0; i < nSegment; i++) { + Fts3SegReader* pSeg = pCsr->apSegment[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++){ + for (i = 0; i < pCsr->nAdvance; i++) { rc = fts3SegReaderFirstDocid(p, pCsr->apSegment[i]); - if( rc!=SQLITE_OK ) return rc; + if (rc != SQLITE_OK) + return rc; } fts3SegReaderSort(pCsr->apSegment, i, i, xCmp); - assert( iCol<0 || iColnColumn ); + assert(iCol < 0 || iCol < p->nColumn); pCsr->iColFilter = iCol; return SQLITE_OK; @@ -189928,17 +187937,17 @@ SQLITE_PRIVATE int sqlite3Fts3MsrIncrStart( ** 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 */ +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 ); + 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++){ + for (i = 0; i < pCsr->nSegment; i++) { pCsr->apSegment[i]->pOffsetList = 0; pCsr->apSegment[i]->nOffsetList = 0; pCsr->apSegment[i]->iDocid = 0; @@ -189947,12 +187956,12 @@ SQLITE_PRIVATE int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr){ return SQLITE_OK; } -static int fts3GrowSegReaderBuffer(Fts3MultiSegReader *pCsr, i64 nReq){ - if( nReq>pCsr->nBuffer ){ - char *aNew; - pCsr->nBuffer = nReq*2; +static int fts3GrowSegReaderBuffer(Fts3MultiSegReader* pCsr, i64 nReq) { + if (nReq > pCsr->nBuffer) { + char* aNew; + pCsr->nBuffer = nReq * 2; aNew = sqlite3_realloc64(pCsr->aBuffer, pCsr->nBuffer); - if( !aNew ){ + if (!aNew) { return SQLITE_NOMEM; } pCsr->aBuffer = aNew; @@ -189960,28 +187969,25 @@ static int fts3GrowSegReaderBuffer(Fts3MultiSegReader *pCsr, i64 nReq){ return SQLITE_OK; } - -SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( - Fts3Table *p, /* Virtual table handle */ - Fts3MultiSegReader *pCsr /* Cursor object */ -){ +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); + 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; + Fts3SegReader** apSegment = pCsr->apSegment; int nSegment = pCsr->nSegment; - Fts3SegFilter *pFilter = pCsr->pFilter; - int (*xCmp)(Fts3SegReader *, Fts3SegReader *) = ( - p->bDescIdx ? fts3SegReaderDoclistCmpRev : fts3SegReaderDoclistCmp - ); + Fts3SegFilter* pFilter = pCsr->pFilter; + int (*xCmp)(Fts3SegReader*, Fts3SegReader*) = (p->bDescIdx ? fts3SegReaderDoclistCmpRev : fts3SegReaderDoclistCmp); - if( pCsr->nSegment==0 ) return SQLITE_OK; + if (pCsr->nSegment == 0) + return SQLITE_OK; do { int nMerge; @@ -189990,21 +187996,23 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( /* 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 ){ + for (i = 0; i < pCsr->nAdvance; i++) { + Fts3SegReader* pSeg = apSegment[i]; + if (pSeg->bLookup) { fts3SegReaderSetEof(pSeg); - }else{ + } else { rc = fts3SegReaderNext(p, pSeg, 0); } - if( rc!=SQLITE_OK ) return rc; + 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; + assert(rc == SQLITE_OK); + if (apSegment[0]->aNode == 0) + break; pCsr->nTerm = apSegment[0]->nTerm; pCsr->zTerm = apSegment[0]->zTerm; @@ -190016,103 +188024,93 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( ** 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) - ){ + if (pFilter->zTerm && !isScan) { + if (pCsr->nTerm < pFilter->nTerm || (!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) - ){ + while (nMerge < nSegment && apSegment[nMerge]->aNode && 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) - ){ + 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, - (i64)pCsr->nDoclist); + if (fts3SegReaderIsPending(apSegment[0])) { + rc = fts3MsrBufferData(pCsr, apSegment[0]->aDoclist, (i64)pCsr->nDoclist); pCsr->aDoclist = pCsr->aBuffer; - }else{ + } 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 */ + 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; + while (apSegment[0]->pOffsetList) { + 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 - ){ + while (j < nMerge && apSegment[j]->pOffsetList && apSegment[j]->iDocid == iDocid) { fts3SegReaderNextDocid(p, apSegment[j], 0, 0); j++; } - if( isColFilter ){ + if (isColFilter) { fts3ColumnFilter(pFilter->iCol, 0, &pList, &nList); } - if( !isIgnoreEmpty || nList>0 ){ + 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; + 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; + } else { + if (nDoclist > 0 && iPrev >= iDocid) + return FTS_CORRUPT_VTAB; iDelta = (i64)((u64)iDocid - (u64)iPrev); } - nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos?nList+1:0); + nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos ? nList + 1 : 0); - rc = fts3GrowSegReaderBuffer(pCsr, - (i64)nByte+nDoclist+FTS3_NODE_PADDING); - if( rc ) return rc; + rc = fts3GrowSegReaderBuffer(pCsr, (i64)nByte + nDoclist + FTS3_NODE_PADDING); + if (rc) + return rc; - if( isFirst ){ - char *a = &pCsr->aBuffer[nDoclist]; + if (isFirst) { + char* a = &pCsr->aBuffer[nDoclist]; int nWrite; nWrite = sqlite3Fts3FirstFilter(iDelta, pList, nList, a); - if( nWrite ){ + if (nWrite) { iPrev = iDocid; nDoclist += nWrite; } - }else{ + } else { nDoclist += sqlite3Fts3PutVarint(&pCsr->aBuffer[nDoclist], iDelta); iPrev = iDocid; - if( isRequirePos ){ + if (isRequirePos) { memcpy(&pCsr->aBuffer[nDoclist], pList, nList); nDoclist += nList; pCsr->aBuffer[nDoclist++] = '\0'; @@ -190122,9 +188120,10 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( fts3SegReaderSort(apSegment, nMerge, j, xCmp); } - if( nDoclist>0 ){ - rc = fts3GrowSegReaderBuffer(pCsr, (i64)nDoclist+FTS3_NODE_PADDING); - if( rc ) return rc; + if (nDoclist > 0) { + rc = fts3GrowSegReaderBuffer(pCsr, (i64)nDoclist + FTS3_NODE_PADDING); + if (rc) + return rc; memset(&pCsr->aBuffer[nDoclist], 0, FTS3_NODE_PADDING); pCsr->aDoclist = pCsr->aBuffer; pCsr->nDoclist = nDoclist; @@ -190132,18 +188131,16 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( } } pCsr->nAdvance = nMerge; - }while( rc==SQLITE_OK ); + } while (rc == SQLITE_OK); return rc; } - -SQLITE_PRIVATE void sqlite3Fts3SegReaderFinish( - Fts3MultiSegReader *pCsr /* Cursor object */ -){ - if( pCsr ){ +SQLITE_PRIVATE void sqlite3Fts3SegReaderFinish(Fts3MultiSegReader* pCsr /* Cursor object */ +) { + if (pCsr) { int i; - for(i=0; inSegment; i++){ + for (i = 0; i < pCsr->nSegment; i++) { sqlite3Fts3SegReaderFree(pCsr->apSegment[i]); } sqlite3_free(pCsr->apSegment); @@ -190165,65 +188162,59 @@ SQLITE_PRIVATE void sqlite3Fts3SegReaderFinish( ** 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 ){ +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'); + for (i = 0; zText[i] >= '0' && zText[i] <= '9'; i++) { + iVal = iVal * 10 + (zText[i] - '0'); } *piEndBlock = (i64)iVal; - while( zText[i]==' ' ) i++; + while (zText[i] == ' ') + i++; iVal = 0; - if( zText[i]=='-' ){ + if (zText[i] == '-') { i++; iMul = -1; } - for(/* no-op */; zText[i]>='0' && zText[i]<='9'; i++){ - iVal = iVal*10 + (zText[i] - '0'); + 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 */ -){ +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; + sqlite3_stmt* pRange; rc = fts3SqlStmt(p, SQL_SELECT_LEVEL_RANGE2, &pRange, 0); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { int bOk = 0; - i64 iLast = (iAbsLevel/FTS3_SEGDIR_MAXLEVEL + 1) * FTS3_SEGDIR_MAXLEVEL - 1; - i64 nLimit = (nByte*3)/2; + 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, 1, iAbsLevel + 1); sqlite3_bind_int64(pRange, 2, iLast); - while( SQLITE_ROW==sqlite3_step(pRange) ){ + while (SQLITE_ROW == sqlite3_step(pRange)) { i64 nSize = 0, dummy; fts3ReadEndBlockField(pRange, 2, &dummy, &nSize); - if( nSize<=0 || nSize>nLimit ){ + 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 @@ -190236,19 +188227,19 @@ static int fts3PromoteSegments( } rc = sqlite3_reset(pRange); - if( bOk ){ + if (bOk) { int iIdx = 0; - sqlite3_stmt *pUpdate1 = 0; - sqlite3_stmt *pUpdate2 = 0; + sqlite3_stmt* pUpdate1 = 0; + sqlite3_stmt* pUpdate2 = 0; - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = fts3SqlStmt(p, SQL_UPDATE_LEVEL_IDX, &pUpdate1, 0); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = fts3SqlStmt(p, SQL_UPDATE_LEVEL, &pUpdate2, 0); } - if( rc==SQLITE_OK ){ + 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, @@ -190260,24 +188251,24 @@ static int fts3PromoteSegments( ** 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) ){ + 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 ){ + if (rc != SQLITE_OK) { sqlite3_reset(pRange); break; } } } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = sqlite3_reset(pRange); } /* Move level -1 to level iAbsLevel */ - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { sqlite3_bind_int64(pUpdate2, 1, iAbsLevel); sqlite3_step(pUpdate2); rc = sqlite3_reset(pUpdate2); @@ -190285,7 +188276,6 @@ static int fts3PromoteSegments( } } - return rc; } @@ -190300,130 +188290,125 @@ static int fts3PromoteSegments( ** 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 ); +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 < FTS3_SEGDIR_MAXLEVEL); + assert(iIndex >= 0 && iIndex < p->nIndex); rc = sqlite3Fts3SegReaderCursor(p, iLangid, iIndex, iLevel, 0, 0, 1, 0, &csr); - if( rc!=SQLITE_OK || csr.nSegment==0 ) goto finished; + if (rc != SQLITE_OK || csr.nSegment == 0) + goto finished; - if( iLevel!=FTS3_SEGCURSOR_PENDING ){ + if (iLevel != FTS3_SEGCURSOR_PENDING) { rc = fts3SegmentMaxLevel(p, iLangid, iIndex, &iMaxLevel); - if( rc!=SQLITE_OK ) goto finished; + if (rc != SQLITE_OK) + goto finished; } - if( iLevel==FTS3_SEGCURSOR_ALL ){ + 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]) ){ + if (csr.nSegment == 1 && 0 == fts3SegReaderIsPending(csr.apSegment[0])) { rc = SQLITE_DONE; goto finished; } iNewLevel = iMaxLevel; bIgnoreEmpty = 1; - }else{ + } 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); + 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; + if (rc != SQLITE_OK) + goto finished; - assert( csr.nSegment>0 ); - assert_fts3_nc( iNewLevel>=getAbsoluteLevel(p, iLangid, iIndex, 0) ); - assert_fts3_nc( - iNewLevel 0); + assert_fts3_nc(iNewLevel >= getAbsoluteLevel(p, iLangid, iIndex, 0)); + assert_fts3_nc(iNewLevel < getAbsoluteLevel(p, iLangid, iIndex, FTS3_SEGDIR_MAXLEVEL)); memset(&filter, 0, sizeof(Fts3SegFilter)); filter.flags = FTS3_SEGMENT_REQUIRE_POS; filter.flags |= (bIgnoreEmpty ? FTS3_SEGMENT_IGNORE_EMPTY : 0); rc = sqlite3Fts3SegReaderStart(p, &csr, &filter); - while( SQLITE_OK==rc ){ + while (SQLITE_OK == rc) { rc = sqlite3Fts3SegReaderStep(p, &csr); - if( rc!=SQLITE_ROW ) break; - rc = fts3SegWriterAdd(p, &pWriter, 1, - csr.zTerm, csr.nTerm, csr.aDoclist, csr.nDoclist); + if (rc != SQLITE_ROW) + break; + rc = fts3SegWriterAdd(p, &pWriter, 1, csr.zTerm, csr.nTerm, csr.aDoclist, csr.nDoclist); } - if( rc!=SQLITE_OK ) goto finished; - assert_fts3_nc( pWriter || bIgnoreEmpty ); + if (rc != SQLITE_OK) + goto finished; + assert_fts3_nc(pWriter || bIgnoreEmpty); - if( iLevel!=FTS3_SEGCURSOR_PENDING ){ - rc = fts3DeleteSegdir( - p, iLangid, iIndex, iLevel, csr.apSegment, csr.nSegment - ); - if( rc!=SQLITE_OK ) goto finished; + if (iLevel != FTS3_SEGCURSOR_PENDING) { + rc = fts3DeleteSegdir(p, iLangid, iIndex, iLevel, csr.apSegment, csr.nSegment); + if (rc != SQLITE_OK) + goto finished; } - if( pWriter ){ + if (pWriter) { rc = fts3SegWriterFlush(p, pWriter, iNewLevel, iIdx); - if( rc==SQLITE_OK ){ - if( iLevel==FTS3_SEGCURSOR_PENDING || iNewLevelnLeafData); } } } - finished: +finished: fts3SegWriterFree(pWriter); sqlite3Fts3SegReaderFinish(&csr); return rc; } - /* ** Flush the contents of pendingTerms to level 0 segments. */ -SQLITE_PRIVATE int sqlite3Fts3PendingTermsFlush(Fts3Table *p){ +SQLITE_PRIVATE int sqlite3Fts3PendingTermsFlush(Fts3Table* p) { int rc = SQLITE_OK; int i; - for(i=0; rc==SQLITE_OK && inIndex; i++){ + for (i = 0; rc == SQLITE_OK && i < p->nIndex; i++) { rc = fts3SegmentMerge(p, p->iPrevLangid, i, FTS3_SEGCURSOR_PENDING); - if( rc==SQLITE_DONE ) rc = SQLITE_OK; + 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; + 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 ){ + if (rc == SQLITE_OK) { sqlite3_bind_int(pStmt, 1, FTS_STAT_AUTOINCRMERGE); rc = sqlite3_step(pStmt); - if( rc==SQLITE_ROW ){ + if (rc == SQLITE_ROW) { p->nAutoincrmerge = sqlite3_column_int(pStmt, 0); - if( p->nAutoincrmerge==1 ) p->nAutoincrmerge = 8; - }else if( rc==SQLITE_DONE ){ + if (p->nAutoincrmerge == 1) + p->nAutoincrmerge = 8; + } else if (rc == SQLITE_DONE) { p->nAutoincrmerge = 0; } rc = sqlite3_reset(pStmt); @@ -190435,14 +188420,13 @@ SQLITE_PRIVATE int sqlite3Fts3PendingTermsFlush(Fts3Table *p){ /* ** 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 */ -){ +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 ){ +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 ){ + if (rc) { sqlite3_free(pBlob); *pRC = rc; return; @@ -190518,66 +188502,64 @@ static void fts3InsertDocsize( ** 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 */ +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; + const int nStat = p->nColumn + 2; - if( *pRC ) return; - a = sqlite3_malloc64( (sizeof(u32)+10)*(sqlite3_int64)nStat ); - if( a==0 ){ + 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 ){ + 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) ); + 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 ){ + if (rc != SQLITE_OK) { sqlite3_free(a); *pRC = rc; return; } - if( nChng<0 && a[0]<(u32)(-nChng) ){ + if (nChng < 0 && a[0] < (u32)(-nChng)) { a[0] = 0; - }else{ + } else { a[0] += nChng; } - for(i=0; inColumn+1; i++){ - u32 x = a[i+1]; - if( x+aSzIns[i] < aSzDel[i] ){ + for (i = 0; i < p->nColumn + 1; i++) { + u32 x = a[i + 1]; + if (x + aSzIns[i] < aSzDel[i]) { x = 0; - }else{ + } else { x = x + aSzIns[i] - aSzDel[i]; } - a[i+1] = x; + a[i + 1] = x; } fts3EncodeIntArray(nStat, a, pBlob, &nBlob); rc = fts3SqlStmt(p, SQL_REPLACE_STAT, &pStmt, 0); - if( rc ){ + if (rc) { sqlite3_free(a); *pRC = rc; return; @@ -190594,37 +188576,38 @@ static void fts3UpdateDocTotals( ** Merge the entire database so that there is one segment for each ** iIndex/iLangid combination. */ -static int fts3DoOptimize(Fts3Table *p, int bReturnDone){ +static int fts3DoOptimize(Fts3Table* p, int bReturnDone) { int bSeenDone = 0; int rc; - sqlite3_stmt *pAllLangid = 0; + sqlite3_stmt* pAllLangid = 0; rc = sqlite3Fts3PendingTermsFlush(p); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = fts3SqlStmt(p, SQL_SELECT_ALL_LANGID, &pAllLangid, 0); } - if( rc==SQLITE_OK ){ + 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 ){ + while (sqlite3_step(pAllLangid) == SQLITE_ROW) { int i; int iLangid = sqlite3_column_int(pAllLangid, 0); - for(i=0; rc==SQLITE_OK && inIndex; i++){ + for (i = 0; rc == SQLITE_OK && i < p->nIndex; i++) { rc = fts3SegmentMerge(p, iLangid, i, FTS3_SEGCURSOR_ALL); - if( rc==SQLITE_DONE ){ + if (rc == SQLITE_DONE) { bSeenDone = 1; rc = SQLITE_OK; } } } rc2 = sqlite3_reset(pAllLangid); - if( rc==SQLITE_OK ) rc = rc2; + if (rc == SQLITE_OK) + rc = rc2; } sqlite3Fts3SegmentsClose(p); - return (rc==SQLITE_OK && bReturnDone && bSeenDone) ? SQLITE_DONE : rc; + return (rc == SQLITE_OK && bReturnDone && bSeenDone) ? SQLITE_DONE : rc; } /* @@ -190637,71 +188620,71 @@ static int fts3DoOptimize(Fts3Table *p, int bReturnDone){ ** 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 */ +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; + 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 ){ + char* zSql = sqlite3_mprintf("SELECT %s", p->zReadExprlist); + if (!zSql) { rc = SQLITE_NOMEM; - }else{ + } 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 ){ + 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{ + } else { memset(aSz, 0, nByte); - aSzIns = &aSz[p->nColumn+1]; - aSzDel = &aSzIns[p->nColumn+1]; + aSzIns = &aSz[p->nColumn + 1]; + aSzDel = &aSzIns[p->nColumn + 1]; } } - while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + 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); + memset(aSz, 0, sizeof(aSz[0]) * (p->nColumn + 1)); + for (iCol = 0; rc == SQLITE_OK && iCol < p->nColumn; 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); + aSz[p->nColumn] += sqlite3_column_bytes(pStmt, iCol + 1); } } - if( p->bHasDocsize ){ + if (p->bHasDocsize) { fts3InsertDocsize(&rc, p, aSz); } - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { sqlite3_finalize(pStmt); pStmt = 0; - }else{ + } else { nEntry++; - for(iCol=0; iCol<=p->nColumn; iCol++){ + for (iCol = 0; iCol <= p->nColumn; iCol++) { aSzIns[iCol] += aSz[iCol]; } } } - if( p->bFts4 ){ + if (p->bFts4) { fts3UpdateDocTotals(&rc, p, aSzIns, aSzDel, nEntry); } sqlite3_free(aSz); - if( pStmt ){ + if (pStmt) { int rc2 = sqlite3_finalize(pStmt); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = rc2; } } @@ -190710,52 +188693,49 @@ static int fts3DoRebuild(Fts3Table *p){ 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[] */ +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); + nByte = sizeof(Fts3SegReader*) * nSeg; + pCsr->apSegment = (Fts3SegReader**)sqlite3_malloc64(nByte); - if( pCsr->apSegment==0 ){ + if (pCsr->apSegment == 0) { rc = SQLITE_NOMEM; - }else{ + } else { memset(pCsr->apSegment, 0, nByte); rc = fts3SqlStmt(p, SQL_SELECT_LEVEL, &pStmt, 0); } - if( rc==SQLITE_OK ){ + 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] - ); + assert(pCsr->nSegment == 0); + for (i = 0; rc == SQLITE_OK && sqlite3_step(pStmt) == SQLITE_ROW && i < nSeg; i++) { + rc = sqlite3Fts3SegReaderNew(i, 0, sqlite3_column_int64(pStmt, 1), /* segdir.start_block */ + sqlite3_column_int64(pStmt, 2), /* segdir.leaves_end_block */ + sqlite3_column_int64(pStmt, 3), /* segdir.end_block */ + sqlite3_column_blob(pStmt, 4), /* segdir.root */ + sqlite3_column_bytes(pStmt, 4), /* segdir.root */ + &pCsr->apSegment[i]); pCsr->nSegment++; } rc2 = sqlite3_reset(pStmt); - if( rc==SQLITE_OK ) rc = rc2; + if (rc == SQLITE_OK) + rc = rc2; } return rc; @@ -190773,9 +188753,9 @@ typedef struct NodeReader NodeReader; ** 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) */ + char* a; /* Pointer to allocation */ + int n; /* Number of valid bytes of data in a[] */ + int nAlloc; /* Allocated size of a[] (nAlloc>=n) */ }; /* @@ -190783,9 +188763,9 @@ struct Blob { ** nodes (blocks). */ struct NodeWriter { - sqlite3_int64 iBlock; /* Current block id */ - Blob key; /* Last key written to the current block */ - Blob block; /* Current block image */ + sqlite3_int64 iBlock; /* Current block id */ + Blob key; /* Last key written to the current block */ + Blob block; /* Current block image */ }; /* @@ -190793,14 +188773,14 @@ struct NodeWriter { ** 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 */ + 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]; }; @@ -190813,15 +188793,15 @@ struct IncrmergeWriter { ** nodeReaderRelease() */ struct NodeReader { - const char *aNode; + const char* aNode; int nNode; - int iOff; /* Current offset within aNode[] */ + 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 */ + sqlite3_int64 iChild; /* Pointer to child node */ + Blob term; /* Current term */ + const char* aDoclist; /* Pointer to doclist */ + int nDoclist; /* Size of doclist in bytes */ }; /* @@ -190833,14 +188813,14 @@ struct NodeReader { ** 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 ){ +static void blobGrowBuffer(Blob* pBlob, int nMin, int* pRc) { + if (*pRc == SQLITE_OK && nMin > pBlob->nAlloc) { int nAlloc = nMin; - char *a = (char *)sqlite3_realloc64(pBlob->a, nAlloc); - if( a ){ + char* a = (char*)sqlite3_realloc64(pBlob->a, nAlloc); + if (a) { pBlob->nAlloc = nAlloc; pBlob->a = a; - }else{ + } else { *pRc = SQLITE_NOMEM; } } @@ -190856,34 +188836,35 @@ static void blobGrowBuffer(Blob *pBlob, int nMin, int *pRc){ ** 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 */ +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 ){ + assert(p->aNode); + if (p->iChild && bFirst == 0) + p->iChild++; + if (p->iOff >= p->nNode) { /* EOF */ p->aNode = 0; - }else{ - if( bFirst==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 ){ + 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) ){ + 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->term.n = nPrefix + nSuffix; p->iOff += nSuffix; - if( p->iChild==0 ){ + if (p->iChild == 0) { p->iOff += fts3GetVarint32(&p->aNode[p->iOff], &p->nDoclist); - if( (p->nNode-p->iOff)nDoclist ){ + if ((p->nNode - p->iOff) < p->nDoclist) { return FTS_CORRUPT_VTAB; } p->aDoclist = &p->aNode[p->iOff]; @@ -190892,14 +188873,14 @@ static int nodeReaderNext(NodeReader *p){ } } - assert_fts3_nc( p->iOff<=p->nNode ); + assert_fts3_nc(p->iOff <= p->nNode); return rc; } /* ** Release all dynamic resources held by node-reader object *p. */ -static void nodeReaderRelease(NodeReader *p){ +static void nodeReaderRelease(NodeReader* p) { sqlite3_free(p->term.a); } @@ -190910,16 +188891,16 @@ static void nodeReaderRelease(NodeReader *p){ ** 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){ +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] ){ + if (aNode && aNode[0]) { /* An internal node. */ p->iOff = 1 + sqlite3Fts3GetVarint(&p->aNode[1], &p->iChild); - }else{ + } else { p->iOff = 1; } @@ -190936,19 +188917,18 @@ static int nodeReaderInit(NodeReader *p, const char *aNode, int nNode){ ** 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 */ -){ +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(iLayer 0); + for (iLayer = 1; ALWAYS(iLayer < FTS_MAX_APPENDABLE_HEIGHT); iLayer++) { sqlite3_int64 iNextPtr = 0; - NodeWriter *pNode = &pWriter->aNodeWriter[iLayer]; + NodeWriter* pNode = &pWriter->aNodeWriter[iLayer]; int rc = SQLITE_OK; int nPrefix; int nSuffix; @@ -190960,19 +188940,20 @@ static int fts3IncrmergePush( ** 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); + 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 (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 ){ + Blob* pBlk = &pNode->block; + if (pBlk->n == 0) { blobGrowBuffer(pBlk, p->nNodeSize, &rc); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pBlk->a[0] = (char)iLayer; pBlk->n = 1 + sqlite3Fts3PutVarint(&pBlk->a[1], iPtr); } @@ -190980,39 +188961,40 @@ static int fts3IncrmergePush( blobGrowBuffer(pBlk, pBlk->n + nSpace, &rc); blobGrowBuffer(&pNode->key, nTerm, &rc); - if( rc==SQLITE_OK ){ - if( pNode->key.n ){ + 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 ); + 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{ + } 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 ); + assert(pNode->block.nAlloc >= p->nNodeSize); pNode->block.a[0] = (char)iLayer; - pNode->block.n = 1 + sqlite3Fts3PutVarint(&pNode->block.a[1], iPtr+1); + 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; + if (rc != SQLITE_OK || iNextPtr == 0) + return rc; iPtr = iNextPtr; } - assert( 0 ); + assert(0); return 0; } @@ -191040,47 +189022,48 @@ static int fts3IncrmergePush( ** 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 */ +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) ); + assert(pNode->n > 0); + assert_fts3_nc((pNode->a[0] == '\0') == (aDoclist != 0)); blobGrowBuffer(pPrev, nTerm, &rc); - if( rc!=SQLITE_OK ) return 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; + if (nSuffix <= 0) + return FTS_CORRUPT_VTAB; memcpy(pPrev->a, zTerm, nTerm); pPrev->n = nTerm; - if( bFirst==0 ){ + 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 ){ + 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 ); + assert(pNode->n <= pNode->nAlloc); return SQLITE_OK; } @@ -191091,34 +189074,34 @@ static int fts3AppendToNode( ** ** 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; +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; + 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 */ + 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; + if (nSuffix <= 0) + return FTS_CORRUPT_VTAB; - nSpace = sqlite3Fts3VarintLen(nPrefix); + 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 ){ + if (pLeaf->block.n > 0 && (pLeaf->block.n + nSpace) > p->nNodeSize) { rc = fts3WriteSegment(p, pLeaf->iBlock, pLeaf->block.a, pLeaf->block.n); pWriter->nWork++; @@ -191134,8 +189117,8 @@ static int fts3IncrmergeAppend( ** 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); + if (rc == SQLITE_OK) { + rc = fts3IncrmergePush(p, pWriter, zTerm, nPrefix + 1); } /* Advance to the next output block */ @@ -191144,21 +189127,19 @@ static int fts3IncrmergeAppend( pLeaf->block.n = 0; nSuffix = nTerm; - nSpace = 1; + 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 ){ + 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 - ); + rc = fts3AppendToNode(&pLeaf->block, &pLeaf->key, zTerm, nTerm, aDoclist, nDoclist); } return rc; @@ -191177,31 +189158,32 @@ static int fts3IncrmergeAppend( ** 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 */ +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 ); + 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; + 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 @@ -191218,23 +189200,21 @@ static void fts3IncrmergeRelease( ** 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; + if (iRoot == 0) { + Blob* pBlock = &pWriter->aNodeWriter[1].block; blobGrowBuffer(pBlock, 1 + FTS3_VARINT_MAX, &rc); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pBlock->a[0] = 0x01; - pBlock->n = 1 + sqlite3Fts3PutVarint( - &pBlock->a[1], pWriter->aNodeWriter[0].iBlock - ); + 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 ){ + for (i = 0; i < iRoot; i++) { + NodeWriter* pNode = &pWriter->aNodeWriter[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); @@ -191242,15 +189222,14 @@ static void fts3IncrmergeRelease( } /* 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 */ + 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); @@ -191267,24 +189246,23 @@ static void fts3IncrmergeRelease( ** 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 */ -){ +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) ){ + if (nCmp && ALWAYS(zLhs) && ALWAYS(zRhs)) { res = memcmp(zLhs, zRhs, nCmp); - }else{ + } else { res = 0; } - if( res==0 ) res = nLhs - nRhs; + 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 @@ -191297,15 +189275,16 @@ static int fts3TermCmp( ** 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 */ +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 ){ + if (rc == SQLITE_OK) { sqlite3_bind_int64(pCheck, 1, iEnd); - if( SQLITE_ROW==sqlite3_step(pCheck) ) bRes = 1; + if (SQLITE_ROW == sqlite3_step(pCheck)) + bRes = 1; rc = sqlite3_reset(pCheck); } @@ -191328,45 +189307,44 @@ static int fts3IsAppendable(Fts3Table *p, sqlite3_int64 iEnd, int *pbRes){ ** 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 */ +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 */ + 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_int64(pSelect, 1, iAbsLevel + 1); sqlite3_bind_int(pSelect, 2, iIdx); - if( sqlite3_step(pSelect)==SQLITE_ROW ){ + 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 ){ + if (pWriter->nLeafData < 0) { pWriter->nLeafData = pWriter->nLeafData * -1; } - pWriter->bNoLeafData = (pWriter->nLeafData==0); + pWriter->bNoLeafData = (pWriter->nLeafData == 0); nRoot = sqlite3_column_bytes(pSelect, 4); aRoot = sqlite3_column_blob(pSelect, 4); - if( aRoot==0 ){ + if (aRoot == 0) { sqlite3_reset(pSelect); return nRoot ? SQLITE_NOMEM : FTS_CORRUPT_VTAB; } - }else{ + } else { return sqlite3_reset(pSelect); } @@ -191374,20 +189352,17 @@ static int fts3IncrmergeLoad( 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; + if (rc == SQLITE_OK && bAppendable) { + char* aLeaf = 0; int nLeaf = 0; rc = sqlite3Fts3ReadBlock(p, iLeafEnd, &aLeaf, &nLeaf, 0); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { NodeReader reader; - for(rc = nodeReaderInit(&reader, aLeaf, nLeaf); - rc==SQLITE_OK && reader.aNode; - rc = nodeReaderNext(&reader) - ){ - assert( reader.aNode ); + 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 ){ + if (fts3TermCmp(zKey, nKey, reader.term.a, reader.term.n) <= 0) { bAppendable = 0; } nodeReaderRelease(&reader); @@ -191395,62 +189370,59 @@ static int fts3IncrmergeLoad( sqlite3_free(aLeaf); } - if( rc==SQLITE_OK && bAppendable ){ + 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 ){ + 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->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; + for (i = nHeight + 1; i < FTS_MAX_APPENDABLE_HEIGHT; i++) { + pWriter->aNodeWriter[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 ){ + 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--){ + for (i = nHeight; i >= 0 && rc == SQLITE_OK; i--) { NodeReader reader; pNode = &pWriter->aNodeWriter[i]; - if( pNode->block.a){ + if (pNode->block.a) { rc = nodeReaderInit(&reader, pNode->block.a, pNode->block.n); - while( reader.aNode && rc==SQLITE_OK ) rc = nodeReaderNext(&reader); + 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 ){ + 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; + if (i > 0) { + char* aBlock = 0; int nBlock = 0; - pNode = &pWriter->aNodeWriter[i-1]; + 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 ){ + 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); @@ -191464,7 +189436,8 @@ static int fts3IncrmergeLoad( } rc2 = sqlite3_reset(pSelect); - if( rc==SQLITE_OK ) rc = rc2; + if (rc == SQLITE_OK) + rc = rc2; } return rc; @@ -191479,17 +189452,16 @@ static int fts3IncrmergeLoad( ** 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 */ -){ +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 */ + 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); + if (rc == SQLITE_OK) { + sqlite3_bind_int64(pOutputIdx, 1, iAbsLevel + 1); sqlite3_step(pOutputIdx); *piIdx = sqlite3_column_int(pOutputIdx, 0); rc = sqlite3_reset(pOutputIdx); @@ -191524,56 +189496,58 @@ static int fts3IncrmergeOutputIdx( ** 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 */ +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 ){ + if (rc == SQLITE_OK) { sqlite3_bind_int64(pLeafEst, 1, iAbsLevel); sqlite3_bind_int64(pLeafEst, 2, pCsr->nSegment); - if( SQLITE_ROW==sqlite3_step(pLeafEst) ){ + if (SQLITE_ROW == sqlite3_step(pLeafEst)) { nLeafEst = sqlite3_column_int(pLeafEst, 0); } rc = sqlite3_reset(pLeafEst); } - if( rc!=SQLITE_OK ) return rc; + 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) ){ + 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; + 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; + 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; + for (i = 0; i < FTS_MAX_APPENDABLE_HEIGHT; i++) { + pWriter->aNodeWriter[i].iBlock = pWriter->iStart + i * pWriter->nLeafEst; } return SQLITE_OK; } @@ -191589,16 +189563,15 @@ static int fts3IncrmergeWriter( ** 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 */ +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 ){ + if (rc == SQLITE_OK) { sqlite3_bind_int64(pDelete, 1, iAbsLevel); sqlite3_bind_int(pDelete, 2, iIdx); sqlite3_step(pDelete); @@ -191613,28 +189586,27 @@ static int fts3RemoveSegdirEntry( ** 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 */ +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 ){ + if (rc == SQLITE_OK) { int rc2; sqlite3_bind_int64(pSelect, 1, iAbsLevel); - while( SQLITE_ROW==sqlite3_step(pSelect) ){ - if( nIdx>=nAlloc ){ - int *aNew; + while (SQLITE_ROW == sqlite3_step(pSelect)) { + if (nIdx >= nAlloc) { + int* aNew; nAlloc += 16; - aNew = sqlite3_realloc64(aIdx, nAlloc*sizeof(int)); - if( !aNew ){ + aNew = sqlite3_realloc64(aIdx, nAlloc * sizeof(int)); + if (!aNew) { rc = SQLITE_NOMEM; break; } @@ -191643,20 +189615,21 @@ static int fts3RepackSegdirLevel( aIdx[nIdx++] = sqlite3_column_int(pSelect, 0); } rc2 = sqlite3_reset(pSelect); - if( rc==SQLITE_OK ) rc = rc2; + if (rc == SQLITE_OK) + rc = rc2; } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = fts3SqlStmt(p, SQL_SHIFT_SEGDIR_ENTRY, &pUpdate, 0); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { sqlite3_bind_int64(pUpdate, 2, iAbsLevel); } - assert( p->bIgnoreSavepoint==0 ); + assert(p->bIgnoreSavepoint == 0); p->bIgnoreSavepoint = 1; - for(i=0; rc==SQLITE_OK && ia[0] = (char)iHeight; - if( iChild ){ - assert( pNode->nAlloc>=1+sqlite3Fts3VarintLen(iChild) ); + if (iChild) { + assert(pNode->nAlloc >= 1 + sqlite3Fts3VarintLen(iChild)); pNode->n = 1 + sqlite3Fts3PutVarint(&pNode->a[1], iChild); - }else{ - assert( pNode->nAlloc>=1 ); + } else { + assert(pNode->nAlloc >= 1); pNode->n = 1; } } @@ -191688,49 +189661,46 @@ static void fts3StartNode(Blob *pNode, int iHeight, sqlite3_int64 iChild){ ** 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 */ +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'; + 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; + 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 ){ + 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; + 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; + rc = fts3AppendToNode(pNew, &prev, reader.term.a, reader.term.n, reader.aDoclist, reader.nDoclist); + if (rc != SQLITE_OK) + break; } - if( pNew->n==0 ){ + if (pNew->n == 0) { fts3StartNode(pNew, (int)aNode[0], reader.iChild); *piBlock = reader.iChild; } - assert( pNew->n<=pNew->nAlloc ); + assert(pNew->n <= pNew->nAlloc); nodeReaderRelease(&reader); sqlite3_free(prev.a); @@ -191746,67 +189716,67 @@ static int fts3TruncateNode( ** 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 */ +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 */ + 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); + 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; + if (rc == SQLITE_OK) + rc = rc2; } - while( rc==SQLITE_OK && iBlock ){ - char *aBlock = 0; + while (rc == SQLITE_OK && iBlock) { + char* aBlock = 0; int nBlock = 0; iNewStart = iBlock; rc = sqlite3Fts3ReadBlock(p, iBlock, &aBlock, &nBlock, 0); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = fts3TruncateNode(aBlock, nBlock, &block, zTerm, nTerm, &iBlock); } - if( rc==SQLITE_OK ){ + 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; + if (rc == SQLITE_OK && iNewStart) { + sqlite3_stmt* pDel = 0; rc = fts3SqlStmt(p, SQL_DELETE_SEGMENTS_RANGE, &pDel, 0); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { sqlite3_bind_int64(pDel, 1, iOldStart); - sqlite3_bind_int64(pDel, 2, iNewStart-1); + sqlite3_bind_int64(pDel, 2, iNewStart - 1); sqlite3_step(pDel); rc = sqlite3_reset(pDel); } } - if( rc==SQLITE_OK ){ - sqlite3_stmt *pChomp = 0; + if (rc == SQLITE_OK) { + sqlite3_stmt* pChomp = 0; rc = fts3SqlStmt(p, SQL_CHOMP_SEGDIR, &pChomp, 0); - if( rc==SQLITE_OK ){ + 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); @@ -191832,47 +189802,47 @@ static int fts3TruncateSegment( ** 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 */ -){ +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; + 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++){ + for (j = 0; ALWAYS(j < pCsr->nSegment); j++) { pSeg = pCsr->apSegment[j]; - if( pSeg->iIdx==i ) break; + if (pSeg->iIdx == i) + break; } - assert( jnSegment && pSeg->iIdx==i ); + assert(j < pCsr->nSegment && pSeg->iIdx == i); - if( pSeg->aNode==0 ){ + if (pSeg->aNode == 0) { /* Seg-reader is at EOF. Remove the entire input segment. */ rc = fts3DeleteSegment(p, pSeg); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = fts3RemoveSegdirEntry(p, iAbsLevel, pSeg->iIdx); } *pnRem = 0; - }else{ + } 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; + 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 ){ + if (rc == SQLITE_OK && nRem != pCsr->nSegment) { rc = fts3RepackSegdirLevel(p, iAbsLevel); } @@ -191883,12 +189853,12 @@ static int fts3IncrmergeChomp( /* ** Store an incr-merge hint in the database. */ -static int fts3IncrmergeHintStore(Fts3Table *p, Blob *pHint){ - sqlite3_stmt *pReplace = 0; - int rc; /* Return code */ +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 ){ + 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); @@ -191907,28 +189877,30 @@ static int fts3IncrmergeHintStore(Fts3Table *p, Blob *pHint){ ** 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; +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 ){ + 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); + if (SQLITE_ROW == sqlite3_step(pSelect)) { + const char* aHint = sqlite3_column_blob(pSelect, 0); int nHint = sqlite3_column_bytes(pSelect, 0); - if( aHint ){ + if (aHint) { blobGrowBuffer(pHint, nHint, &rc); - if( rc==SQLITE_OK ){ - if( ALWAYS(pHint->a!=0) ) memcpy(pHint->a, aHint, nHint); + 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; + if (rc == SQLITE_OK) + rc = rc2; } return rc; @@ -191943,14 +189915,13 @@ static int fts3IncrmergeHintLoad(Fts3Table *p, Blob *pHint){ ** 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 ){ +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); } @@ -191964,27 +189935,31 @@ static void fts3IncrmergeHintPush( ** 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){ +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 = 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--; + 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; + assert(i <= nHint); + if (i != nHint) + return FTS_CORRUPT_VTAB; return SQLITE_OK; } - /* ** Attempt an incremental merge that writes nMerge leaf blocks. ** @@ -191994,28 +189969,29 @@ static int fts3IncrmergeHintPop(Blob *pHint, i64 *piAbsLevel, int *pnInput){ ** 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 */ +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_malloc64(nAlloc); - if( !pWriter ) return SQLITE_NOMEM; - pFilter = (Fts3SegFilter *)&pWriter[1]; - pCsr = (Fts3MultiSegReader *)&pFilter[1]; + pWriter = (IncrmergeWriter*)sqlite3_malloc64(nAlloc); + if (!pWriter) + return SQLITE_NOMEM; + pFilter = (Fts3SegFilter*)&pWriter[1]; + pCsr = (Fts3MultiSegReader*)&pFilter[1]; rc = fts3IncrmergeHintLoad(p, &hint); - while( rc==SQLITE_OK && nRem>0 ){ + while (rc == SQLITE_OK && nRem > 0) { const i64 nMod = FTS3_SEGDIR_MAXLEVEL * p->nIndex; - sqlite3_stmt *pFindLevel = 0; /* SQL used to determine iAbsLevel */ + 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) */ @@ -192027,11 +190003,11 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ */ rc = fts3SqlStmt(p, SQL_FIND_MERGE_LEVEL, &pFindLevel, 0); sqlite3_bind_int(pFindLevel, 1, MAX(2, nMin)); - if( sqlite3_step(pFindLevel)==SQLITE_ROW ){ + if (sqlite3_step(pFindLevel) == SQLITE_ROW) { iAbsLevel = sqlite3_column_int64(pFindLevel, 0); nSeg = sqlite3_column_int(pFindLevel, 1); - assert( nSeg>=2 ); - }else{ + assert(nSeg >= 2); + } else { nSeg = -1; } rc = sqlite3_reset(pFindLevel); @@ -192041,13 +190017,13 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ ** 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 ){ + if (rc == SQLITE_OK && hint.n) { int nHint = hint.n; - sqlite3_int64 iHintAbsLevel = 0; /* Hint level */ - int nHintSeg = 0; /* Hint number of segments */ + 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) ){ + 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, @@ -192055,10 +190031,10 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ ** value of nHintSeg to avoid a large memory allocation in case the ** merge-hint is corrupt*/ iAbsLevel = iHintAbsLevel; - nSeg = MIN(MAX(nMin,nSeg), nHintSeg); + nSeg = MIN(MAX(nMin, nSeg), nHintSeg); bUseHint = 1; bDirtyHint = 1; - }else{ + } else { /* This undoes the effect of the HintPop() above - so that no entry ** is removed from the hint blob. */ hint.n = nHint; @@ -192068,10 +190044,11 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ /* 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; + if (nSeg <= 0) + break; - assert( nMod<=0x7FFFFFFF ); - if( iAbsLevel<0 || iAbsLevel>(nMod<<32) ){ + assert(nMod <= 0x7FFFFFFF); + if (iAbsLevel < 0 || iAbsLevel > (nMod << 32)) { rc = FTS_CORRUPT_VTAB; break; } @@ -192085,67 +190062,67 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ memset(pWriter, 0, nAlloc); pFilter->flags = FTS3_SEGMENT_REQUIRE_POS; - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = fts3IncrmergeOutputIdx(p, iAbsLevel, &iIdx); - assert( bUseHint==1 || bUseHint==0 ); - if( iIdx==0 || (bUseHint && iIdx==1) ){ + assert(bUseHint == 1 || bUseHint == 0); + if (iIdx == 0 || (bUseHint && iIdx == 1)) { int bIgnore = 0; - rc = fts3SegmentIsMaxLevel(p, iAbsLevel+1, &bIgnore); - if( bIgnore ){ + rc = fts3SegmentIsMaxLevel(p, iAbsLevel + 1, &bIgnore); + if (bIgnore) { pFilter->flags |= FTS3_SEGMENT_IGNORE_EMPTY; } } } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = fts3IncrmergeCsr(p, iAbsLevel, nSeg, pCsr); } - if( SQLITE_OK==rc && pCsr->nSegment==nSeg - && SQLITE_OK==(rc = sqlite3Fts3SegReaderStart(p, pCsr, pFilter)) - ){ + 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 ){ + if (rc == SQLITE_OK) { bEmpty = 1; - }else if( rc!=SQLITE_ROW ){ + } else if (rc != SQLITE_ROW) { sqlite3Fts3SegReaderFinish(pCsr); break; } - if( bUseHint && iIdx>0 ){ - const char *zKey = pCsr->zTerm; + if (bUseHint && iIdx > 0) { + const char* zKey = pCsr->zTerm; int nKey = pCsr->nTerm; - rc = fts3IncrmergeLoad(p, iAbsLevel, iIdx-1, zKey, nKey, pWriter); - }else{ + rc = fts3IncrmergeLoad(p, iAbsLevel, iIdx - 1, zKey, nKey, pWriter); + } else { rc = fts3IncrmergeWriter(p, iAbsLevel, iIdx, pCsr, pWriter); } - if( rc==SQLITE_OK && pWriter->nLeafEst ){ + if (rc == SQLITE_OK && pWriter->nLeafEst) { fts3LogMerge(nSeg, iAbsLevel); - if( bEmpty==0 ){ + 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 ); + 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 ){ + if (rc == SQLITE_OK) { nRem -= (1 + pWriter->nWork); rc = fts3IncrmergeChomp(p, iAbsLevel, pCsr, &nSeg); - if( nSeg!=0 ){ + if (nSeg != 0) { bDirtyHint = 1; fts3IncrmergeHintPush(&hint, iAbsLevel, nSeg, &rc); } } } - if( nSeg!=0 ){ + if (nSeg != 0) { pWriter->nLeafData = pWriter->nLeafData * -1; } fts3IncrmergeRelease(p, pWriter, &rc); - if( nSeg==0 && pWriter->bNoLeafData==0 ){ - fts3PromoteSegments(p, iAbsLevel+1, pWriter->nLeafData); + if (nSeg == 0 && pWriter->bNoLeafData == 0) { + fts3PromoteSegments(p, iAbsLevel + 1, pWriter->nLeafData); } } @@ -192153,7 +190130,7 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ } /* Write the hint values into the %_stat table for the next incr-merger */ - if( bDirtyHint && rc==SQLITE_OK ){ + if (bDirtyHint && rc == SQLITE_OK) { rc = fts3IncrmergeHintStore(p, &hint); } @@ -192170,10 +190147,11 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ ** This function used for parameters to merge= and incrmerge= ** commands. */ -static int fts3Getint(const char **pz){ - const char *z = *pz; +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'; + while ((*z) >= '0' && (*z) <= '9' && i < 214748363) + i = 10 * i + *(z++) - '0'; *pz = z; return i; } @@ -192187,34 +190165,33 @@ static int fts3Getint(const char **pz){ ** 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" */ -){ +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; + 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' ){ + if (z[0] == ',' && z[1] != '\0') { z++; nMin = fts3Getint(&z); } - if( z[0]!='\0' || nMin<2 ){ + if (z[0] != '\0' || nMin < 2) { rc = SQLITE_ERROR; - }else{ + } else { rc = SQLITE_OK; - if( !p->bHasStat ){ - assert( p->bFts4==0 ); + if (!p->bHasStat) { + assert(p->bFts4 == 0); sqlite3Fts3CreateStatTable(&rc, p); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = sqlite3Fts3Incrmerge(p, nMerge, nMin); } sqlite3Fts3SegmentsClose(p); @@ -192230,23 +190207,24 @@ static int fts3DoIncrmerge( ** 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 */ -){ +static int fts3DoAutoincrmerge(Fts3Table* p, /* FTS3 table handle */ + const char* zParam /* Nul-terminated string containing boolean */ +) { int rc = SQLITE_OK; - sqlite3_stmt *pStmt = 0; + sqlite3_stmt* pStmt = 0; p->nAutoincrmerge = fts3Getint(&zParam); - if( p->nAutoincrmerge==1 || p->nAutoincrmerge>MergeCount(p) ){ + if (p->nAutoincrmerge == 1 || p->nAutoincrmerge > MergeCount(p)) { p->nAutoincrmerge = 8; } - if( !p->bHasStat ){ - assert( p->bFts4==0 ); + if (!p->bHasStat) { + assert(p->bFts4 == 0); sqlite3Fts3CreateStatTable(&rc, p); - if( rc ) return rc; + if (rc) + return rc; } rc = fts3SqlStmt(p, SQL_REPLACE_STAT, &pStmt, 0); - if( rc ) return rc; + if (rc) + return rc; sqlite3_bind_int(pStmt, 1, FTS_STAT_AUTOINCRMERGE); sqlite3_bind_int(pStmt, 2, p->nAutoincrmerge); sqlite3_step(pStmt); @@ -192258,23 +190236,23 @@ static int fts3DoAutoincrmerge( ** 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 */ -){ +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 */ -){ +static u64 fts3ChecksumIndex(Fts3Table* p, /* FTS3 table handle */ + int iLangid, /* Language id to return cksum for */ + int iIndex, /* Index to cksum (0..p->nIndex-1) */ + int* pRc /* OUT: Return code */ +) { Fts3SegFilter filter; Fts3MultiSegReader csr; int rc; u64 cksum = 0; - assert( *pRc==SQLITE_OK ); + 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_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 = 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]; + 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 ){ + if (p->bDescIdx) { iDocid = (i64)((u64)iDocid - iVal); - }else{ + } else { iDocid = (i64)((u64)iDocid + iVal); } } - }else{ + } else { iPos += (iVal - 2); - cksum = cksum ^ fts3ChecksumEntry( - csr.zTerm, csr.nTerm, iLangid, iIndex, iDocid, - (int)iCol, (int)iPos - ); + cksum = cksum ^ fts3ChecksumEntry(csr.zTerm, csr.nTerm, iLangid, iIndex, iDocid, (int)iCol, (int)iPos); } } } @@ -192366,77 +190338,76 @@ static u64 fts3ChecksumIndex( ** 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 */ +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 ){ + 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 ){ + while (rc == SQLITE_OK && sqlite3_step(pAllLangid) == SQLITE_ROW) { int iLangid = sqlite3_column_int(pAllLangid, 0); int i; - for(i=0; inIndex; i++){ + for (i = 0; i < p->nIndex; i++) { cksum1 = cksum1 ^ fts3ChecksumIndex(p, iLangid, i, &rc); } } rc2 = sqlite3_reset(pAllLangid); - if( rc==SQLITE_OK ) rc = rc2; + 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; + 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 ){ + zSql = sqlite3_mprintf("SELECT %s", p->zReadExprlist); + if (!zSql) { rc = SQLITE_NOMEM; - }else{ + } else { rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); sqlite3_free(zSql); } - while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + 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; + for (iCol = 0; rc == SQLITE_OK && iCol < p->nColumn; 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 */ + 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 ){ + 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 - ); + cksum2 = cksum2 ^ fts3ChecksumEntry(zToken, nToken, iLang, 0, iDocid, iCol, iPos); + for (i = 1; i < p->nIndex; 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; + if (pT) + pModule->xClose(pT); + if (rc == SQLITE_DONE) + rc = SQLITE_OK; } } } @@ -192444,7 +190415,7 @@ static int fts3IntegrityCheck(Fts3Table *p, int *pbOk){ sqlite3_finalize(pStmt); } - *pbOk = (cksum1==cksum2); + *pbOk = (cksum1 == cksum2); return rc; } @@ -192479,13 +190450,13 @@ static int fts3IntegrityCheck(Fts3Table *p, int *pbOk){ ** If the two checksums are identical, the integrity-check is deemed to have ** passed. */ -static int fts3DoIntegrityCheck( - Fts3Table *p /* FTS3 table handle */ -){ +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; + if (rc == SQLITE_OK && bOk == 0) + rc = FTS_CORRUPT_VTAB; return rc; } @@ -192497,40 +190468,43 @@ static int fts3DoIntegrityCheck( ** 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); +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 ){ + if (!zVal) { return SQLITE_NOMEM; - }else if( nVal==8 && 0==sqlite3_strnicmp(zVal, "optimize", 8) ){ + } else if (nVal == 8 && 0 == sqlite3_strnicmp(zVal, "optimize", 8)) { rc = fts3DoOptimize(p, 0); - }else if( nVal==7 && 0==sqlite3_strnicmp(zVal, "rebuild", 7) ){ + } else if (nVal == 7 && 0 == sqlite3_strnicmp(zVal, "rebuild", 7)) { rc = fts3DoRebuild(p); - }else if( nVal==15 && 0==sqlite3_strnicmp(zVal, "integrity-check", 15) ){ + } else if (nVal == 15 && 0 == sqlite3_strnicmp(zVal, "integrity-check", 15)) { rc = fts3DoIntegrityCheck(p); - }else if( nVal>6 && 0==sqlite3_strnicmp(zVal, "merge=", 6) ){ + } 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) ){ + } else if (nVal > 10 && 0 == sqlite3_strnicmp(zVal, "automerge=", 10)) { rc = fts3DoAutoincrmerge(p, &zVal[10]); #if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) - }else{ + } else { int v; - if( nVal>9 && 0==sqlite3_strnicmp(zVal, "nodesize=", 9) ){ + if (nVal > 9 && 0 == sqlite3_strnicmp(zVal, "nodesize=", 9)) { v = atoi(&zVal[9]); - if( v>=24 && v<=p->nPgsz-35 ) p->nNodeSize = v; + if (v >= 24 && v <= p->nPgsz - 35) + p->nNodeSize = v; rc = SQLITE_OK; - }else if( nVal>11 && 0==sqlite3_strnicmp(zVal, "maxpending=", 9) ){ + } 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; + 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) ){ + } 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) ){ + } 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; + if (v >= 4 && v <= FTS3_MERGE_COUNT && (v & 1) == 0) + p->nMergeCount = v; rc = SQLITE_OK; } #endif @@ -192543,9 +190517,9 @@ static int fts3SpecialInsert(Fts3Table *p, sqlite3_value *pVal){ ** 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){ +SQLITE_PRIVATE void sqlite3Fts3FreeDeferredDoclists(Fts3Cursor* pCsr) { + Fts3DeferredToken* pDef; + for (pDef = pCsr->pDeferred; pDef; pDef = pDef->pNext) { fts3PendingListDelete(pDef->pList); pDef->pList = 0; } @@ -192555,10 +190529,10 @@ SQLITE_PRIVATE void sqlite3Fts3FreeDeferredDoclists(Fts3Cursor *pCsr){ ** 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){ +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); @@ -192574,51 +190548,50 @@ SQLITE_PRIVATE void sqlite3Fts3FreeDeferredTokens(Fts3Cursor *pCsr){ ** 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 */ +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; + Fts3Table* p = (Fts3Table*)pCsr->base.pVtab; + sqlite3_tokenizer* pT = p->pTokenizer; + sqlite3_tokenizer_module const* pModule = pT->pModule; - assert( pCsr->isRequireSeek==0 ); + 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; + for (i = 0; i < p->nColumn && 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 */ + 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)) - ){ + 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->n < nToken)) && (0 == memcmp(zToken, pPT->z, pPT->n))) { fts3PendingListAppend(&pDef->pList, iDocid, i, iPos, &rc); } } } - if( pTC ) pModule->xClose(pTC); - if( rc==SQLITE_DONE ) rc = SQLITE_OK; + 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 ){ + for (pDef = pCsr->pDeferred; pDef && rc == SQLITE_OK; pDef = pDef->pNext) { + if (pDef->pList) { rc = fts3PendingListAppendVarint(&pDef->pList, 0); } } @@ -192627,24 +190600,21 @@ SQLITE_PRIVATE int sqlite3Fts3CacheDeferredDoclists(Fts3Cursor *pCsr){ return rc; } -SQLITE_PRIVATE int sqlite3Fts3DeferredTokenList( - Fts3DeferredToken *p, - char **ppData, - int *pnData -){ - char *pRet; +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 ){ + if (p->pList == 0) { return SQLITE_OK; } - pRet = (char *)sqlite3_malloc64(p->pList->nData); - if( !pRet ) return SQLITE_NOMEM; + pRet = (char*)sqlite3_malloc64(p->pList->nData); + if (!pRet) + return SQLITE_NOMEM; nSkip = sqlite3Fts3GetVarint(p->pList->aData, &dummy); *pnData = p->pList->nData - nSkip; @@ -192657,14 +190627,13 @@ SQLITE_PRIVATE int sqlite3Fts3DeferredTokenList( /* ** 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; +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_malloc64(sizeof(*pDeferred)); - if( !pDeferred ){ + if (!pDeferred) { return SQLITE_NOMEM; } memset(pDeferred, 0, sizeof(*pDeferred)); @@ -192673,7 +190642,7 @@ SQLITE_PRIVATE int sqlite3Fts3DeferToken( pDeferred->iCol = iCol; pCsr->pDeferred = pDeferred; - assert( pToken->pDeferred==0 ); + assert(pToken->pDeferred == 0); pToken->pDeferred = pDeferred; return SQLITE_OK; @@ -192685,33 +190654,29 @@ SQLITE_PRIVATE int sqlite3Fts3DeferToken( ** 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 */ +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 */ + 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 ){ + 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{ + memset(aSzDel, 0, sizeof(u32) * (p->nColumn + 1) * 2); + } else { *pnChng = *pnChng - 1; - if( p->zContentTbl==0 ){ + if (p->zContentTbl == 0) { fts3SqlExec(&rc, p, SQL_DELETE_CONTENT, &pRowid); } - if( p->bHasDocsize ){ + if (p->bHasDocsize) { fts3SqlExec(&rc, p, SQL_DELETE_DOCSIZE, &pRowid); } } @@ -192734,57 +190699,53 @@ static int fts3DeleteByRowid( ** ** */ -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 */ +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->bHasStat == 0 || p->bHasStat == 1); - assert( p->pSegments==0 ); - assert( - nArg==1 /* DELETE operations */ - || nArg==(2 + p->nColumn + 3) /* INSERT or UPDATE operations */ + 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]); + 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 ){ + 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 ){ + 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); + 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 (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. @@ -192795,17 +190756,15 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod( ** detect the conflict and return SQLITE_CONSTRAINT before beginning to ** modify the database file. */ - if( nArg>1 && p->zContentTbl==0 ){ + 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 ){ + 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) - )){ + 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 @@ -192823,51 +190782,51 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod( ** 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 ){ + if (sqlite3_vtab_on_conflict(p->db) == SQLITE_REPLACE) { rc = fts3DeleteByRowid(p, pNewRowid, &nChng, aSzDel); - }else{ + } else { rc = fts3InsertData(p, apVal, pRowid); bInsertDone = 1; } } } - if( rc!=SQLITE_OK ){ + 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 ); + 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 ){ + if (nArg > 1 && rc == SQLITE_OK) { int iLangid = sqlite3_value_int(apVal[2 + p->nColumn + 2]); - if( bInsertDone==0 ){ + if (bInsertDone == 0) { rc = fts3InsertData(p, apVal, pRowid); - if( rc==SQLITE_CONSTRAINT && p->zContentTbl==0 ){ + if (rc == SQLITE_CONSTRAINT && p->zContentTbl == 0) { rc = FTS_CORRUPT_VTAB; } } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = fts3PendingTermsDocid(p, 0, iLangid, *pRowid); } - if( rc==SQLITE_OK ){ - assert( p->iPrevDocid==*pRowid ); + if (rc == SQLITE_OK) { + assert(p->iPrevDocid == *pRowid); rc = fts3InsertTerms(p, iLangid, apVal, aSzIns); } - if( p->bHasDocsize ){ + if (p->bHasDocsize) { fts3InsertDocsize(&rc, p, aSzIns); } nChng++; } - if( p->bFts4 ){ + if (p->bFts4) { fts3UpdateDocTotals(&rc, p, aSzIns, aSzDel, nChng); } - update_out: +update_out: sqlite3_free(aSzDel); sqlite3Fts3SegmentsClose(p); return rc; @@ -192878,15 +190837,16 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod( ** 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){ +SQLITE_PRIVATE int sqlite3Fts3Optimize(Fts3Table* p) { int rc; rc = sqlite3_exec(p->db, "SAVEPOINT fts3", 0, 0, 0); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = fts3DoOptimize(p, 1); - if( rc==SQLITE_OK || rc==SQLITE_DONE ){ + 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{ + 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); } @@ -192925,21 +190885,20 @@ typedef sqlite3_int64 i64; /* ** 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 */ +#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" - +#define FTS3_MATCHINFO_DEFAULT "pcx" /* ** Used as an fts3ExprIterate() context when loading phrase doclists to @@ -192947,9 +190906,9 @@ typedef sqlite3_int64 i64; */ 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 */ + Fts3Cursor* pCsr; /* FTS3 Cursor */ + int nPhrase; /* Number of phrases seen so far */ + int nToken; /* Number of tokens seen so far */ }; /* @@ -192961,28 +190920,28 @@ 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 */ + 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 */ + 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 */ + 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 */ }; /* @@ -192991,12 +190950,12 @@ struct SnippetFragment { */ 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 */ + 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 */ + u32* aMatchinfo; /* Pre-allocated buffer */ }; /* @@ -193007,12 +190966,11 @@ struct MatchInfo { struct MatchinfoBuffer { u8 aRef[3]; int nElem; - int bGlobal; /* Set if global data is loaded */ - char *zMatchinfo; + 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 @@ -193020,12 +190978,11 @@ struct MatchinfoBuffer { */ 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 */ + 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. */ @@ -193033,61 +190990,57 @@ struct StrBuffer { /* ** 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); +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 = 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->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); + 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]); +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] ){ + assert((u32*)p == &pBuf->aMatchinfo[1] || (u32*)p == &pBuf->aMatchinfo[pBuf->nElem + 2]); + if ((u32*)p == &pBuf->aMatchinfo[1]) { pBuf->aRef[1] = 0; - }else{ + } else { pBuf->aRef[2] = 0; } - if( pBuf->aRef[0]==0 && pBuf->aRef[1]==0 && 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*){ +static void (*fts3MIBufferAlloc(MatchinfoBuffer* p, u32** paOut))(void*) { void (*xRet)(void*) = 0; - u32 *aOut = 0; + u32* aOut = 0; - if( p->aRef[1]==0 ){ + if (p->aRef[1] == 0) { p->aRef[1] = 1; aOut = &p->aMatchinfo[1]; xRet = fts3MIBufferFree; - } - else if( p->aRef[2]==0 ){ + } else if (p->aRef[2] == 0) { p->aRef[2] = 1; - aOut = &p->aMatchinfo[p->nElem+2]; + aOut = &p->aMatchinfo[p->nElem + 2]; xRet = fts3MIBufferFree; - }else{ + } else { aOut = (u32*)sqlite3_malloc64(p->nElem * sizeof(u32)); - if( aOut ){ + if (aOut) { xRet = sqlite3_free; - if( p->bGlobal ) memcpy(aOut, &p->aMatchinfo[1], p->nElem*sizeof(u32)); + if (p->bGlobal) + memcpy(aOut, &p->aMatchinfo[1], p->nElem * sizeof(u32)); } } @@ -193095,19 +191048,19 @@ static void (*fts3MIBufferAlloc(MatchinfoBuffer *p, u32 **paOut))(void*){ return xRet; } -static void fts3MIBufferSetGlobal(MatchinfoBuffer *p){ +static void fts3MIBufferSetGlobal(MatchinfoBuffer* p) { p->bGlobal = 1; - memcpy(&p->aMatchinfo[2+p->nElem], &p->aMatchinfo[1], p->nElem*sizeof(u32)); + 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 ); +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 ){ + if (p->aRef[0] == 0 && p->aRef[1] == 0 && p->aRef[2] == 0) { sqlite3_free(p); } } @@ -193117,7 +191070,6 @@ SQLITE_PRIVATE void sqlite3Fts3MIBufferFree(MatchinfoBuffer *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 @@ -193138,31 +191090,30 @@ SQLITE_PRIVATE void sqlite3Fts3MIBufferFree(MatchinfoBuffer *p){ ** 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){ +static void fts3GetDeltaPosition(char** pp, i64* piPos) { int iVal; *pp += fts3GetVarint32(*pp, &iVal); - *piPos += (iVal-2); + *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 */ +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 ); + if (eType != FTSQUERY_PHRASE) { + assert(pExpr->pLeft && pExpr->pRight); rc = fts3ExprIterate2(pExpr->pLeft, piPhrase, x, pCtx); - if( rc==SQLITE_OK && eType!=FTSQUERY_NOT ){ + if (rc == SQLITE_OK && eType != FTSQUERY_NOT) { rc = fts3ExprIterate2(pExpr->pRight, piPhrase, x, pCtx); } - }else{ + } else { rc = x(pExpr, *piPhrase, pCtx); (*piPhrase)++; } @@ -193179,25 +191130,23 @@ static int fts3ExprIterate2( ** 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 */ +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){ +static int fts3ExprLoadDoclistsCb(Fts3Expr* pExpr, int iPhrase, void* ctx) { int rc = SQLITE_OK; - Fts3Phrase *pPhrase = pExpr->pPhrase; - LoadDoclistCtx *p = (LoadDoclistCtx *)ctx; + Fts3Phrase* pPhrase = pExpr->pPhrase; + LoadDoclistCtx* p = (LoadDoclistCtx*)ctx; UNUSED_PARAMETER(iPhrase); @@ -193217,28 +191166,29 @@ static int fts3ExprLoadDoclistsCb(Fts3Expr *pExpr, int iPhrase, void *ctx){ ** 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() */ +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; + 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)++; +static int fts3ExprPhraseCountCb(Fts3Expr* pExpr, int iPhrase, void* ctx) { + (*(int*)ctx)++; pExpr->iPhrase = iPhrase; return SQLITE_OK; } -static int fts3ExprPhraseCount(Fts3Expr *pExpr){ +static int fts3ExprPhraseCount(Fts3Expr* pExpr) { int nPhrase = 0; - (void)fts3ExprIterate(pExpr, fts3ExprPhraseCountCb, (void *)&nPhrase); + (void)fts3ExprIterate(pExpr, fts3ExprPhraseCountCb, (void*)&nPhrase); return nPhrase; } @@ -193247,13 +191197,13 @@ static int fts3ExprPhraseCount(Fts3Expr *pExpr){ ** 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 ){ +static void fts3SnippetAdvance(char** ppIter, i64* piIter, int iNext) { + char* pIter = *ppIter; + if (pIter) { i64 iIter = *piIter; - while( iIteriCurrent<0 ){ + if (pIter->iCurrent < 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). @@ -193282,28 +191232,28 @@ static int fts3SnippetNextCandidate(SnippetIter *pIter){ /* 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]; + for (i = 0; i < pIter->nPhrase; i++) { + SnippetPhrase* pPhrase = &pIter->aPhrase[i]; fts3SnippetAdvance(&pPhrase->pHead, &pPhrase->iHead, pIter->nSnippet); } - }else{ + } else { int iStart; int iEnd = 0x7FFFFFFF; - for(i=0; inPhrase; i++){ - SnippetPhrase *pPhrase = &pIter->aPhrase[i]; - if( pPhrase->pHead && pPhrase->iHeadnPhrase; i++) { + SnippetPhrase* pPhrase = &pIter->aPhrase[i]; + if (pPhrase->pHead && pPhrase->iHead < iEnd) { iEnd = pPhrase->iHead; } } - if( iEnd==0x7FFFFFFF ){ + 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); + for (i = 0; i < pIter->nPhrase; i++) { + SnippetPhrase* pPhrase = &pIter->aPhrase[i]; + fts3SnippetAdvance(&pPhrase->pHead, &pPhrase->iHead, iEnd + 1); fts3SnippetAdvance(&pPhrase->pTail, &pPhrase->iTail, iStart); } } @@ -193315,44 +191265,44 @@ static int fts3SnippetNextCandidate(SnippetIter *pIter){ ** 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; +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; i < pIter->nPhrase; i++) { + SnippetPhrase* pPhrase = &pIter->aPhrase[i]; + if (pPhrase->pTail) { + char* pCsr = pPhrase->pTail; i64 iCsr = pPhrase->iTail; - while( iCsr<(iStart+pIter->nSnippet) && iCsr>=iStart ){ + while (iCsr < (iStart + pIter->nSnippet) && iCsr >= iStart) { int j; - u64 mPhrase = (u64)1 << (i%64); + 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 ){ + assert(iCsr >= iStart && (iCsr - iStart) <= 64); + assert(i >= 0); + if ((mCover | mCovered) & mPhrase) { iScore++; - }else{ + } else { iScore += 1000; } mCover |= mPhrase; - for(j=0; jnToken; j++){ - mHighlight |= (mPos>>j); + for (j = 0; j < pPhrase->nToken; j++) { + mHighlight |= (mPos >> j); } - if( 0==(*pCsr & 0x0FE) ) break; + if (0 == (*pCsr & 0x0FE)) + break; fts3GetDeltaPosition(&pCsr, &iCsr); } } @@ -193369,31 +191319,29 @@ static void fts3SnippetDetails( ** 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; +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 ){ + assert(rc == SQLITE_OK || pCsr == 0); + if (pCsr) { i64 iFirst = 0; pPhrase->pList = pCsr; fts3GetDeltaPosition(&pCsr, &iFirst); - if( iFirst<0 ){ + if (iFirst < 0) { rc = FTS_CORRUPT_VTAB; - }else{ + } 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 - )); + } else { + assert(rc != SQLITE_OK || (pPhrase->pList == 0 && pPhrase->pHead == 0 && pPhrase->pTail == 0)); } return rc; @@ -193414,21 +191362,20 @@ static int fts3SnippetFindPositions(Fts3Expr *pExpr, int iPhrase, void *ctx){ ** 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 */ +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)); @@ -193436,7 +191383,7 @@ static int fts3BestSnippet( ** callback makes sure the doclists are loaded for each phrase. */ rc = fts3ExprLoadDoclists(pCsr, &nList, 0); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } @@ -193444,8 +191391,8 @@ static int fts3BestSnippet( ** the required space using malloc(). */ nByte = sizeof(SnippetPhrase) * nList; - sIter.aPhrase = (SnippetPhrase *)sqlite3Fts3MallocZero(nByte); - if( !sIter.aPhrase ){ + sIter.aPhrase = (SnippetPhrase*)sqlite3Fts3MallocZero(nByte); + if (!sIter.aPhrase) { return SQLITE_NOMEM; } @@ -193458,12 +191405,12 @@ static int fts3BestSnippet( sIter.nPhrase = nList; sIter.iCurrent = -1; rc = fts3ExprIterate(pCsr->pExpr, fts3SnippetFindPositions, (void*)&sIter); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { /* Set the *pmSeen output variable. */ - for(i=0; iiCol = iCol; - while( !fts3SnippetNextCandidate(&sIter) ){ + while (!fts3SnippetNextCandidate(&sIter)) { int iPos; int iScore; u64 mCover; u64 mHighlite; - fts3SnippetDetails(&sIter, mCovered, &iPos, &iScore, &mCover,&mHighlite); - assert( iScore>=0 ); - if( iScore>iBestScore ){ + fts3SnippetDetails(&sIter, mCovered, &iPos, &iScore, &mCover, &mHighlite); + assert(iScore >= 0); + if (iScore > iBestScore) { pFragment->iPos = iPos; pFragment->hlmask = mHighlite; pFragment->covered = mCover; @@ -193492,19 +191439,17 @@ static int fts3BestSnippet( 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 ){ +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); } @@ -193512,16 +191457,16 @@ static int fts3StringAppend( ** 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 ){ + 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) ); + assert(pStr->z != 0 && (pStr->nAlloc >= pStr->n + nAppend + 1)); /* Append the data to the string buffer. */ memcpy(&pStr->z[pStr->n], zAppend, nAppend); @@ -193551,26 +191496,27 @@ static int fts3StringAppend( ** 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 */ +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 */ + 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; + 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 @@ -193579,31 +191525,34 @@ static int fts3SnippetShift( ** 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; + 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 ){ + if (rc != SQLITE_OK) { return rc; } - while( rc==SQLITE_OK && iCurrent<(nSnippet+nDesired) ){ - const char *ZDUMMY; int DUMMY1 = 0, DUMMY2 = 0, DUMMY3 = 0; + 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; } + if (rc != SQLITE_OK && rc != SQLITE_DONE) { + return rc; + } - nShift = (rc==SQLITE_DONE)+iCurrent-nSnippet; - assert( nShift<=nDesired ); - if( nShift>0 ){ + nShift = (rc == SQLITE_DONE) + iCurrent - nSnippet; + assert(nShift <= nDesired); + if (nShift > 0) { *piPos += nShift; *pHlmask = hlmask >> nShift; } @@ -193616,33 +191565,32 @@ static int fts3SnippetShift( ** 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; +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 */ + 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 */ + 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 ){ + 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; @@ -193650,18 +191598,18 @@ static int fts3SnippetText( 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 ){ + 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 */ + 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 @@ -193675,8 +191623,8 @@ static int fts3SnippetText( ** 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 ){ + 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. @@ -193685,43 +191633,48 @@ static int fts3SnippetText( } break; } - if( iCurrentiLangid, nSnippet, &zDoc[iBegin], n, &iPos, &hlmask - ); + rc = fts3SnippetShift(pTab, pCsr->iLangid, 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 ){ + if (rc == SQLITE_OK) { + if (iPos > 0 || iFragment > 0) { rc = fts3StringAppend(pOut, zEllipsis, -1); - }else if( iBegin ){ + } else if (iBegin) { rc = fts3StringAppend(pOut, zDoc, iBegin); } } - if( rc!=SQLITE_OK || iCurrent=(iPos+nSnippet) ){ - if( isLast ){ + if (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; + 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); + 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; } @@ -193730,7 +191683,6 @@ static int fts3SnippetText( 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 @@ -193744,15 +191696,16 @@ static int fts3SnippetText( ** ** The number of elements in the column-list is returned. */ -static int fts3ColumnlistCount(char **ppCollist){ - char *pEnd = *ppCollist; +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) ){ + while (0xFE & (*pEnd | c)) { c = *pEnd++ & 0x80; - if( !c ) nEntry++; + if (!c) + nEntry++; } *ppCollist = pEnd; @@ -193762,55 +191715,55 @@ static int fts3ColumnlistCount(char **ppCollist){ /* ** 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; +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; + 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 ){ + assert(p->flag == FTS3_MATCHINFO_LHITS_BM || p->flag == FTS3_MATCHINFO_LHITS); + if (p->flag == FTS3_MATCHINFO_LHITS) { iStart = pExpr->iPhrase * p->nCol; - }else{ + } 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)); + 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; } - 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 -){ +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 ){ + 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{ + if (rc == SQLITE_OK) + rc = fts3ExprLHitGather(pExpr->pRight, p); + } else { rc = fts3ExprLHits(pExpr, p); } } @@ -193844,15 +191797,12 @@ static int fts3ExprLHitGather( ** to calculate these values properly, and the full-text index doclist is ** not available for deferred tokens. */ -static int fts3ExprGlobalHitsCb( - Fts3Expr *pExpr, /* Phrase expression node */ - int iPhrase, /* Phrase number (numbered from zero) */ - void *pCtx /* Pointer to MatchInfo structure */ -){ - MatchInfo *p = (MatchInfo *)pCtx; - return sqlite3Fts3EvalPhraseStats( - p->pCursor, pExpr, &p->aMatchinfo[3*iPhrase*p->nCol] - ); +static int fts3ExprGlobalHitsCb(Fts3Expr* pExpr, /* Phrase expression node */ + int iPhrase, /* Phrase number (numbered from zero) */ + void* pCtx /* Pointer to MatchInfo structure */ +) { + MatchInfo* p = (MatchInfo*)pCtx; + return sqlite3Fts3EvalPhraseStats(p->pCursor, pExpr, &p->aMatchinfo[3 * iPhrase * p->nCol]); } /* @@ -193860,54 +191810,43 @@ static int fts3ExprGlobalHitsCb( ** 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 */ -){ +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; + MatchInfo* p = (MatchInfo*)pCtx; int iStart = iPhrase * p->nCol * 3; int i; - for(i=0; inCol && rc==SQLITE_OK; i++){ - char *pCsr; + for (i = 0; i < p->nCol && 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; + 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) - ){ +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 */ +static size_t fts3MatchinfoSize(MatchInfo* pInfo, char cArg) { + size_t nVal; /* Number of integers output by cArg */ - switch( cArg ){ + switch (cArg) { case FTS3_MATCHINFO_NDOC: case FTS3_MATCHINFO_NPHRASE: case FTS3_MATCHINFO_NCOL: @@ -193929,7 +191868,7 @@ static size_t fts3MatchinfoSize(MatchInfo *pInfo, char cArg){ break; default: - assert( cArg==FTS3_MATCHINFO_HITS ); + assert(cArg == FTS3_MATCHINFO_HITS); nVal = pInfo->nCol * pInfo->nPhrase * 3; break; } @@ -193937,41 +191876,38 @@ static size_t fts3MatchinfoSize(MatchInfo *pInfo, char cArg){ 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; +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 ){ + if (!*ppStmt) { int rc = sqlite3Fts3SelectDoctotal(pTab, ppStmt); - if( rc!=SQLITE_OK ) return rc; + if (rc != SQLITE_OK) + return rc; } pStmt = *ppStmt; - assert( sqlite3_data_count(pStmt)==1 ); + assert(sqlite3_data_count(pStmt) == 1); n = sqlite3_column_bytes(pStmt, 0); a = sqlite3_column_blob(pStmt, 0); - if( a==0 ){ + if (a == 0) { return FTS_CORRUPT_VTAB; } pEnd = a + n; a += sqlite3Fts3GetVarintBounded(a, pEnd, &nDoc); - if( nDoc<=0 || a>pEnd ){ + if (nDoc <= 0 || a > pEnd) { return FTS_CORRUPT_VTAB; } *pnDoc = nDoc; - if( paLen ) *paLen = a; - if( ppEnd ) *ppEnd = pEnd; + if (paLen) + *paLen = a; + if (ppEnd) + *ppEnd = pEnd; return SQLITE_OK; } @@ -193983,10 +191919,10 @@ static int fts3MatchinfoSelectDoctotal( */ 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 */ + 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 */ }; /* @@ -193995,12 +191931,11 @@ struct LcsIterator { */ #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; +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; } @@ -194010,19 +191945,20 @@ static int fts3MatchinfoLcsCb( ** 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; +static int fts3LcsIteratorAdvance(LcsIterator* pIter) { + char* pRead; sqlite3_int64 iRead; int rc = 0; - if( NEVER(pIter==0) ) return 1; + if (NEVER(pIter == 0)) + return 1; pRead = pIter->pRead; pRead += sqlite3Fts3GetVarint(pRead, &iRead); - if( iRead==0 || iRead==1 ){ + if (iRead == 0 || iRead == 1) { pRead = 0; rc = 1; - }else{ - pIter->iPos += (int)(iRead-2); + } else { + pIter->iPos += (int)(iRead - 2); } pIter->pRead = pRead; @@ -194040,8 +191976,8 @@ static int fts3LcsIteratorAdvance(LcsIterator *pIter){ ** data written to the first nCol elements of pInfo->aMatchinfo[] is ** undefined. */ -static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ - LcsIterator *aIter; +static int fts3MatchinfoLcs(Fts3Cursor* pCsr, MatchInfo* pInfo) { + LcsIterator* aIter; int i; int iCol; int nToken = 0; @@ -194051,27 +191987,29 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ ** contains one element for each matchable phrase in the query. **/ aIter = sqlite3Fts3MallocZero(sizeof(LcsIterator) * pCsr->nPhrase); - if( !aIter ) return SQLITE_NOMEM; + if (!aIter) + return SQLITE_NOMEM; (void)fts3ExprIterate(pCsr->pExpr, fts3MatchinfoLcsCb, (void*)aIter); - for(i=0; inPhrase; i++){ - LcsIterator *pIter = &aIter[i]; + for (i = 0; i < pInfo->nPhrase; 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 (iCol = 0; iCol < pInfo->nCol; 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]; + for (i = 0; i < pInfo->nPhrase; i++) { + LcsIterator* pIt = &aIter[i]; rc = sqlite3Fts3EvalPhrasePoslist(pCsr, pIt->pExpr, iCol, &pIt->pRead); - if( rc!=SQLITE_OK ) goto matchinfo_lcs_out; - if( pIt->pRead ){ + if (rc != SQLITE_OK) + goto matchinfo_lcs_out; + if (pIt->pRead) { pIt->iPos = pIt->iPosOffset; fts3LcsIteratorAdvance(pIt); - if( pIt->pRead==0 ){ + if (pIt->pRead == 0) { rc = FTS_CORRUPT_VTAB; goto matchinfo_lcs_out; } @@ -194079,34 +192017,36 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ } } - while( nLive>0 ){ - LcsIterator *pAdv = 0; /* The iterator to advance by one position */ - int nThisLcs = 0; /* LCS for the current iterator positions */ + 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 ){ + for (i = 0; i < pInfo->nPhrase; 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 ){ + } else { + if (pAdv == 0 || pIter->iPos < pAdv->iPos) { pAdv = pIter; } - if( nThisLcs==0 || pIter->iPos==pIter[-1].iPos ){ + if (nThisLcs == 0 || pIter->iPos == pIter[-1].iPos) { nThisLcs++; - }else{ + } else { nThisLcs = 1; } - if( nThisLcs>nLcs ) nLcs = nThisLcs; + if (nThisLcs > nLcs) + nLcs = nThisLcs; } } - if( fts3LcsIteratorAdvance(pAdv) ) nLive--; + if (fts3LcsIteratorAdvance(pAdv)) + nLive--; } pInfo->aMatchinfo[iCol] = nLcs; } - matchinfo_lcs_out: +matchinfo_lcs_out: sqlite3_free(aIter); return rc; } @@ -194128,30 +192068,31 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ ** 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 */ -){ +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; + Fts3Table* pTab = (Fts3Table*)pCsr->base.pVtab; + sqlite3_stmt* pSelect = 0; - for(i=0; rc==SQLITE_OK && zArg[i]; i++){ + for (i = 0; rc == SQLITE_OK && zArg[i]; i++) { pInfo->flag = zArg[i]; - switch( zArg[i] ){ + switch (zArg[i]) { case FTS3_MATCHINFO_NPHRASE: - if( bGlobal ) pInfo->aMatchinfo[0] = pInfo->nPhrase; + if (bGlobal) + pInfo->aMatchinfo[0] = pInfo->nPhrase; break; case FTS3_MATCHINFO_NCOL: - if( bGlobal ) pInfo->aMatchinfo[0] = pInfo->nCol; + if (bGlobal) + pInfo->aMatchinfo[0] = pInfo->nCol; break; case FTS3_MATCHINFO_NDOC: - if( bGlobal ){ + if (bGlobal) { sqlite3_int64 nDoc = 0; rc = fts3MatchinfoSelectDoctotal(pTab, &pSelect, &nDoc, 0, 0); pInfo->aMatchinfo[0] = (u32)nDoc; @@ -194159,23 +192100,23 @@ static int fts3MatchinfoValues( 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 */ + 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 ){ + if (rc == SQLITE_OK) { int iCol; - for(iCol=0; iColnCol; iCol++){ + for (iCol = 0; iCol < pInfo->nCol; iCol++) { u32 iVal; sqlite3_int64 nToken; a += sqlite3Fts3GetVarint(a, &nToken); - if( a>pEnd ){ + if (a > pEnd) { rc = SQLITE_CORRUPT_VTAB; break; } - iVal = (u32)(((u32)(nToken&0xffffffff)+nDoc/2)/nDoc); + iVal = (u32)(((u32)(nToken & 0xffffffff) + nDoc / 2) / nDoc); pInfo->aMatchinfo[iCol] = iVal; } } @@ -194183,16 +192124,16 @@ static int fts3MatchinfoValues( break; case FTS3_MATCHINFO_LENGTH: { - sqlite3_stmt *pSelectDocsize = 0; + sqlite3_stmt* pSelectDocsize = 0; rc = sqlite3Fts3SelectDocsize(pTab, pCsr->iPrevId, &pSelectDocsize); - if( rc==SQLITE_OK ){ + 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++){ + const char* a = sqlite3_column_blob(pSelectDocsize, 0); + const char* pEnd = a + sqlite3_column_bytes(pSelectDocsize, 0); + for (iCol = 0; iCol < pInfo->nCol; iCol++) { sqlite3_int64 nToken; a += sqlite3Fts3GetVarintBounded(a, pEnd, &nToken); - if( a>pEnd ){ + if (a > pEnd) { rc = SQLITE_CORRUPT_VTAB; break; } @@ -194205,7 +192146,7 @@ static int fts3MatchinfoValues( case FTS3_MATCHINFO_LCS: rc = fts3ExprLoadDoclists(pCsr, 0, 0); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = fts3MatchinfoLcs(pCsr, pInfo); } break; @@ -194219,21 +192160,24 @@ static int fts3MatchinfoValues( } default: { - Fts3Expr *pExpr; - assert( zArg[i]==FTS3_MATCHINFO_HITS ); + 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; + 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); + rc = fts3ExprIterate(pExpr, fts3ExprGlobalHitsCb, (void*)pInfo); sqlite3Fts3EvalTestDeferred(pCsr, &rc); - if( rc!=SQLITE_OK ) break; + if (rc != SQLITE_OK) + break; } - (void)fts3ExprIterate(pExpr, fts3ExprLocalHitsCb,(void*)pInfo); + (void)fts3ExprIterate(pExpr, fts3ExprLocalHitsCb, (void*)pInfo); break; } } @@ -194245,22 +192189,20 @@ static int fts3MatchinfoValues( 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 */ -){ +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; + Fts3Table* pTab = (Fts3Table*)pCsr->base.pVtab; int rc = SQLITE_OK; - int bGlobal = 0; /* Collect 'global' stats as well as local */ + int bGlobal = 0; /* Collect 'global' stats as well as local */ - u32 *aOut = 0; + u32* aOut = 0; void (*xDestroyOut)(void*) = 0; memset(&sInfo, 0, sizeof(MatchInfo)); @@ -194270,7 +192212,7 @@ static void fts3GetMatchinfo( /* 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) ){ + if (pCsr->pMIBuffer && strcmp(pCsr->pMIBuffer->zMatchinfo, zArg)) { sqlite3Fts3MIBufferFree(pCsr->pMIBuffer); pCsr->pMIBuffer = 0; } @@ -194280,18 +192222,18 @@ static void fts3GetMatchinfo( ** 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 */ + 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) ){ + 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; @@ -194301,32 +192243,34 @@ static void fts3GetMatchinfo( /* Allocate space for Fts3Cursor.aMatchinfo[] and Fts3Cursor.zMatchinfo. */ pCsr->pMIBuffer = fts3MIBufferNew(nMatchinfo, zArg); - if( !pCsr->pMIBuffer ) rc = SQLITE_NOMEM; + if (!pCsr->pMIBuffer) + rc = SQLITE_NOMEM; pCsr->isMatchinfoNeeded = 1; bGlobal = 1; } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { xDestroyOut = fts3MIBufferAlloc(pCsr->pMIBuffer, &aOut); - if( xDestroyOut==0 ){ + if (xDestroyOut == 0) { rc = SQLITE_NOMEM; } } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { sInfo.aMatchinfo = aOut; sInfo.nPhrase = pCsr->nPhrase; rc = fts3MatchinfoValues(pCsr, bGlobal, &sInfo, zArg); - if( bGlobal ){ + if (bGlobal) { fts3MIBufferSetGlobal(pCsr->pMIBuffer); } } - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { sqlite3_result_error_code(pCtx, rc); - if( xDestroyOut ) xDestroyOut(aOut); - }else{ + if (xDestroyOut) + xDestroyOut(aOut); + } else { int n = pCsr->pMIBuffer->nElem * sizeof(u32); sqlite3_result_blob(pCtx, aOut, n, xDestroyOut); } @@ -194335,16 +192279,15 @@ static void fts3GetMatchinfo( /* ** 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; +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}; @@ -194357,35 +192300,37 @@ SQLITE_PRIVATE void sqlite3Fts3Snippet( ** 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 */ + 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 ){ + 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; + if (nToken < -64) + nToken = -64; + if (nToken > +64) + nToken = +64; - for(nSnippet=1; 1; nSnippet++){ + 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() */ + 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{ + if (nToken >= 0) { + nFToken = (nToken + nSnippet - 1) / nSnippet; + } else { nFToken = -1 * nToken; } - for(iSnip=0; iSnipnColumn; iRead++){ + for (iRead = 0; iRead < pTab->nColumn; iRead++) { SnippetFragment sF = {0, 0, 0, 0}; int iS = 0; - if( iCol>=0 && iRead!=iCol ) continue; + 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 ){ + if (rc != SQLITE_OK) { goto snippet_out; } - if( iS>iBestScore ){ + if (iS > iBestScore) { *pFragment = sF; iBestScore = iS; } @@ -194415,68 +192361,66 @@ SQLITE_PRIVATE void sqlite3Fts3Snippet( /* 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((mCovered & mSeen) == mCovered); + if (mSeen == mCovered || nSnippet == SizeofArray(aSnippet)) + break; } - assert( nFToken>0 ); + assert(nFToken > 0); - for(i=0; ipCsr, pExpr, p->iCol, &pList); nTerm = pExpr->pPhrase->nToken; - if( pList ){ + if (pList) { fts3GetDeltaPosition(&pList, &iPos); - assert_fts3_nc( iPos>=0 ); + assert_fts3_nc(iPos >= 0); } - for(iTerm=0; iTermaTerm[p->iTerm++]; - pT->iOff = nTerm-iTerm-1; + for (iTerm = 0; iTerm < nTerm; iTerm++) { + TermOffset* pT = &p->aTerm[p->iTerm++]; + pT->iOff = nTerm - iTerm - 1; pT->pList = pList; pT->iPos = iPos; } @@ -194487,33 +192431,33 @@ static int fts3ExprTermOffsetInit(Fts3Expr *pExpr, int iPhrase, void *ctx){ /* ** 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 ){ +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 ); + assert(pCsr->isRequireSeek == 0); /* Count the number of terms in the query */ rc = fts3ExprLoadDoclists(pCsr, 0, &nToken); - if( rc!=SQLITE_OK ) goto offsets_out; + if (rc != SQLITE_OK) + goto offsets_out; /* Allocate the array of TermOffset iterators. */ - sCtx.aTerm = (TermOffset *)sqlite3Fts3MallocZero(sizeof(TermOffset)*nToken); - if( 0==sCtx.aTerm ){ + sCtx.aTerm = (TermOffset*)sqlite3Fts3MallocZero(sizeof(TermOffset) * nToken); + if (0 == sCtx.aTerm) { rc = SQLITE_NOMEM; goto offsets_out; } @@ -194523,14 +192467,14 @@ SQLITE_PRIVATE void sqlite3Fts3Offsets( /* 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() */ + for (iCol = 0; iCol < pTab->nColumn; 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; + const char* zDoc; int nDoc; /* Initialize the contents of sCtx.aTerm[] for column iCol. This @@ -194539,7 +192483,8 @@ SQLITE_PRIVATE void sqlite3Fts3Offsets( sCtx.iCol = iCol; sCtx.iTerm = 0; rc = fts3ExprIterate(pCsr->pExpr, fts3ExprTermOffsetInit, (void*)&sCtx); - if( rc!=SQLITE_OK ) goto offsets_out; + 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. @@ -194547,10 +192492,10 @@ SQLITE_PRIVATE void sqlite3Fts3Offsets( ** 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 ){ + 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; @@ -194558,66 +192503,64 @@ SQLITE_PRIVATE void sqlite3Fts3Offsets( } /* 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 = 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; + 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; i < nToken; i++) { + TermOffset* pT = &sCtx.aTerm[i]; + if (pT->pList && (pT->iPos - pT->iOff) < iMinPos) { + iMinPos = pT->iPos - pT->iOff; pTerm = pT; } } - if( !pTerm ){ + if (!pTerm) { /* All offsets for this column have been gathered. */ rc = SQLITE_DONE; - }else{ - assert_fts3_nc( iCurrent<=iMinPos ); - if( 0==(0xFE&*pTerm->pList) ){ + } else { + assert_fts3_nc(iCurrent <= iMinPos); + if (0 == (0xFE & *pTerm->pList)) { pTerm->pList = 0; - }else{ + } else { fts3GetDeltaPosition(&pTerm->pList, &pTerm->iPos); } - while( rc==SQLITE_OK && iCurrentxNext(pC, &ZDUMMY, &NDUMMY, &iStart, &iEnd, &iCurrent); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { char aBuffer[64]; - sqlite3_snprintf(sizeof(aBuffer), aBuffer, - "%d %d %d %d ", iCol, pTerm-sCtx.aTerm, iStart, iEnd-iStart - ); + 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 ){ + } else if (rc == SQLITE_DONE && pTab->zContentTbl == 0) { rc = FTS_CORRUPT_VTAB; } } } - if( rc==SQLITE_DONE ){ + if (rc == SQLITE_DONE) { rc = SQLITE_OK; } pMod->xClose(pC); - if( rc!=SQLITE_OK ) goto offsets_out; + if (rc != SQLITE_OK) + goto offsets_out; } - offsets_out: +offsets_out: sqlite3_free(sCtx.aTerm); - assert( rc!=SQLITE_DONE ); + assert(rc != SQLITE_DONE); sqlite3Fts3SegmentsClose(pTab); - if( rc!=SQLITE_OK ){ - sqlite3_result_error_code(pCtx, rc); + 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); + } else { + sqlite3_result_text(pCtx, res.z, res.n - 1, sqlite3_free); } return; } @@ -194625,24 +192568,23 @@ SQLITE_PRIVATE void sqlite3Fts3Offsets( /* ** 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; +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 ){ + if (zArg) { zFormat = zArg; - }else{ + } else { zFormat = FTS3_MATCHINFO_DEFAULT; } - if( !pCsr->pExpr ){ + if (!pCsr->pExpr) { sqlite3_result_blob(pContext, "", 0, SQLITE_STATIC); return; - }else{ + } else { /* Retrieve matchinfo() data. */ fts3GetMatchinfo(pContext, pCsr, zFormat); sqlite3Fts3SegmentsClose(pTab); @@ -194688,47 +192630,41 @@ SQLITE_PRIVATE void sqlite3Fts3Matchinfo( #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, + 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); \ - } \ -} +#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 */ @@ -194739,26 +192675,25 @@ struct unicode_tokenizer { sqlite3_tokenizer base; int eRemoveDiacritic; int nException; - int *aiException; + 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 */ + 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; +static int unicodeDestroy(sqlite3_tokenizer* pTokenizer) { + if (pTokenizer) { + unicode_tokenizer* p = (unicode_tokenizer*)pTokenizer; sqlite3_free(p->aiException); sqlite3_free(p); } @@ -194783,46 +192718,44 @@ static int unicodeDestroy(sqlite3_tokenizer *pTokenizer){ ** 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]; +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 ); + assert(bAlnum == 0 || bAlnum == 1); - while( zaiException,(p->nException+nEntry)*sizeof(int)); - if( aNew==0 ) return SQLITE_NOMEM; + aNew = sqlite3_realloc64(p->aiException, (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]; + for (i = 0; i < nNew && aNew[i] < (int)iCode; i++) + ; + for (j = nNew; j > i; j--) + aNew[j] = aNew[j - 1]; aNew[i] = (int)iCode; nNew++; } @@ -194837,20 +192770,20 @@ static int unicodeAddExceptions( /* ** 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; +static int unicodeIsException(unicode_tokenizer* p, int iCode) { + if (p->nException > 0) { + int* a = p->aiException; int iLo = 0; - int iHi = p->nException-1; + int iHi = p->nException - 1; - while( iHi>=iLo ){ + while (iHi >= iLo) { int iTest = (iHi + iLo) / 2; - if( iCode==a[iTest] ){ + if (iCode == a[iTest]) { return 1; - }else if( iCode>a[iTest] ){ - iLo = iTest+1; - }else{ - iHi = iTest-1; + } else if (iCode > a[iTest]) { + iLo = iTest + 1; + } else { + iHi = iTest - 1; } } } @@ -194862,58 +192795,53 @@ static int unicodeIsException(unicode_tokenizer *p, int iCode){ ** 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 ); +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 */ +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; + 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 ){ + } 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 ){ + } 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{ + } 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; + rc = SQLITE_ERROR; } } - if( rc!=SQLITE_OK ){ - unicodeDestroy((sqlite3_tokenizer *)pNew); + if (rc != SQLITE_OK) { + unicodeDestroy((sqlite3_tokenizer*)pNew); pNew = 0; } - *pp = (sqlite3_tokenizer *)pNew; + *pp = (sqlite3_tokenizer*)pNew; return rc; } @@ -194923,27 +192851,26 @@ static int unicodeCreate( ** 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; +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 ){ + 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->aInput = (const unsigned char*)aInput; + if (aInput == 0) { pCsr->nInput = 0; pCsr->aInput = (const unsigned char*)""; - }else if( nInput<0 ){ + } else if (nInput < 0) { pCsr->nInput = (int)strlen(aInput); - }else{ + } else { pCsr->nInput = nInput; } @@ -194956,8 +192883,8 @@ static int unicodeOpen( ** 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; +static int unicodeClose(sqlite3_tokenizer_cursor* pCursor) { + unicode_cursor* pCsr = (unicode_cursor*)pCursor; sqlite3_free(pCsr->zToken); sqlite3_free(pCsr); return SQLITE_OK; @@ -194967,41 +192894,43 @@ static int unicodeClose(sqlite3_tokenizer_cursor *pCursor){ ** 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); +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]; + 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; + if (zStart >= 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; + 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; @@ -195010,16 +192939,15 @@ static int unicodeNext( /* Write the folded case of the last character read to the output */ zEnd = z; iOut = sqlite3FtsUnicodeFold((int)iCode, p->eRemoveDiacritic); - if( iOut ){ + if (iOut) { WRITE_UTF8(zOut, iOut); } /* If the cursor is not at EOF, read the next character */ - if( z>=zTerm ) break; + if (z >= zTerm) + break; READ_UTF8(z, zTerm, iCode); - }while( unicodeIsAlnum(p, (int)iCode) - || sqlite3FtsUnicodeIsdiacritic((int)iCode) - ); + } while (unicodeIsAlnum(p, (int)iCode) || sqlite3FtsUnicodeIsdiacritic((int)iCode)); /* Set the output variables and return. */ pCsr->iOff = (int)(z - pCsr->aInput); @@ -195035,15 +192963,9 @@ static int unicodeNext( ** Set *ppModule to a pointer to the sqlite3_tokenizer_module ** structure for the unicode tokenizer. */ -SQLITE_PRIVATE void sqlite3Fts3UnicodeTokenizer(sqlite3_tokenizer_module const **ppModule){ +SQLITE_PRIVATE void sqlite3Fts3UnicodeTokenizer(sqlite3_tokenizer_module const** ppModule) { static const sqlite3_tokenizer_module module = { - 0, - unicodeCreate, - unicodeDestroy, - unicodeOpen, - unicodeClose, - unicodeNext, - 0, + 0, unicodeCreate, unicodeDestroy, unicodeOpen, unicodeClose, unicodeNext, 0, }; *ppModule = &module; } @@ -195082,7 +193004,7 @@ SQLITE_PRIVATE void sqlite3Fts3UnicodeTokenizer(sqlite3_tokenizer_module const * ** The results are undefined if the value passed to this function ** is less than zero. */ -SQLITE_PRIVATE int sqlite3FtsUnicodeIsalnum(int c){ +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). @@ -195095,117 +193017,74 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeIsalnum(int c){ ** 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, + 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, + 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; + 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 iHi = sizeof(aEntry) / sizeof(aEntry[0]) - 1; int iLo = 0; - while( iHi>=iLo ){ + while (iHi >= iLo) { int iTest = (iHi + iLo) / 2; - if( key >= aEntry[iTest] ){ + if (key >= aEntry[iTest]) { iRes = iTest; - iLo = iTest+1; - }else{ - iHi = iTest-1; + iLo = iTest + 1; + } else { + iHi = iTest - 1; } } - assert( aEntry[0]=aEntry[iRes] ); - return (((unsigned int)c) >= ((aEntry[iRes]>>10) + (aEntry[iRes]&0x3FF))); + assert(aEntry[0] < key); + assert(key >= 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 @@ -195214,83 +193093,64 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeIsalnum(int c){ ** E"). The resuls of passing a codepoint that corresponds to an ** uppercase letter are undefined. */ -static int remove_diacritic(int c, int bComplex){ +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, + 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', + '\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; + unsigned int key = (((unsigned int)c) << 3) | 0x00000007; int iRes = 0; - int iHi = sizeof(aDia)/sizeof(aDia[0]) - 1; + int iHi = sizeof(aDia) / sizeof(aDia[0]) - 1; int iLo = 0; - while( iHi>=iLo ){ + while (iHi >= iLo) { int iTest = (iHi + iLo) / 2; - if( key >= aDia[iTest] ){ + if (key >= aDia[iTest]) { iRes = iTest; - iLo = iTest+1; - }else{ - iHi = iTest-1; + 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); + 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){ +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))); + 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, @@ -195300,7 +193160,7 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeIsdiacritic(int c){ ** The results are undefined if the value passed to this function ** is less than zero. */ -SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int eRemoveDiacritic){ +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. @@ -195323,112 +193183,74 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int eRemoveDiacritic){ 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}, + {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, + 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 ); + 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; + 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 ){ + assert(c > aEntry[0].iCode); + while (iHi >= iLo) { int iTest = (iHi + iLo) / 2; int cmp = (c - aEntry[iTest].iCode); - if( cmp>=0 ){ + if (cmp >= 0) { iRes = iTest; - iLo = iTest+1; - }else{ - iHi = iTest-1; + iLo = iTest + 1; + } else { + iHi = iTest - 1; } } - assert( iRes>=0 && c>=aEntry[iRes].iCode ); + 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 (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); + if (eRemoveDiacritic) { + ret = remove_diacritic(ret, eRemoveDiacritic == 2); } } - else if( c>=66560 && c<66600 ){ + else if (c >= 66560 && c < 66600) { ret = c + 40; } @@ -195471,29 +193293,19 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int eRemoveDiacritic){ ** 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, + 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) +#define VVA(X) #else -# define VVA(X) X +#define VVA(X) X #endif /* Objects */ @@ -195506,71 +193318,68 @@ typedef struct JsonParse JsonParse; ** 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 */ + 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 + */ +#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" */ +#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" -}; +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 */ - + */ +#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 */ + 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 */ + 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 */ + 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 */ + 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 */ @@ -195585,15 +193394,15 @@ struct JsonParse { ** descent parser. A depth of 2000 is far deeper than any sane JSON ** should go. */ -#define JSON_MAX_DEPTH 2000 +#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){ + */ +static void jsonZero(JsonString* p) { p->zBuf = p->zSpace; p->nAlloc = sizeof(p->zSpace); p->nUsed = 0; @@ -195601,26 +193410,25 @@ static void jsonZero(JsonString *p){ } /* Initialize the JsonString object -*/ -static void jsonInit(JsonString *p, sqlite3_context *pCtx){ + */ +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); +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){ + */ +static void jsonOom(JsonString* p) { p->bErr = 1; sqlite3_result_error_nomem(p->pCtx); jsonReset(p); @@ -195629,22 +193437,23 @@ static void jsonOom(JsonString *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; +static int jsonGrow(JsonString* p, u32 N) { + u64 nTotal = N < p->nAlloc ? p->nAlloc * 2 : p->nAlloc + N + 10; + char* zNew; + if (p->bStatic) { + if (p->bErr) + return 1; zNew = sqlite3_malloc64(nTotal); - if( zNew==0 ){ + if (zNew == 0) { jsonOom(p); return SQLITE_NOMEM; } memcpy(zNew, p->zBuf, (size_t)p->nUsed); p->zBuf = zNew; p->bStatic = 0; - }else{ + } else { zNew = sqlite3_realloc64(p->zBuf, nTotal); - if( zNew==0 ){ + if (zNew == 0) { jsonOom(p); return SQLITE_NOMEM; } @@ -195655,40 +193464,46 @@ static int jsonGrow(JsonString *p, u32 N){ } /* 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); + */ +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, ...){ + */ +static void jsonPrintf(int N, JsonString* p, const char* zFormat, ...) { va_list ap; - if( (p->nUsed + N >= p->nAlloc) && jsonGrow(p, N) ) return; + if ((p->nUsed + N >= p->nAlloc) && jsonGrow(p, N)) + return; va_start(ap, zFormat); - sqlite3_vsnprintf(N, p->zBuf+p->nUsed, zFormat, ap); + sqlite3_vsnprintf(N, p->zBuf + p->nUsed, zFormat, ap); va_end(ap); - p->nUsed += (int)strlen(p->zBuf+p->nUsed); + 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; + */ +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){ +static void jsonAppendSeparator(JsonString* p) { char c; - if( p->nUsed==0 ) return; - c = p->zBuf[p->nUsed-1]; - if( c!='[' && c!='{' ) jsonAppendChar(p, ','); + 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 @@ -195696,77 +193511,77 @@ static void jsonAppendSeparator(JsonString *p){ ** any double-quotes or backslash characters contained within the ** string. */ -static void jsonAppendString(JsonString *p, const char *zIn, u32 N){ +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; + 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; + if (c == '"' || c == '\\') { + json_simple_escape: + if ((p->nUsed + 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] ){ + } 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; + 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++] = '0' + (c >> 4); + c = "0123456789abcdef"[c & 0xf]; } p->zBuf[p->nUsed++] = c; } p->zBuf[p->nUsed++] = '"'; - assert( p->nUsednAlloc ); + assert(p->nUsed < p->nAlloc); } /* ** 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) ){ +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); + 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); + const char* z = (const char*)sqlite3_value_text(pValue); u32 n = (u32)sqlite3_value_bytes(pValue); - if( sqlite3_value_subtype(pValue)==JSON_SUBTYPE ){ + if (sqlite3_value_subtype(pValue) == JSON_SUBTYPE) { jsonAppendRaw(p, z, n); - }else{ + } else { jsonAppendString(p, z, n); } break; } default: { - if( p->bErr==0 ){ + if (p->bErr == 0) { sqlite3_result_error(p->pCtx, "JSON cannot hold BLOB values", -1); p->bErr = 2; jsonReset(p); @@ -195776,17 +193591,14 @@ static void jsonAppendValue( } } - /* 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); + */ +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 ); + assert(p->bStatic); } /************************************************************************** @@ -195802,15 +193614,15 @@ static void jsonResult(JsonString *p){ ** 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; +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){ +static void jsonParseReset(JsonParse* pParse) { sqlite3_free(pParse->aNode); pParse->aNode = 0; pParse->nNode = 0; @@ -195822,7 +193634,7 @@ static void jsonParseReset(JsonParse *pParse){ /* ** Free a JsonParse object that was obtained from sqlite3_malloc(). */ -static void jsonParseFree(JsonParse *pParse){ +static void jsonParseFree(JsonParse* pParse) { jsonParseReset(pParse); sqlite3_free(pParse); } @@ -195832,24 +193644,23 @@ static void jsonParseFree(JsonParse *pParse){ ** 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 ); +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 ); + assert(pNode->eU == 5); pNode = pNode->u.pPatch; } - switch( pNode->eType ){ + switch (pNode->eType) { default: { - assert( pNode->eType==JSON_NULL ); + assert(pNode->eType == JSON_NULL); jsonAppendRaw(pOut, "null", 4); break; } @@ -195862,8 +193673,8 @@ static void jsonRenderNode( break; } case JSON_STRING: { - if( pNode->jnFlags & JNODE_RAW ){ - assert( pNode->eU==1 ); + if (pNode->jnFlags & JNODE_RAW) { + assert(pNode->eU == 1); jsonAppendString(pOut, pNode->u.zJContent, pNode->n); break; } @@ -195871,23 +193682,24 @@ static void jsonRenderNode( } case JSON_REAL: case JSON_INT: { - assert( pNode->eU==1 ); + 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 ){ + 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 ); + if ((pNode->jnFlags & JNODE_APPEND) == 0) + break; + assert(pNode->eU == 2); pNode = &pNode[pNode->u.iAppend]; j = 1; } @@ -195897,18 +193709,19 @@ static void jsonRenderNode( case JSON_OBJECT: { u32 j = 1; jsonAppendChar(pOut, '{'); - for(;;){ - while( j<=pNode->n ){ - if( (pNode[j+1].jnFlags & JNODE_REMOVE)==0 ){ + 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); + jsonRenderNode(&pNode[j + 1], pOut, aReplace); } - j += 1 + jsonNodeSize(&pNode[j+1]); + j += 1 + jsonNodeSize(&pNode[j + 1]); } - if( (pNode->jnFlags & JNODE_APPEND)==0 ) break; - assert( pNode->eU==2 ); + if ((pNode->jnFlags & JNODE_APPEND) == 0) + break; + assert(pNode->eU == 2); pNode = &pNode[pNode->u.iAppend]; j = 1; } @@ -195921,11 +193734,10 @@ static void jsonRenderNode( /* ** 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 */ -){ +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); @@ -195938,12 +193750,12 @@ static void jsonReturnJson( ** 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') ); +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)); + h += 9 * (1 & ~(h >> 4)); #else - h += 9*(1&(h>>6)); + h += 9 * (1 & (h >> 6)); #endif return (u8)(h & 0xf); } @@ -195951,30 +193763,26 @@ static u8 jsonHexToInt(int h){ /* ** Convert a 4-byte hex string into an integer */ -static u32 jsonHexToInt4(const char *z){ +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]); + 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 ){ +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 ); + assert(pNode->eType == JSON_NULL); sqlite3_result_null(pCtx); break; } @@ -195988,50 +193796,58 @@ static void jsonReturn( } case JSON_INT: { sqlite3_int64 i = 0; - const char *z; - assert( pNode->eU==1 ); + const char* z; + assert(pNode->eU == 1); z = pNode->u.zJContent; - if( z[0]=='-' ){ z++; } - while( z[0]>='0' && z[0]<='9' ){ + 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]=='-' ){ + 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{ + } else { goto int_as_real; } } } - i = i*10 + v; + i = i * 10 + v; + } + if (pNode->u.zJContent[0] == '-') { + i = -i; } - if( pNode->u.zJContent[0]=='-' ){ i = -i; } sqlite3_result_int64(pCtx, i); - int_done: + int_done: break; - int_as_real: ; /* no break */ deliberate_fall_through + int_as_real:; /* no break */ + deliberate_fall_through } case JSON_REAL: { double r; #ifdef SQLITE_AMALGAMATION - const char *z; - assert( pNode->eU==1 ); + const char* z; + assert(pNode->eU == 1); z = pNode->u.zJContent; sqlite3AtoF(z, &r, sqlite3Strlen30(z), SQLITE_UTF8); #else - assert( pNode->eU==1 ); + 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 +#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 ); @@ -196039,72 +193855,68 @@ static void jsonReturn( SQLITE_TRANSIENT); }else #endif - assert( (pNode->jnFlags & JNODE_RAW)==0 ); - if( (pNode->jnFlags & JNODE_ESCAPE)==0 ){ + 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{ + 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; + const char* z; + char* zOut; u32 j; - assert( pNode->eU==1 ); + assert(pNode->eU == 1); z = pNode->u.zJContent; - zOut = sqlite3_malloc( n+1 ); - if( zOut==0 ){ + 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{ + } else if (v <= 0x7ff) { + zOut[j++] = (char)(0xc0 | (v >> 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); + zOut[j++] = 0xf0 | (v >> 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' ){ + } else { + if (c == 'b') { c = '\b'; - }else if( c=='f' ){ + } else if (c == 'f') { c = '\f'; - }else if( c=='n' ){ + } else if (c == 'n') { c = '\n'; - }else if( c=='r' ){ + } else if (c == 'r') { c = '\r'; - }else if( c=='t' ){ + } else if (c == 't') { c = '\t'; } zOut[j++] = c; @@ -196125,40 +193937,39 @@ static void jsonReturn( } /* Forward reference */ -static int jsonParseAddNode(JsonParse*,u32,u32,const char*); +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) +#define JSON_NOINLINE __attribute__((noinline)) +#elif defined(_MSC_VER) && _MSC_VER >= 1310 +#define JSON_NOINLINE __declspec(noinline) #else -# define JSON_NOINLINE +#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 */ -){ +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 ){ + 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 ); + assert(pParse->nNode < pParse->nAlloc); return jsonParseAddNode(pParse, eType, n, zContent); } @@ -196167,20 +193978,19 @@ static JSON_NOINLINE int jsonParseAddNodeExpand( ** 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 ){ +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 ); + VVA(p->eU = zContent ? 1 : 0); p->n = n; p->u.zJContent = zContent; return pParse->nNode++; @@ -196189,9 +193999,11 @@ static int jsonParseAddNode( /* ** Return true if z[] begins with 4 (or more) hexadecimal digits */ -static int jsonIs4Hex(const char *z){ +static int jsonIs4Hex(const char* z) { int i; - for(i=0; i<4; i++) if( !sqlite3Isxdigit(z[i]) ) return 0; + for (i = 0; i < 4; i++) + if (!sqlite3Isxdigit(z[i])) + return 0; return 1; } @@ -196203,157 +194015,184 @@ static int jsonIs4Hex(const char *z){ ** first non-whitespace character is '}' and return -3 if the first ** non-whitespace character is ']'. */ -static int jsonParseValue(JsonParse *pParse, u32 i){ +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])=='{' ){ + 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; + 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 ){ + if (x < 0) { pParse->iDepth--; - if( x==(-2) && pParse->nNode==(u32)iThis+1 ) return j+1; + 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; + 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; + while (fast_isspace(z[j])) { + j++; + } + if (z[j] != ':') + return -1; j++; x = jsonParseValue(pParse, j); pParse->iDepth--; - if( x<0 ) return -1; + if (x < 0) + return -1; j = x; - while( fast_isspace(z[j]) ){ j++; } + while (fast_isspace(z[j])) { + j++; + } c = z[j]; - if( c==',' ) continue; - if( c!='}' ) return -1; + if (c == ',') + continue; + if (c != '}') + return -1; break; } pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1; - return j+1; - }else if( c=='[' ){ + return j + 1; + } else if (c == '[') { /* Parse array */ iThis = jsonParseAddNode(pParse, JSON_ARRAY, 0, 0); - if( iThis<0 ) return -1; + 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; + 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; + if (x < 0) { + if (x == (-3) && pParse->nNode == (u32)iThis + 1) + return j + 1; return -1; } j = x; - while( fast_isspace(z[j]) ){ j++; } + while (fast_isspace(z[j])) { + j++; + } c = z[j]; - if( c==',' ) continue; - if( c!=']' ) return -1; + if (c == ',') + continue; + if (c != ']') + return -1; break; } pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1; - return j+1; - }else if( c=='"' ){ + return j + 1; + } else if (c == '"') { /* Parse string */ u8 jnFlags = 0; - j = i+1; - for(;;){ + j = i + 1; + for (;;) { c = z[j]; - if( (c & ~0x1f)==0 ){ + if ((c & ~0x1f) == 0) { /* Control characters are not allowed in strings */ return -1; } - if( c=='\\' ){ + 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)) ){ + if (c == '"' || c == '\\' || c == '/' || c == 'b' || c == 'f' || c == 'n' || c == 'r' || c == 't' || + (c == 'u' && jsonIs4Hex(z + j + 1))) { jnFlags = JNODE_ESCAPE; - }else{ + } else { return -1; } - }else if( c=='"' ){ + } 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_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]) ){ + 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]) ){ + 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') ){ + 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; + 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++){ + 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; + 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; + 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=='-' ){ + c = z[j + 1]; + if (c == '+' || c == '-') { j++; - c = z[j+1]; + c = z[j + 1]; } - if( c<'0' || c>'9' ) return -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]); + 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 */ + } 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 */ } } @@ -196364,27 +194203,30 @@ static int jsonParseValue(JsonParse *pParse, u32 i){ ** ** 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 */ -){ +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; + 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 ){ + 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{ + } else { sqlite3_result_error(pCtx, "malformed JSON", -1); } } @@ -196397,21 +194239,21 @@ static int jsonParse( /* 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]; +static void jsonParseFillInParentage(JsonParse* pParse, u32 i, u32 iParent) { + JsonNode* pNode = &pParse->aNode[i]; u32 j; pParse->aUp[i] = iParent; - switch( pNode->eType ){ + switch (pNode->eType) { case JSON_ARRAY: { - for(j=1; j<=pNode->n; j += jsonNodeSize(pNode+j)){ - jsonParseFillInParentage(pParse, i+j, i); + 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); + for (j = 1; j <= pNode->n; j += jsonNodeSize(pNode + j + 1) + 1) { + pParse->aUp[i + j] = i; + jsonParseFillInParentage(pParse, i + j + 1, i); } break; } @@ -196424,11 +194266,11 @@ static void jsonParseFillInParentage(JsonParse *pParse, u32 i, u32 iParent){ /* ** 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 ){ +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; } @@ -196439,8 +194281,8 @@ static int jsonParseFindParents(JsonParse *pParse){ /* ** 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 */ +#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 @@ -196450,81 +194292,76 @@ static int jsonParseFindParents(JsonParse *pParse){ ** 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]); +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; + 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 - ){ + if (pMatch == 0 && p->nJson == nJson && memcmp(p->zJson, zJson, nJson) == 0) { p->nErr = 0; pMatch = p; - }else if( p->iHoldiHold < iMinHold) { iMinHold = p->iHold; iMinKey = iKey; } - if( p->iHold>iMaxHold ){ + if (p->iHold > iMaxHold) { iMaxHold = p->iHold; } } - if( pMatch ){ + if (pMatch) { pMatch->nErr = 0; - pMatch->iHold = iMaxHold+1; + pMatch->iHold = iMaxHold + 1; return pMatch; } - p = sqlite3_malloc64( sizeof(*p) + nJson + 1 ); - if( p==0 ){ + 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) ){ + 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); + 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; +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**); +static JsonNode* jsonLookupAppend(JsonParse*, const char*, int*, const char**); /* ** Search along zPath to find the node specified. Return a pointer @@ -196535,150 +194372,164 @@ static JsonNode *jsonLookupAppend(JsonParse*,const char*,int*,const char**); ** 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 */ -){ +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; + 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]=='"' ){ + if (zPath[0] == '"') { zKey = zPath + 1; - for(i=1; zPath[i] && zPath[i]!='"'; i++){} - nKey = i-1; - if( zPath[i] ){ + for (i = 1; zPath[i] && zPath[i] != '"'; i++) { + } + nKey = i - 1; + if (zPath[i]) { i++; - }else{ + } else { *pzErr = zPath; return 0; } - testcase( nKey==0 ); - }else{ + testcase(nKey == 0); + } else { zKey = zPath; - for(i=0; zPath[i] && zPath[i]!='.' && zPath[i]!='['; i++){} + for (i = 0; zPath[i] && zPath[i] != '.' && zPath[i] != '['; i++) { + } nKey = i; - if( nKey==0 ){ + 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); + 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 ); + if ((pRoot->jnFlags & JNODE_APPEND) == 0) + break; + assert(pRoot->eU == 2); iRoot += pRoot->u.iAppend; pRoot = &pParse->aNode[iRoot]; j = 1; } - if( pApnd ){ + if (pApnd) { u32 iStart, iLabel; - JsonNode *pNode; + 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 ){ + if (pParse->oom) + return 0; + if (pNode) { pRoot = &pParse->aNode[iRoot]; - assert( pRoot->eU==0 ); + assert(pRoot->eU == 0); pRoot->u.iAppend = iStart - iRoot; pRoot->jnFlags |= JNODE_APPEND; - VVA( pRoot->eU = 2 ); + VVA(pRoot->eU = 2); pParse->aNode[iLabel].jnFlags |= JNODE_RAW; } return pNode; } - }else if( zPath[0]=='[' ){ + } else if (zPath[0] == '[') { i = 0; j = 1; - while( sqlite3Isdigit(zPath[j]) ){ - i = i*10 + zPath[j] - '0'; + while (sqlite3Isdigit(zPath[j])) { + i = i * 10 + zPath[j] - '0'; j++; } - if( j<2 || zPath[j]!=']' ){ - if( zPath[1]=='#' ){ - JsonNode *pBase = pRoot; + 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++; + 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 ); + 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]) ){ + if (zPath[2] == '-' && sqlite3Isdigit(zPath[3])) { unsigned int x = 0; j = 3; - do{ - x = x*10 + zPath[j] - '0'; + do { + x = x * 10 + zPath[j] - '0'; j++; - }while( sqlite3Isdigit(zPath[j]) ); - if( x>i ) return 0; + } while (sqlite3Isdigit(zPath[j])); + if (x > i) + return 0; i -= x; } - if( zPath[j]!=']' ){ + if (zPath[j] != ']') { *pzErr = zPath; return 0; } - }else{ + } else { *pzErr = zPath; return 0; } } - if( pRoot->eType!=JSON_ARRAY ) 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--; + 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 ); + 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 (j <= pRoot->n) { + return jsonLookupStep(pParse, iRoot + j, zPath, pApnd, pzErr); } - if( i==0 && pApnd ){ + if (i == 0 && pApnd) { u32 iStart; - JsonNode *pNode; + JsonNode* pNode; iStart = jsonParseAddNode(pParse, JSON_ARRAY, 1, 0); pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr); - if( pParse->oom ) return 0; - if( pNode ){ + if (pParse->oom) + return 0; + if (pNode) { pRoot = &pParse->aNode[iRoot]; - assert( pRoot->eU==0 ); + assert(pRoot->eU == 0); pRoot->u.iAppend = iStart - iRoot; pRoot->jnFlags |= JNODE_APPEND; - VVA( pRoot->eU = 2 ); + VVA(pRoot->eU = 2); } return pNode; } - }else{ + } else { *pzErr = zPath; } return 0; @@ -196688,33 +194539,33 @@ static JsonNode *jsonLookupStep( ** 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 */ -){ +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 ){ + if (zPath[0] == 0) { jsonParseAddNode(pParse, JSON_NULL, 0, 0); - return pParse->oom ? 0 : &pParse->aNode[pParse->nNode-1]; + return pParse->oom ? 0 : &pParse->aNode[pParse->nNode - 1]; } - if( zPath[0]=='.' ){ + if (zPath[0] == '.') { jsonParseAddNode(pParse, JSON_OBJECT, 0, 0); - }else if( strncmp(zPath,"[0]",3)==0 ){ + } else if (strncmp(zPath, "[0]", 3) == 0) { jsonParseAddNode(pParse, JSON_ARRAY, 0, 0); - }else{ + } else { return 0; } - if( pParse->oom ) return 0; - return jsonLookupStep(pParse, pParse->nNode-1, zPath, pApnd, pzErr); + 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){ +static char* jsonPathSyntaxError(const char* zErr) { return sqlite3_mprintf("JSON path error near '%q'", zErr); } @@ -196728,49 +194579,45 @@ static char *jsonPathSyntaxError(const char *zErr){ ** 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; +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]!='$' ){ + 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; + if (zErr == 0) + return pNode; lookup_err: pParse->nErr++; - assert( zErr!=0 && pCtx!=0 ); + assert(zErr != 0 && pCtx != 0); zMsg = jsonPathSyntaxError(zErr); - if( zMsg ){ + if (zMsg) { sqlite3_result_error(pCtx, zMsg, -1); sqlite3_free(zMsg); - }else{ + } 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); +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); } @@ -196778,12 +194625,12 @@ static void jsonWrongNumArgs( /* ** Mark all NULL entries in the Object passed in as JNODE_REMOVE. */ -static void jsonRemoveAllNulls(JsonNode *pNode){ +static void jsonRemoveAllNulls(JsonNode* pNode) { int i, n; - assert( pNode->eType==JSON_OBJECT ); + assert(pNode->eType == JSON_OBJECT); n = pNode->n; - for(i=2; i<=n; i += jsonNodeSize(&pNode[i])+1){ - switch( pNode[i].eType ){ + for (i = 2; i <= n; i += jsonNodeSize(&pNode[i]) + 1) { + switch (pNode[i].eType) { case JSON_NULL: pNode[i].jnFlags |= JNODE_REMOVE; break; @@ -196794,7 +194641,6 @@ static void jsonRemoveAllNulls(JsonNode *pNode){ } } - /**************************************************************************** ** SQL functions used for testing and debugging ****************************************************************************/ @@ -196805,36 +194651,32 @@ static void jsonRemoveAllNulls(JsonNode *pNode){ ** 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 */ +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; + 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]); + if (p == 0) + return; + assert(p->nNode); + if (argc == 2) { + const char* zPath = (const char*)sqlite3_value_text(argv[1]); pNode = jsonLookup(p, zPath, 0, ctx); - }else{ + } else { pNode = p->aNode; } - if( pNode==0 ){ + if (pNode == 0) { return; } - if( pNode->eType==JSON_ARRAY ){ - assert( (pNode->jnFlags & JNODE_APPEND)==0 ); - for(i=1; i<=pNode->n; n++){ + if (pNode->eType == JSON_ARRAY) { + assert((pNode->jnFlags & JNODE_APPEND) == 0); + for (i = 1; i <= pNode->n; n++) { i += jsonNodeSize(&pNode[i]); } } @@ -196948,10 +194774,10 @@ static void jsonArrayLengthFunc( ** 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() */ +#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, ...) @@ -196973,26 +194799,25 @@ static void jsonArrayLengthFunc( ** 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; +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; + if (argc < 2) + return; p = jsonParseCached(ctx, argv, ctx); - if( p==0 ) return; - if( argc==2 ){ + 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]!='$' ){ + 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. @@ -197002,50 +194827,52 @@ static void jsonExtractFunc( ** [NUMBER] ==> $[NUMBER] // Not PG. Purely for convenience */ jsonInit(&jx, ctx); - if( sqlite3Isdigit(zPath[0]) ){ + if (sqlite3Isdigit(zPath[0])) { jsonAppendRaw(&jx, "$[", 2); jsonAppendRaw(&jx, zPath, (int)strlen(zPath)); jsonAppendRaw(&jx, "]", 2); - }else{ - jsonAppendRaw(&jx, "$.", 1 + (zPath[0]!='[')); + } 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{ + } else { pNode = jsonLookup(p, zPath, 0, ctx); } - if( pNode ){ - if( flags & JSON_JSON ){ + if (pNode) { + if (flags & JSON_JSON) { jsonReturnJson(pNode, ctx, 0); - }else{ + } else { jsonReturn(pNode, ctx, 0); sqlite3_result_subtype(ctx, 0); } } - }else{ + } else { pNode = jsonLookup(p, zPath, 0, ctx); - if( p->nErr==0 && pNode ) jsonReturn(pNode, ctx, 0); + if (p->nErr == 0 && pNode) + jsonReturn(pNode, ctx, 0); } - }else{ + } 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; + if (p->nErr) + break; jsonAppendSeparator(&jx); - if( pNode ){ + if (pNode) { jsonRenderNode(pNode, &jx, 0); - }else{ + } else { jsonAppendRaw(&jx, "null", 4); } } - if( i==argc ){ + if (i == argc) { jsonAppendChar(&jx, ']'); jsonResult(&jx); sqlite3_result_subtype(ctx, JSON_SUBTYPE); @@ -197055,79 +194882,79 @@ static void jsonExtractFunc( } /* 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 */ -){ + */ +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 ){ + JsonNode* pTarget; + if (pPatch->eType != JSON_OBJECT) { return pPatch; } - assert( iTargetnNode ); + assert(iTarget < pParse->nNode); pTarget = &pParse->aNode[iTarget]; - assert( (pPatch->jnFlags & JNODE_APPEND)==0 ); - if( pTarget->eType!=JSON_OBJECT ){ + 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){ + for (i = 1; i < pPatch->n; 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 ); + 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; + assert((pPatch[i].jnFlags & JNODE_RAW) == 0); + for (j = 1; j < pTarget->n; 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; + 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 ){ + 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; + 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 ); + 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 ); + 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 ); + 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]; + pParse->aNode[iPatch].u.pPatch = &pPatch[i + 1]; } } return pTarget; @@ -197138,57 +194965,51 @@ static JsonNode *jsonMergePatch( ** 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 */ +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])) ){ + 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 ){ + assert(pResult != 0 || x.oom); + if (pResult) { jsonReturnJson(pResult, ctx, 0); - }else{ + } 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 -){ +static void jsonObjectFunc(sqlite3_context* ctx, int argc, sqlite3_value** argv) { int i; JsonString jx; - const char *z; + const char* z; u32 n; - if( argc&1 ){ - sqlite3_result_error(ctx, "json_object() requires an even number " - "of arguments", -1); + 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.nErr) + goto remove_done; + if (pNode) + pNode->jnFlags |= JNODE_REMOVE; } - if( (x.aNode[0].jnFlags & JNODE_REMOVE)==0 ){ + if ((x.aNode[0].jnFlags & JNODE_REMOVE) == 0) { jsonReturnJson(x.aNode, ctx, 0); } remove_done: @@ -197245,46 +195066,44 @@ static void jsonRemoveFunc( ** 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; +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 ) { + 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){ + 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 ); + 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 ); + VVA(pNode->eU = 4); pNode->u.iReplace = i + 1; } } - if( x.aNode[0].jnFlags & JNODE_REPLACE ){ - assert( x.aNode[0].eU==4 ); + if (x.aNode[0].jnFlags & JNODE_REPLACE) { + assert(x.aNode[0].eU == 4); sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]); - }else{ + } else { jsonReturnJson(x.aNode, ctx, argv); } replace_err: jsonParseReset(&x); } - /* ** json_set(JSON, PATH, VALUE, ...) ** @@ -197297,46 +195116,44 @@ static void jsonReplaceFunc( ** 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; +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; + int bIsSet = sqlite3_user_data(ctx) != 0; - if( argc<1 ) return; - if( (argc&1)==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){ + 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 ){ + if (x.oom) { sqlite3_result_error_nomem(ctx); goto jsonSetDone; - }else if( x.nErr ){ + } 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 ); + } 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 ); + if (x.aNode[0].jnFlags & JNODE_REPLACE) { + assert(x.aNode[0].eU == 4); sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]); - }else{ + } else { jsonReturnJson(x.aNode, ctx, argv); } jsonSetDone: @@ -197350,24 +195167,21 @@ static void jsonSetFunc( ** 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; +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 ){ + if (p == 0) + return; + if (argc == 2) { zPath = (const char*)sqlite3_value_text(argv[1]); pNode = jsonLookup(p, zPath, 0, ctx); - }else{ + } else { pNode = p->aNode; } - if( pNode ){ + if (pNode) { sqlite3_result_text(ctx, jsonType[pNode->eType], -1, SQLITE_STATIC); } } @@ -197378,18 +195192,13 @@ static void jsonTypeFunc( ** 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 */ +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); + sqlite3_result_int(ctx, p != 0); } - /**************************************************************************** ** Aggregate SQL function implementations ****************************************************************************/ @@ -197398,51 +195207,47 @@ static void jsonValidFunc( ** ** Return a JSON array composed of all values in the aggregate. */ -static void jsonArrayStep( - sqlite3_context *ctx, - int argc, - sqlite3_value **argv -){ - JsonString *pStr; +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 ){ + if (pStr) { + if (pStr->zBuf == 0) { jsonInit(pStr, ctx); jsonAppendChar(pStr, '['); - }else if( pStr->nUsed>1 ){ + } else if (pStr->nUsed > 1) { jsonAppendChar(pStr, ','); } pStr->pCtx = ctx; jsonAppendValue(pStr, argv[0]); } } -static void jsonArrayCompute(sqlite3_context *ctx, int isFinal){ - JsonString *pStr; +static void jsonArrayCompute(sqlite3_context* ctx, int isFinal) { + JsonString* pStr; pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0); - if( pStr ){ + 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); + 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{ + } else { sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, SQLITE_TRANSIENT); pStr->nUsed--; } - }else{ + } else { sqlite3_result_text(ctx, "[]", 2, SQLITE_STATIC); } sqlite3_result_subtype(ctx, JSON_SUBTYPE); } -static void jsonArrayValue(sqlite3_context *ctx){ +static void jsonArrayValue(sqlite3_context* ctx) { jsonArrayCompute(ctx, 0); } -static void jsonArrayFinal(sqlite3_context *ctx){ +static void jsonArrayFinal(sqlite3_context* ctx) { jsonArrayCompute(ctx, 1); } @@ -197453,69 +195258,63 @@ static void jsonArrayFinal(sqlite3_context *ctx){ ** 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 -){ +static void jsonGroupInverse(sqlite3_context* ctx, int argc, sqlite3_value** argv) { unsigned int i; int inStr = 0; int nNest = 0; - char *z; + char* z; char c; - JsonString *pStr; + 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; + if (NEVER(!pStr)) + return; #endif z = pStr->zBuf; - for(i=1; inUsed && ((c = z[i])!=',' || inStr || nNest); i++){ - if( c=='"' ){ + for (i = 1; i < pStr->nUsed && ((c = z[i]) != ',' || inStr || nNest); i++) { + if (c == '"') { inStr = !inStr; - }else if( c=='\\' ){ + } else if (c == '\\') { i++; - }else if( !inStr ){ - if( c=='{' || c=='[' ) nNest++; - if( c=='}' || c==']' ) nNest--; + } else if (!inStr) { + if (c == '{' || c == '[') + nNest++; + if (c == '}' || c == ']') + nNest--; } } - if( inUsed ){ + if (i < pStr->nUsed) { pStr->nUsed -= i; - memmove(&z[1], &z[i+1], (size_t)pStr->nUsed-1); + memmove(&z[1], &z[i + 1], (size_t)pStr->nUsed - 1); z[pStr->nUsed] = 0; - }else{ + } else { pStr->nUsed = 1; } } #else -# define jsonGroupInverse 0 +#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; +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 ){ + if (pStr) { + if (pStr->zBuf == 0) { jsonInit(pStr, ctx); jsonAppendChar(pStr, '{'); - }else if( pStr->nUsed>1 ){ + } else if (pStr->nUsed > 1) { jsonAppendChar(pStr, ','); } pStr->pCtx = ctx; @@ -197526,90 +195325,82 @@ static void jsonObjectStep( jsonAppendValue(pStr, argv[1]); } } -static void jsonObjectCompute(sqlite3_context *ctx, int isFinal){ - JsonString *pStr; +static void jsonObjectCompute(sqlite3_context* ctx, int isFinal) { + JsonString* pStr; pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0); - if( pStr ){ + 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); + 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{ + } else { sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, SQLITE_TRANSIENT); pStr->nUsed--; } - }else{ + } else { sqlite3_result_text(ctx, "{}", 2, SQLITE_STATIC); } sqlite3_result_subtype(ctx, JSON_SUBTYPE); } -static void jsonObjectValue(sqlite3_context *ctx){ +static void jsonObjectValue(sqlite3_context* ctx) { jsonObjectCompute(ctx, 0); } -static void jsonObjectFinal(sqlite3_context *ctx){ +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 */ + 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; +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_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 +#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 +#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; + 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); } @@ -197617,28 +195408,29 @@ static int jsonEachConnect( } /* destructor for json_each virtual table */ -static int jsonEachDisconnect(sqlite3_vtab *pVtab){ +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; +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; + 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){ +static int jsonEachOpenTree(sqlite3_vtab* p, sqlite3_vtab_cursor** ppCursor) { int rc = jsonEachOpenEach(p, ppCursor); - if( rc==SQLITE_OK ){ - JsonEachCursor *pCur = (JsonEachCursor*)*ppCursor; + if (rc == SQLITE_OK) { + JsonEachCursor* pCur = (JsonEachCursor*)*ppCursor; pCur->bRecursive = 1; } return rc; @@ -197646,7 +195438,7 @@ static int jsonEachOpenTree(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ /* Reset a JsonEachCursor back to its original state. Free any memory ** held. */ -static void jsonEachCursorReset(JsonEachCursor *p){ +static void jsonEachCursorReset(JsonEachCursor* p) { sqlite3_free(p->zJson); sqlite3_free(p->zRoot); jsonParseReset(&p->sParse); @@ -197659,8 +195451,8 @@ static void jsonEachCursorReset(JsonEachCursor *p){ } /* Destructor for a jsonEachCursor object */ -static int jsonEachClose(sqlite3_vtab_cursor *cur){ - JsonEachCursor *p = (JsonEachCursor*)cur; +static int jsonEachClose(sqlite3_vtab_cursor* cur) { + JsonEachCursor* p = (JsonEachCursor*)cur; jsonEachCursorReset(p); sqlite3_free(cur); return SQLITE_OK; @@ -197668,42 +195460,43 @@ static int jsonEachClose(sqlite3_vtab_cursor *cur){ /* 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; +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++; +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 ){ + if (p->i < p->iEnd) { u32 iUp = p->sParse.aUp[p->i]; - JsonNode *pUp = &p->sParse.aNode[iUp]; + 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 ){ + 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{ + } else { pUp->u.iKey++; } } } - }else{ - switch( p->eType ){ + } 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->i += 1 + jsonNodeSize(&p->sParse.aNode[p->i + 1]); p->iRowid++; break; } @@ -197719,40 +195512,37 @@ static int jsonEachNext(sqlite3_vtab_cursor *cur){ /* Append an object label to the JSON Path being constructed ** in pStr. */ -static void jsonAppendObjectPathElement( - JsonString *pStr, - JsonNode *pNode -){ +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 ); + 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; jj= 2); + assert(z[0] == '"'); + assert(z[nn - 1] == '"'); + if (nn > 2 && sqlite3Isalpha(z[1])) { + for (jj = 2; jj < nn - 1 && sqlite3Isalnum(z[jj]); jj++) { + } + if (jj == nn - 1) { z++; nn -= 2; } } - jsonPrintf(nn+2, pStr, ".%.*s", nn, z); + jsonPrintf(nn + 2, pStr, ".%.*s", nn, z); } /* Append the name of the path for element i to pStr -*/ -static void jsonEachComputePath( - JsonEachCursor *p, /* The cursor */ - JsonString *pStr, /* Write the path here */ - u32 i /* Path to this element */ -){ + */ +static void jsonEachComputePath(JsonEachCursor* p, /* The cursor */ + JsonString* pStr, /* Write the path here */ + u32 i /* Path to this element */ +) { JsonNode *pNode, *pUp; u32 iUp; - if( i==0 ){ + if (i == 0) { jsonAppendChar(pStr, '$'); return; } @@ -197760,37 +195550,39 @@ static void jsonEachComputePath( 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 ); + 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--; + } 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 ){ +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 ){ + if (p->i == 0) + break; + if (p->eType == JSON_OBJECT) { jsonReturn(pThis, ctx, 0); - }else if( p->eType==JSON_ARRAY ){ + } 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 ); + 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{ + } else { iKey = p->iRowid; } sqlite3_result_int64(ctx, (sqlite3_int64)iKey); @@ -197798,28 +195590,31 @@ static int jsonEachColumn( break; } case JEACH_VALUE: { - if( pThis->jnFlags & JNODE_LABEL ) pThis++; + if (pThis->jnFlags & JNODE_LABEL) + pThis++; jsonReturn(pThis, ctx, 0); break; } case JEACH_TYPE: { - if( pThis->jnFlags & JNODE_LABEL ) pThis++; + 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; + 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)); + sqlite3_result_int64(ctx, (sqlite3_int64)p->i + ((pThis->jnFlags & JNODE_LABEL) != 0)); break; } case JEACH_PARENT: { - if( p->i>p->iBegin && p->bRecursive ){ + if (p->i > p->iBegin && p->bRecursive) { sqlite3_result_int64(ctx, (sqlite3_int64)p->sParse.aUp[p->i]); } break; @@ -197827,17 +195622,17 @@ static int jsonEachColumn( case JEACH_FULLKEY: { JsonString x; jsonInit(&x, ctx); - if( p->bRecursive ){ + if (p->bRecursive) { jsonEachComputePath(p, &x, p->i); - }else{ - if( p->zRoot ){ + } else { + if (p->zRoot) { jsonAppendRaw(&x, p->zRoot, (int)strlen(p->zRoot)); - }else{ + } else { jsonAppendChar(&x, '$'); } - if( p->eType==JSON_ARRAY ){ + if (p->eType == JSON_ARRAY) { jsonPrintf(30, &x, "[%d]", p->iRowid); - }else if( p->eType==JSON_OBJECT ){ + } else if (p->eType == JSON_OBJECT) { jsonAppendObjectPathElement(&x, pThis); } } @@ -197845,7 +195640,7 @@ static int jsonEachColumn( break; } case JEACH_PATH: { - if( p->bRecursive ){ + if (p->bRecursive) { JsonString x; jsonInit(&x, ctx); jsonEachComputePath(p, &x, p->sParse.aUp[p->i]); @@ -197857,13 +195652,14 @@ static int jsonEachColumn( /* no break */ deliberate_fall_through } default: { - const char *zRoot = p->zRoot; - if( zRoot==0 ) zRoot = "$"; + 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 ); + assert(i == JEACH_JSON); sqlite3_result_text(ctx, p->sParse.zJson, -1, SQLITE_STATIC); break; } @@ -197872,8 +195668,8 @@ static int jsonEachColumn( } /* Return the current rowid value */ -static int jsonEachRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ - JsonEachCursor *p = (JsonEachCursor*)cur; +static int jsonEachRowid(sqlite3_vtab_cursor* cur, sqlite_int64* pRowid) { + JsonEachCursor* p = (JsonEachCursor*)cur; *pRowid = p->iRowid; return SQLITE_OK; } @@ -197883,140 +195679,140 @@ static int jsonEachRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ ** 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; +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 ); + assert(JEACH_ROOT == JEACH_JSON + 1); UNUSED_PARAMETER(tab); aIdx[0] = aIdx[1] = -1; pConstraint = pIdxInfo->aConstraint; - for(i=0; inConstraint; i++, pConstraint++){ + for (i = 0; i < pIdxInfo->nConstraint; i++, pConstraint++) { int iCol; int iMask; - if( pConstraint->iColumn < JEACH_JSON ) continue; + if (pConstraint->iColumn < JEACH_JSON) + continue; iCol = pConstraint->iColumn - JEACH_JSON; - assert( iCol==0 || iCol==1 ); - testcase( iCol==0 ); + assert(iCol == 0 || iCol == 1); + testcase(iCol == 0); iMask = 1 << iCol; - if( pConstraint->usable==0 ){ + if (pConstraint->usable == 0) { unusableMask |= iMask; - }else if( pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){ + } else if (pConstraint->op == SQLITE_INDEX_CONSTRAINT_EQ) { aIdx[iCol] = i; idxMask |= iMask; } } - if( (unusableMask & ~idxMask)!=0 ){ + 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 ){ + 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{ + } 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{ + 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 */ + 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; +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; + if (idxNum == 0) + return SQLITE_OK; z = (const char*)sqlite3_value_text(argv[0]); - if( z==0 ) return SQLITE_OK; + 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) ){ + 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 ){ + if (p->sParse.oom == 0) { sqlite3_free(cur->pVtab->zErrMsg); cur->pVtab->zErrMsg = sqlite3_mprintf("malformed JSON"); - if( cur->pVtab->zErrMsg ) rc = SQLITE_ERROR; + if (cur->pVtab->zErrMsg) + rc = SQLITE_ERROR; } jsonEachCursorReset(p); return rc; - }else if( p->bRecursive && jsonParseFindParents(&p->sParse) ){ + } else if (p->bRecursive && jsonParseFindParents(&p->sParse)) { jsonEachCursorReset(p); return SQLITE_NOMEM; - }else{ - JsonNode *pNode = 0; - if( idxNum==3 ){ - const char *zErr = 0; + } 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; + 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]!='$' ){ + 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); + } else { + pNode = jsonLookupStep(&p->sParse, 0, p->zRoot + 1, 0, &zErr); } - if( 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 ){ + } else if (pNode == 0) { return SQLITE_OK; } - }else{ + } 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 ); + 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 ){ + 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 ){ + if (p->i > 0 && (p->sParse.aNode[p->i - 1].jnFlags & JNODE_LABEL) != 0) { p->i--; } - }else{ + } else { p->i++; } - }else{ - p->iEnd = p->i+1; + } else { + p->iEnd = p->i + 1; } } return SQLITE_OK; @@ -198024,58 +195820,58 @@ static int jsonEachFilter( /* 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 */ + 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 */ + 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) */ @@ -198083,56 +195879,52 @@ static sqlite3_module jsonTreeModule = { /* ** Register JSON functions. */ -SQLITE_PRIVATE void sqlite3RegisterJsonFunctions(void){ +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), + 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) - }; + 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) +#if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_JSON) /* ** Register the JSON table-valued functions */ -SQLITE_PRIVATE int sqlite3JsonTableFunctions(sqlite3 *db){ +SQLITE_PRIVATE int sqlite3JsonTableFunctions(sqlite3* db) { int rc = SQLITE_OK; static const struct { - const char *zName; - sqlite3_module *pModule; + const char* zName; + sqlite3_module* pModule; } aMod[] = { - { "json_each", &jsonEachModule }, - { "json_tree", &jsonTreeModule }, + {"json_each", &jsonEachModule}, + {"json_tree", &jsonTreeModule}, }; unsigned int i; - for(i=0; i */ /* The following macro is used to suppress compiler warnings. -*/ + */ #ifndef UNUSED_PARAMETER -# define UNUSED_PARAMETER(x) (void)(x) +#define UNUSED_PARAMETER(x) (void)(x) #endif typedef struct Rtree Rtree; @@ -198280,70 +196071,70 @@ typedef struct RtreeSearchPoint RtreeSearchPoint; ** RTREE_DEFAULT_ROWEST. */ #define RTREE_DEFAULT_ROWEST 1048576 -#define RTREE_MIN_ROWEST 100 +#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 */ + 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 */ + u8 nAuxNotNull; /* Number of initial not-null aux columns */ #endif #ifdef SQLITE_DEBUG - u8 bCorrupt; /* Shadow table corruption detected */ + 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 */ + 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 */ + RtreeNode* pDeleted; + int iReinsertHeight; /* Height of sub-trees Reinsert() has run on */ /* Blob I/O on xxx_node */ - sqlite3_blob *pNodeBlob; + sqlite3_blob* pNodeBlob; /* Statements to read/write/delete a record from xxx_node */ - sqlite3_stmt *pWriteNode; - sqlite3_stmt *pDeleteNode; + 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; + 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; + sqlite3_stmt* pReadParent; + sqlite3_stmt* pWriteParent; + sqlite3_stmt* pDeleteParent; /* Statement for writing to the "aux:" fields, if there are any */ - sqlite3_stmt *pWriteAux; + sqlite3_stmt* pWriteAux; - RtreeNode *aHash[HASHSIZE]; /* Hash table of in-memory nodes. */ + RtreeNode* aHash[HASHSIZE]; /* Hash table of in-memory nodes. */ }; /* Possible values for Rtree.eCoordType: */ #define RTREE_COORD_REAL32 0 -#define RTREE_COORD_INT32 1 +#define RTREE_COORD_INT32 1 /* ** If SQLITE_RTREE_INT_ONLY is defined, then this virtual table will @@ -198351,22 +196142,22 @@ struct Rtree { ** 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 +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 +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) +#define RTREE_IS_CORRUPT(X) ((X)->bCorrupt = 1) #else -# define RTREE_IS_CORRUPT(X) +#define RTREE_IS_CORRUPT(X) #endif /* @@ -198379,11 +196170,11 @@ struct Rtree { ** 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 */ + 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 */ }; /* @@ -198395,7 +196186,7 @@ struct RtreeSearchPoint { ** 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_MINCELLS(p) ((((p)->iNodeSize - 4) / (p)->nBytesPerCell) / 3) #define RTREE_REINSERT(p) RTREE_MINCELLS(p) #define RTREE_MAXCELLS 51 @@ -198408,13 +196199,12 @@ struct RtreeSearchPoint { */ #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 +#define RTREE_CACHE_SZ 5 /* ** An rtree cursor object. @@ -198426,28 +196216,28 @@ struct RtreeCursor { 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. */ + 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* 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 */ + 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)) +#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 */ + RtreeValue f; /* Floating point value */ + int i; /* Integer value */ + u32 u; /* Unsigned for byte-order conversions */ }; /* @@ -198457,55 +196247,51 @@ union RtreeCoord { ** RtreeCoord. */ #ifdef SQLITE_RTREE_INT_ONLY -# define DCOORD(coord) ((RtreeDValue)coord.i) +#define DCOORD(coord) ((RtreeDValue)coord.i) #else -# define DCOORD(coord) ( \ - (pRtree->eCoordType==RTREE_COORD_REAL32) ? \ - ((double)coord.f) : \ - ((double)coord.i) \ - ) +#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 */ + int iCoord; /* Index of constrained coordinate */ + int op; /* Constraining operation */ union { - RtreeDValue rValue; /* Constraint value. */ - int (*xGeom)(sqlite3_rtree_geometry*,int,RtreeDValue*,int*); + 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 */ + 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() */ +#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 /* @ */ +#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 */ + 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 */ @@ -198515,11 +196301,10 @@ struct RtreeNode { ** A single cell from a node, deserialized */ struct RtreeCell { - i64 iRowid; /* Node or entry ID */ - RtreeCoord aCoord[RTREE_MAX_DIMENSIONS*2]; /* Bounding box coordinates */ + 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 @@ -198538,7 +196323,7 @@ struct RtreeGeomCallback { int (*xGeom)(sqlite3_rtree_geometry*, int, RtreeDValue*, int*); int (*xQueryFunc)(sqlite3_rtree_query_info*); void (*xDestructor)(void*); - void *pContext; + void* pContext; }; /* @@ -198551,15 +196336,15 @@ 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 */ + 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)) +#define MAX(x, y) ((x) < (y) ? (y) : (x)) #endif #ifndef MIN -# define MIN(x,y) ((x) > (y) ? (y) : (x)) +#define MIN(x, y) ((x) > (y) ? (y) : (x)) #endif /* What version of GCC is being used. 0 means GCC is not being used . @@ -198569,9 +196354,9 @@ struct RtreeMatchArg { */ #ifndef GCC_VERSION #if defined(__GNUC__) && !defined(SQLITE_DISABLE_INTRINSIC) -# define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__) +#define GCC_VERSION (__GNUC__ * 1000000 + __GNUC_MINOR__ * 1000 + __GNUC_PATCHLEVEL__) #else -# define GCC_VERSION 0 +#define GCC_VERSION 0 #endif #endif @@ -198579,12 +196364,15 @@ struct RtreeMatchArg { ** 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 +#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 /* @@ -198593,15 +196381,15 @@ struct RtreeMatchArg { ** the SQLITE_DISABLE_INTRINSIC define. */ #if !defined(SQLITE_DISABLE_INTRINSIC) -# if defined(_MSC_VER) && _MSC_VER>=1400 -# if !defined(_WIN32_WCE) +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#if !defined(_WIN32_WCE) /* # include */ -# pragma intrinsic(_byteswap_ulong) -# pragma intrinsic(_byteswap_uint64) -# else +#pragma intrinsic(_byteswap_ulong) +#pragma intrinsic(_byteswap_uint64) +#else /* # include */ -# endif -# endif +#endif +#endif #endif /* @@ -198614,25 +196402,22 @@ struct RtreeMatchArg { ** 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 +#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" */ +#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 +#define MSVC_VERSION _MSC_VER #else -# define MSVC_VERSION 0 +#define MSVC_VERSION 0 #endif #endif @@ -198640,50 +196425,37 @@ struct RtreeMatchArg { ** 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 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 +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 +#elif SQLITE_BYTEORDER == 1234 && GCC_VERSION >= 4003000 pCoord->u = __builtin_bswap32(*(u32*)p); -#elif SQLITE_BYTEORDER==4321 +#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) - ); + 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 +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 +#elif SQLITE_BYTEORDER == 1234 && GCC_VERSION >= 4003000 u64 x; memcpy(&x, p, 8); return (i64)__builtin_bswap64(x); -#elif SQLITE_BYTEORDER==4321 +#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) - ); + 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 } @@ -198692,51 +196464,51 @@ static i64 readInt64(u8 *p){ ** 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 void writeInt16(u8* p, int i) { + p[0] = (i >> 8) & 0xFF; + p[1] = (i >> 0) & 0xFF; } -static int writeCoord(u8 *p, RtreeCoord *pCoord){ +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 + 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 +#elif SQLITE_BYTEORDER == 1234 && MSVC_VERSION >= 1300 i = _byteswap_ulong(pCoord->u); memcpy(p, &i, 4); -#elif SQLITE_BYTEORDER==4321 +#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; + 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 +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 +#elif SQLITE_BYTEORDER == 1234 && MSVC_VERSION >= 1300 i = (i64)_byteswap_uint64((u64)i); memcpy(p, &i, 8); -#elif SQLITE_BYTEORDER==4321 +#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; + 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; } @@ -198744,9 +196516,9 @@ static int writeInt64(u8 *p, i64 i){ /* ** Increment the reference count of node p. */ -static void nodeReference(RtreeNode *p){ - if( p ){ - assert( p->nRef>0 ); +static void nodeReference(RtreeNode* p) { + if (p) { + assert(p->nRef > 0); p->nRef++; } } @@ -198754,8 +196526,8 @@ static void nodeReference(RtreeNode *p){ /* ** 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); +static void nodeZero(Rtree* pRtree, RtreeNode* p) { + memset(&p->zData[2], 0, pRtree->iNodeSize - 2); p->isDirty = 1; } @@ -198763,7 +196535,7 @@ static void nodeZero(Rtree *pRtree, RtreeNode *p){ ** Given a node number iNode, return the corresponding key to use ** in the Rtree.aHash table. */ -static unsigned int nodeHash(i64 iNode){ +static unsigned int nodeHash(i64 iNode) { return ((unsigned)iNode) % HASHSIZE; } @@ -198771,18 +196543,19 @@ static unsigned int nodeHash(i64 iNode){ ** 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); +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){ +static void nodeHashInsert(Rtree* pRtree, RtreeNode* pNode) { int iHash; - assert( pNode->pNext==0 ); + assert(pNode->pNext == 0); iHash = nodeHash(pNode->iNode); pNode->pNext = pRtree->aHash[iHash]; pRtree->aHash[iHash] = pNode; @@ -198791,11 +196564,13 @@ static void nodeHashInsert(Rtree *pRtree, RtreeNode *pNode){ /* ** Remove node pNode from the node hash table. */ -static void nodeHashDelete(Rtree *pRtree, RtreeNode *pNode){ - RtreeNode **pp; - if( pNode->iNode!=0 ){ +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); } + for (; (*pp) != pNode; pp = &(*pp)->pNext) { + assert(*pp); + } *pp = pNode->pNext; pNode->pNext = 0; } @@ -198807,12 +196582,12 @@ static void nodeHashDelete(Rtree *pRtree, RtreeNode *pNode){ ** 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 ){ +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->zData = (u8*)&pNode[1]; pNode->nRef = 1; pRtree->nNodeRef++; pNode->pParent = pParent; @@ -198825,9 +196600,9 @@ static RtreeNode *nodeNew(Rtree *pRtree, RtreeNode *pParent){ /* ** Clear the Rtree.pNodeBlob object */ -static void nodeBlobReset(Rtree *pRtree){ - if( pRtree->pNodeBlob && pRtree->inWrTrans==0 && pRtree->nCursor==0 ){ - sqlite3_blob *pBlob = pRtree->pNodeBlob; +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); } @@ -198836,20 +196611,19 @@ static void nodeBlobReset(Rtree *pRtree){ /* ** 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 */ -){ +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; + 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 ){ + if ((pNode = nodeHashLookup(pRtree, iNode)) != 0) { + if (pParent && pParent != pNode->pParent) { RTREE_IS_CORRUPT(pRtree); return SQLITE_CORRUPT_VTAB; } @@ -198858,46 +196632,46 @@ static int nodeAcquire( return SQLITE_OK; } - if( pRtree->pNodeBlob ){ - sqlite3_blob *pBlob = pRtree->pNodeBlob; + if (pRtree->pNodeBlob) { + sqlite3_blob* pBlob = pRtree->pNodeBlob; pRtree->pNodeBlob = 0; rc = sqlite3_blob_reopen(pBlob, iNode); pRtree->pNodeBlob = pBlob; - if( rc ){ + if (rc) { nodeBlobReset(pRtree); - if( rc==SQLITE_NOMEM ) return SQLITE_NOMEM; + 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); + 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 ){ + 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 ){ + 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 ){ + } else if (pRtree->iNodeSize == sqlite3_blob_bytes(pRtree->pNodeBlob)) { + pNode = (RtreeNode*)sqlite3_malloc64(sizeof(RtreeNode) + pRtree->iNodeSize); + if (!pNode) { rc = SQLITE_NOMEM; - }else{ + } else { pNode->pParent = pParent; - pNode->zData = (u8 *)&pNode[1]; + 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); + rc = sqlite3_blob_read(pRtree->pNodeBlob, pNode->zData, pRtree->iNodeSize, 0); } } @@ -198907,9 +196681,9 @@ static int nodeAcquire( ** 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 ){ + if (rc == SQLITE_OK && pNode && iNode == 1) { pRtree->iDepth = readInt16(pNode->zData); - if( pRtree->iDepth>RTREE_MAX_DEPTH ){ + if (pRtree->iDepth > RTREE_MAX_DEPTH) { rc = SQLITE_CORRUPT_VTAB; RTREE_IS_CORRUPT(pRtree); } @@ -198919,24 +196693,24 @@ static int nodeAcquire( ** 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) ){ + 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 ){ + if (rc == SQLITE_OK) { + if (pNode != 0) { nodeReference(pParent); nodeHashInsert(pRtree, pNode); - }else{ + } else { rc = SQLITE_CORRUPT_VTAB; RTREE_IS_CORRUPT(pRtree); } *ppNode = pNode; - }else{ - if( pNode ){ + } else { + if (pNode) { pRtree->nNodeRef--; sqlite3_free(pNode); } @@ -198949,16 +196723,15 @@ static int nodeAcquire( /* ** 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 */ -){ +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]; + u8* p = &pNode->zData[4 + pRtree->nBytesPerCell * iCell]; p += writeInt64(p, pCell->iRowid); - for(ii=0; iinDim2; ii++){ + for (ii = 0; ii < pRtree->nDim2; ii++) { p += writeCoord(p, &pCell->aCoord[ii]); } pNode->isDirty = 1; @@ -198967,12 +196740,12 @@ static void nodeOverwriteCell( /* ** 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]; +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); + writeInt16(&pNode->zData[2], NCELL(pNode) - 1); pNode->isDirty = 1; } @@ -198982,37 +196755,36 @@ static void nodeDeleteCell(Rtree *pRtree, RtreeNode *pNode, int iCell){ ** ** 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 */ +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; + nMaxCell = (pRtree->iNodeSize - 4) / pRtree->nBytesPerCell; nCell = NCELL(pNode); - assert( nCell<=nMaxCell ); - if( nCellzData[2], nCell+1); + writeInt16(&pNode->zData[2], nCell + 1); pNode->isDirty = 1; } - return (nCell==nMaxCell); + return (nCell == nMaxCell); } /* ** If the node is dirty, write it out to the database. */ -static int nodeWrite(Rtree *pRtree, RtreeNode *pNode){ +static int nodeWrite(Rtree* pRtree, RtreeNode* pNode) { int rc = SQLITE_OK; - if( pNode->isDirty ){ - sqlite3_stmt *p = pRtree->pWriteNode; - if( pNode->iNode ){ + if (pNode->isDirty) { + sqlite3_stmt* p = pRtree->pWriteNode; + if (pNode->iNode) { sqlite3_bind_int64(p, 1, pNode->iNode); - }else{ + } else { sqlite3_bind_null(p, 1); } sqlite3_bind_blob(p, 2, pNode->zData, pRtree->iNodeSize, SQLITE_STATIC); @@ -199020,7 +196792,7 @@ static int nodeWrite(Rtree *pRtree, RtreeNode *pNode){ pNode->isDirty = 0; rc = sqlite3_reset(p); sqlite3_bind_null(p, 2); - if( pNode->iNode==0 && rc==SQLITE_OK ){ + if (pNode->iNode == 0 && rc == SQLITE_OK) { pNode->iNode = sqlite3_last_insert_rowid(pRtree->db); nodeHashInsert(pRtree, pNode); } @@ -199032,21 +196804,21 @@ static int nodeWrite(Rtree *pRtree, RtreeNode *pNode){ ** 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){ +static int nodeRelease(Rtree* pRtree, RtreeNode* pNode) { int rc = SQLITE_OK; - if( pNode ){ - assert( pNode->nRef>0 ); - assert( pRtree->nNodeRef>0 ); + if (pNode) { + assert(pNode->nRef > 0); + assert(pRtree->nNodeRef > 0); pNode->nRef--; - if( pNode->nRef==0 ){ + if (pNode->nRef == 0) { pRtree->nNodeRef--; - if( pNode->iNode==1 ){ + if (pNode->iNode == 1) { pRtree->iDepth = -1; } - if( pNode->pParent ){ + if (pNode->pParent) { rc = nodeRelease(pRtree, pNode->pParent); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = nodeWrite(pRtree, pNode); } nodeHashDelete(pRtree, pNode); @@ -199061,90 +196833,72 @@ static int nodeRelease(Rtree *pRtree, RtreeNode *pNode){ ** 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]); +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(iCell < NCELL(pNode)); + return readInt64(&pNode->zData[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); +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; +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); + pData = pNode->zData + (12 + pRtree->nBytesPerCell * iCell); pCoord = pCell->aCoord; - do{ + do { readCoord(pData, &pCoord[ii]); - readCoord(pData+4, &pCoord[ii+1]); + readCoord(pData + 4, &pCoord[ii + 1]); pData += 8; ii += 2; - }while( iinDim2 ); + } while (ii < pRtree->nDim2); } - /* 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 -); +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 -){ +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 -){ +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){ +static void rtreeReference(Rtree* pRtree) { pRtree->nBusy++; } @@ -199152,13 +196906,13 @@ static void rtreeReference(Rtree *pRtree){ ** Decrement the r-tree reference count. When the reference count reaches ** zero the structure is deleted. */ -static void rtreeRelease(Rtree *pRtree){ +static void rtreeRelease(Rtree* pRtree) { pRtree->nBusy--; - if( pRtree->nBusy==0 ){ + if (pRtree->nBusy == 0) { pRtree->inWrTrans = 0; - assert( pRtree->nCursor==0 ); + assert(pRtree->nCursor == 0); nodeBlobReset(pRtree); - assert( pRtree->nNodeRef==0 || pRtree->bCorrupt ); + assert(pRtree->nNodeRef == 0 || pRtree->bCorrupt); sqlite3_finalize(pRtree->pWriteNode); sqlite3_finalize(pRtree->pDeleteNode); sqlite3_finalize(pRtree->pReadRowid); @@ -199176,33 +196930,29 @@ static void rtreeRelease(Rtree *pRtree){ /* ** Rtree virtual table module xDisconnect method. */ -static int rtreeDisconnect(sqlite3_vtab *pVtab){ - rtreeRelease((Rtree *)pVtab); +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; +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 ){ + 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{ + } else { nodeBlobReset(pRtree); rc = sqlite3_exec(pRtree->db, zCreate, 0, 0, 0); sqlite3_free(zCreate); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rtreeRelease(pRtree); } @@ -199212,59 +196962,59 @@ static int rtreeDestroy(sqlite3_vtab *pVtab){ /* ** Rtree virtual table module xOpen method. */ -static int rtreeOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ +static int rtreeOpen(sqlite3_vtab* pVTab, sqlite3_vtab_cursor** ppCursor) { int rc = SQLITE_NOMEM; - Rtree *pRtree = (Rtree *)pVTab; - RtreeCursor *pCsr; + Rtree* pRtree = (Rtree*)pVTab; + RtreeCursor* pCsr; - pCsr = (RtreeCursor *)sqlite3_malloc64(sizeof(RtreeCursor)); - if( 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; + *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); +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_stmt* pStmt; + if (pCsr->aConstraint) { + int i; /* Used to iterate through constraint array */ + for (i = 0; i < pCsr->nConstraint; 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]); + for (ii = 0; ii < RTREE_CACHE_SZ; ii++) + nodeRelease(pRtree, pCsr->aNode[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 ); +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); @@ -199279,8 +197029,8 @@ static int rtreeClose(sqlite3_vtab_cursor *cur){ ** 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; +static int rtreeEof(sqlite3_vtab_cursor* cur) { + RtreeCursor* pCsr = (RtreeCursor*)cur; return pCsr->atEOF; } @@ -199295,110 +197045,143 @@ static int rtreeEof(sqlite3_vtab_cursor *cur){ ** 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; \ -} +#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; \ -} +#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 */ +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 */ + 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 ); + 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 ){ + 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 + 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 ){ + 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; + rc = pConstraint->u.xGeom((sqlite3_rtree_geometry*)pInfo, nCoord, aCoord, &eWithin); + if (eWithin == 0) + *peWithin = NOT_WITHIN; *prScore = RTREE_ZERO; - }else{ + } 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 || *prScoreeWithin < *peWithin) + *peWithin = pInfo->eWithin; + if (pInfo->rScore < *prScore || *prScore < RTREE_ZERO) { *prScore = pInfo->rScore; } } @@ -199410,48 +197193,51 @@ static int rtreeCallbackConstraint( ** 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 */ +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); + 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 */ + 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 ){ + 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; + 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; + 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; + if (p->u.rValue <= val) + return; break; } *peWithin = NOT_WITHIN; @@ -199467,28 +197253,43 @@ static void rtreeNonleafConstraint( ** 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 */ +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 */ + 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; + 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; } @@ -199497,17 +197298,12 @@ static void rtreeLeafConstraint( ** 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 -){ +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) ){ +static int nodeParentIndex(Rtree* pRtree, RtreeNode* pNode, int* piIndex) { + RtreeNode* pParent = pNode->pParent; + if (ALWAYS(pParent)) { return nodeRowidIndex(pRtree, pParent, pNode->iNode, piIndex); - }else{ + } else { *piIndex = -1; return SQLITE_OK; } @@ -199540,32 +197336,34 @@ static int nodeParentIndex(Rtree *pRtree, RtreeNode *pNode, int *piIndex){ ** 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; +static int rtreeSearchPointCompare(const RtreeSearchPoint* pA, const RtreeSearchPoint* pB) { + if (pA->rScore < pB->rScore) + return -1; + if (pA->rScore > pB->rScore) + return +1; + if (pA->iLevel < pB->iLevel) + 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){ +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 ){ + i++; + j++; + if (i < RTREE_CACHE_SZ) { + if (j >= RTREE_CACHE_SZ) { nodeRelease(RTREE_OF_CURSOR(p), p->aNode[i]); p->aNode[i] = 0; - }else{ - RtreeNode *pTemp = p->aNode[i]; + } else { + RtreeNode* pTemp = p->aNode[i]; p->aNode[i] = p->aNode[j]; p->aNode[j] = pTemp; } @@ -199575,20 +197373,20 @@ static void rtreeSearchPointSwap(RtreeCursor *p, int i, int j){ /* ** Return the search point with the lowest current score. */ -static RtreeSearchPoint *rtreeSearchPointFirst(RtreeCursor *pCur){ +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){ +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 ); + 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]); } @@ -199598,17 +197396,17 @@ static RtreeNode *rtreeNodeOfFirstSearchPoint(RtreeCursor *pCur, int *pRC){ /* ** 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 */ -){ +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; + 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; } @@ -199616,12 +197414,13 @@ static RtreeSearchPoint *rtreeEnqueue( pNew = pCur->aPoint + i; pNew->rScore = rScore; pNew->iLevel = iLevel; - assert( iLevel<=RTREE_MAX_DEPTH ); - while( i>0 ){ - RtreeSearchPoint *pParent; - j = (i-1)/2; + assert(iLevel <= RTREE_MAX_DEPTH); + while (i > 0) { + RtreeSearchPoint* pParent; + j = (i - 1) / 2; pParent = pCur->aPoint + j; - if( rtreeSearchPointCompare(pNew, pParent)>=0 ) break; + if (rtreeSearchPointCompare(pNew, pParent) >= 0) + break; rtreeSearchPointSwap(pCur, j, i); i = j; pNew = pParent; @@ -199633,28 +197432,25 @@ static RtreeSearchPoint *rtreeEnqueue( ** 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 */ -){ +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 ){ + 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; + if (pNew == 0) + return 0; ii = (int)(pNew - pCur->aPoint) + 1; - assert( ii==1 ); - if( ALWAYS(iiaNode[ii]==0 ); + assert(ii == 1); + if (ALWAYS(ii < RTREE_CACHE_SZ)) { + assert(pCur->aNode[ii] == 0); pCur->aNode[ii] = pCur->aNode[0]; - }else{ + } else { nodeRelease(RTREE_OF_CURSOR(pCur), pCur->aNode[0]); } pCur->aNode[0] = 0; @@ -199664,7 +197460,7 @@ static RtreeSearchPoint *rtreeSearchPointNew( pCur->sPoint.iLevel = iLevel; pCur->bPoint = 1; return &pCur->sPoint; - }else{ + } else { return rtreeEnqueue(pCur, rScore, iLevel); } } @@ -199694,47 +197490,47 @@ static void traceQueue(RtreeCursor *pCur, const char *zPrefix){ tracePoint(&pCur->aPoint[ii], ii, pCur); } } -# define RTREE_QUEUE_TRACE(A,B) traceQueue(A,B) +#define RTREE_QUEUE_TRACE(A, B) traceQueue(A, B) #else -# define RTREE_QUEUE_TRACE(A,B) /* no-op */ +#define RTREE_QUEUE_TRACE(A, B) /* no-op */ #endif /* Remove the search point with the lowest current score. -*/ -static void rtreeSearchPointPop(RtreeCursor *p){ + */ +static void rtreeSearchPointPop(RtreeCursor* p) { int i, j, k, n; i = 1 - p->bPoint; - assert( i==0 || i==1 ); - if( p->aNode[i] ){ + assert(i == 0 || i == 1); + if (p->aNode[i]) { nodeRelease(RTREE_OF_CURSOR(p), p->aNode[i]); p->aNode[i] = 0; } - if( p->bPoint ){ + if (p->bPoint) { p->anQueue[p->sPoint.iLevel]--; p->bPoint = 0; - }else if( ALWAYS(p->nPoint) ){ + } 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; + if (n < RTREE_CACHE_SZ - 1) { + p->aNode[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 ){ + while ((j = i * 2 + 1) < n) { + k = j + 1; + if (k < n && rtreeSearchPointCompare(&p->aPoint[k], &p->aPoint[j]) < 0) { + if (rtreeSearchPointCompare(&p->aPoint[k], &p->aPoint[i]) < 0) { rtreeSearchPointSwap(p, i, k); i = k; - }else{ + } else { break; } - }else{ - if( rtreeSearchPointCompare(&p->aPoint[j], &p->aPoint[i])<0 ){ + } else { + if (rtreeSearchPointCompare(&p->aPoint[j], &p->aPoint[i]) < 0) { rtreeSearchPointSwap(p, i, j); i = j; - }else{ + } else { break; } } @@ -199742,17 +197538,16 @@ static void rtreeSearchPointPop(RtreeCursor *p){ } } - /* ** 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; +static int rtreeStepToLeaf(RtreeCursor* pCur) { + RtreeSearchPoint* p; + Rtree* pRtree = RTREE_OF_CURSOR(pCur); + RtreeNode* pNode; int eWithin; int rc = SQLITE_OK; int nCell; @@ -199761,82 +197556,86 @@ static int rtreeStepToLeaf(RtreeCursor *pCur){ int eInt; RtreeSearchPoint x; - eInt = pRtree->eCoordType==RTREE_COORD_INT32; - while( (p = rtreeSearchPointFirst(pCur))!=0 && p->iLevel>0 ){ - u8 *pCellData; + eInt = pRtree->eCoordType == RTREE_COORD_INT32; + while ((p = rtreeSearchPointFirst(pCur)) != 0 && p->iLevel > 0) { + u8* pCellData; pNode = rtreeNodeOfFirstSearchPoint(pCur, &rc); - if( rc ) return rc; + if (rc) + return rc; nCell = NCELL(pNode); - assert( nCell<200 ); - pCellData = pNode->zData + (4+pRtree->nBytesPerCell*p->iCell); - while( p->iCellzData + (4 + pRtree->nBytesPerCell * p->iCell); + while (p->iCell < nCell) { sqlite3_rtree_dbl rScore = (sqlite3_rtree_dbl)-1; eWithin = FULLY_WITHIN; - for(ii=0; iiaConstraint + ii; - if( pConstraint->op>=RTREE_MATCH ){ - rc = rtreeCallbackConstraint(pConstraint, eInt, pCellData, p, - &rScore, &eWithin); - if( rc ) return rc; - }else if( p->iLevel==1 ){ + for (ii = 0; ii < nConstraint; ii++) { + RtreeConstraint* pConstraint = pCur->aConstraint + 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{ + } else { rtreeNonleafConstraint(pConstraint, eInt, pCellData, &eWithin); } - if( eWithin==NOT_WITHIN ){ + if (eWithin == NOT_WITHIN) { p->iCell++; pCellData += pRtree->nBytesPerCell; break; } } - if( eWithin==NOT_WITHIN ) continue; + if (eWithin == NOT_WITHIN) + continue; p->iCell++; x.iLevel = p->iLevel - 1; - if( x.iLevel ){ + if (x.iLevel) { x.id = readInt64(pCellData); - for(ii=0; iinPoint; ii++){ - if( pCur->aPoint[ii].id==x.id ){ + for (ii = 0; ii < pCur->nPoint; ii++) { + if (pCur->aPoint[ii].id == x.id) { RTREE_IS_CORRUPT(pRtree); return SQLITE_CORRUPT_VTAB; } } x.iCell = 0; - }else{ + } else { x.id = p->id; x.iCell = p->iCell - 1; } - if( p->iCell>=nCell ){ + 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 ){ + if (p->iCell >= nCell) { RTREE_QUEUE_TRACE(pCur, "POP-Se:"); rtreeSearchPointPop(pCur); } } - pCur->atEOF = p==0; + pCur->atEOF = p == 0; return SQLITE_OK; } /* ** Rtree virtual table module xNext method. */ -static int rtreeNext(sqlite3_vtab_cursor *pVtabCursor){ - RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor; +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 ){ + if (pCsr->bAuxValid) { pCsr->bAuxValid = 0; sqlite3_reset(pCsr->pReadAux); } @@ -199848,12 +197647,12 @@ static int rtreeNext(sqlite3_vtab_cursor *pVtabCursor){ /* ** Rtree virtual table module xRowid method. */ -static int rtreeRowid(sqlite3_vtab_cursor *pVtabCursor, sqlite_int64 *pRowid){ - RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor; - RtreeSearchPoint *p = rtreeSearchPointFirst(pCsr); +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) ){ + RtreeNode* pNode = rtreeNodeOfFirstSearchPoint(pCsr, &rc); + if (rc == SQLITE_OK && ALWAYS(p)) { *pRowid = nodeGetRowid(RTREE_OF_CURSOR(pCsr), pNode, p->iCell); } return rc; @@ -199862,49 +197661,50 @@ static int rtreeRowid(sqlite3_vtab_cursor *pVtabCursor, sqlite_int64 *pRowid){ /* ** 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); +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); + RtreeNode* pNode = rtreeNodeOfFirstSearchPoint(pCsr, &rc); - if( rc ) return rc; - if( NEVER(p==0) ) return SQLITE_OK; - if( i==0 ){ + 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); + } else if (i <= pRtree->nDim2) { + nodeGetCoord(pRtree, pNode, p->iCell, i - 1, &c); #ifndef SQLITE_RTREE_INT_ONLY - if( pRtree->eCoordType==RTREE_COORD_REAL32 ){ + if (pRtree->eCoordType == RTREE_COORD_REAL32) { sqlite3_result_double(ctx, c.f); - }else + } else #endif { - assert( pRtree->eCoordType==RTREE_COORD_INT32 ); + 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)); + } 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 ){ + if (rc == SQLITE_ROW) { pCsr->bAuxValid = 1; - }else{ + } else { sqlite3_reset(pCsr->pReadAux); - if( rc==SQLITE_DONE ) rc = SQLITE_OK; + if (rc == SQLITE_DONE) + rc = SQLITE_OK; return rc; } } - sqlite3_result_value(ctx, - sqlite3_column_value(pCsr->pReadAux, i - pRtree->nDim2 + 1)); + sqlite3_result_value(ctx, sqlite3_column_value(pCsr->pReadAux, i - pRtree->nDim2 + 1)); } return SQLITE_OK; } @@ -199916,21 +197716,21 @@ static int rtreeColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ ** *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 */ -){ +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 ){ + if (sqlite3_step(pRtree->pReadRowid) == SQLITE_ROW) { i64 iNode = sqlite3_column_int64(pRtree->pReadRowid, 0); - if( piNode ) *piNode = iNode; + if (piNode) + *piNode = iNode; rc = nodeAcquire(pRtree, iNode, 0, ppLeaf); sqlite3_reset(pRtree->pReadRowid); - }else{ + } else { rc = sqlite3_reset(pRtree->pReadRowid); } return rc; @@ -199942,15 +197742,16 @@ static int findLeafNode( ** 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 */ +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; + 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); @@ -199959,9 +197760,9 @@ static int deserializeGeometry(sqlite3_value *pValue, RtreeConstraint *pCons){ pInfo->aParam = pBlob->aParam; pInfo->apSqlParam = pBlob->apSqlParam; - if( pBlob->cb.xGeom ){ + if (pBlob->cb.xGeom) { pCons->u.xGeom = pBlob->cb.xGeom; - }else{ + } else { pCons->op = RTREE_QUERY; pCons->u.xQueryFunc = pBlob->cb.xQueryFunc; } @@ -199972,14 +197773,10 @@ static int deserializeGeometry(sqlite3_value *pValue, RtreeConstraint *pCons){ /* ** 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; +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; @@ -199990,95 +197787,92 @@ static int rtreeFilter( resetCursor(pCsr); pCsr->iStrategy = idxNum; - if( idxNum==1 ){ + if (idxNum == 1) { /* Special case - lookup by rowid. */ - RtreeNode *pLeaf; /* Leaf on which the required cell resides */ - RtreeSearchPoint *p; /* Search point for the leaf */ + 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) - ){ + if (eType == SQLITE_INTEGER || (eType == SQLITE_FLOAT && sqlite3_value_double(argv[0]) == iRowid)) { rc = findLeafNode(pRtree, iRowid, &pLeaf, &iNode); - }else{ + } else { rc = SQLITE_OK; pLeaf = 0; } - if( rc==SQLITE_OK && pLeaf!=0 ){ + if (rc == SQLITE_OK && pLeaf != 0) { p = rtreeSearchPointNew(pCsr, RTREE_ZERO, 0); - assert( p!=0 ); /* Always returns pCsr->sPoint */ + 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{ + } else { pCsr->atEOF = 1; } - }else{ + } 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); + if (rc == SQLITE_OK && argc > 0) { + pCsr->aConstraint = sqlite3_malloc64(sizeof(RtreeConstraint) * argc); pCsr->nConstraint = argc; - if( !pCsr->aConstraint ){ + 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]; + } 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; ii < argc; ii++) { + RtreeConstraint* p = &pCsr->aConstraint[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 ){ + 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 ){ + 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 ){ + } 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{ + } else { p->u.rValue = RTREE_ZERO; - if( eType==SQLITE_NULL ){ + if (eType == SQLITE_NULL) { p->op = RTREE_FALSE; - }else if( p->op==RTREE_LT || p->op==RTREE_LE ){ + } else if (p->op == RTREE_LT || p->op == RTREE_LE) { p->op = RTREE_TRUE; - }else{ + } 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 */ + 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 ); + assert(pCsr->bPoint == 1); pCsr->aNode[0] = pRoot; pRoot = 0; RTREE_QUEUE_TRACE(pCsr, "PUSH-Fm:"); @@ -200125,37 +197919,35 @@ static int rtreeFilter( ** 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; +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 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]; + 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 ){ + for (ii = 0; ii < pIdxInfo->nConstraint; 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]; + assert(pIdxInfo->idxStr == 0); + for (ii = 0; ii < pIdxInfo->nConstraint && 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 - ){ + 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; } @@ -200175,24 +197967,35 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ return SQLITE_OK; } - if( p->usable - && ((p->iColumn>0 && p->iColumn<=pRtree->nDim2) - || p->op==SQLITE_INDEX_CONSTRAINT_MATCH) - ){ + 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 ){ + 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].argvIndex = (iIdx / 2); pIdxInfo->aConstraintUsage[ii].omit = 1; } } @@ -200200,11 +198003,11 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ pIdxInfo->idxNum = 2; pIdxInfo->needToFreeIdxStr = 1; - if( iIdx>0 && 0==(pIdxInfo->idxStr = sqlite3_mprintf("%s", zIdxStr)) ){ + if (iIdx > 0 && 0 == (pIdxInfo->idxStr = sqlite3_mprintf("%s", zIdxStr))) { return SQLITE_NOMEM; } - nRow = pRtree->nRowEst >> (iIdx/2); + nRow = pRtree->nRowEst >> (iIdx / 2); pIdxInfo->estimatedCost = (double)6.0 * (double)nRow; pIdxInfo->estimatedRows = nRow; @@ -200214,27 +198017,37 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ /* ** Return the N-dimensional volumn of the cell stored in *p. */ -static RtreeDValue cellArea(Rtree *pRtree, RtreeCell *p){ +static RtreeDValue cellArea(Rtree* pRtree, RtreeCell* p) { RtreeDValue area = (RtreeDValue)1; - assert( pRtree->nDim>=1 && pRtree->nDim<=5 ); + 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; + 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 + } 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; + 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; @@ -200244,33 +198057,33 @@ static RtreeDValue cellArea(Rtree *pRtree, RtreeCell *p){ ** 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){ +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])); + do { + margin += (DCOORD(p->aCoord[ii + 1]) - DCOORD(p->aCoord[ii])); ii -= 2; - }while( ii>=0 ); + } while (ii >= 0); return margin; } /* ** Store the union of cells p1 and p2 in p1. */ -static void cellUnion(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){ +static void cellUnion(Rtree* pRtree, RtreeCell* p1, RtreeCell* p2) { int ii = 0; - if( pRtree->eCoordType==RTREE_COORD_REAL32 ){ - do{ + 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); + p1->aCoord[ii + 1].f = MAX(p1->aCoord[ii + 1].f, p2->aCoord[ii + 1].f); ii += 2; - }while( iinDim2 ); - }else{ - do{ + } while (ii < pRtree->nDim2); + } 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); + p1->aCoord[ii + 1].i = MAX(p1->aCoord[ii + 1].i, p2->aCoord[ii + 1].i); ii += 2; - }while( iinDim2 ); + } while (ii < pRtree->nDim2); } } @@ -200278,15 +198091,13 @@ static void cellUnion(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){ ** 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){ +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)) - ){ + int isInt = (pRtree->eCoordType == RTREE_COORD_INT32); + for (ii = 0; ii < pRtree->nDim2; ii += 2) { + RtreeCoord* a1 = &p1->aCoord[ii]; + RtreeCoord* a2 = &p2->aCoord[ii]; + if ((!isInt && (a2[0].f < a1[0].f || a2[1].f > a1[1].f)) || (isInt && (a2[0].i < a1[0].i || a2[1].i > a1[1].i))) { return 0; } } @@ -200296,35 +198107,30 @@ static int cellContains(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){ /* ** Return the amount cell p would grow by if it were unioned with pCell. */ -static RtreeDValue cellGrowth(Rtree *pRtree, RtreeCell *p, RtreeCell *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); + return (cellArea(pRtree, &cell) - area); } -static RtreeDValue cellOverlap( - Rtree *pRtree, - RtreeCell *p, - RtreeCell *aCell, - int nCell -){ +static RtreeDValue cellOverlap(Rtree* pRtree, RtreeCell* p, RtreeCell* aCell, int nCell) { int ii; RtreeDValue overlap = RTREE_ZERO; - for(ii=0; iinDim2; jj+=2){ + for (jj = 0; jj < pRtree->nDim2; 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( x2aCoord[jj + 1]), DCOORD(aCell[ii].aCoord[jj + 1])); + if (x2 < x1) { o = (RtreeDValue)0; break; - }else{ - o = o * (x2-x1); + } else { + o = o * (x2 - x1); } } overlap += o; @@ -200332,23 +198138,21 @@ static RtreeDValue cellOverlap( return overlap; } - /* ** This function implements the ChooseLeaf algorithm from Gutman[84]. ** ChooseSubTree in r*tree terminology. */ -static int ChooseLeaf( - Rtree *pRtree, /* Rtree table */ - RtreeCell *pCell, /* Cell to insert into rtree */ - int iHeight, /* Height of sub-tree rooted at pCell */ - RtreeNode **ppLeaf /* OUT: Selected leaf page */ -){ +static int ChooseLeaf(Rtree* pRtree, /* Rtree table */ + RtreeCell* pCell, /* Cell to insert into rtree */ + int iHeight, /* Height of sub-tree rooted at pCell */ + RtreeNode** ppLeaf /* OUT: Selected leaf page */ +) { int rc; int ii; - RtreeNode *pNode = 0; + RtreeNode* pNode = 0; rc = nodeAcquire(pRtree, 1, 0, &pNode); - for(ii=0; rc==SQLITE_OK && ii<(pRtree->iDepth-iHeight); ii++){ + for (ii = 0; rc == SQLITE_OK && ii < (pRtree->iDepth - iHeight); ii++) { int iCell; sqlite3_int64 iBest = 0; @@ -200357,25 +198161,25 @@ static int ChooseLeaf( int nCell = NCELL(pNode); RtreeCell cell; - RtreeNode *pChild = 0; + RtreeNode* pChild = 0; - RtreeCell *aCell = 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; + while (p->pParent) { + RtreeNode* pParent = p->pParent; RtreeCell cell; int iCell; cnt++; - if( NEVER(cnt>100) ){ + if (NEVER(cnt > 100)) { RTREE_IS_CORRUPT(pRtree); return SQLITE_CORRUPT_VTAB; } rc = nodeParentIndex(pRtree, p, &iCell); - if( NEVER(rc!=SQLITE_OK) ){ + if (NEVER(rc != SQLITE_OK)) { RTREE_IS_CORRUPT(pRtree); return SQLITE_CORRUPT_VTAB; } nodeGetCell(pRtree, pParent, iCell, &cell); - if( !cellContains(pRtree, &cell, pCell) ){ + if (!cellContains(pRtree, &cell, pCell)) { cellUnion(pRtree, &cell, pCell); nodeOverwriteCell(pRtree, pParent, &cell, iCell); } @@ -200435,7 +198238,7 @@ static int AdjustTree( /* ** Write mapping (iRowid->iNode) to the _rowid table. */ -static int rowidWrite(Rtree *pRtree, sqlite3_int64 iRowid, sqlite3_int64 iNode){ +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); @@ -200445,15 +198248,14 @@ static int rowidWrite(Rtree *pRtree, sqlite3_int64 iRowid, sqlite3_int64 iNode){ /* ** Write mapping (iNode->iPar) to the _parent table. */ -static int parentWrite(Rtree *pRtree, sqlite3_int64 iNode, sqlite3_int64 iPar){ +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); - +static int rtreeInsertCell(Rtree*, RtreeNode*, RtreeCell*, int); /* ** Arguments aIdx, aDistance and aSpare all point to arrays of size @@ -200472,42 +198274,37 @@ static int rtreeInsertCell(Rtree *, RtreeNode *, RtreeCell *, int); ** 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 ){ +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]; + 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); + memcpy(aSpare, aLeft, sizeof(int) * nLeft); aLeft = aSpare; - while( iLeft1 ){ +static void SortByDimension(Rtree* pRtree, int* aIdx, int nIdx, int iDim, RtreeCell* aCell, 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]; + 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); + memcpy(aSpare, aLeft, sizeof(int) * nLeft); aLeft = aSpare; - while( iLeftnDim+1)*(sizeof(int*)+nCell*sizeof(int)); + sqlite3_int64 nByte = (pRtree->nDim + 1) * (sizeof(int*) + nCell * sizeof(int)); - aaSorted = (int **)sqlite3_malloc64(nByte); - if( !aaSorted ){ + aaSorted = (int**)sqlite3_malloc64(nByte); + if (!aaSorted) { return SQLITE_NOMEM; } - aSpare = &((int *)&aaSorted[pRtree->nDim])[pRtree->nDim*nCell]; + aSpare = &((int*)&aaSorted[pRtree->nDim])[pRtree->nDim * nCell]; memset(aaSorted, 0, nByte); - for(ii=0; iinDim; ii++){ + for (ii = 0; ii < pRtree->nDim; ii++) { int jj; - aaSorted[ii] = &((int *)&aaSorted[pRtree->nDim])[ii*nCell]; - for(jj=0; jjnDim])[ii * nCell]; + for (jj = 0; jj < nCell; jj++) { aaSorted[ii][jj] = jj; } SortByDimension(pRtree, aaSorted[ii], nCell, ii, aCell, aSpare); } - for(ii=0; iinDim; ii++){ + for (ii = 0; ii < pRtree->nDim; 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++ - ){ + for (nLeft = RTREE_MINCELLS(pRtree); nLeft <= (nCell - RTREE_MINCELLS(pRtree)); nLeft++) { RtreeCell left; RtreeCell right; int kk; @@ -200651,11 +198427,11 @@ static int splitNodeStartree( 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 ){ +static int updateMapping(Rtree* pRtree, i64 iRowid, RtreeNode* pNode, int iHeight) { + int (*xSetMapping)(Rtree*, sqlite3_int64, sqlite3_int64); + xSetMapping = ((iHeight == 0) ? rowidWrite : parentWrite); + if (iHeight > 0) { + 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; + if (NEVER(pNode == 0)) + return SQLITE_ERROR; return xSetMapping(pRtree, iRowid, pNode->iNode); } -static int SplitNode( - Rtree *pRtree, - RtreeNode *pNode, - RtreeCell *pCell, - int iHeight -){ +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; + RtreeCell* aCell; + int* aiUsed; - RtreeNode *pLeft = 0; - RtreeNode *pRight = 0; + RtreeNode* pLeft = 0; + RtreeNode* pRight = 0; RtreeCell leftbbox; RtreeCell rightbbox; @@ -200742,33 +198506,33 @@ static int SplitNode( /* 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 ){ + 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 ){ + if (pNode->iNode == 1) { pRight = nodeNew(pRtree, pNode); pLeft = nodeNew(pRtree, pNode); pRtree->iDepth++; pNode->isDirty = 1; writeInt16(pNode->zData, pRtree->iDepth); - }else{ + } else { pLeft = pNode; pRight = nodeNew(pRtree, pLeft->pParent); pLeft->nRef++; } - if( !pLeft || !pRight ){ + if (!pLeft || !pRight) { rc = SQLITE_NOMEM; goto splitnode_out; } @@ -200776,9 +198540,8 @@ static int SplitNode( 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 ){ + rc = splitNodeStartree(pRtree, aCell, nCell, pLeft, pRight, &leftbbox, &rightbbox); + if (rc != SQLITE_OK) { goto splitnode_out; } @@ -200787,64 +198550,62 @@ static int SplitNode( ** 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))) - ){ + 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 ){ + if (pNode->iNode == 1) { + rc = rtreeInsertCell(pRtree, pLeft->pParent, &leftbbox, iHeight + 1); + if (rc != SQLITE_OK) { goto splitnode_out; } - }else{ - RtreeNode *pParent = pLeft->pParent; + } else { + RtreeNode* pParent = pLeft->pParent; int iCell; rc = nodeParentIndex(pRtree, pLeft, &iCell); - if( ALWAYS(rc==SQLITE_OK) ){ + if (ALWAYS(rc == SQLITE_OK)) { nodeOverwriteCell(pRtree, pParent, &leftbbox, iCell); rc = AdjustTree(pRtree, pParent, &leftbbox); - assert( rc==SQLITE_OK ); + assert(rc == SQLITE_OK); } - if( NEVER(rc!=SQLITE_OK) ){ + if (NEVER(rc != SQLITE_OK)) { goto splitnode_out; } } - if( (rc = rtreeInsertCell(pRtree, pRight->pParent, &rightbbox, iHeight+1)) ){ + if ((rc = rtreeInsertCell(pRtree, pRight->pParent, &rightbbox, iHeight + 1))) { goto splitnode_out; } - for(i=0; iiRowid ){ + if (iRowid == pCell->iRowid) { newCellIsRight = 1; } - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { goto splitnode_out; } } - if( pNode->iNode==1 ){ - for(i=0; iiNode == 1) { + for (i = 0; i < NCELL(pLeft); i++) { i64 iRowid = nodeGetRowid(pRtree, pLeft, i); rc = updateMapping(pRtree, iRowid, pLeft, iHeight); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { goto splitnode_out; } } - }else if( newCellIsRight==0 ){ + } else if (newCellIsRight == 0) { rc = updateMapping(pRtree, pCell->iRowid, pLeft, iHeight); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = nodeRelease(pRtree, pRight); pRight = 0; } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = nodeRelease(pRtree, pLeft); pLeft = 0; } @@ -200867,16 +198628,16 @@ static int SplitNode( ** 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){ +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 */ + 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 */ + 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 @@ -200884,14 +198645,16 @@ static int fixLeafParent(Rtree *pRtree, RtreeNode *pLeaf){ ** 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 ){ + 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 ){ + if (rc == SQLITE_OK) + rc = rc2; + if (rc == SQLITE_OK && !pChild->pParent) { RTREE_IS_CORRUPT(pRtree); rc = SQLITE_CORRUPT_VTAB; } @@ -200900,43 +198663,43 @@ static int fixLeafParent(Rtree *pRtree, RtreeNode *pLeaf){ return rc; } -static int deleteCell(Rtree *, RtreeNode *, int, int); +static int deleteCell(Rtree*, RtreeNode*, int, int); -static int removeNode(Rtree *pRtree, RtreeNode *pNode, int iHeight){ +static int removeNode(Rtree* pRtree, RtreeNode* pNode, int iHeight) { int rc; int rc2; - RtreeNode *pParent = 0; + RtreeNode* pParent = 0; int iCell; - assert( pNode->nRef==1 ); + assert(pNode->nRef == 1); /* Remove the entry in the parent cell. */ rc = nodeParentIndex(pRtree, pNode, &iCell); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { pParent = pNode->pParent; pNode->pParent = 0; - rc = deleteCell(pRtree, pParent, iCell, iHeight+1); - testcase( rc!=SQLITE_OK ); + rc = deleteCell(pRtree, pParent, iCell, iHeight + 1); + testcase(rc != SQLITE_OK); } rc2 = nodeRelease(pRtree, pParent); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = rc2; } - if( rc!=SQLITE_OK ){ + 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)) ){ + 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)) ){ + if (SQLITE_OK != (rc = sqlite3_reset(pRtree->pDeleteParent))) { return rc; } @@ -200952,22 +198715,22 @@ static int removeNode(Rtree *pRtree, RtreeNode *pNode, int iHeight){ return SQLITE_OK; } -static int fixBoundingBox(Rtree *pRtree, RtreeNode *pNode){ - RtreeNode *pParent = pNode->pParent; +static int fixBoundingBox(Rtree* pRtree, RtreeNode* pNode) { + RtreeNode* pParent = pNode->pParent; int rc = SQLITE_OK; - if( pParent ){ + if (pParent) { int ii; int nCell = NCELL(pNode); - RtreeCell box; /* Bounding box for 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 ){ + if (rc == SQLITE_OK) { nodeOverwriteCell(pRtree, pParent, &box, ii); rc = fixBoundingBox(pRtree, pParent); } @@ -200979,11 +198742,11 @@ static int fixBoundingBox(Rtree *pRtree, RtreeNode *pNode){ ** 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; +static int deleteCell(Rtree* pRtree, RtreeNode* pNode, int iCell, int iHeight) { + RtreeNode* pParent; int rc; - if( SQLITE_OK!=(rc = fixLeafParent(pRtree, pNode)) ){ + if (SQLITE_OK != (rc = fixLeafParent(pRtree, pNode))) { return rc; } @@ -200998,11 +198761,11 @@ static int deleteCell(Rtree *pRtree, RtreeNode *pNode, int iCell, int iHeight){ ** node. */ pParent = pNode->pParent; - assert( pParent || pNode->iNode==1 ); - if( pParent ){ - if( NCELL(pNode)iNode == 1); + if (pParent) { + if (NCELL(pNode) < RTREE_MINCELLS(pRtree)) { rc = removeNode(pRtree, pNode, iHeight); - }else{ + } else { rc = fixBoundingBox(pRtree, pNode); } } @@ -201010,16 +198773,11 @@ static int deleteCell(Rtree *pRtree, RtreeNode *pNode, int iCell, int iHeight){ return rc; } -static int Reinsert( - Rtree *pRtree, - RtreeNode *pNode, - RtreeCell *pCell, - int iHeight -){ - int *aOrder; - int *aSpare; - RtreeCell *aCell; - RtreeDValue *aDistance; +static int Reinsert(Rtree* pRtree, RtreeNode* pNode, RtreeCell* pCell, int iHeight) { + int* aOrder; + int* aSpare; + RtreeCell* aCell; + RtreeDValue* aDistance; int nCell; RtreeDValue aCenterCoord[RTREE_MAX_DIMENSIONS]; int iDim; @@ -201027,81 +198785,79 @@ static int Reinsert( int rc = SQLITE_OK; int n; - memset(aCenterCoord, 0, sizeof(RtreeDValue)*RTREE_MAX_DIMENSIONS); + memset(aCenterCoord, 0, sizeof(RtreeDValue) * RTREE_MAX_DIMENSIONS); - nCell = NCELL(pNode)+1; - n = (nCell+1)&(~1); + nCell = NCELL(pNode) + 1; + n = (nCell + 1) & (~1); /* Allocate the buffers used by this operation. The allocation is ** relinquished before this function returns. */ - aCell = (RtreeCell *)sqlite3_malloc64(n * ( - sizeof(RtreeCell) + /* aCell array */ - sizeof(int) + /* aOrder array */ - sizeof(int) + /* aSpare array */ - sizeof(RtreeDValue) /* aDistance array */ - )); - if( !aCell ){ + aCell = (RtreeCell*)sqlite3_malloc64(n * (sizeof(RtreeCell) + /* aCell array */ + sizeof(int) + /* aOrder array */ + sizeof(int) + /* aSpare array */ + sizeof(RtreeDValue) /* aDistance array */ + )); + if (!aCell) { return SQLITE_NOMEM; } - aOrder = (int *)&aCell[n]; - aSpare = (int *)&aOrder[n]; - aDistance = (RtreeDValue *)&aSpare[n]; + aOrder = (int*)&aCell[n]; + aSpare = (int*)&aOrder[n]; + aDistance = (RtreeDValue*)&aSpare[n]; - for(ii=0; iinDim; iDim++){ - aCenterCoord[iDim] += DCOORD(aCell[ii].aCoord[iDim*2]); - aCenterCoord[iDim] += DCOORD(aCell[ii].aCoord[iDim*2+1]); + for (iDim = 0; iDim < pRtree->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 (iDim = 0; iDim < pRtree->nDim; 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]); + for (iDim = 0; iDim < pRtree->nDim; 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]]; + 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 ){ + if (p->iRowid == pCell->iRowid) { + if (iHeight == 0) { rc = rowidWrite(pRtree, p->iRowid, pNode->iNode); - }else{ + } else { rc = parentWrite(pRtree, p->iRowid, pNode->iNode); } } } - if( rc==SQLITE_OK ){ + 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]]; + RtreeNode* pInsert; + RtreeCell* p = &aCell[aOrder[ii]]; rc = ChooseLeaf(pRtree, p, iHeight, &pInsert); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { int rc2; rc = rtreeInsertCell(pRtree, pInsert, p, iHeight); rc2 = nodeRelease(pRtree, pInsert); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = rc2; } } @@ -201115,34 +198871,29 @@ static int Reinsert( ** 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 -){ +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 ){ + 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){ + if (nodeInsertCell(pRtree, pNode, pCell)) { + if (iHeight <= pRtree->iReinsertHeight || pNode->iNode == 1) { rc = SplitNode(pRtree, pNode, pCell, iHeight); - }else{ + } else { pRtree->iReinsertHeight = iHeight; rc = Reinsert(pRtree, pNode, pCell, iHeight); } - }else{ + } else { rc = AdjustTree(pRtree, pNode, pCell); - if( ALWAYS(rc==SQLITE_OK) ){ - if( iHeight==0 ){ + if (ALWAYS(rc == SQLITE_OK)) { + if (iHeight == 0) { rc = rowidWrite(pRtree, pCell->iRowid, pNode->iNode); - }else{ + } else { rc = parentWrite(pRtree, pCell->iRowid, pNode->iNode); } } @@ -201150,13 +198901,13 @@ static int rtreeInsertCell( return rc; } -static int reinsertNodeContent(Rtree *pRtree, RtreeNode *pNode){ +static int reinsertNodeContent(Rtree* pRtree, RtreeNode* pNode) { int ii; int rc = SQLITE_OK; int nCell = NCELL(pNode); - for(ii=0; rc==SQLITE_OK && iiiNode, &pInsert); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { int rc2; rc = rtreeInsertCell(pRtree, pInsert, &cell, (int)pNode->iNode); rc2 = nodeRelease(pRtree, pInsert); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = rc2; } } @@ -201179,7 +198930,7 @@ static int reinsertNodeContent(Rtree *pRtree, RtreeNode *pNode){ /* ** Select a currently unused rowid for a new r-tree record. */ -static int rtreeNewRowid(Rtree *pRtree, i64 *piRowid){ +static int rtreeNewRowid(Rtree* pRtree, i64* piRowid) { int rc; sqlite3_bind_null(pRtree->pWriteRowid, 1); sqlite3_bind_null(pRtree->pWriteRowid, 2); @@ -201192,12 +198943,11 @@ static int rtreeNewRowid(Rtree *pRtree, i64 *piRowid){ /* ** 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 */ - +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); @@ -201205,29 +198955,29 @@ static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){ /* Obtain a reference to the leaf node that contains the entry ** about to be deleted. */ - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = findLeafNode(pRtree, iDelete, &pLeaf, 0); } #ifdef CORRUPT_DB - assert( pLeaf!=0 || rc!=SQLITE_OK || 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 ){ + if (rc == SQLITE_OK && pLeaf) { int rc2; rc = nodeRowidIndex(pRtree, pLeaf, iDelete, &iCell); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = deleteCell(pRtree, pLeaf, iCell, 0); } rc2 = nodeRelease(pRtree, pLeaf); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = rc2; } } /* Delete the corresponding entry in the _rowid table. */ - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { sqlite3_bind_int64(pRtree->pDeleteRowid, 1, iDelete); sqlite3_step(pRtree->pDeleteRowid); rc = sqlite3_reset(pRtree->pDeleteRowid); @@ -201241,17 +198991,18 @@ static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){ ** 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 ){ + if (rc == SQLITE_OK && pRtree->iDepth > 0 && NCELL(pRoot) == 1) { int rc2; - RtreeNode *pChild = 0; + 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); + 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 ){ + if (rc == SQLITE_OK) + rc = rc2; + if (rc == SQLITE_OK) { pRtree->iDepth--; writeInt16(pRoot->zData, pRtree->iDepth); pRoot->isDirty = 1; @@ -201259,8 +199010,8 @@ static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){ } /* Re-insert the contents of any underfull nodes removed from the tree. */ - for(pLeaf=pRtree->pDeleted; pLeaf; pLeaf=pRtree->pDeleted){ - if( rc==SQLITE_OK ){ + for (pLeaf = pRtree->pDeleted; pLeaf; pLeaf = pRtree->pDeleted) { + if (rc == SQLITE_OK) { rc = reinsertNodeContent(pRtree, pLeaf); } pRtree->pDeleted = pLeaf->pNext; @@ -201269,9 +199020,9 @@ static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){ } /* Release the reference to the root node. */ - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = nodeRelease(pRtree, pRoot); - }else{ + } else { nodeRelease(pRtree, pRoot); } @@ -201281,27 +199032,27 @@ static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){ /* ** 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 */ +#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){ +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)); + if (f > d) { + f = (float)(d * (d < 0 ? RNDAWAY : RNDTOWARDS)); } return f; } -static RtreeValue rtreeValueUp(sqlite3_value *v){ +static RtreeValue rtreeValueUp(sqlite3_value* v) { double d = sqlite3_value_double(v); float f = (float)d; - if( fzDb, pRtree->zName); - if( zSql ){ + if (zSql) { rc = sqlite3_prepare_v2(pRtree->db, zSql, -1, &pStmt, 0); - }else{ + } 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 - ); + 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); + 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; +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 */ + RtreeCell cell; /* New cell to insert if nData>1 */ + int bHaveRowid = 0; /* Set to 1 after new rowid is determined */ - if( pRtree->nNodeRef ){ + 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); + assert(nData >= 1); - cell.iRowid = 0; /* Used only to suppress a compiler warning */ + 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: @@ -201391,38 +199131,39 @@ static int rtreeUpdate( ** case, SQLITE_CONSTRAINT must be returned regardless of the ** conflict-handling mode specified by the user. */ - if( nData>1 ){ + 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. - */ + 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); + if (pRtree->eCoordType == RTREE_COORD_REAL32) { + for (ii = 0; ii < nn; ii += 2) { + cell.aCoord[ii].f = rtreeValueDown(aData[ii + 3]); + cell.aCoord[ii + 1].f = rtreeValueUp(aData[ii + 4]); + if (cell.aCoord[ii].f > cell.aCoord[ii + 1].f) { + rc = rtreeConstraintError(pRtree, ii + 1); goto constraint; } } - }else + } else #endif { - for(ii=0; iicell.aCoord[ii+1].i ){ - rc = rtreeConstraintError(pRtree, ii+1); + for (ii = 0; ii < nn; ii += 2) { + cell.aCoord[ii].i = sqlite3_value_int(aData[ii + 3]); + cell.aCoord[ii + 1].i = sqlite3_value_int(aData[ii + 4]); + if (cell.aCoord[ii].i > cell.aCoord[ii + 1].i) { + rc = rtreeConstraintError(pRtree, ii + 1); goto constraint; } } @@ -201430,19 +199171,17 @@ static int rtreeUpdate( /* 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 ){ + 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 - ){ + 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 ){ + if (SQLITE_ROW == steprc) { + if (sqlite3_vtab_on_conflict(pRtree->db) == SQLITE_REPLACE) { rc = rtreeDeleteRowid(pRtree, cell.iRowid); - }else{ + } else { rc = rtreeConstraintError(pRtree, 0); goto constraint; } @@ -201456,7 +199195,7 @@ static int rtreeUpdate( ** record to delete from the r-tree table. The following block does ** just that. */ - if( sqlite3_value_type(aData[0])!=SQLITE_NULL ){ + if (sqlite3_value_type(aData[0]) != SQLITE_NULL) { rc = rtreeDeleteRowid(pRtree, sqlite3_value_int64(aData[0])); } @@ -201464,34 +199203,34 @@ static int rtreeUpdate( ** (aData[2]..aData[argc-1]) contain a new record to insert into ** the r-tree structure. */ - if( rc==SQLITE_OK && nData>1 ){ + if (rc == SQLITE_OK && nData > 1) { /* Insert the new record into the r-tree */ - RtreeNode *pLeaf = 0; + RtreeNode* pLeaf = 0; /* Figure out the rowid of the new row. */ - if( bHaveRowid==0 ){ + if (bHaveRowid == 0) { rc = rtreeNewRowid(pRtree, &cell.iRowid); } *pRowid = cell.iRowid; - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = ChooseLeaf(pRtree, &cell, 0, &pLeaf); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { int rc2; pRtree->iReinsertHeight = -1; rc = rtreeInsertCell(pRtree, pLeaf, &cell, 0); rc2 = nodeRelease(pRtree, pLeaf); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = rc2; } } - if( rc==SQLITE_OK && pRtree->nAux ){ - sqlite3_stmt *pUp = pRtree->pWriteAux; + 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]); + for (jj = 0; jj < pRtree->nAux; jj++) { + sqlite3_bind_value(pUp, jj + 2, aData[pRtree->nDim2 + 3 + jj]); } sqlite3_step(pUp); rc = sqlite3_reset(pUp); @@ -201506,9 +199245,9 @@ static int rtreeUpdate( /* ** Called when a transaction starts. */ -static int rtreeBeginTransaction(sqlite3_vtab *pVtab){ - Rtree *pRtree = (Rtree *)pVtab; - assert( pRtree->inWrTrans==0 ); +static int rtreeBeginTransaction(sqlite3_vtab* pVtab) { + Rtree* pRtree = (Rtree*)pVtab; + assert(pRtree->inWrTrans == 0); pRtree->inWrTrans++; return SQLITE_OK; } @@ -201517,8 +199256,8 @@ static int rtreeBeginTransaction(sqlite3_vtab *pVtab){ ** 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; +static int rtreeEndTransaction(sqlite3_vtab* pVtab) { + Rtree* pRtree = (Rtree*)pVtab; pRtree->inWrTrans = 0; nodeBlobReset(pRtree); return SQLITE_OK; @@ -201527,18 +199266,15 @@ static int rtreeEndTransaction(sqlite3_vtab *pVtab){ /* ** The xRename method for rtree module virtual tables. */ -static int rtreeRename(sqlite3_vtab *pVtab, const char *zNewName){ - Rtree *pRtree = (Rtree *)pVtab; +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 ){ + 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); @@ -201560,8 +199296,8 @@ static int rtreeRename(sqlite3_vtab *pVtab, const char *zNewName){ ** DROP TABLE ; -- Would fail with SQLITE_LOCKED ** COMMIT; */ -static int rtreeSavepoint(sqlite3_vtab *pVtab, int iSavepoint){ - Rtree *pRtree = (Rtree *)pVtab; +static int rtreeSavepoint(sqlite3_vtab* pVtab, int iSavepoint) { + Rtree* pRtree = (Rtree*)pVtab; u8 iwt = pRtree->inWrTrans; UNUSED_PARAMETER(iSavepoint); pRtree->inWrTrans = 0; @@ -201575,27 +199311,26 @@ static int rtreeSavepoint(sqlite3_vtab *pVtab, int iSavepoint){ ** 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; +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 ){ + 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; + return rc == SQLITE_ERROR ? SQLITE_OK : rc; } zSql = sqlite3_mprintf(zFmt, pRtree->zDb, pRtree->zName); - if( zSql==0 ){ + if (zSql == 0) { rc = SQLITE_NOMEM; - }else{ + } 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); + if (rc == SQLITE_OK) { + if (sqlite3_step(p) == SQLITE_ROW) + nRow = sqlite3_column_int64(p, 0); rc = sqlite3_finalize(p); } sqlite3_free(zSql); @@ -201604,106 +199339,86 @@ static int rtreeQueryStat1(sqlite3 *db, Rtree *pRtree){ 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" - }; +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); + 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); + sqlite3_str_appendf(p, "CREATE TABLE \"%w\".\"%w_rowid\"(rowid INTEGER PRIMARY KEY,nodeno", zDb, zPrefix); + for (ii = 0; ii < pRtree->nAux; 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 ){ + if (!zCreate) { return SQLITE_NOMEM; } rc = sqlite3_exec(db, zCreate, 0, 0, 0); sqlite3_free(zCreate); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { return rc; } } @@ -201718,52 +199433,51 @@ static int rtreeSqlInit( 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"; + for (i = 0; i < N_STATEMENT && rc == SQLITE_OK; i++) { + char* zSql; + const char* zFormat; + if (i != 3 || pRtree->nAux == 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 ){ + if (zSql) { rc = sqlite3_prepare_v3(db, zSql, -1, f, appStmt[i], 0); - }else{ + } 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 ){ + 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); + } else { + sqlite3_str* p = sqlite3_str_new(db); int ii; - char *zSql; + 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); + for (ii = 0; ii < pRtree->nAux; 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 + if (ii < pRtree->nAuxNotNull) { + 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, "a%d=?%d", ii, ii + 2); } } sqlite3_str_appendf(p, " WHERE rowid=?1"); zSql = sqlite3_str_finish(p); - if( zSql==0 ){ + if (zSql == 0) { rc = SQLITE_NOMEM; - }else{ + } else { rc = sqlite3_prepare_v3(db, zSql, -1, f, &pRtree->pWriteAux, 0); sqlite3_free(zSql); } @@ -201780,13 +199494,13 @@ static int rtreeSqlInit( ** 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){ +static int getIntFromStmt(sqlite3* db, const char* zSql, int* piVal) { int rc = SQLITE_NOMEM; - if( zSql ){ - sqlite3_stmt *pStmt = 0; + 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) ){ + if (rc == SQLITE_OK) { + if (SQLITE_ROW == sqlite3_step(pStmt)) { *piVal = sqlite3_column_int(pStmt, 0); } rc = sqlite3_finalize(pStmt); @@ -201810,39 +199524,34 @@ static int getIntFromStmt(sqlite3 *db, const char *zSql, int *piVal){ ** 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 */ -){ +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 ){ + 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; + if (rc == SQLITE_OK) { + pRtree->iNodeSize = iPageSize - 64; + if ((4 + pRtree->nBytesPerCell * RTREE_MAXCELLS) < pRtree->iNodeSize) { + pRtree->iNodeSize = 4 + pRtree->nBytesPerCell * RTREE_MAXCELLS; } - }else{ + } 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 - ); + } 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 ){ + if (rc != SQLITE_OK) { *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); - }else if( pRtree->iNodeSize<(512-64) ){ + } 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); + *pzErr = sqlite3_mprintf("undersize RTree blobs in \"%q_node\"", pRtree->zName); } } @@ -201853,9 +199562,9 @@ static int getNodeSize( /* ** Return the length of a token */ -static int rtreeTokenLength(const char *z){ +static int rtreeTokenLength(const char* z) { int dummy = 0; - return sqlite3GetToken((const unsigned char*)z,&dummy); + return sqlite3GetToken((const unsigned char*)z, &dummy); } /* @@ -201867,35 +199576,34 @@ static int rtreeTokenLength(const char *z){ ** 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 */ -){ +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] */ + 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; + 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 */ + 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)]); + 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; } @@ -201904,90 +199612,89 @@ static int rtreeInit( /* 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 ){ + pRtree = (Rtree*)sqlite3_malloc64(sizeof(Rtree) + nDb + nName + 2); + if (!pRtree) { return SQLITE_NOMEM; } - memset(pRtree, 0, sizeof(Rtree)+nDb+nName+2); + 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->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 ){ + 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"}; + } else { + static const char* azFormat[] = {",%.*s REAL", ",%.*s INT"}; pRtree->nDim2++; - sqlite3_str_appendf(pSql, azFormat[eCoordType], - rtreeTokenLength(zArg), zArg); + sqlite3_str_appendf(pSql, azFormat[eCoordType], rtreeTokenLength(zArg), zArg); } } sqlite3_str_appendf(pSql, ");"); zSql = sqlite3_str_finish(pSql); - if( !zSql ){ + if (!zSql) { rc = SQLITE_NOMEM; - }else if( iinDim = pRtree->nDim2/2; - if( pRtree->nDim<1 ){ + if (rc) + goto rtreeInit_fail; + pRtree->nDim = pRtree->nDim2 / 2; + if (pRtree->nDim < 1) { iErr = 2; - }else if( pRtree->nDim2>RTREE_MAX_DIMENSIONS*2 ){ + } else if (pRtree->nDim2 > RTREE_MAX_DIMENSIONS * 2) { iErr = 3; - }else if( pRtree->nDim2 % 2 ){ + } else if (pRtree->nDim2 % 2) { iErr = 1; - }else{ + } else { iErr = 0; } - if( iErr ){ + if (iErr) { *pzErr = sqlite3_mprintf("%s", aErrMsg[iErr]); goto rtreeInit_fail; } - pRtree->nBytesPerCell = 8 + pRtree->nDim2*4; + pRtree->nBytesPerCell = 8 + pRtree->nDim2 * 4; /* Figure out the node size to use. */ rc = getNodeSize(db, pRtree, isCreate, pzErr); - if( rc ) goto rtreeInit_fail; + if (rc) + goto rtreeInit_fail; rc = rtreeSqlInit(pRtree, db, argv[1], argv[2], isCreate); - if( rc ){ + if (rc) { *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); goto rtreeInit_fail; } - *ppVtab = (sqlite3_vtab *)pRtree; + *ppVtab = (sqlite3_vtab*)pRtree; return SQLITE_OK; rtreeInit_fail: - if( rc==SQLITE_OK ) rc = SQLITE_ERROR; - assert( *ppVtab==0 ); - assert( pRtree->nBusy==1 ); + 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. @@ -202004,36 +199711,41 @@ static int rtreeInit( ** list, containing the 8-byte rowid/pageno followed by the ** *2 coordinates. */ -static void rtreenode(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){ +static void rtreenode(sqlite3_context* ctx, int nArg, sqlite3_value** apArg) { RtreeNode node; Rtree tree; int ii; int nData; int errCode; - sqlite3_str *pOut; + 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; + 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; + 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); + if (ii > 0) + sqlite3_str_append(pOut, " ", 1); sqlite3_str_appendf(pOut, "{%lld", cell.iRowid); - for(jj=0; jjrc==SQLITE_OK ) pCheck->rc = rc; + if (pCheck->rc == SQLITE_OK) + pCheck->rc = rc; } /* @@ -202112,21 +199824,20 @@ static void rtreeCheckReset(RtreeCheck *pCheck, sqlite3_stmt *pStmt){ ** 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 */ -){ +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; + char* z; + sqlite3_stmt* pRet = 0; va_start(ap, zFmt); z = sqlite3_vmprintf(zFmt, ap); - if( pCheck->rc==SQLITE_OK ){ - if( z==0 ){ + if (pCheck->rc == SQLITE_OK) { + if (z == 0) { pCheck->rc = SQLITE_NOMEM; - }else{ + } else { pCheck->rc = sqlite3_prepare_v2(pCheck->db, z, -1, &pRet, 0); } } @@ -202141,18 +199852,16 @@ static sqlite3_stmt *rtreeCheckPrepare( ** 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, ...){ +static void rtreeCheckAppendMsg(RtreeCheck* pCheck, const char* zFmt, ...) { va_list ap; va_start(ap, zFmt); - if( pCheck->rc==SQLITE_OK && pCheck->nErrrc == SQLITE_OK && pCheck->nErr < RTREE_CHECK_MAX_ERROR) { + char* z = sqlite3_vmprintf(zFmt, ap); + if (z == 0) { pCheck->rc = SQLITE_NOMEM; - }else{ - pCheck->zReport = sqlite3_mprintf("%z%s%z", - pCheck->zReport, (pCheck->zReport ? "\n" : ""), z - ); - if( pCheck->zReport==0 ){ + } else { + pCheck->zReport = sqlite3_mprintf("%z%s%z", pCheck->zReport, (pCheck->zReport ? "\n" : ""), z); + if (pCheck->zReport == 0) { pCheck->rc = SQLITE_NOMEM; } } @@ -202175,31 +199884,28 @@ static void rtreeCheckAppendMsg(RtreeCheck *pCheck, const char *zFmt, ...){ ** 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 */ +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 && pCheck->pGetNode == 0) { + pCheck->pGetNode = rtreeCheckPrepare(pCheck, "SELECT data FROM %Q.'%q_node' WHERE nodeno=?", pCheck->zDb, pCheck->zTab); } - if( pCheck->rc==SQLITE_OK ){ + if (pCheck->rc == SQLITE_OK) { sqlite3_bind_int64(pCheck->pGetNode, 1, iNode); - if( sqlite3_step(pCheck->pGetNode)==SQLITE_ROW ){ + 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); + const u8* pNode = (const u8*)sqlite3_column_blob(pCheck->pGetNode, 0); pRet = sqlite3_malloc64(nNode); - if( pRet==0 ){ + if (pRet == 0) { pCheck->rc = SQLITE_NOMEM; - }else{ + } else { memcpy(pRet, pNode, nNode); *pnNode = nNode; } } rtreeCheckReset(pCheck, pCheck->pGetNode); - if( pCheck->rc==SQLITE_OK && pRet==0 ){ + if (pCheck->rc == SQLITE_OK && pRet == 0) { rtreeCheckAppendMsg(pCheck, "Node %lld missing from database", iNode); } } @@ -202219,41 +199925,32 @@ static u8 *rtreeCheckGetNode(RtreeCheck *pCheck, i64 iNode, int *pnNode){ ** 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 */ -){ +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" - }; + 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 - ); + 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; + 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 ){ + 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 - ); + if (ii != iVal) { + rtreeCheckAppendMsg(pCheck, "Found (%lld -> %lld) in %s table, expected (%lld -> %lld)", iKey, ii, (bLeaf ? "%_rowid" : "%_parent"), + iKey, iVal); } } rtreeCheckReset(pCheck, pStmt); @@ -202271,39 +199968,30 @@ static void rtreeCheckMapping( ** 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 */ -){ +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); + for (i = 0; i < pCheck->nDim; 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 (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 (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 - ); + if ((pCheck->bInt ? c1.i < p1.i : c1.f < p1.f) || (pCheck->bInt ? 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); } } } @@ -202317,52 +200005,45 @@ static void rtreeCheckCellCoord( ** 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; +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 ); + 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 ){ + 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 ){ + 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)]; + 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; i < nCell; i++) { + u8* pCell = &aNode[4 + i * (8 + pCheck->nDim * 2 * 4)]; i64 iVal = readInt64(pCell); rtreeCheckCellCoord(pCheck, iNode, i, &pCell[8], aParent); - if( iDepth>0 ){ + if (iDepth > 0) { rtreeCheckMapping(pCheck, 0, iVal, iNode); - rtreeCheckNode(pCheck, iDepth-1, &pCell[8], iVal); + rtreeCheckNode(pCheck, iDepth - 1, &pCell[8], iVal); pCheck->nNonLeaf++; - }else{ + } else { rtreeCheckMapping(pCheck, 1, iVal, iNode); pCheck->nLeaf++; } @@ -202380,19 +200061,18 @@ static void rtreeCheckNode( ** 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 ){ +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 - ); + if (nActual != nExpect) { + rtreeCheckAppendMsg(pCheck, + "Wrong number of entries in %%%s table" + " - expected %lld, actual %lld", + zTbl, nExpect, nActual); } } pCheck->rc = sqlite3_finalize(pCount); @@ -202404,16 +200084,15 @@ static void rtreeCheckCount(RtreeCheck *pCheck, const char *zTbl, i64 nExpect){ ** 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. */ +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)); @@ -202424,40 +200103,40 @@ static int rtreeCheckTable( /* 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) ){ + 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 ){ + if (check.rc == SQLITE_OK) { pStmt = rtreeCheckPrepare(&check, "SELECT * FROM %Q.'%q_rowid'", zDb, zTab); - if( pStmt ){ + if (pStmt) { nAux = sqlite3_column_count(pStmt) - 2; sqlite3_finalize(pStmt); - }else - if( check.rc!=SQLITE_NOMEM ){ + } 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 ){ + if (pStmt) { int rc; check.nDim = (sqlite3_column_count(pStmt) - 1 - nAux) / 2; - if( check.nDim<1 ){ + 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); + } 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; + if (rc != SQLITE_CORRUPT) + check.rc = rc; } /* Do the actual integrity-check */ - if( check.nDim>=1 ){ - if( check.rc==SQLITE_OK ){ + if (check.nDim >= 1) { + if (check.rc == SQLITE_OK) { rtreeCheckNode(&check, 0, 0, 1); } rtreeCheckCount(&check, "_rowid", check.nLeaf); @@ -202470,9 +200149,10 @@ static int rtreeCheckTable( sqlite3_finalize(check.aCheckMapping[1]); /* If one was opened, close the transaction */ - if( bEnd ){ + if (bEnd) { int rc = sqlite3_exec(db, "END", 0, 0, 0); - if( check.rc==SQLITE_OK ) check.rc = rc; + if (check.rc == SQLITE_OK) + check.rc = rc; } *pzReport = check.zReport; return check.rc; @@ -202511,30 +200191,24 @@ static int rtreeCheckTable( ** 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{ +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 ){ + char* zReport = 0; + const char* zDb = (const char*)sqlite3_value_text(apArg[0]); + const char* zTab; + if (nArg == 1) { zTab = zDb; zDb = "main"; - }else{ + } else { zTab = (const char*)sqlite3_value_text(apArg[1]); } rc = rtreeCheckTable(sqlite3_context_db_handle(ctx), zDb, zTab, &zReport); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { sqlite3_result_text(ctx, zReport ? zReport : "ok", -1, SQLITE_TRANSIENT); - }else{ + } else { sqlite3_result_error_code(ctx, rc); } sqlite3_free(zReport); @@ -202567,49 +200241,41 @@ static void rtreecheck( /* Enable -DGEOPOLY_ENABLE_DEBUG for debugging facilities */ #ifdef GEOPOLY_ENABLE_DEBUG - static int geo_debug = 0; -# define GEODEBUG(X) if(geo_debug)printf X +static int geo_debug = 0; +#define GEODEBUG(X) \ + if (geo_debug) \ + printf X #else -# define GEODEBUG(X) +#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) +/* 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)) +/* 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 */ +#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, + 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 */ @@ -202617,21 +200283,21 @@ static const char geopolyIsSpace[] = { /* Compiler and version */ #ifndef GCC_VERSION #if defined(__GNUC__) && !defined(SQLITE_DISABLE_INTRINSIC) -# define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__) +#define GCC_VERSION (__GNUC__ * 1000000 + __GNUC_MINOR__ * 1000 + __GNUC_PATCHLEVEL__) #else -# define GCC_VERSION 0 +#define GCC_VERSION 0 #endif #endif #ifndef MSVC_VERSION #if defined(_MSC_VER) && !defined(SQLITE_DISABLE_INTRINSIC) -# define MSVC_VERSION _MSC_VER +#define MSVC_VERSION _MSC_VER #else -# define MSVC_VERSION 0 +#define MSVC_VERSION 0 #endif #endif /* Datatype for coordinates -*/ + */ typedef float GeoCoord; /* @@ -202666,30 +200332,29 @@ struct GeoPoly { /* 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)) +#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]) - +#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() */ + 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){ +static void geopolySwab32(unsigned char* a) { unsigned char t = a[0]; a[0] = a[3]; a[3] = t; @@ -202699,58 +200364,67 @@ static void geopolySwab32(unsigned char *a){ } /* Skip whitespace. Return the next non-whitespace character. */ -static char geopolySkipSpace(GeoParse *p){ - while( fast_isspace(p->z[0]) ) p->z++; +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){ +static int geopolyParseNumber(GeoParse* p, GeoCoord* pVal) { char c = geopolySkipSpace(p); - const unsigned char *z = p->z; + const unsigned char* z = p->z; int j = 0; int seenDP = 0; int seenE = 0; - if( c=='-' ){ + if (c == '-') { j = 1; c = z[j]; } - if( c=='0' && z[j+1]>='0' && z[j+1]<='9' ) return 0; - for(;; 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; + 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; + 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=='-' ){ + c = z[j + 1]; + if (c == '+' || c == '-') { j++; - c = z[j+1]; + c = z[j + 1]; } - if( c<'0' || c>'9' ) return 0; + if (c < '0' || c > '9') + return 0; continue; } break; } - if( z[j-1]<'0' ) return 0; - if( pVal ){ + 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; + /* 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); + *pVal = (GeoCoord)atof((const char*)p->z); #endif } p->z += j; @@ -202765,73 +200439,75 @@ static int geopolyParseNumber(GeoParse *p, GeoCoord *pVal){ ** ** If any error occurs, return NULL. */ -static GeoPoly *geopolyParseJson(const unsigned char *z, int *pRc){ +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)=='[' ){ + if (geopolySkipSpace(&s) == '[') { s.z++; - while( geopolySkipSpace(&s)=='[' ){ + 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 ){ + 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) ){ + while (geopolyParseNumber(&s, ii <= 1 ? &s.a[s.nVertex * 2 + ii] : 0)) { ii++; - if( ii==2 ) s.nVertex++; + if (ii == 2) + s.nVertex++; c = geopolySkipSpace(&s); s.z++; - if( c==',' ) continue; - if( c==']' && ii>=2 ) break; + if (c == ',') + continue; + if (c == ']' && ii >= 2) + break; s.nErr++; rc = SQLITE_ERROR; goto parse_json_err; } - if( geopolySkipSpace(&s)==',' ){ + 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; + 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) ); + 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; + if (pOut == 0) + goto parse_json_err; pOut->nVertex = s.nVertex; - memcpy(pOut->a, s.a, s.nVertex*2*sizeof(GeoCoord)); + 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; + 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; + if (pRc) + *pRc = SQLITE_OK; return pOut; - }else{ + } else { s.nErr++; rc = SQLITE_ERROR; } } parse_json_err: - if( pRc ) *pRc = rc; + if (pRc) + *pRc = rc; sqlite3_free(s.a); return 0; } @@ -202842,56 +200518,57 @@ static GeoPoly *geopolyParseJson(const unsigned char *z, int *pRc){ ** 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; +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); + 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); + 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{ + 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 ){ + if (a[0] != *(unsigned char*)&x) { int ii; - for(ii=0; iihdr[0] ^= 1; } } } - if( pRc ) *pRc = SQLITE_OK; + 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; + } 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; + } else { + if (pRc) + *pRc = SQLITE_ERROR; return 0; } } @@ -202903,15 +200580,10 @@ static GeoPoly *geopolyFuncParam( ** 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); +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); } } @@ -202922,21 +200594,17 @@ static void geopolyBlobFunc( ** 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); +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)); + for (i = 0; i < p->nVertex; 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_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); } @@ -202948,28 +200616,25 @@ static void geopolyJsonFunc( ** 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; +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); + if (p) { + sqlite3* db = sqlite3_context_db_handle(context); + sqlite3_str* x = sqlite3_str_new(db); int i; char cSep = '\''; sqlite3_str_appendf(x, "nVertex; i++) { + sqlite3_str_appendf(x, "%c%g,%g", cSep, GeoX(p, i), GeoY(p, i)); cSep = ' '; } - sqlite3_str_appendf(x, " %g,%g'", GeoX(p,0), GeoY(p,0)); - for(i=1; inVertex; 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); + if (p) { + for (ii = 0; ii < p->nVertex; 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); } } @@ -203031,16 +200691,16 @@ static void geopolyXformFunc( ** 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){ +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; + for (ii = 0; ii < p->nVertex - 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) */ + rArea += (GeoX(p, ii) - GeoX(p, 0)) /* (xN - x0) */ + * (GeoY(p, ii) + GeoY(p, 0)) /* (yN + y0) */ * 0.5; return rArea; } @@ -203053,13 +200713,9 @@ static double geopolyArea(GeoPoly *p){ ** 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 ){ +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); } @@ -203078,26 +200734,21 @@ static void geopolyAreaFunc( ** 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 ){ +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; iinVertex - 1; ii < jj; ii++, jj--) { + GeoCoord t = GeoX(p, ii); + GeoX(p, ii) = GeoX(p, jj); + GeoX(p, jj) = t; + t = GeoY(p, ii); + GeoY(p, ii) = GeoY(p, jj); + GeoY(p, jj) = t; } } - sqlite3_result_blob(context, p->hdr, - 4+8*p->nVertex, SQLITE_TRANSIENT); + sqlite3_result_blob(context, p->hdr, 4 + 8 * p->nVertex, SQLITE_TRANSIENT); sqlite3_free(p); } } @@ -203105,19 +200756,19 @@ static void geopolyCcwFunc( #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; + */ +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; + 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; } } @@ -203127,36 +200778,34 @@ static double geopolySine(double r){ ** 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 -){ +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; + 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 ){ + 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); + p->hdr[2] = (n >> 8) & 0xff; + p->hdr[3] = n & 0xff; + for (i = 0; i < n; i++) { + double rAngle = 2.0 * GEOPOLY_PI * i / n; + GeoX(p, i) = x - r * geopolySine(rAngle - 0.5 * GEOPOLY_PI); + GeoY(p, i) = y + r * geopolySine(rAngle); + } + sqlite3_result_blob(context, p->hdr, 4 + 8 * n, SQLITE_TRANSIENT); sqlite3_free(p); } @@ -203170,45 +200819,51 @@ static void geopolyRegularFunc( ** 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; +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 ){ + 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{ + } else { p = geopolyFuncParam(context, pPoly, pRc); } - if( p ){ + 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: + mnX = mxX = GeoX(p, 0); + mnY = mxY = GeoY(p, 0); + for (ii = 1; ii < p->nVertex; ii++) { + double r = GeoX(p, ii); + if (r < mnX) + mnX = (float)r; + else if (r > mxX) + mxX = (float)r; + r = GeoY(p, ii); + if (r < mnY) + mnY = (float)r; + else if (r > mxY) + mxY = (float)r; + } + if (pRc) + *pRc = SQLITE_OK; + if (aCoord == 0) { + geopolyBboxFill: pOut = sqlite3_realloc64(p, GEOPOLY_SZ(4)); - if( pOut==0 ){ + if (pOut == 0) { sqlite3_free(p); - if( context ) sqlite3_result_error_nomem(context); - if( pRc ) *pRc = SQLITE_NOMEM; + if (context) + sqlite3_result_error_nomem(context); + if (pRc) + *pRc = SQLITE_NOMEM; return 0; } pOut->nVertex = 4; @@ -203217,23 +200872,23 @@ static GeoPoly *geopolyBBox( 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{ + 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); + } else if (aCoord) { + memset(aCoord, 0, sizeof(RtreeCoord) * 4); } return pOut; } @@ -203241,15 +200896,10 @@ static GeoPoly *geopolyBBox( /* ** 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); +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); } } @@ -203263,49 +200913,46 @@ struct GeoBBox { RtreeCoord a[4]; }; - /* ** Implementation of the geopoly_group_bbox(X) aggregate SQL function. */ -static void geopolyBBoxStep( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ +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; + if (rc == SQLITE_OK) { + GeoBBox* pBBox; pBBox = (GeoBBox*)sqlite3_aggregate_context(context, sizeof(*pBBox)); - if( pBBox==0 ) return; - if( pBBox->isInit==0 ){ + 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]; + 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; +static void geopolyBBoxFinal(sqlite3_context* context) { + GeoPoly* p; + GeoBBox* pBBox; pBBox = (GeoBBox*)sqlite3_aggregate_context(context, 0); - if( pBBox==0 ) return; + 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); + 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: @@ -203320,27 +200967,31 @@ static void geopolyBBoxFinal( ** 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 -){ +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{ + if (x0 == x1 && y0 == y1) + return 2; + if (x1 < x2) { + if (x0 <= x1 || x0 > x2) + 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; + if (x0 != x1) + return 0; + if (y0 < y1 && y0 < y2) + return 0; + if (y0 > y1 && 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; + if (p1 == 0) + return; + for (ii = 0; ii < p1->nVertex - 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) { + v = pointBeneathLine(x0, y0, GeoX(p1, ii), GeoY(p1, ii), GeoX(p1, 0), GeoY(p1, 0)); } - if( v==2 ){ + if (v == 2) { sqlite3_result_int(context, 1); - }else if( ((v+cnt)&1)==0 ){ + } else if (((v + cnt) & 1) == 0) { sqlite3_result_int(context, 0); - }else{ + } else { sqlite3_result_int(context, 2); } sqlite3_free(p1); } /* Forward declaration */ -static int geopolyOverlap(GeoPoly *p1, GeoPoly *p2); +static int geopolyOverlap(GeoPoly* p1, GeoPoly* p2); /* ** SQL function: geopoly_within(P1,P2) @@ -203394,19 +201041,15 @@ static int geopolyOverlap(GeoPoly *p1, GeoPoly *p2); ** 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 ){ +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 ){ + if (x < 0) { sqlite3_result_error_nomem(context); - }else{ - sqlite3_result_int(context, x==2 ? 1 : x==4 ? 2 : 0); + } else { + sqlite3_result_int(context, x == 2 ? 1 : x == 4 ? 2 : 0); } } sqlite3_free(p1); @@ -203418,42 +201061,35 @@ 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 */ + 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 */ + 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 */ + 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 ){ +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; @@ -203463,8 +201099,8 @@ static void geopolyAddOneSegment( } pSeg = p->aSegment + p->nSegment; p->nSegment++; - pSeg->C = (y1-y0)/(x1-x0); - pSeg->B = y1 - x1*pSeg->C; + pSeg->C = (y1 - y0) / (x1 - x0); + pSeg->B = y1 - x1 * pSeg->C; pSeg->y0 = y0; pSeg->side = side; pSeg->idx = idx; @@ -203480,39 +201116,36 @@ static void geopolyAddOneSegment( 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 */ -){ +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); + 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); + 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){ +static GeoEvent* geopolyEventMerge(GeoEvent* pLeft, GeoEvent* pRight) { GeoEvent head, *pLast; head.pNext = 0; pLast = &head; - while( pRight && pLeft ){ - if( pRight->x <= pLeft->x ){ + while (pRight && pLeft) { + if (pRight->x <= pLeft->x) { pLast->pNext = pRight; pLast = pRight; pRight = pRight->pNext; - }else{ + } else { pLast->pNext = pLeft; pLast = pLeft; pLeft = pLeft->pNext; @@ -203525,23 +201158,24 @@ static GeoEvent *geopolyEventMerge(GeoEvent *pLeft, GeoEvent *pRight){ /* ** Sort an array of nEvent event objects into a list. */ -static GeoEvent *geopolySortEventsByX(GeoEvent *aEvent, int nEvent){ +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; + if (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 ){ + if (r == 0.0) + r = pRight->C - pLeft->C; + if (r < 0.0) { pLast->pNext = pRight; pLast = pRight; pRight = pRight->pNext; - }else{ + } else { pLast->pNext = pLeft; pLast = pLeft; pLeft = pLeft->pNext; @@ -203575,24 +201210,25 @@ static GeoSegment *geopolySegmentMerge(GeoSegment *pLeft, GeoSegment *pRight){ ** 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){ +static GeoSegment* geopolySortSegmentsByYAndC(GeoSegment* pList) { int mx = 0; int i; - GeoSegment *p; - GeoSegment *a[50]; - while( pList ){ + GeoSegment* p; + GeoSegment* a[50]; + while (pList) { p = pList; pList = pList->pNext; p->pNext = 0; - for(i=0; i=mx ) mx = i+1; + if (i >= mx) + mx = i + 1; } p = 0; - for(i=0; inVertex + p2->nVertex + 2; - GeoOverlap *p; + GeoOverlap* p; sqlite3_int64 nByte; - GeoEvent *pThisEvent; + GeoEvent* pThisEvent; double rX; int rc = 0; int needSort = 0; - GeoSegment *pActive = 0; - GeoSegment *pSeg; + 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; + 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->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; + rX = pThisEvent && pThisEvent->x == 0.0 ? -1.0 : 0.0; memset(aOverlap, 0, sizeof(aOverlap)); - while( pThisEvent ){ - if( pThisEvent->x!=rX ){ - GeoSegment *pPrev = 0; + while (pThisEvent) { + if (pThisEvent->x != rX) { + GeoSegment* pPrev = 0; int iMask = 0; GEODEBUG(("Distinct X: %g\n", pThisEvent->x)); rX = pThisEvent->x; - if( needSort ){ + if (needSort) { GEODEBUG(("SORT\n")); pActive = geopolySortSegmentsByYAndC(pActive); needSort = 0; } - for(pSeg=pActive; pSeg; pSeg=pSeg->pNext){ - if( pPrev ){ - if( pPrev->y!=pSeg->y ){ + for (pSeg = pActive; pSeg; pSeg = pSeg->pNext) { + if (pPrev) { + if (pPrev->y != pSeg->y) { GEODEBUG(("MASK: %d\n", iMask)); aOverlap[iMask] = 1; } @@ -203648,18 +201283,16 @@ static int geopolyOverlap(GeoPoly *p1, GeoPoly *p2){ pPrev = pSeg; } pPrev = 0; - for(pSeg=pActive; pSeg; pSeg=pSeg->pNext){ - double y = pSeg->C*rX + pSeg->B; + 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 ){ + 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)); + GEODEBUG(("Crossing: %d.%d and %d.%d\n", pPrev->side, pPrev->idx, pSeg->side, pSeg->idx)); goto geopolyOverlapDone; - }else if( pPrev->y!=pSeg->y ){ + } else if (pPrev->y != pSeg->y) { GEODEBUG(("MASK: %d\n", iMask)); aOverlap[iMask] = 1; } @@ -203668,25 +201301,22 @@ static int geopolyOverlap(GeoPoly *p1, GeoPoly *p2){ 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 ){ + 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{ + } else { /* Remove a segment */ - if( pActive==pThisEvent->pSeg ){ + if (pActive == pThisEvent->pSeg) { pActive = ALWAYS(pActive) ? pActive->pNext : 0; - }else{ - for(pSeg=pActive; pSeg; pSeg=pSeg->pNext){ - if( pSeg->pNext==pThisEvent->pSeg ){ + } else { + for (pSeg = pActive; pSeg; pSeg = pSeg->pNext) { + if (pSeg->pNext == pThisEvent->pSeg) { pSeg->pNext = ALWAYS(pSeg->pNext) ? pSeg->pNext->pNext : 0; break; } @@ -203695,15 +201325,15 @@ static int geopolyOverlap(GeoPoly *p1, GeoPoly *p2){ } pThisEvent = pThisEvent->pNext; } - if( aOverlap[3]==0 ){ + if (aOverlap[3] == 0) { rc = 0; - }else if( aOverlap[1]!=0 && aOverlap[2]==0 ){ + } else if (aOverlap[1] != 0 && aOverlap[2] == 0) { rc = 3; - }else if( aOverlap[1]==0 && aOverlap[2]!=0 ){ + } else if (aOverlap[1] == 0 && aOverlap[2] != 0) { rc = 2; - }else if( aOverlap[1]==0 && aOverlap[2]==0 ){ + } else if (aOverlap[1] == 0 && aOverlap[2] == 0) { rc = 4; - }else{ + } else { rc = 1; } @@ -203724,18 +201354,14 @@ static int geopolyOverlap(GeoPoly *p1, GeoPoly *p2){ ** 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 ){ +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 ){ + if (x < 0) { sqlite3_result_error_nomem(context); - }else{ + } else { sqlite3_result_int(context, x); } } @@ -203746,11 +201372,7 @@ static void geopolyOverlapFunc( /* ** Enable or disable debugging output */ -static void geopolyDebugFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ +static void geopolyDebugFunc(sqlite3_context* context, int argc, sqlite3_value** argv) { #ifdef GEOPOLY_ENABLE_DEBUG geo_debug = sqlite3_value_int(argv[0]); #endif @@ -203765,20 +201387,19 @@ static void geopolyDebugFunc( ** 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 */ -){ +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; + 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); @@ -203786,93 +201407,81 @@ static int geopolyInit( /* Allocate the sqlite3_vtab structure */ nDb = strlen(argv[1]); nName = strlen(argv[2]); - pRtree = (Rtree *)sqlite3_malloc64(sizeof(Rtree)+nDb+nName+2); - if( !pRtree ){ + pRtree = (Rtree*)sqlite3_malloc64(sizeof(Rtree) + nDb + nName + 2); + if (!pRtree) { return SQLITE_NOMEM; } - memset(pRtree, 0, sizeof(Rtree)+nDb+nName+2); + 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->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 = 1; /* Add one for _shape */ + pRtree->nAuxNotNull = 1; /* The _shape column is always not-null */ + for (ii = 3; ii < argc; ii++) { pRtree->nAux++; sqlite3_str_appendf(pSql, ",%s", argv[ii]); } sqlite3_str_appendf(pSql, ");"); zSql = sqlite3_str_finish(pSql); - if( !zSql ){ + if (!zSql) { rc = SQLITE_NOMEM; - }else if( SQLITE_OK!=(rc = sqlite3_declare_vtab(db, zSql)) ){ + } 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; + 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; + if (rc) + goto geopolyInit_fail; rc = rtreeSqlInit(pRtree, db, argv[1], argv[2], isCreate); - if( rc ){ + if (rc) { *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); goto geopolyInit_fail; } - *ppVtab = (sqlite3_vtab *)pRtree; + *ppVtab = (sqlite3_vtab*)pRtree; return SQLITE_OK; geopolyInit_fail: - if( rc==SQLITE_OK ) rc = SQLITE_ERROR; - assert( *ppVtab==0 ); - assert( pRtree->nBusy==1 ); + 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 -){ +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 -){ +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. ** @@ -203885,15 +201494,14 @@ static int geopolyConnect( ** 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; +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; @@ -203903,47 +201511,47 @@ static int geopolyFilter( resetCursor(pCsr); pCsr->iStrategy = idxNum; - if( idxNum==1 ){ + if (idxNum == 1) { /* Special case - lookup by rowid. */ - RtreeNode *pLeaf; /* Leaf on which the required cell resides */ - RtreeSearchPoint *p; /* Search point for the leaf */ + 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 ){ + if (rc == SQLITE_OK && pLeaf != 0) { p = rtreeSearchPointNew(pCsr, RTREE_ZERO, 0); - assert( p!=0 ); /* Always returns pCsr->sPoint */ + 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{ + } else { pCsr->atEOF = 1; } - }else{ + } 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 ){ + if (rc == SQLITE_OK && idxNum <= 3) { RtreeCoord bbox[4]; - RtreeConstraint *p; - assert( argc==1 ); - assert( argv[0]!=0 ); + RtreeConstraint* p; + assert(argc == 1); + assert(argv[0] != 0); geopolyBBox(0, argv[0], bbox, &rc); - if( rc ){ + if (rc) { goto geopoly_filter_end; } - pCsr->aConstraint = p = sqlite3_malloc(sizeof(RtreeConstraint)*4); + pCsr->aConstraint = p = sqlite3_malloc(sizeof(RtreeConstraint) * 4); pCsr->nConstraint = 4; - if( p==0 ){ + 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 ){ + } 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; @@ -203960,7 +201568,7 @@ static int geopolyFilter( p->op = 'D'; p->iCoord = 3; p->u.rValue = bbox[2].f; - }else{ + } else { /* Within query */ p->op = 'D'; p->iCoord = 0; @@ -203980,17 +201588,17 @@ static int geopolyFilter( } } } - if( rc==SQLITE_OK ){ - RtreeSearchPoint *pNew; - pNew = rtreeSearchPointNew(pCsr, RTREE_ZERO, (u8)(pRtree->iDepth+1)); - if( pNew==0 ){ + 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 ); + assert(pCsr->bPoint == 1); pCsr->aNode[0] = pRoot; pRoot = 0; RTREE_QUEUE_TRACE(pCsr, "PUSH-Fm:"); @@ -204017,20 +201625,21 @@ static int geopolyFilter( ** 4 "fullscan" full-table scan. ** ------------------------------------------------ */ -static int geopolyBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ +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 ){ + for (ii = 0; ii < pIdxInfo->nConstraint; 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 ){ + 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() */ @@ -204039,7 +201648,7 @@ static int geopolyBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ } } - if( iRowidTerm>=0 ){ + if (iRowidTerm >= 0) { pIdxInfo->idxNum = 1; pIdxInfo->idxStr = "rowid"; pIdxInfo->aConstraintUsage[iRowidTerm].argvIndex = 1; @@ -204049,7 +201658,7 @@ static int geopolyBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ pIdxInfo->idxFlags = SQLITE_INDEX_SCAN_UNIQUE; return SQLITE_OK; } - if( iFuncTerm>=0 ){ + if (iFuncTerm >= 0) { pIdxInfo->idxNum = idxNum; pIdxInfo->idxStr = "rtree"; pIdxInfo->aConstraintUsage[iFuncTerm].argvIndex = 1; @@ -204065,44 +201674,45 @@ static int geopolyBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ 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); +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)); + 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 ){ + if (rc == SQLITE_ROW) { pCsr->bAuxValid = 1; - }else{ + } else { sqlite3_reset(pCsr->pReadAux); - if( rc==SQLITE_DONE ) rc = SQLITE_OK; + if (rc == SQLITE_DONE) + rc = SQLITE_OK; return rc; } } - sqlite3_result_value(ctx, sqlite3_column_value(pCsr->pReadAux, i+2)); + sqlite3_result_value(ctx, sqlite3_column_value(pCsr->pReadAux, i + 2)); } return SQLITE_OK; } - /* ** The xUpdate method for GEOPOLY module virtual tables. ** @@ -204124,47 +201734,42 @@ static int geopolyColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ ** 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; +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 ){ + 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); + assert(nData >= 1); - oldRowidValid = sqlite3_value_type(aData[0])!=SQLITE_NULL;; + 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; + 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 ); + 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"); + if (rc) { + if (rc == SQLITE_ERROR) { + pVtab->zErrMsg = sqlite3_mprintf("_shape does not contain a valid polygon"); } goto geopoly_update_end; } @@ -204172,15 +201777,15 @@ static int geopolyUpdate( /* 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) ){ + 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 ){ + if (SQLITE_ROW == steprc) { + if (sqlite3_vtab_on_conflict(pRtree->db) == SQLITE_REPLACE) { rc = rtreeDeleteRowid(pRtree, cell.iRowid); - }else{ + } else { rc = rtreeConstraintError(pRtree, 0); } } @@ -204191,7 +201796,7 @@ static int geopolyUpdate( ** record to delete from the r-tree table. The following block does ** just that. */ - if( rc==SQLITE_OK && (nData==1 || (coordChange && oldRowidValid)) ){ + if (rc == SQLITE_OK && (nData == 1 || (coordChange && oldRowidValid))) { rc = rtreeDeleteRowid(pRtree, oldRowid); } @@ -204199,54 +201804,51 @@ static int geopolyUpdate( ** (aData[2]..aData[argc-1]) contain a new record to insert into ** the r-tree structure. */ - if( rc==SQLITE_OK && nData>1 && coordChange ){ + if (rc == SQLITE_OK && nData > 1 && coordChange) { /* Insert the new record into the r-tree */ - RtreeNode *pLeaf = 0; - if( !newRowidValid ){ + RtreeNode* pLeaf = 0; + if (!newRowidValid) { rc = rtreeNewRowid(pRtree, &cell.iRowid); } *pRowid = cell.iRowid; - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = ChooseLeaf(pRtree, &cell, 0, &pLeaf); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { int rc2; pRtree->iReinsertHeight = -1; rc = rtreeInsertCell(pRtree, pLeaf, &cell, 0); rc2 = nodeRelease(pRtree, pLeaf); - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { rc = rc2; } } } /* Change the data */ - if( rc==SQLITE_OK && nData>1 ){ - sqlite3_stmt *pUp = pRtree->pWriteAux; + 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]) ){ + 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{ + } 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; jjxDestructor ) pInfo->xDestructor(pInfo->pContext); +static void rtreeFreeCallback(void* p) { + RtreeGeomCallback* pInfo = (RtreeGeomCallback*)p; + if (pInfo->xDestructor) + pInfo->xDestructor(pInfo->pContext); sqlite3_free(p); } /* ** This routine frees the BLOB that is returned by geomCallback(). */ -static void rtreeMatchArgFree(void *pArg){ +static void rtreeMatchArgFree(void* pArg) { int i; - RtreeMatchArg *p = (RtreeMatchArg*)pArg; - for(i=0; inParam; i++){ + RtreeMatchArg* p = (RtreeMatchArg*)pArg; + for (i = 0; i < p->nParam; i++) { sqlite3_value_free(p->apSqlParam[i]); } sqlite3_free(p); @@ -204440,36 +202028,36 @@ static void rtreeMatchArgFree(void *pArg){ ** 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; +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 ){ + nBlob = sizeof(RtreeMatchArg) + (nArg - 1) * sizeof(RtreeDValue) + nArg * sizeof(sqlite3_value*); + pBlob = (RtreeMatchArg*)sqlite3_malloc64(nBlob); + if (!pBlob) { sqlite3_result_error_nomem(ctx); - }else{ + } 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; + 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 ){ + if (memErr) { sqlite3_result_error_nomem(ctx); rtreeMatchArgFree(pBlob); - }else{ + } else { sqlite3_result_pointer(ctx, pBlob, "RtreeMatchArg", rtreeMatchArgFree); } } @@ -204478,63 +202066,56 @@ static void geomCallback(sqlite3_context *ctx, int nArg, sqlite3_value **aArg){ /* ** 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 */ +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 = (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 - ); + 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 */ +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); + 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 - ); + 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_API int +sqlite3_rtree_init(sqlite3* db, char** pzErrMsg, const sqlite3_api_routines* pApi) { SQLITE_EXTENSION_INIT2(pApi) return sqlite3RtreeInit(db); } @@ -204574,21 +202155,19 @@ SQLITE_API int sqlite3_rtree_init( ** provide case-independent matching. */ -#if !defined(SQLITE_CORE) \ - || defined(SQLITE_ENABLE_ICU) \ - || defined(SQLITE_ENABLE_ICU_COLLATIONS) +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) || defined(SQLITE_ENABLE_ICU_COLLATIONS) /* Include ICU headers */ -#include +#include #include #include -#include +#include /* #include */ #ifndef SQLITE_CORE /* #include "sqlite3ext.h" */ - SQLITE_EXTENSION_INIT1 +SQLITE_EXTENSION_INIT1 #else /* #include "sqlite3.h" */ #endif @@ -204600,11 +202179,10 @@ SQLITE_API int sqlite3_rtree_init( ** 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 */ -){ +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'; @@ -204618,13 +202196,13 @@ static void icuFunctionError( ** operator. */ #ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH -# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000 +#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){ +static void xFree(void* p) { sqlite3_free(p); } @@ -204634,53 +202212,49 @@ static void xFree(void *p){ ** 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, + 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_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++;} \ +#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 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 */ + int prevEscape = 0; /* True if the previous character was uEsc */ - while( 1 ){ + 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; + if (uPattern == 0) + break; /* There are now 4 possibilities: ** @@ -204689,7 +202263,7 @@ static int icuLikeCompare( ** 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 ){ + if (uPattern == MATCH_ALL && !prevEscape && uPattern != (uint32_t)uEsc) { /* Case 1. */ uint8_t c; @@ -204697,47 +202271,50 @@ static int icuLikeCompare( ** 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; + 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; + if (*zPattern == 0) + return 1; - while( *zString ){ - if( icuLikeCompare(zPattern, zString, uEsc) ){ + 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 ){ + } else if (uPattern == MATCH_ONE && !prevEscape && uPattern != (uint32_t)uEsc) { /* Case 2. */ - if( *zString==0 ) return 0; + if (*zString == 0) + return 0; SQLITE_ICU_SKIP_UTF8(zString); - }else if( uPattern==(uint32_t)uEsc && !prevEscape ){ + } else if (uPattern == (uint32_t)uEsc && !prevEscape) { /* Case 3. */ prevEscape = 1; - }else{ + } 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 ){ + if (uString != uPattern) { return 0; } prevEscape = 0; } } - return *zString==0; + return *zString == 0; } /* @@ -204753,41 +202330,36 @@ static int icuLikeCompare( ** ** 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]); +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 ){ + 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 ){ + 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 nE = sqlite3_value_bytes(argv[2]); + const unsigned char* zE = sqlite3_value_text(argv[2]); int i = 0; - if( zE==0 ) return; + 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); + if (i != nE) { + sqlite3_result_error(context, "ESCAPE expression must be a single character", -1); return; } } - if( zA && zB ){ + if (zA && zB) { sqlite3_result_int(context, icuLikeCompare(zA, zB, uEsc)); } } @@ -204796,8 +202368,8 @@ static void icuLikeFunc( ** Function to delete compiled regexp objects. Registered as ** a destructor function with sqlite3_set_auxdata(). */ -static void icuRegexpDelete(void *p){ - URegularExpression *pExpr = (URegularExpression *)p; +static void icuRegexpDelete(void* p) { + URegularExpression* pExpr = (URegularExpression*)p; uregex_close(pExpr); } @@ -204820,34 +202392,34 @@ static void icuRegexpDelete(void *p){ ** uregex_matches() ** uregex_close() */ -static void icuRegexpFunc(sqlite3_context *p, int nArg, sqlite3_value **apArg){ +static void icuRegexpFunc(sqlite3_context* p, int nArg, sqlite3_value** apArg) { UErrorCode status = U_ZERO_ERROR; - URegularExpression *pExpr; + URegularExpression* pExpr; UBool res; - const UChar *zString = sqlite3_value_text16(apArg[1]); + const UChar* zString = sqlite3_value_text16(apArg[1]); - (void)nArg; /* Unused parameter */ + (void)nArg; /* Unused parameter */ /* If the left hand side of the regexp operator is NULL, ** then the result is also NULL. */ - if( !zString ){ + if (!zString) { return; } pExpr = sqlite3_get_auxdata(p, 0); - if( !pExpr ){ - const UChar *zPattern = sqlite3_value_text16(apArg[0]); - if( !zPattern ){ + 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) ){ + if (U_SUCCESS(status)) { sqlite3_set_auxdata(p, 0, pExpr, icuRegexpDelete); pExpr = sqlite3_get_auxdata(p, 0); } - if( !pExpr ){ + if (!pExpr) { icuFunctionError(p, "uregex_open", status); return; } @@ -204855,14 +202427,14 @@ static void icuRegexpFunc(sqlite3_context *p, int nArg, sqlite3_value **apArg){ /* Configure the text that the regular expression operates on. */ uregex_setText(pExpr, zString, -1, &status); - if( !U_SUCCESS(status) ){ + if (!U_SUCCESS(status)) { icuFunctionError(p, "uregex_setText", status); return; } /* Attempt the match */ res = uregex_matches(pExpr, 0, &status); - if( !U_SUCCESS(status) ){ + if (!U_SUCCESS(status)) { icuFunctionError(p, "uregex_matches", status); return; } @@ -204904,58 +202476,58 @@ static void icuRegexpFunc(sqlite3_context *p, int nArg, sqlite3_value **apArg){ ** ** 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 */ +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() */ + int bToUpper; /* True for toupper(), false for tolower() */ UErrorCode status; - const char *zLocale = 0; + 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]); + 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 ){ + if (!zInput) { return; } nOut = nInput = sqlite3_value_bytes16(apArg[0]); - if( nOut==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 ){ + 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 (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) ){ + if (U_SUCCESS(status)) { sqlite3_result_text16(p, zOutput, nOut, xFree); - }else if( status==U_BUFFER_OVERFLOW_ERROR ){ - assert( cnt==0 ); + } else if (status == U_BUFFER_OVERFLOW_ERROR) { + assert(cnt == 0); continue; - }else{ + } else { icuFunctionError(p, bToUpper ? "u_strToUpper" : "u_strToLower", status); } return; } - assert( 0 ); /* Unreachable */ + assert(0); /* Unreachable */ } #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) */ @@ -204964,8 +202536,8 @@ static void icuCaseFunc16(sqlite3_context *p, int nArg, sqlite3_value **apArg){ ** 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; +static void icuCollationDel(void* pCtx) { + UCollator* p = (UCollator*)pCtx; ucol_close(p); } @@ -204973,20 +202545,17 @@ static void icuCollationDel(void *pCtx){ ** 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 -){ +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; + 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; @@ -205005,38 +202574,32 @@ static int icuCollationColl( ** "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); +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() */ + 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); + assert(nArg == 2); (void)nArg; /* Unused parameter */ - zLocale = (const char *)sqlite3_value_text(apArg[0]); - zName = (const char *)sqlite3_value_text(apArg[1]); + zLocale = (const char*)sqlite3_value_text(apArg[0]); + zName = (const char*)sqlite3_value_text(apArg[1]); - if( !zLocale || !zName ){ + if (!zLocale || !zName) { return; } pUCollator = ucol_open(zLocale, &status); - if( !U_SUCCESS(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 ){ + 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); } @@ -205045,40 +202608,36 @@ static void icuLoadCollation( /* ** Register the ICU extension functions with database db. */ -SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db){ -# define SQLITEICU_EXTRAFLAGS (SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS) +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**); + 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}, + {"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}, + {"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 - ); + 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; @@ -205088,11 +202647,8 @@ SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db){ #ifdef _WIN32 __declspec(dllexport) #endif -SQLITE_API int sqlite3_icu_init( - sqlite3 *db, - char **pzErrMsg, - const sqlite3_api_routines *pApi -){ +SQLITE_API int +sqlite3_icu_init(sqlite3* db, char** pzErrMsg, const sqlite3_api_routines* pApi) { SQLITE_EXTENSION_INIT2(pApi) return sqlite3IcuInit(db); } @@ -205133,19 +202689,19 @@ typedef struct IcuCursor IcuCursor; struct IcuTokenizer { sqlite3_tokenizer base; - char *zLocale; + 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 */ + 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; + char* zBuffer; int iToken; }; @@ -205153,29 +202709,28 @@ struct IcuCursor { /* ** 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; +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; + if (argc > 0) { + n = strlen(argv[0]) + 1; } - p = (IcuTokenizer *)sqlite3_malloc64(sizeof(IcuTokenizer)+n); - if( !p ){ + p = (IcuTokenizer*)sqlite3_malloc64(sizeof(IcuTokenizer) + n); + if (!p) { return SQLITE_NOMEM; } memset(p, 0, sizeof(IcuTokenizer)); - if( n ){ - p->zLocale = (char *)&p[1]; + if (n) { + p->zLocale = (char*)&p[1]; memcpy(p->zLocale, argv[0], n); } - *ppTokenizer = (sqlite3_tokenizer *)p; + *ppTokenizer = (sqlite3_tokenizer*)p; return SQLITE_OK; } @@ -205183,8 +202738,8 @@ static int icuCreate( /* ** Destroy a tokenizer */ -static int icuDestroy(sqlite3_tokenizer *pTokenizer){ - IcuTokenizer *p = (IcuTokenizer *)pTokenizer; +static int icuDestroy(sqlite3_tokenizer* pTokenizer) { + IcuTokenizer* p = (IcuTokenizer*)pTokenizer; sqlite3_free(p); return SQLITE_OK; } @@ -205195,14 +202750,13 @@ static int icuDestroy(sqlite3_tokenizer *pTokenizer){ ** 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; +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; @@ -205214,61 +202768,60 @@ static int icuOpen( *ppCursor = 0; - if( zInput==0 ){ + if (zInput == 0) { nInput = 0; zInput = ""; - }else if( nInput<0 ){ + } 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[] */ + 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 ){ + if (!pCsr) { return SQLITE_NOMEM; } memset(pCsr, 0, sizeof(IcuCursor)); - pCsr->aChar = (UChar *)&pCsr[1]; - pCsr->aOffset = (int *)&pCsr->aChar[(nChar+3)&~3]; + 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 ){ + while (c > 0) { int isError = 0; c = u_foldCase(c, opt); U16_APPEND(pCsr->aChar, iOut, nChar, c, isError); - if( 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) ){ + if (!U_SUCCESS(status)) { sqlite3_free(pCsr); return SQLITE_ERROR; } pCsr->nChar = iOut; ubrk_first(pCsr->pIter); - *ppCursor = (sqlite3_tokenizer_cursor *)pCsr; + *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; +static int icuClose(sqlite3_tokenizer_cursor* pCursor) { + IcuCursor* pCsr = (IcuCursor*)pCursor; ubrk_close(pCsr->pIter); sqlite3_free(pCsr->zBuffer); sqlite3_free(pCsr); @@ -205278,58 +202831,56 @@ static int icuClose(sqlite3_tokenizer_cursor *pCursor){ /* ** 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; +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 ){ + while (iStart == iEnd) { UChar32 c; iStart = ubrk_current(pCsr->pIter); iEnd = ubrk_next(pCsr->pIter); - if( iEnd==UBRK_DONE ){ + if (iEnd == UBRK_DONE) { return SQLITE_DONE; } - while( iStartaChar, iWhite, pCsr->nChar, c); - if( u_isspace(c) ){ + if (u_isspace(c)) { iStart = iWhite; - }else{ + } else { break; } } - assert(iStart<=iEnd); + assert(iStart <= iEnd); } do { UErrorCode status = U_ZERO_ERROR; - if( nByte ){ - char *zNew = sqlite3_realloc(pCsr->zBuffer, nByte); - if( !zNew ){ + 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 */ + u_strToUTF8(pCsr->zBuffer, pCsr->nBuffer, &nByte, /* Output vars */ + &pCsr->aChar[iStart], iEnd - iStart, /* Input vars */ + &status /* Output success/failure */ ); - } while( nByte>pCsr->nBuffer ); + } while (nByte > pCsr->nBuffer); *ppToken = pCsr->zBuffer; *pnBytes = nByte; @@ -205344,21 +202895,19 @@ static int icuNext( ** 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 */ + 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 -){ +SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule(sqlite3_tokenizer_module const** ppModule) { *ppModule = &icuTokenizerModule; } @@ -205768,11 +203317,7 @@ typedef struct sqlite3rbu sqlite3rbu; ** 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 -); +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. @@ -205811,10 +203356,7 @@ SQLITE_API sqlite3rbu *sqlite3rbu_open( ** a description of the complications associated with using RBU with ** zipvfs databases. */ -SQLITE_API sqlite3rbu *sqlite3rbu_vacuum( - const char *zTarget, - const char *zState -); +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 @@ -205869,7 +203411,7 @@ SQLITE_API sqlite3_int64 sqlite3rbu_temp_size(sqlite3rbu*); ** 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); +SQLITE_API sqlite3* sqlite3rbu_db(sqlite3rbu*, int bRbu); /* ** Do some work towards applying the RBU update to the target db. @@ -205883,7 +203425,7 @@ SQLITE_API sqlite3 *sqlite3rbu_db(sqlite3rbu*, int bRbu); ** 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); +SQLITE_API int sqlite3rbu_step(sqlite3rbu* pRbu); /* ** Force RBU to save its state to disk. @@ -205895,7 +203437,7 @@ SQLITE_API int sqlite3rbu_step(sqlite3rbu *pRbu); ** ** SQLITE_OK is returned if successful, or an SQLite error code otherwise. */ -SQLITE_API int sqlite3rbu_savestate(sqlite3rbu *pRbu); +SQLITE_API int sqlite3rbu_savestate(sqlite3rbu* pRbu); /* ** Close an RBU handle. @@ -205915,14 +203457,14 @@ SQLITE_API int sqlite3rbu_savestate(sqlite3rbu *pRbu); ** update has been partially applied, or SQLITE_DONE if it has been ** completely applied. */ -SQLITE_API int sqlite3rbu_close(sqlite3rbu *pRbu, char **pzErrmsg); +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); +SQLITE_API sqlite3_int64 sqlite3rbu_progress(sqlite3rbu* pRbu); /* ** Obtain permyriadage (permyriadage is to 10000 as percentage is to 100) @@ -205964,7 +203506,7 @@ SQLITE_API sqlite3_int64 sqlite3rbu_progress(sqlite3rbu *pRbu); ** 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); +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. @@ -205996,13 +203538,13 @@ SQLITE_API void sqlite3rbu_bp_progress(sqlite3rbu *pRbu, int *pnOne, int*pnTwo); ** 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_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 +#define SQLITE_RBU_STATE_DONE 4 +#define SQLITE_RBU_STATE_ERROR 5 -SQLITE_API int sqlite3rbu_state(sqlite3rbu *pRbu); +SQLITE_API int sqlite3rbu_state(sqlite3rbu* pRbu); /* ** Create an RBU VFS named zName that accesses the underlying file-system @@ -206046,7 +203588,7 @@ SQLITE_API int sqlite3rbu_state(sqlite3rbu *pRbu); ** 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); +SQLITE_API int sqlite3rbu_create_vfs(const char* zName, const char* zParent); /* ** Deregister and destroy an RBU vfs created by an earlier call to @@ -206056,7 +203598,7 @@ SQLITE_API int sqlite3rbu_create_vfs(const char *zName, const char *zParent); ** before all database handles that use it have been closed, the results ** are undefined. */ -SQLITE_API void sqlite3rbu_destroy_vfs(const char *zName); +SQLITE_API void sqlite3rbu_destroy_vfs(const char* zName); #if 0 } /* end of the 'extern "C"' block */ @@ -206078,14 +203620,19 @@ SQLITE_API void sqlite3rbu_destroy_vfs(const char *zName); ** to enable checksum verification. */ #ifndef RBU_ENABLE_DELTA_CKSUM -# define RBU_ENABLE_DELTA_CKSUM 0 +#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;} +#define SWAP(TYPE, A, B) \ + { \ + TYPE t = A; \ + A = B; \ + B = t; \ + } #endif /* @@ -206094,7 +203641,6 @@ SQLITE_API void sqlite3rbu_destroy_vfs(const char *zName); */ #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 @@ -206143,26 +203689,24 @@ SQLITE_API void sqlite3rbu_destroy_vfs(const char *zName); ** 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_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_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)" +#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; @@ -206184,20 +203728,20 @@ typedef sqlite3_int64 i64; ** 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 WAL_LOCK_WRITE 0 +#define WAL_LOCK_CKPT 1 +#define WAL_LOCK_READ0 3 -#define SQLITE_FCNTL_RBUCNT 5149216 +#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; + char* zTbl; + char* zDataTbl; + char* zIdx; i64 iWalCksum; int nRow; i64 nProgress; @@ -206207,13 +203751,13 @@ struct RbuState { }; struct RbuUpdateStmt { - char *zMask; /* Copy of update mask used with pUpdate */ - sqlite3_stmt *pUpdate; /* Last update statement (or NULL) */ - RbuUpdateStmt *pNext; + char* zMask; /* Copy of update mask used with pUpdate */ + sqlite3_stmt* pUpdate; /* Last update statement (or NULL) */ + RbuUpdateStmt* pNext; }; struct RbuSpan { - const char *zSpan; + const char* zSpan; int nSpan; }; @@ -206239,39 +203783,39 @@ struct RbuSpan { ** */ 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 */ + 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 */ + 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 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; + RbuSpan* aIdxCol; + char* zIdxSql; /* Last UPDATE used (for PK b-tree updates only), or NULL. */ - RbuUpdateStmt *pRbuUpdate; + RbuUpdateStmt* pRbuUpdate; }; /* @@ -206284,25 +203828,24 @@ struct RbuObjIter { ** 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 - +#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_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 */ +#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 @@ -206354,41 +203897,41 @@ struct RbuFrame { ** 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 */ + 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 iMaxFrame; /* Largest iWalFrame value in aFrame[] */ u32 mLock; - int nFrame; /* Entries in aFrame[] array */ - int nFrameAlloc; /* Allocated size of aFrame[] array */ - RbuFrame *aFrame; + int nFrame; /* Entries in aFrame[] array */ + int nFrameAlloc; /* Allocated size of aFrame[] array */ + RbuFrame* aFrame; int pgsz; - u8 *aBuf; + u8* aBuf; i64 iWalCksum; - i64 szTemp; /* Current size of all temp files in use */ - i64 szTempLimit; /* Total size limit for temp files */ + 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 */ + int nRbu; /* Number of RBU VFS in the stack */ + rbu_file* pRbuFd; /* Fd for main db of dbRbu */ }; /* @@ -206400,12 +203943,12 @@ struct sqlite3rbu { ** 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 */ + 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 */ }; /* @@ -206416,32 +203959,31 @@ struct rbu_vfs { ** "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 */ + 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) - +#define rbuIsVacuum(p) ((p)->zTarget == 0) /************************************************************************* ** The following three functions, found below: @@ -206460,23 +204002,19 @@ struct rbu_file { ** 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 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, + -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; + unsigned char* z = (unsigned char*)*pz; + unsigned char* zStart = z; + while ((c = zValue[0x7f & *(z++)]) >= 0) { + v = (v << 6) + c; } z--; *pLen -= z - zStart; @@ -206488,21 +204026,21 @@ static unsigned int rbuDeltaGetInt(const char **pz, int *pLen){ /* ** 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; +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){ + 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]); + 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){ + while (N >= 4) { sum0 += z[0]; sum1 += z[1]; sum2 += z[2]; @@ -206511,11 +204049,14 @@ static unsigned int rbuDeltaChecksum(const char *zIn, size_t N){ 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: ; + switch (N) { + case 3: + sum3 += (z[2] << 8); + case 2: + sum3 += (z[1] << 16); + case 1: + sum3 += (z[0] << 24); + default:; } return sum3; } @@ -206541,43 +204082,45 @@ static unsigned int rbuDeltaChecksum(const char *zIn, size_t N){ ** 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 */ -){ +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; + char* zOrigOut = zOut; #endif limit = rbuDeltaGetInt(&zDelta, &lenDelta); - if( *zDelta!='\n' ){ + if (*zDelta != '\n') { /* ERROR: size integer not terminated by "\n" */ return -1; } - zDelta++; lenDelta--; - while( *zDelta && lenDelta>0 ){ + zDelta++; + lenDelta--; + while (*zDelta && lenDelta > 0) { unsigned int cnt, ofst; cnt = rbuDeltaGetInt(&zDelta, &lenDelta); - switch( zDelta[0] ){ + switch (zDelta[0]) { case '@': { - zDelta++; lenDelta--; + zDelta++; + lenDelta--; ofst = rbuDeltaGetInt(&zDelta, &lenDelta); - if( lenDelta>0 && zDelta[0]!=',' ){ + if (lenDelta > 0 && zDelta[0] != ',') { /* ERROR: copy command not terminated by ',' */ return -1; } - zDelta++; lenDelta--; + zDelta++; + lenDelta--; total += cnt; - if( total>limit ){ + if (total > limit) { /* ERROR: copy exceeds output file size */ return -1; } - if( (int)(ofst+cnt) > lenSrc ){ + if ((int)(ofst + cnt) > lenSrc) { /* ERROR: copy extends past end of input */ return -1; } @@ -206586,13 +204129,14 @@ static int rbuDeltaApply( break; } case ':': { - zDelta++; lenDelta--; + zDelta++; + lenDelta--; total += cnt; - if( total>limit ){ + if (total > limit) { /* ERROR: insert command gives an output larger than predicted */ return -1; } - if( (int)cnt>lenDelta ){ + if ((int)cnt > lenDelta) { /* ERROR: insert count exceeds size of delta */ return -1; } @@ -206603,15 +204147,16 @@ static int rbuDeltaApply( break; } case ';': { - zDelta++; lenDelta--; + zDelta++; + lenDelta--; zOut[0] = 0; #if RBU_ENABLE_DELTA_CKSUM - if( cnt!=rbuDeltaChecksum(zOrigOut, total) ){ + if (cnt != rbuDeltaChecksum(zOrigOut, total)) { /* ERROR: bad checksum */ return -1; } #endif - if( total!=limit ){ + if (total != limit) { /* ERROR: generated size does not match predicted size */ return -1; } @@ -206627,10 +204172,10 @@ static int rbuDeltaApply( return -1; } -static int rbuDeltaOutputSize(const char *zDelta, int lenDelta){ +static int rbuDeltaOutputSize(const char* zDelta, int lenDelta) { int size; size = rbuDeltaGetInt(&zDelta, &lenDelta); - if( *zDelta!='\n' ){ + if (*zDelta != '\n') { /* ERROR: size integer not terminated by "\n" */ return -1; } @@ -206649,21 +204194,17 @@ static int rbuDeltaOutputSize(const char *zDelta, int lenDelta){ ** 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; +static void rbuFossilDeltaFunc(sqlite3_context* context, int argc, sqlite3_value** argv) { + const char* aDelta; int nDelta; - const char *aOrig; + const char* aOrig; int nOrig; int nOut; int nOut2; - char *aOut; + char* aOut; - assert( argc==2 ); + assert(argc == 2); nOrig = sqlite3_value_bytes(argv[0]); aOrig = (const char*)sqlite3_value_blob(argv[0]); @@ -206672,26 +204213,25 @@ static void rbuFossilDeltaFunc( /* Figure out the size of the output */ nOut = rbuDeltaOutputSize(aDelta, nDelta); - if( nOut<0 ){ + if (nOut < 0) { sqlite3_result_error(context, "corrupt fossil delta", -1); return; } - aOut = sqlite3_malloc(nOut+1); - if( aOut==0 ){ + aOut = sqlite3_malloc(nOut + 1); + if (aOut == 0) { sqlite3_result_error_nomem(context); - }else{ + } else { nOut2 = rbuDeltaApply(aOrig, nOrig, aDelta, nDelta, aOut); - if( nOut2!=nOut ){ + if (nOut2 != nOut) { sqlite3_free(aOut); sqlite3_result_error(context, "corrupt fossil delta", -1); - }else{ + } 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 @@ -206702,14 +204242,9 @@ static void rbuFossilDeltaFunc( ** 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 -){ +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 ){ + if (rc != SQLITE_OK) { *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); *ppStmt = 0; } @@ -206724,9 +204259,9 @@ static int prepareAndCollectError( ** 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){ +static int resetAndCollectError(sqlite3_stmt* pStmt, char** pzErrmsg) { int rc = sqlite3_reset(pStmt); - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(sqlite3_db_handle(pStmt))); } return rc; @@ -206747,18 +204282,13 @@ static int resetAndCollectError(sqlite3_stmt *pStmt, char **pzErrmsg){ ** 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 -){ +static int prepareFreeAndCollectError(sqlite3* db, sqlite3_stmt** ppStmt, char** pzErrmsg, char* zSql) { int rc; - assert( *pzErrmsg==0 ); - if( zSql==0 ){ + assert(*pzErrmsg == 0); + if (zSql == 0) { rc = SQLITE_NOMEM; *ppStmt = 0; - }else{ + } else { rc = prepareAndCollectError(db, ppStmt, pzErrmsg, zSql); sqlite3_free(zSql); } @@ -206769,9 +204299,9 @@ static int prepareFreeAndCollectError( ** Free the RbuObjIter.azTblCol[] and RbuObjIter.abTblPk[] arrays allocated ** by an earlier call to rbuObjIterCacheTableInfo(). */ -static void rbuObjIterFreeCols(RbuObjIter *pIter){ +static void rbuObjIterFreeCols(RbuObjIter* pIter) { int i; - for(i=0; inTblCol; i++){ + for (i = 0; i < pIter->nTblCol; i++) { sqlite3_free(pIter->azTblCol[i]); sqlite3_free(pIter->azTblType[i]); } @@ -206782,23 +204312,23 @@ static void rbuObjIterFreeCols(RbuObjIter *pIter){ pIter->abTblPk = 0; pIter->abNotNull = 0; pIter->nTblCol = 0; - pIter->eType = 0; /* Invalid value */ + 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; +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; + while (pUp) { + RbuUpdateStmt* pTmp = pUp->pNext; sqlite3_finalize(pUp->pUpdate); sqlite3_free(pUp); pUp = pTmp; @@ -206821,7 +204351,7 @@ static void rbuObjIterClearStatements(RbuObjIter *pIter){ ** Clean up any resources allocated as part of the iterator object passed ** as the only argument. */ -static void rbuObjIterFinalize(RbuObjIter *pIter){ +static void rbuObjIterFinalize(RbuObjIter* pIter) { rbuObjIterClearStatements(pIter); sqlite3_finalize(pIter->pTblIter); sqlite3_finalize(pIter->pIdxIter); @@ -206837,47 +204367,46 @@ static void rbuObjIterFinalize(RbuObjIter *pIter){ ** 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){ +static int rbuObjIterNext(sqlite3rbu* p, RbuObjIter* pIter) { int rc = p->rc; - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { /* Free any SQLite statements used while processing the previous object */ rbuObjIterClearStatements(pIter); - if( pIter->zIdx==0 ){ + 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 - ); + "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 ){ + if (rc == SQLITE_OK) { + if (pIter->bCleanup) { rbuObjIterFreeCols(pIter); pIter->bCleanup = 0; rc = sqlite3_step(pIter->pTblIter); - if( rc!=SQLITE_ROW ){ + if (rc != SQLITE_ROW) { rc = resetAndCollectError(pIter->pTblIter, &p->zErrmsg); pIter->zTbl = 0; - }else{ + } else { pIter->zTbl = (const char*)sqlite3_column_text(pIter->pTblIter, 0); - pIter->zDataTbl = (const char*)sqlite3_column_text(pIter->pTblIter,1); + 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; + } 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 ){ + if (rc == SQLITE_OK) { rc = sqlite3_step(pIter->pIdxIter); - if( rc!=SQLITE_ROW ){ + if (rc != SQLITE_ROW) { rc = resetAndCollectError(pIter->pIdxIter, &p->zErrmsg); pIter->bCleanup = 1; pIter->zIdx = 0; - }else{ + } 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); @@ -206888,14 +204417,13 @@ static int rbuObjIterNext(sqlite3rbu *p, RbuObjIter *pIter){ } } - if( rc!=SQLITE_OK ){ + 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 - @@ -206917,28 +204445,25 @@ static int rbuObjIterNext(sqlite3rbu *p, RbuObjIter *pIter){ ** 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 ); +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]) ){ + 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 ){ + } 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); + 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); } } } @@ -206953,25 +204478,23 @@ static void rbuTargetNameFunc( ** 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){ +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 ){ + 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 = ?" - ); + "SELECT name, rootpage, sql IS NULL OR substr(8, 6)=='UNIQUE' " + " FROM main.sqlite_schema " + " WHERE type='index' AND tbl_name = ?"); } pIter->bCleanup = 1; @@ -206988,14 +204511,15 @@ static int rbuObjIterFirst(sqlite3rbu *p, RbuObjIter *pIter){ ** 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; +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{ + if (p->rc == SQLITE_OK) { + if (zSql == 0) + p->rc = SQLITE_NOMEM; + } else { sqlite3_free(zSql); zSql = 0; } @@ -207013,15 +204537,15 @@ static char *rbuMPrintf(sqlite3rbu *p, const char *zFmt, ...){ ** 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, ...){ +static int rbuMPrintfExec(sqlite3rbu* p, sqlite3* db, const char* zFmt, ...) { va_list ap; - char *zSql; + char* zSql; va_start(ap, zFmt); zSql = sqlite3_vmprintf(zFmt, ap); - if( p->rc==SQLITE_OK ){ - if( zSql==0 ){ + if (p->rc == SQLITE_OK) { + if (zSql == 0) { p->rc = SQLITE_NOMEM; - }else{ + } else { p->rc = sqlite3_exec(db, zSql, 0, 0, &p->zErrmsg); } } @@ -207040,32 +204564,31 @@ static int rbuMPrintfExec(sqlite3rbu *p, sqlite3 *db, const char *zFmt, ...){ ** 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 ); +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 ){ + if (pRet == 0) { p->rc = SQLITE_NOMEM; - }else{ + } 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; +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 ){ + if (azNew) { pIter->azTblCol = azNew; pIter->azTblType = &azNew[nCol]; pIter->aiSrcOrder = (int*)&pIter->azTblType[nCol]; @@ -207085,16 +204608,16 @@ static void rbuAllocateIterArrays(sqlite3rbu *p, RbuObjIter *pIter, int nCol){ ** 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; +static char* rbuStrndup(const char* zStr, int* pRc) { + char* zRet = 0; - if( *pRc==SQLITE_OK ){ - if( zStr ){ + if (*pRc == SQLITE_OK) { + if (zStr) { size_t nCopy = strlen(zStr) + 1; zRet = (char*)sqlite3_malloc64(nCopy); - if( zRet ){ + if (zRet) { memcpy(zRet, zStr, nCopy); - }else{ + } else { *pRc = SQLITE_NOMEM; } } @@ -207110,10 +204633,10 @@ static char *rbuStrndup(const char *zStr, int *pRc){ ** 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); +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 ){ + if (p->rc == SQLITE_OK && rc != SQLITE_OK) { p->rc = rc; p->zErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); } @@ -207158,60 +204681,50 @@ static void rbuFinalize(sqlite3rbu *p, sqlite3_stmt *pStmt){ ** return RBU_PK_NONE ** } */ -static void rbuTableType( - sqlite3rbu *p, - const char *zTab, - int *peType, - int *piTnum, - int *piPk -){ +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}; + sqlite3_stmt* aStmt[4] = {0, 0, 0, 0}; *peType = RBU_PK_NOTABLE; *piPk = 0; - assert( p->rc==SQLITE_OK ); + 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 ){ + 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 */ + 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[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 ){ + 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{ + } else { *peType = RBU_PK_WITHOUT_ROWID; } } @@ -207219,13 +204732,11 @@ static void rbuTableType( } } - 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 */ + 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; } } @@ -207233,45 +204744,43 @@ static void rbuTableType( } rbuTableType_end: { - unsigned int i; - for(i=0; iabIndexed[] array. */ -static void rbuObjIterCacheIndexedCols(sqlite3rbu *p, RbuObjIter *pIter){ - sqlite3_stmt *pList = 0; +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) - ); + 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); + 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); + 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) ){ + 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); + if (iCid >= 0) + pIter->abIndexed[iCid] = 1; + if (iCid == -2) { + memset(pIter->abIndexed, 0x01, sizeof(u8) * pIter->nTblCol); } } rbuFinalize(p, pXInfo); @@ -207279,16 +204788,16 @@ static void rbuObjIterCacheIndexedCols(sqlite3rbu *p, RbuObjIter *pIter){ pIter->nIndex++; } - if( pIter->eType==RBU_PK_WITHOUT_ROWID ){ + 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 (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 @@ -207298,106 +204807,95 @@ static void rbuObjIterCacheIndexedCols(sqlite3rbu *p, RbuObjIter *pIter){ ** 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; +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 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 ); + assert(pIter->eType == 0); rbuTableType(p, pIter->zTbl, &pIter->eType, &iTnum, &pIter->iPkTnum); - if( p->rc==SQLITE_OK && pIter->eType==RBU_PK_NOTABLE ){ + 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; + 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 - ); + 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 ){ + 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); + for (i = 0; p->rc == SQLITE_OK && i < nCol; i++) { + const char* zName = (const char*)sqlite3_column_name(pStmt, i); + if (sqlite3_strnicmp("rbu_", zName, 4)) { + char* zCopy = rbuStrndup(zName, &p->rc); pIter->aiSrcOrder[pIter->nTblCol] = pIter->nTblCol; pIter->azTblCol[pIter->nTblCol++] = zCopy; - } - else if( 0==sqlite3_stricmp("rbu_rowid", zName) ){ + } 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) - ){ + 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") - ); + 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 (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; i < pIter->nTblCol; i++) { + if (0 == strcmp(zName, pIter->azTblCol[i])) + break; } - if( i==pIter->nTblCol ){ + if (i == pIter->nTblCol) { p->rc = SQLITE_ERROR; - p->zErrmsg = sqlite3_mprintf("column missing from %q: %s", - pIter->zDataTbl, zName - ); - }else{ + 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); + const char* zType = (const char*)sqlite3_column_text(pStmt, 2); - if( i!=iOrder ){ + 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 ); + assert(iPk >= 0); pIter->abTblPk[iOrder] = (u8)iPk; - pIter->abNotNull[iOrder] = (u8)bNotNull || (iPk!=0); + 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 ); + assert(pIter->eType != RBU_PK_VTAB || pIter->abIndexed == 0); + assert(pIter->eType != RBU_PK_VTAB || pIter->nIndex == 0); } return p->rc; @@ -207408,15 +204906,14 @@ static int rbuObjIterCacheTableInfo(sqlite3rbu *p, RbuObjIter *pIter){ ** 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 = ""; +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]; + for (i = 0; i < pIter->nTblCol; i++) { + const char* z = pIter->azTblCol[i]; zList = rbuMPrintf(p, "%z%s\"%w\"", zList, zSep, z); zSep = ", "; } @@ -207429,27 +204926,27 @@ static char *rbuObjIterGetCollist( ** 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 */ -){ +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 ){ + 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]; + for (i = 0; i < pIter->nTblCol; 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; + if (i == pIter->nTblCol) + break; iPk++; } return zRet; @@ -207474,39 +204971,32 @@ static char *rbuObjIterGetPkList( ** 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 ){ +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_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); + } 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); @@ -207541,75 +205031,65 @@ static char *rbuVacuumTableStart( ** 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; +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 = ""; + const char* zSep = ""; int iCol = 0; - sqlite3_stmt *pXInfo = 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) ){ + 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) ){ + 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 ){ + if (iCid < 0) { + if (pIter->eType == RBU_PK_IPK) { int i; - for(i=0; pIter->abTblPk[i]==0; i++); - assert( inTblCol ); + for (i = 0; pIter->abTblPk[i] == 0; i++) + ; + assert(i < pIter->nTblCol); zCol = pIter->azTblCol[i]; - }else{ + } else { zCol = "_rowid_"; } - }else{ + } 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 - ); + 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 (bFailed) + goto index_start_out; - if( p->rc==SQLITE_OK ){ - sqlite3_stmt *pSel = 0; + 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) ){ + 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 ){ + for (iCol = 0; iCol < pIter->nCol; iCol++) { + const char* zQuoted = (const char*)sqlite3_column_text(pSel, iCol); + if (zQuoted == 0) { p->rc = SQLITE_NOMEM; - }else if( zQuoted[0]=='N' ){ + } else if (zQuoted[0] == 'N') { bFailed = 1; break; } @@ -207617,14 +205097,14 @@ static char *rbuVacuumIndexStart( zSep = ", "; } - if( !bFailed ){ + if (!bFailed) { zRet = rbuMPrintf(p, "(%s) > (%s)", zLhs, zVector); } } rbuFinalize(p, pSel); } - index_start_out: +index_start_out: sqlite3_free(zOrder); sqlite3_free(zSelect); sqlite3_free(zVector); @@ -207656,89 +205136,81 @@ static char *rbuVacuumIndexStart( ** 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) ){ +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; + const char* zCollate = (const char*)sqlite3_column_text(pXInfo, 4); + const char* zCol = 0; + const char* zType; - if( iCid==-2 ){ + 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 - ); + zRet = sqlite3_mprintf("%z%s(%.*s) COLLATE %Q", zRet, zCom, pIter->aIdxCol[iSeq].nSpan, pIter->aIdxCol[iSeq].zSpan, zCollate); zType = ""; - }else { - if( iCid<0 ){ + } 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 ){ + if (pIter->eType == RBU_PK_IPK) { int i; - for(i=0; pIter->abTblPk[i]==0; i++); - assert( inTblCol ); + for (i = 0; pIter->abTblPk[i] == 0; i++) + ; + assert(i < pIter->nTblCol); zCol = pIter->azTblCol[i]; - }else if( rbuIsVacuum(p) ){ + } else if (rbuIsVacuum(p)) { zCol = "_rowid_"; - }else{ + } else { zCol = "rbu_rowid"; } zType = "INTEGER"; - }else{ + } else { zCol = pIter->azTblCol[iCid]; zType = pIter->azTblType[iCid]; } - zRet = sqlite3_mprintf("%z%s\"%w\" COLLATE %Q", zRet, zCom,zCol,zCollate); + 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 - ); + 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; + 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) + rc = rc2; - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { sqlite3_free(zRet); sqlite3_free(zImpCols); sqlite3_free(zImpPK); @@ -207768,31 +205240,27 @@ static char *rbuObjIterGetIndexCols( ** 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 = ""; +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]; + for (i = 0; i < pIter->nTblCol; i++) { + if (pIter->abIndexed[i]) { + const char* zCol = pIter->azTblCol[i]; zList = sqlite3_mprintf("%z%s%s.\"%w\"", zList, zS, zObj, zCol); - }else{ + } else { zList = sqlite3_mprintf("%z%sNULL", zList, zS); } zS = ", "; - if( zList==0 ){ + 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 ){ + if (pIter->eType == RBU_PK_EXTERNAL || pIter->eType == RBU_PK_NONE) { zList = rbuMPrintf(p, "%z, %s._rowid_", zList, zObj); } } @@ -207809,33 +205277,28 @@ static char *rbuObjIterGetOldlist( ** ** "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 = ""; +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); + for (i = 0; i < pIter->nTblCol; 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 - ); + zList = rbuMPrintf(p, "_rowid_ = (SELECT id FROM rbu_imposter2 WHERE %z)", zList); - }else{ - const char *zSep = ""; + } 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); + for (i = 0; i < pIter->nTblCol; 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 "; } } @@ -207850,12 +205313,11 @@ static char *rbuObjIterGetWhere( ** 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){ +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 @@ -207873,37 +205335,25 @@ static void rbuBadControlError(sqlite3rbu *p){ ** 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 ){ +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 ){ + if ((int)strlen(zMask) != pIter->nTblCol) { rbuBadControlError(p); - }else{ - const char *zSep = ""; - for(i=0; inTblCol; i++){ + } else { + const char* zSep = ""; + for (i = 0; i < pIter->nTblCol; i++) { char c = zMask[pIter->aiSrcOrder[i]]; - if( c=='x' ){ - zList = rbuMPrintf(p, "%z%s\"%w\"=?%d", - zList, zSep, pIter->azTblCol[i], i+1 - ); + 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 - ); + } 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 - ); + } 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 = ", "; } } @@ -207927,16 +205377,16 @@ static char *rbuObjIterGetSetlist( ** 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; +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 ){ + 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 = */ +static char* rbuWithoutRowidPK(sqlite3rbu* p, RbuObjIter* pIter) { + char* z = 0; + assert(pIter->zIdx == 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) - ); + 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) ){ + 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" : ""; + 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 = ", "; } @@ -208013,45 +205459,39 @@ static char *rbuWithoutRowidPK(sqlite3rbu *p, RbuObjIter *pIter){ ** 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 */ +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 ){ + 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) ){ + 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) - ); + 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) ){ + while (p->rc == SQLITE_OK && SQLITE_ROW == sqlite3_step(pXInfo)) { int bKey = sqlite3_column_int(pXInfo, 5); - if( bKey ){ + 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":""); + 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 = ", "; } } @@ -208059,10 +205499,7 @@ static void rbuCreateImposterTable2(sqlite3rbu *p, RbuObjIter *pIter){ 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 - ); + 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); } } @@ -208087,47 +205524,41 @@ static void rbuCreateImposterTable2(sqlite3rbu *p, RbuObjIter *pIter){ ** 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 ){ +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; + 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; + for (iCol = 0; p->rc == SQLITE_OK && iCol < pIter->nTblCol; 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 - ); + 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 (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" : "") - ); + 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 ){ + 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" : "") - ); + 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); } } @@ -208143,88 +205574,70 @@ static void rbuCreateImposterTable(sqlite3rbu *p, RbuObjIter *pIter){ ** (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); +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 ){ + 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]); + for (i = 0; rc == SQLITE_OK && i < nVal; i++) { + rc = sqlite3_bind_value(p->objiter.pTmpInsert, i + 1, apVal[i]); } - if( rc==SQLITE_OK ){ + if (rc == SQLITE_OK) { sqlite3_step(p->objiter.pTmpInsert); rc = sqlite3_reset(p->objiter.pTmpInsert); } - if( rc!=SQLITE_OK ){ + if (rc != SQLITE_OK) { sqlite3_result_error_code(pCtx, rc); } } -static char *rbuObjIterGetIndexWhere(sqlite3rbu *p, RbuObjIter *pIter){ - sqlite3_stmt *pStmt = 0; +static char* rbuObjIterGetIndexWhere(sqlite3rbu* p, RbuObjIter* pIter) { + sqlite3_stmt* pStmt = 0; int rc = p->rc; - char *zRet = 0; + char* zRet = 0; - assert( pIter->zIdxSql==0 && pIter->nIdxCol==0 && pIter->aIdxCol==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) { + rc = prepareAndCollectError(p->dbMain, &pStmt, &p->zErrmsg, "SELECT trim(sql) FROM sqlite_schema WHERE type='index' AND name=?"); } - if( rc==SQLITE_OK ){ + 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 ){ + 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 */ + if (zSql) { + int nParen = 0; /* Number of open parenthesis */ int i; int iIdxCol = 0; int nIdxAlloc = 0; - for(i=0; zSql[i]; i++){ + 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 ){ + if (iIdxCol == nIdxAlloc) { + RbuSpan* aIdxCol = (RbuSpan*)sqlite3_realloc(pIter->aIdxCol, (nIdxAlloc + 16) * sizeof(RbuSpan)); + if (aIdxCol == 0) { rc = SQLITE_NOMEM; break; } @@ -208232,46 +205645,51 @@ static char *rbuObjIterGetIndexWhere(sqlite3rbu *p, RbuObjIter *pIter){ nIdxAlloc += 16; } - if( c=='(' ){ - if( nParen==0 ){ - assert( iIdxCol==0 ); - pIter->aIdxCol[0].zSpan = &zSql[i+1]; + if (c == '(') { + if (nParen == 0) { + assert(iIdxCol == 0); + pIter->aIdxCol[0].zSpan = &zSql[i + 1]; } nParen++; - } - else if( c==')' ){ + } else if (c == ')') { nParen--; - if( nParen==0 ){ + if (nParen == 0) { int nSpan = &zSql[i] - pIter->aIdxCol[iIdxCol].zSpan; pIter->aIdxCol[iIdxCol++].nSpan = nSpan; i++; break; } - }else if( c==',' && nParen==1 ){ + } 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; + 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 == '[') { + 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; + } 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] ){ + if (zSql[i]) { zRet = rbuStrndup(&zSql[i], &rc); } pIter->nIdxCol = iIdxCol; @@ -208279,7 +205697,8 @@ static char *rbuObjIterGetIndexWhere(sqlite3rbu *p, RbuObjIter *pIter){ } rc2 = sqlite3_finalize(pStmt); - if( rc==SQLITE_OK ) rc = rc2; + if (rc == SQLITE_OK) + rc = rc2; } p->rc = rc; @@ -208291,113 +205710,88 @@ static char *rbuObjIterGetIndexWhere(sqlite3rbu *p, RbuObjIter *pIter){ ** 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 ){ +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; + char* zCollist = 0; /* List of indexed columns */ + char** pz = &p->zErrmsg; + const char* zIdx = pIter->zIdx; + char* zLimit = 0; - if( nOffset ){ + if (nOffset) { zLimit = sqlite3_mprintf(" LIMIT -1 OFFSET %d", nOffset); - if( !zLimit ) p->rc = SQLITE_NOMEM; + 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; + 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 ); + assert(pIter->eType != RBU_PK_VTAB); zPart = rbuObjIterGetIndexWhere(p, pIter); - zCollist = rbuObjIterGetIndexCols( - p, pIter, &zImposterCols, &zImposterPK, &zWhere, &nBind - ); + 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", 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) - ); + 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) - ); + 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 ){ + if (p->rc == SQLITE_OK) { + char* zSql; + if (rbuIsVacuum(p)) { + char* zStart = 0; + if (nOffset) { zStart = rbuVacuumIndexStart(p, pIter); - if( zStart ){ + 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 - ); + 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{ + } 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); } } @@ -208407,17 +205801,15 @@ static int rbuObjIterPrepareAll( 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 */ + } 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"); + 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; @@ -208425,113 +205817,93 @@ static int rbuObjIterPrepareAll( /* Create the imposter table or tables (if required). */ rbuCreateImposterTable(p, pIter); rbuCreateImposterTable2(p, pIter); - zWrite = (pIter->eType==RBU_PK_VTAB ? "" : "rbu_imp_"); + 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 - ) - ); + 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 ){ + 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 - ) - ); + 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 ){ + 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 - ); + "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 ){ + "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 - ); + "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 ){ + 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 ){ + if (rbuIsVacuum(p)) { + if (nOffset) { zStart = rbuVacuumTableStart(p, pIter, bRbuRowid, zWrite); - if( zStart ){ + if (zStart) { sqlite3_free(zLimit); zLimit = 0; } } - if( bRbuRowid ){ + if (bRbuRowid) { zOrder = rbuMPrintf(p, "_rowid_"); - }else{ + } else { zOrder = rbuObjIterGetPkList(p, pIter, "", ", ", ""); } } - if( p->rc==SQLITE_OK ){ + 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_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); @@ -208558,14 +205930,13 @@ static int rbuObjIterPrepareAll( ** 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; +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 */ @@ -208575,9 +205946,9 @@ static int rbuGetUpdateStmt( ** 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)){ + for (pp = &pIter->pRbuUpdate; *pp; pp = &((*pp)->pNext)) { pUp = *pp; - if( strcmp(pUp->zMask, zMask)==0 ){ + if (strcmp(pUp->zMask, zMask) == 0) { *pp = pUp->pNext; pUp->pNext = pIter->pRbuUpdate; pIter->pRbuUpdate = pUp; @@ -208586,37 +205957,35 @@ static int rbuGetUpdateStmt( } nUp++; } - assert( pUp==0 || pUp->pNext==0 ); + assert(pUp == 0 || pUp->pNext == 0); - if( nUp>=SQLITE_RBU_UPDATE_CACHESIZE ){ - for(pp=&pIter->pRbuUpdate; *pp!=pUp; pp=&((*pp)->pNext)); + 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); + } 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; + 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 (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 - ); + 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); @@ -208626,16 +205995,12 @@ static int rbuGetUpdateStmt( 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; +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 ){ + if (p->rc) { p->zErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); sqlite3_close(db); db = 0; @@ -208647,8 +206012,8 @@ static sqlite3 *rbuOpenDbhandle( /* ** Free an RbuState object allocated by rbuLoadState(). */ -static void rbuFreeState(RbuState *p){ - if( p ){ +static void rbuFreeState(RbuState* p) { + if (p) { sqlite3_free(p->zTbl); sqlite3_free(p->zDataTbl); sqlite3_free(p->zIdx); @@ -208665,26 +206030,22 @@ static void rbuFreeState(RbuState *p){ ** 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; +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; + 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) ){ + 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 - ){ + if (pRet->eStage != RBU_STAGE_OAL && pRet->eStage != RBU_STAGE_MOVE && pRet->eStage != RBU_STAGE_CKPT) { p->rc = SQLITE_CORRUPT; } break; @@ -208731,13 +206092,13 @@ static RbuState *rbuLoadState(sqlite3rbu *p){ } } rc2 = sqlite3_finalize(pStmt); - if( rc==SQLITE_OK ) rc = rc2; + 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. @@ -208746,29 +206107,29 @@ static RbuState *rbuLoadState(sqlite3rbu *p){ ** 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 ); +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) ){ + 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"); + 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 ){ + if (p->zState) { rbuMPrintfExec(p, p->dbRbu, "ATTACH %Q AS stat", p->zState); memcpy(p->zStateDb, "stat", 4); - }else{ + } else { memcpy(p->zStateDb, "main", 4); } @@ -208811,31 +206172,33 @@ static void rbuOpenDatabase(sqlite3rbu *p, sqlite3 *dbMain, int *pbRetry){ } #endif - if( p->rc==SQLITE_OK && rbuIsVacuum(p) ){ + 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 ){ + 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); + } 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); + 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) ){ + 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 ){ + } else if (p->pRbuFd->pWalFd) { + if (pbRetry) { p->pRbuFd->bNolock = 0; sqlite3_close(p->dbRbu); sqlite3_close(p->dbMain); @@ -208846,50 +206209,44 @@ static void rbuOpenDatabase(sqlite3rbu *p, sqlite3 *dbMain, int *pbRetry){ } 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) ){ + } 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; + while (*zExtra) { + if (*zExtra++ == '?') + break; } - if( *zExtra=='\0' ) zExtra = 0; + 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) - ); + 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 ){ + if (zTarget == 0) { p->rc = SQLITE_NOMEM; return; } - p->dbMain = rbuOpenDbhandle(p, zTarget, p->nRbu<=1); + 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_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->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_create_function(p->dbRbu, "rbu_target_name", -1, SQLITE_UTF8, (void*)p, rbuTargetNameFunc, 0, 0); } - if( p->rc==SQLITE_OK ){ + 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"); @@ -208897,11 +206254,11 @@ static void rbuOpenDatabase(sqlite3rbu *p, sqlite3 *dbMain, int *pbRetry){ /* 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 ){ + if (p->rc == SQLITE_OK) { p->rc = sqlite3_file_control(p->dbMain, "main", SQLITE_FCNTL_RBU, (void*)p); } - if( p->rc==SQLITE_NOTFOUND ){ + if (p->rc == SQLITE_NOTFOUND) { p->rc = SQLITE_ERROR; p->zErrmsg = sqlite3_mprintf("rbu vfs not found"); } @@ -208927,16 +206284,18 @@ static void rbuOpenDatabase(sqlite3rbu *p, sqlite3 *dbMain, int *pbRetry){ ** test.db-shm => test.shm ** test.db-mj7f3319fa => test.9fa */ -static void rbuFileSuffix3(const char *zBase, char *z){ +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) ) +#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); + 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 } @@ -208948,13 +206307,13 @@ static void rbuFileSuffix3(const char *zBase, char *z){ ** 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){ +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 ){ + 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]; } } @@ -208977,14 +206336,14 @@ static i64 rbuShmChecksum(sqlite3rbu *p){ ** other client appends a transaction to the wal file in the middle of ** an incremental checkpoint. */ -static void rbuSetupCheckpoint(sqlite3rbu *p, RbuState *pState){ +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 ){ + if (pState == 0) { p->eStage = 0; - if( p->rc==SQLITE_OK ){ + if (p->rc == SQLITE_OK) { p->rc = sqlite3_exec(p->dbMain, "SELECT * FROM sqlite_schema", 0, 0, 0); } } @@ -209017,33 +206376,34 @@ static void rbuSetupCheckpoint(sqlite3rbu *p, RbuState *pState){ ** data from the wal file into the database file according to the ** contents of aFrame[]. */ - if( p->rc==SQLITE_OK ){ + 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; + 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 ){ + 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) ){ + if (p->rc == SQLITE_OK) { + if (p->nFrame == 0 || (pState && pState->iWalCksum != p->iWalCksum)) { p->rc = SQLITE_DONE; p->eStage = RBU_STAGE_DONE; - }else{ + } else { int nSectorSize; - sqlite3_file *pDb = p->pTargetFd->pReal; - sqlite3_file *pWal = p->pTargetFd->pWalFd->pReal; - assert( p->nPagePerSector==0 ); + 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 ){ + if (nSectorSize > p->pgsz) { p->nPagePerSector = nSectorSize / p->pgsz; - }else{ + } else { p->nPagePerSector = 1; } @@ -209061,27 +206421,29 @@ static void rbuSetupCheckpoint(sqlite3rbu *p, RbuState *pState){ ** 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 ){ + if (pRbu->mLock != mReq) { pRbu->rc = SQLITE_BUSY; return SQLITE_INTERNAL; } pRbu->pgsz = iAmt; - if( pRbu->nFrame==pRbu->nFrameAlloc ){ + if (pRbu->nFrame == pRbu->nFrameAlloc) { int nNew = (pRbu->nFrameAlloc ? pRbu->nFrameAlloc : 64) * 2; - RbuFrame *aNew; + RbuFrame* aNew; aNew = (RbuFrame*)sqlite3_realloc64(pRbu->aFrame, nNew * sizeof(RbuFrame)); - if( aNew==0 ) return SQLITE_NOMEM; + if (aNew == 0) + return SQLITE_NOMEM; pRbu->aFrame = aNew; pRbu->nFrameAlloc = nNew; } - iFrame = (u32)((iOff-32) / (i64)(iAmt+24)) + 1; - if( pRbu->iMaxFrame