From e996e15328a0a608a438c3903bad514cdbfee718 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 1 Sep 2024 14:41:35 +0200 Subject: [PATCH 001/156] add yalc to gitignore --- .gitignore | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index fadab267..8fe028f6 100644 --- a/.gitignore +++ b/.gitignore @@ -74,4 +74,8 @@ android/.cxx lib/ # Gradle android/gradle/ -android/gradle* \ No newline at end of file +android/gradle* + +# Yalc +.yalc +yalc.lock From 86bd0247f997514a3be4404f48934c7860f20d58 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 1 Sep 2024 14:41:59 +0200 Subject: [PATCH 002/156] add nitro-modules deps --- package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index ea4ec6cc..a8354a51 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "registry": "https://registry.npmjs.org/" }, "devDependencies": { + "nitro-codegen": "^0.6.0", "react": "18.2.0", "react-native": "0.71.0", "react-native-builder-bob": "^0.18.2", @@ -53,7 +54,8 @@ }, "peerDependencies": { "react": "*", - "react-native": "*" + "react-native": "*", + "react-native-nitro-modules": "*" }, "prettier": { "quoteProps": "consistent", From 397007c2facd2b9d32515b2e5c5436704b72c7f3 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 1 Sep 2024 14:42:03 +0200 Subject: [PATCH 003/156] add nitro.json --- nitro.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 nitro.json diff --git a/nitro.json b/nitro.json new file mode 100644 index 00000000..f72b6f5f --- /dev/null +++ b/nitro.json @@ -0,0 +1,14 @@ +{ + "cxxNamespace": [ + "com::margelo::rnquicksqlite" + ], + "ios": { + "iosModulename": "RNQuickSQLite" + }, + "android": { + "androidNamespace": [ + "com.margelo.rnquicksqlite" + ], + "androidCxxLibName": "RNQuickSQLite" + } +} From 5302e24c8705381b9bf7231b27051900479e7a34 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 1 Sep 2024 14:42:20 +0200 Subject: [PATCH 004/156] implement nitro spec and restructure --- src/index.ts | 189 +++------------------------------ src/specs/QuickSQLite.nitro.ts | 39 +++++++ src/types.ts | 105 ++++++++++++++++++ 3 files changed, 156 insertions(+), 177 deletions(-) create mode 100644 src/specs/QuickSQLite.nitro.ts create mode 100644 src/types.ts diff --git a/src/index.ts b/src/index.ts index b3e7fc74..ed332615 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,166 +1,15 @@ -import { NativeModules } from 'react-native'; - -declare global { - function nativeCallSyncHook(): unknown; - var __QuickSQLiteProxy: object | undefined; -} - -if (global.__QuickSQLiteProxy == null) { - const QuickSQLiteModule = NativeModules.QuickSQLite; - - if (QuickSQLiteModule == null) { - throw new Error( - 'Base quick-sqlite module not found. Maybe try rebuilding the app.' - ); - } - - // Check if we are running on-device (JSI) - if (global.nativeCallSyncHook == null || QuickSQLiteModule.install == null) { - throw new Error( - 'Failed to install react-native-quick-sqlite: React Native is not running on-device. QuickSQLite can only be used when synchronous method invocations (JSI) are possible. If you are using a remote debugger (e.g. Chrome), switch to an on-device debugger (e.g. Flipper) instead.' - ); - } - - // Call the synchronous blocking install() function - const result = QuickSQLiteModule.install(); - if (result !== true) { - throw new Error( - `Failed to install react-native-quick-sqlite: The native QuickSQLite Module could not be installed! Looks like something went wrong when installing JSI bindings: ${result}` - ); - } - - // Check again if the constructor now exists. If not, throw an error. - if (global.__QuickSQLiteProxy == null) { - throw new Error( - 'Failed to install react-native-quick-sqlite, the native initializer function does not exist. Are you trying to use QuickSQLite from different JS Runtimes?' - ); - } -} - -const proxy = global.__QuickSQLiteProxy; -export const QuickSQLite = proxy as ISQLite; - -/** - * Object returned by SQL Query executions { - * insertId: Represent the auto-generated row id if applicable - * rowsAffected: Number of affected rows if result of a update query - * message: if status === 1, here you will find error description - * rows: if status is undefined or 0 this object will contain the query results - * } - * - * @interface QueryResult - */ -export type QueryResult = { - insertId?: number; - rowsAffected: number; - rows?: { - /** Raw array with all dataset */ - _array: any[]; - /** The lengh of the dataset */ - length: number; - /** A convenience function to acess the index based the row object - * @param idx the row index - * @returns the row structure identified by column names - */ - item: (idx: number) => any; - }; - /** - * Query metadata, avaliable only for select query results - */ - metadata?: ColumnMetadata[]; -}; - -/** - * Column metadata - * Describes some information about columns fetched by the query - */ -export type ColumnMetadata = { - /** The name used for this column for this resultset */ - columnName: string; - /** The declared column type for this column, when fetched directly from a table or a View resulting from a table column. "UNKNOWN" for dynamic values, like function returned ones. */ - columnDeclaredType: string; - /** - * The index for this column for this resultset*/ - columnIndex: number; -}; - -/** - * Allows the execution of bulk of sql commands - * inside a transaction - * If a single query must be executed many times with different arguments, its preferred - * to declare it a single time, and use an array of array parameters. - */ -export type SQLBatchTuple = [string] | [string, Array | Array>]; - -/** - * status: 0 or undefined for correct execution, 1 for error - * message: if status === 1, here you will find error description - * rowsAffected: Number of affected rows if status == 0 - */ -export type BatchQueryResult = { - rowsAffected?: number; -}; - -/** - * Result of loading a file and executing every line as a SQL command - * Similar to BatchQueryResult - */ -export interface FileLoadResult extends BatchQueryResult { - commands?: number; -} - -export interface Transaction { - commit: () => QueryResult; - execute: (query: string, params?: any[]) => QueryResult; - executeAsync: ( - query: string, - params?: any[] | undefined - ) => Promise; - rollback: () => QueryResult; -} - -export interface PendingTransaction { - /* - * The start function should not throw or return a promise because the - * queue just calls it and does not monitor for failures or completions. - * - * It should catch any errors and call the resolve or reject of the wrapping - * promise when complete. - * - * It should also automatically commit or rollback the transaction if needed - */ - start: () => void; -} - -interface ISQLite { - open: (dbName: string, location?: string) => void; - close: (dbName: string) => void; - delete: (dbName: string, location?: string) => void; - attach: ( - mainDbName: string, - dbNameToAttach: string, - alias: string, - location?: string - ) => void; - detach: (mainDbName: string, alias: string) => void; - transaction: ( - dbName: string, - fn: (tx: Transaction) => Promise | void - ) => Promise; - execute: (dbName: string, query: string, params?: any[]) => QueryResult; - executeAsync: ( - dbName: string, - query: string, - params?: any[] - ) => Promise; - executeBatch: (dbName: string, commands: SQLBatchTuple[]) => BatchQueryResult; - executeBatchAsync: ( - dbName: string, - commands: SQLBatchTuple[] - ) => Promise; - loadFile: (dbName: string, location: string) => FileLoadResult; - loadFileAsync: (dbName: string, location: string) => Promise; -} +import { NitroModules } from 'react-native-nitro-modules'; +import { RNQuickSQLite } from 'src/specs/QuickSQLite.nitro'; +import { + PendingTransaction, + QueryResult, + QuickSQLiteConnection, + SQLBatchTuple, + Transaction, +} from 'src/types'; + +const QuickSQLite = + NitroModules.createHybridObject('RNQuickSQLite'); const locks: Record< string, @@ -415,20 +264,6 @@ export const typeORMDriver = { }, }; -export type QuickSQLiteConnection = { - close: () => void; - delete: () => void; - attach: (dbNameToAttach: string, alias: string, location?: string) => void; - detach: (alias: string) => void; - transaction: (fn: (tx: Transaction) => Promise | void) => Promise; - execute: (query: string, params?: any[]) => QueryResult; - executeAsync: (query: string, params?: any[]) => Promise; - executeBatch: (commands: SQLBatchTuple[]) => BatchQueryResult; - executeBatchAsync: (commands: SQLBatchTuple[]) => Promise; - loadFile: (location: string) => FileLoadResult; - loadFileAsync: (location: string) => Promise; -}; - export const open = (options: { name: string; location?: string; diff --git a/src/specs/QuickSQLite.nitro.ts b/src/specs/QuickSQLite.nitro.ts new file mode 100644 index 00000000..2d8eeb99 --- /dev/null +++ b/src/specs/QuickSQLite.nitro.ts @@ -0,0 +1,39 @@ +import { HybridObject } from 'react-native-nitro-modules'; +import { + BatchQueryResult, + FileLoadResult, + QueryResult, + SQLBatchTuple, + Transaction, +} from 'src/types'; + +export interface RNQuickSQLite + extends HybridObject<{ ios: 'c++'; android: 'c++' }> { + open: (dbName: string, location?: string) => void; + close: (dbName: string) => void; + delete: (dbName: string, location?: string) => void; + attach: ( + mainDbName: string, + dbNameToAttach: string, + alias: string, + location?: string + ) => void; + detach: (mainDbName: string, alias: string) => void; + transaction: ( + dbName: string, + fn: (tx: Transaction) => Promise | void + ) => Promise; + execute: (dbName: string, query: string, params?: any[]) => QueryResult; + executeAsync: ( + dbName: string, + query: string, + params?: any[] + ) => Promise; + executeBatch: (dbName: string, commands: SQLBatchTuple[]) => BatchQueryResult; + executeBatchAsync: ( + dbName: string, + commands: SQLBatchTuple[] + ) => Promise; + loadFile: (dbName: string, location: string) => FileLoadResult; + loadFileAsync: (dbName: string, location: string) => Promise; +} diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 00000000..def288a0 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,105 @@ +/** + * Object returned by SQL Query executions { + * insertId: Represent the auto-generated row id if applicable + * rowsAffected: Number of affected rows if result of a update query + * message: if status === 1, here you will find error description + * rows: if status is undefined or 0 this object will contain the query results + * } + * + * @interface QueryResult + */ +export type QueryResult = { + insertId?: number; + rowsAffected: number; + rows?: { + /** Raw array with all dataset */ + _array: any[]; + /** The lengh of the dataset */ + length: number; + /** A convenience function to acess the index based the row object + * @param idx the row index + * @returns the row structure identified by column names + */ + item: (idx: number) => any; + }; + /** + * Query metadata, avaliable only for select query results + */ + metadata?: ColumnMetadata[]; +}; + +/** + * Column metadata + * Describes some information about columns fetched by the query + */ +export type ColumnMetadata = { + /** The name used for this column for this resultset */ + columnName: string; + /** The declared column type for this column, when fetched directly from a table or a View resulting from a table column. "UNKNOWN" for dynamic values, like function returned ones. */ + columnDeclaredType: string; + /** + * The index for this column for this resultset*/ + columnIndex: number; +}; + +/** + * Allows the execution of bulk of sql commands + * inside a transaction + * If a single query must be executed many times with different arguments, its preferred + * to declare it a single time, and use an array of array parameters. + */ +export type SQLBatchTuple = [string] | [string, Array | Array>]; + +/** + * status: 0 or undefined for correct execution, 1 for error + * message: if status === 1, here you will find error description + * rowsAffected: Number of affected rows if status == 0 + */ +export type BatchQueryResult = { + rowsAffected?: number; +}; + +/** + * Result of loading a file and executing every line as a SQL command + * Similar to BatchQueryResult + */ +export interface FileLoadResult extends BatchQueryResult { + commands?: number; +} + +export interface Transaction { + commit: () => QueryResult; + execute: (query: string, params?: any[]) => QueryResult; + executeAsync: ( + query: string, + params?: any[] | undefined + ) => Promise; + rollback: () => QueryResult; +} + +export interface PendingTransaction { + /* + * The start function should not throw or return a promise because the + * queue just calls it and does not monitor for failures or completions. + * + * It should catch any errors and call the resolve or reject of the wrapping + * promise when complete. + * + * It should also automatically commit or rollback the transaction if needed + */ + start: () => void; +} + +export type QuickSQLiteConnection = { + close: () => void; + delete: () => void; + attach: (dbNameToAttach: string, alias: string, location?: string) => void; + detach: (alias: string) => void; + transaction: (fn: (tx: Transaction) => Promise | void) => Promise; + execute: (query: string, params?: any[]) => QueryResult; + executeAsync: (query: string, params?: any[]) => Promise; + executeBatch: (commands: SQLBatchTuple[]) => BatchQueryResult; + executeBatchAsync: (commands: SQLBatchTuple[]) => Promise; + loadFile: (location: string) => FileLoadResult; + loadFileAsync: (location: string) => Promise; +}; From bf79fd984232993614a1eee13c87cb81fbcaa7f7 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 1 Sep 2024 14:54:12 +0200 Subject: [PATCH 005/156] fix: nitro.json --- nitro.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nitro.json b/nitro.json index f72b6f5f..83aea8e4 100644 --- a/nitro.json +++ b/nitro.json @@ -1,13 +1,13 @@ { "cxxNamespace": [ - "com::margelo::rnquicksqlite" + "rnquicksqlite" ], "ios": { "iosModulename": "RNQuickSQLite" }, "android": { "androidNamespace": [ - "com.margelo.rnquicksqlite" + "rnquicksqlite" ], "androidCxxLibName": "RNQuickSQLite" } From 2bc63f5afddf4b2ca24d393d70633bd8e0066bb1 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 1 Sep 2024 14:54:26 +0200 Subject: [PATCH 006/156] rename nitro spec interface --- src/index.ts | 4 ++-- src/specs/QuickSQLite.nitro.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/index.ts b/src/index.ts index ed332615..3f1b61a7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ import { NitroModules } from 'react-native-nitro-modules'; -import { RNQuickSQLite } from 'src/specs/QuickSQLite.nitro'; +import { QuickSQLite } from 'src/specs/QuickSQLite.nitro'; import { PendingTransaction, QueryResult, @@ -9,7 +9,7 @@ import { } from 'src/types'; const QuickSQLite = - NitroModules.createHybridObject('RNQuickSQLite'); + NitroModules.createHybridObject('RNQuickSQLite'); const locks: Record< string, diff --git a/src/specs/QuickSQLite.nitro.ts b/src/specs/QuickSQLite.nitro.ts index 2d8eeb99..32811991 100644 --- a/src/specs/QuickSQLite.nitro.ts +++ b/src/specs/QuickSQLite.nitro.ts @@ -7,7 +7,7 @@ import { Transaction, } from 'src/types'; -export interface RNQuickSQLite +export interface QuickSQLite extends HybridObject<{ ios: 'c++'; android: 'c++' }> { open: (dbName: string, location?: string) => void; close: (dbName: string) => void; From 66c10dae2abc8fead326cecf00701bd32190dd0b Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 1 Sep 2024 15:23:09 +0200 Subject: [PATCH 007/156] first (partial) nitrogen specs --- .../android/RNQuickSQLite+autolinking.cmake | 45 +++++++ .../android/RNQuickSQLite+autolinking.gradle | 26 ++++ .../ios/RNQuickSQLite+autolinking.rb | 57 +++++++++ .../ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp | 9 ++ .../ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 117 ++++++++++++++++++ .../ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp | 40 ++++++ .../shared/c++/HybridQuickSQLiteSpec.cpp | 33 +++++ .../shared/c++/HybridQuickSQLiteSpec.hpp | 75 +++++++++++ nitrogen/generated/shared/c++/Transaction.hpp | 69 +++++++++++ 9 files changed, 471 insertions(+) create mode 100644 nitrogen/generated/android/RNQuickSQLite+autolinking.cmake create mode 100644 nitrogen/generated/android/RNQuickSQLite+autolinking.gradle create mode 100644 nitrogen/generated/ios/RNQuickSQLite+autolinking.rb create mode 100644 nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp create mode 100644 nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp create mode 100644 nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp create mode 100644 nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp create mode 100644 nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp create mode 100644 nitrogen/generated/shared/c++/Transaction.hpp diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake new file mode 100644 index 00000000..2180e871 --- /dev/null +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake @@ -0,0 +1,45 @@ +# +# RNQuickSQLite+autolinking.cmake +# Sun Sep 01 2024 +# This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +# https://github.com/mrousavy/nitro +# Copyright © 2024 Marc Rousavy @ Margelo +# + +# This is a CMake file that adds all files generated by Nitrogen +# to the current CMake project. +# +# To use it, add this to your CMakeLists.txt: +# ```cmake +# include(${CMAKE_SOURCE_DIR}/../nitrogen/generated/android/RNQuickSQLite+autolinking.cmake) +# ``` + +# Add all headers that were generated by Nitrogen +include_directories( + "../nitrogen/generated/shared/c++" + "../nitrogen/generated/android/c++" +) + +# Add all .cpp sources that were generated by Nitrogen +target_sources( + # CMake project name (Android C++ library name) + RNQuickSQLite PRIVATE + # Shared Nitrogen C++ sources + ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp + # Android-specific Nitrogen C++ sources + +) + +# Add all libraries required by the generated specs +find_package(fbjni REQUIRED) # <-- Used for communication between Java <-> C++ +find_package(ReactAndroid REQUIRED) # <-- Used to set up React Native bindings (e.g. CallInvoker/TurboModule) +find_package(react-native-nitro-modules REQUIRED) # <-- Used to create all HybridObjects and use the Nitro core library + +# Link all libraries together +target_link_libraries( + RNQuickSQLite + fbjni::fbjni # <-- Facebook C++ JNI helpers + ReactAndroid::jsi # <-- RN: JSI + ReactAndroid::react_nativemodule_core # <-- RN: TurboModules Core + react-native-nitro-modules::NitroModules # <-- NitroModules Core :) +) diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle b/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle new file mode 100644 index 00000000..f54b1134 --- /dev/null +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle @@ -0,0 +1,26 @@ +/// +/// RNQuickSQLite+autolinking.gradle +/// Sun Sep 01 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +/// This is a Gradle file that adds all files generated by Nitrogen +/// to the current Gradle project. +/// +/// To use it, add this to your build.gradle: +/// ```gradle +/// apply from: '../nitrogen/generated/android/RNQuickSQLite+autolinking.gradle' +/// ``` + +android { + sourceSets { + main { + java.srcDirs += [ + // Nitrogen files + "${project.projectDir}/../nitrogen/generated/android/kotlin" + ] + } + } +} diff --git a/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb b/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb new file mode 100644 index 00000000..b7fccb2a --- /dev/null +++ b/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb @@ -0,0 +1,57 @@ +# +# RNQuickSQLite+autolinking.rb +# Sun Sep 01 2024 +# This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +# https://github.com/mrousavy/nitro +# Copyright © 2024 Marc Rousavy @ Margelo +# + +# This is a Ruby script that adds all files generated by Nitrogen +# to the given podspec. +# +# To use it, add this to your .podspec: +# ```ruby +# Pod::Spec.new do |spec| +# # ... +# +# # Add all files generated by Nitrogen +# load 'nitrogen/generated/ios/RNQuickSQLite+autolinking.rb' +# add_nitrogen_files(spec) +# end +# ``` + +def add_nitrogen_files(spec) + Pod::UI.puts "[NitroModules] Adding RNQuickSQLite specs..." + + spec.dependency "NitroModules" + + current_source_files = spec.attributes_hash['source_files'] || [] + spec.source_files = current_source_files + [ + # Generated cross-platform specs + "nitrogen/generated/shared/**/*.{h,hpp,c,cpp,swift}", + # Generated bridges for the cross-platform specs + "nitrogen/generated/ios/**/*.{h,hpp,c,cpp,swift}", + ] + + current_public_header_files = spec.attributes_hash['public_header_files'] || [] + spec.public_header_files = current_public_header_files + [ + # Generated specs + "nitrogen/generated/shared/**/*.{h,hpp}", + # Swift to C++ bridging helpers + "nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp" + ] + + current_private_header_files = spec.attributes_hash['private_header_files'] || [] + spec.private_header_files = current_private_header_files + [ + # iOS specific specs + "nitrogen/generated/ios/c++/**/*.{h,hpp}", + ] + + current_pod_target_xcconfig = spec.attributes_hash['pod_target_xcconfig'] || {} + spec.pod_target_xcconfig = current_pod_target_xcconfig.merge({ + # Use C++ 20 + "CLANG_CXX_LANGUAGE_STANDARD" => "c++20", + # Enables C++ <-> Swift interop (by default it's only C) + "SWIFT_OBJC_INTEROP_MODE" => "objcxx", + }) +end diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp new file mode 100644 index 00000000..fba36231 --- /dev/null +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp @@ -0,0 +1,9 @@ +/// +/// RNQuickSQLite-Swift-Cxx-Bridge.cpp +/// Sun Sep 01 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#include "RNQuickSQLite-Swift-Cxx-Bridge.hpp" diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp new file mode 100644 index 00000000..9c706013 --- /dev/null +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -0,0 +1,117 @@ +/// +/// RNQuickSQLite-Swift-Cxx-Bridge.hpp +/// Sun Sep 01 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +// Forward declarations of C++ defined types +// Forward declaration of `Transaction` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct Transaction; } + +// Include C++ defined types +#include "Transaction.hpp" +#include +#include +#include +#include +#include + +/** + * Contains specialized versions of C++ templated types so they can be accessed from Swift, + * as well as helper functions to interact with those C++ types from Swift. + */ +namespace margelo::nitro::rnquicksqlite::bridge::swift { + + /** + * Specialized version of `std::function`. + */ + using Func_void_std__string_std__string = std::function; + inline Func_void_std__string_std__string create_Func_void_std__string_std__string(void* closureHolder, void(*call)(void* /* closureHolder */, std::string, std::string), void(*destroy)(void*)) { + std::shared_ptr sharedClosureHolder(closureHolder, destroy); + return [sharedClosureHolder, call](const std::string& dbName, const std::string& location) -> void { + call(sharedClosureHolder.get(), dbName, location); + }; + } + inline std::shared_ptr share_Func_void_std__string_std__string(const Func_void_std__string_std__string& value) { + return std::make_shared(value); + } + + /** + * Specialized version of `std::function`. + */ + using Func_void_std__string = std::function; + inline Func_void_std__string create_Func_void_std__string(void* closureHolder, void(*call)(void* /* closureHolder */, std::string), void(*destroy)(void*)) { + std::shared_ptr sharedClosureHolder(closureHolder, destroy); + return [sharedClosureHolder, call](const std::string& dbName) -> void { + call(sharedClosureHolder.get(), dbName); + }; + } + inline std::shared_ptr share_Func_void_std__string(const Func_void_std__string& value) { + return std::make_shared(value); + } + + /** + * Specialized version of `std::function`. + */ + using Func_void_std__string_std__string_std__string_std__string = std::function; + inline Func_void_std__string_std__string_std__string_std__string create_Func_void_std__string_std__string_std__string_std__string(void* closureHolder, void(*call)(void* /* closureHolder */, std::string, std::string, std::string, std::string), void(*destroy)(void*)) { + std::shared_ptr sharedClosureHolder(closureHolder, destroy); + return [sharedClosureHolder, call](const std::string& mainDbName, const std::string& dbNameToAttach, const std::string& alias, const std::string& location) -> void { + call(sharedClosureHolder.get(), mainDbName, dbNameToAttach, alias, location); + }; + } + inline std::shared_ptr share_Func_void_std__string_std__string_std__string_std__string(const Func_void_std__string_std__string_std__string_std__string& value) { + return std::make_shared(value); + } + + /** + * Specialized version of `PromiseHolder`. + */ + using PromiseHolder_void_ = PromiseHolder; + inline PromiseHolder create_PromiseHolder_void_() { + return PromiseHolder(); + } + + /** + * Specialized version of `std::function>(const Transaction& / * tx * /)>`. + */ + using Func_std__future_std__future_void___Transaction = std::function>(const Transaction& /* tx */)>; + inline Func_std__future_std__future_void___Transaction create_Func_std__future_std__future_void___Transaction(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, Transaction), void(*destroy)(void*)) { + std::shared_ptr sharedClosureHolder(closureHolder, destroy); + return [sharedClosureHolder, call](const Transaction& tx) -> std::future> { + auto result = call(sharedClosureHolder.get(), tx); + return result.getFuture(); + }; + } + inline std::shared_ptr share_Func_std__future_std__future_void___Transaction(const Func_std__future_std__future_void___Transaction& value) { + return std::make_shared(value); + } + + /** + * Specialized version of `PromiseHolder>`. + */ + using PromiseHolder_std__future_void__ = PromiseHolder>; + inline PromiseHolder> create_PromiseHolder_std__future_void__() { + return PromiseHolder>(); + } + + /** + * Specialized version of `std::function>(const std::string& / * dbName * /, const std::function>(const Transaction& / * tx * /)>& / * fn * /)>`. + */ + using Func_std__future_std__future_void___std__string_std__function_std__future_std__future_void___const_Transaction_____tx_____ = std::function>(const std::string& /* dbName */, const std::function>(const Transaction& /* tx */)>& /* fn */)>; + inline Func_std__future_std__future_void___std__string_std__function_std__future_std__future_void___const_Transaction_____tx_____ create_Func_std__future_std__future_void___std__string_std__function_std__future_std__future_void___const_Transaction_____tx_____(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, std::string, std::function>(const Transaction& /* tx */)>), void(*destroy)(void*)) { + std::shared_ptr sharedClosureHolder(closureHolder, destroy); + return [sharedClosureHolder, call](const std::string& dbName, const std::function>(const Transaction& /* tx */)>& fn) -> std::future> { + auto result = call(sharedClosureHolder.get(), dbName, fn); + return result.getFuture(); + }; + } + inline std::shared_ptr share_Func_std__future_std__future_void___std__string_std__function_std__future_std__future_void___const_Transaction_____tx_____(const Func_std__future_std__future_void___std__string_std__function_std__future_std__future_void___const_Transaction_____tx_____& value) { + return std::make_shared(value); + } + +} // namespace margelo::nitro::rnquicksqlite::bridge::swift diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp new file mode 100644 index 00000000..6b22c97f --- /dev/null +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp @@ -0,0 +1,40 @@ +/// +/// RNQuickSQLite-Swift-Cxx-Umbrella.hpp +/// Sun Sep 01 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +// Forward declarations of C++ defined types +// Forward declaration of `Transaction` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct Transaction; } + +// Include C++ defined types +#include "Transaction.hpp" +#include +#include +#include + +// C++ helpers for Swift +#include "RNQuickSQLite-Swift-Cxx-Bridge.hpp" + +// Common C++ types used in Swift +#include +#include +#include +#include + +// Forward declarations of Swift defined types + + +// Include Swift defined types +#if __has_include("RNQuickSQLite-Swift.h") +// This header is generated by Xcode/Swift on every app build. +// If it cannot be found, make sure the Swift module's name (= podspec name) is actually "RNQuickSQLite". +#include "RNQuickSQLite-Swift.h" +#else +#error RNQuickSQLite's autogenerated Swift header cannot be found! Make sure the Swift module's name (= podspec name) is actually "RNQuickSQLite", and try building the app first. +#endif diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp new file mode 100644 index 00000000..15f4435b --- /dev/null +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp @@ -0,0 +1,33 @@ +/// +/// HybridQuickSQLiteSpec.cpp +/// Sun Sep 01 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#include "HybridQuickSQLiteSpec.hpp" + +namespace margelo::nitro::rnquicksqlite { + + void HybridQuickSQLiteSpec::loadHybridMethods() { + // load base methods/properties + HybridObject::loadHybridMethods(); + // load custom methods/properties + registerHybrids(this, [](Prototype& prototype) { + prototype.registerHybridGetter("open", &HybridQuickSQLiteSpec::getOpen); + prototype.registerHybridSetter("open", &HybridQuickSQLiteSpec::setOpen); + prototype.registerHybridGetter("close", &HybridQuickSQLiteSpec::getClose); + prototype.registerHybridSetter("close", &HybridQuickSQLiteSpec::setClose); + prototype.registerHybridGetter("delete", &HybridQuickSQLiteSpec::getDelete); + prototype.registerHybridSetter("delete", &HybridQuickSQLiteSpec::setDelete); + prototype.registerHybridGetter("attach", &HybridQuickSQLiteSpec::getAttach); + prototype.registerHybridSetter("attach", &HybridQuickSQLiteSpec::setAttach); + prototype.registerHybridGetter("detach", &HybridQuickSQLiteSpec::getDetach); + prototype.registerHybridSetter("detach", &HybridQuickSQLiteSpec::setDetach); + prototype.registerHybridGetter("transaction", &HybridQuickSQLiteSpec::getTransaction); + prototype.registerHybridSetter("transaction", &HybridQuickSQLiteSpec::setTransaction); + }); + } + +} // namespace margelo::nitro::rnquicksqlite diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp new file mode 100644 index 00000000..45f7d26b --- /dev/null +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp @@ -0,0 +1,75 @@ +/// +/// HybridQuickSQLiteSpec.hpp +/// Sun Sep 01 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +// Forward declaration of `Transaction` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct Transaction; } + +#include +#include +#include +#include "Transaction.hpp" + +namespace margelo::nitro::rnquicksqlite { + + using namespace margelo::nitro; + + /** + * An abstract base class for `QuickSQLite` + * Inherit this class to create instances of `HybridQuickSQLiteSpec` in C++. + * @example + * ```cpp + * class HybridQuickSQLite: public HybridQuickSQLiteSpec { + * // ... + * }; + * ``` + */ + class HybridQuickSQLiteSpec: public virtual HybridObject { + public: + // Constructor + explicit HybridQuickSQLiteSpec(): HybridObject(TAG) { } + + // Destructor + virtual ~HybridQuickSQLiteSpec() { } + + public: + // Properties + virtual std::function getOpen() = 0; + virtual void setOpen(const std::function& open) = 0; + virtual std::function getClose() = 0; + virtual void setClose(const std::function& close) = 0; + virtual std::function getDelete() = 0; + virtual void setDelete(const std::function& delete) = 0; + virtual std::function getAttach() = 0; + virtual void setAttach(const std::function& attach) = 0; + virtual std::function getDetach() = 0; + virtual void setDetach(const std::function& detach) = 0; + virtual std::function>(const std::string& /* dbName */, const std::function>(const Transaction& /* tx */)>& /* fn */)> getTransaction() = 0; + virtual void setTransaction(const std::function>(const std::string& /* dbName */, const std::function>(const Transaction& /* tx */)>& /* fn */)>& transaction) = 0; + + public: + // Methods + + + protected: + // Hybrid Setup + void loadHybridMethods() override; + + protected: + // Tag for logging + static constexpr auto TAG = "QuickSQLite"; + }; + +} // namespace margelo::nitro::rnquicksqlite diff --git a/nitrogen/generated/shared/c++/Transaction.hpp b/nitrogen/generated/shared/c++/Transaction.hpp new file mode 100644 index 00000000..496f91da --- /dev/null +++ b/nitrogen/generated/shared/c++/Transaction.hpp @@ -0,0 +1,69 @@ +/// +/// Transaction.hpp +/// Sun Sep 01 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + + + + + +namespace margelo::nitro::rnquicksqlite { + + /** + * A struct which can be represented as a JavaScript object (Transaction). + */ + struct Transaction { + public: + + + public: + explicit Transaction(): {} + }; + +} // namespace margelo::nitro::rnquicksqlite + +namespace margelo::nitro { + + using namespace margelo::nitro::rnquicksqlite; + + // C++ Transaction <> JS Transaction (object) + template <> + struct JSIConverter { + static inline Transaction fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return Transaction( + + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const Transaction& arg) { + jsi::Object obj(runtime); + + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + + return true; + } + }; + +} // namespace margelo::nitro From d37f1aac1c5d8c0dbbbde505d62043cda584552c Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 1 Sep 2024 15:26:24 +0200 Subject: [PATCH 008/156] full nitrogen specs (with string instead of any) --- .../ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 349 ++++++++++++++++++ .../ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp | 19 + .../generated/shared/c++/BatchQueryResult.hpp | 69 ++++ .../generated/shared/c++/ColumnMetadata.hpp | 77 ++++ .../generated/shared/c++/FileLoadResult.hpp | 73 ++++ .../shared/c++/HybridQuickSQLiteSpec.cpp | 12 + .../shared/c++/HybridQuickSQLiteSpec.hpp | 24 ++ nitrogen/generated/shared/c++/QueryResult.hpp | 87 +++++ .../generated/shared/c++/QueryResultRow.hpp | 80 ++++ nitrogen/generated/shared/c++/Transaction.hpp | 31 +- 10 files changed, 814 insertions(+), 7 deletions(-) create mode 100644 nitrogen/generated/shared/c++/BatchQueryResult.hpp create mode 100644 nitrogen/generated/shared/c++/ColumnMetadata.hpp create mode 100644 nitrogen/generated/shared/c++/FileLoadResult.hpp create mode 100644 nitrogen/generated/shared/c++/QueryResult.hpp create mode 100644 nitrogen/generated/shared/c++/QueryResultRow.hpp diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index 9c706013..327b8b16 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -9,16 +9,35 @@ #pragma once // Forward declarations of C++ defined types +// Forward declaration of `BatchQueryResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } +// Forward declaration of `ColumnMetadata` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } +// Forward declaration of `FileLoadResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } +// Forward declaration of `QueryResultRow` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct QueryResultRow; } +// Forward declaration of `QueryResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct QueryResult; } // Forward declaration of `Transaction` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct Transaction; } // Include C++ defined types +#include "BatchQueryResult.hpp" +#include "ColumnMetadata.hpp" +#include "FileLoadResult.hpp" +#include "QueryResult.hpp" +#include "QueryResultRow.hpp" #include "Transaction.hpp" #include #include #include #include +#include #include +#include +#include +#include /** * Contains specialized versions of C++ templated types so they can be accessed from Swift, @@ -76,6 +95,144 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { return PromiseHolder(); } + /** + * Specialized version of `std::optional`. + */ + using std__optional_double_ = std::optional; + inline std::optional create_std__optional_double_(const double& value) { + return std::optional(value); + } + + /** + * Specialized version of `std::vector`. + */ + using std__vector_std__string_ = std::vector; + inline std::vector create_std__vector_std__string_(size_t size) { + std::vector vector; + vector.reserve(size); + return vector; + } + + /** + * Specialized version of `std::function(double / * idx * /)>`. + */ + using Func_std__future_std__string__double = std::function(double /* idx */)>; + inline Func_std__future_std__string__double create_Func_std__future_std__string__double(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, double), void(*destroy)(void*)) { + std::shared_ptr sharedClosureHolder(closureHolder, destroy); + return [sharedClosureHolder, call](double idx) -> std::future { + auto result = call(sharedClosureHolder.get(), idx); + return result.getFuture(); + }; + } + inline std::shared_ptr share_Func_std__future_std__string__double(const Func_std__future_std__string__double& value) { + return std::make_shared(value); + } + + /** + * Specialized version of `PromiseHolder`. + */ + using PromiseHolder_std__string_ = PromiseHolder; + inline PromiseHolder create_PromiseHolder_std__string_() { + return PromiseHolder(); + } + + /** + * Specialized version of `std::vector`. + */ + using std__vector_QueryResultRow_ = std::vector; + inline std::vector create_std__vector_QueryResultRow_(size_t size) { + std::vector vector; + vector.reserve(size); + return vector; + } + + /** + * Specialized version of `std::optional>`. + */ + using std__optional_std__vector_QueryResultRow__ = std::optional>; + inline std::optional> create_std__optional_std__vector_QueryResultRow__(const std::vector& value) { + return std::optional>(value); + } + + /** + * Specialized version of `std::vector`. + */ + using std__vector_ColumnMetadata_ = std::vector; + inline std::vector create_std__vector_ColumnMetadata_(size_t size) { + std::vector vector; + vector.reserve(size); + return vector; + } + + /** + * Specialized version of `std::optional>`. + */ + using std__optional_std__vector_ColumnMetadata__ = std::optional>; + inline std::optional> create_std__optional_std__vector_ColumnMetadata__(const std::vector& value) { + return std::optional>(value); + } + + /** + * Specialized version of `std::function()>`. + */ + using Func_std__future_QueryResult_ = std::function()>; + inline Func_std__future_QueryResult_ create_Func_std__future_QueryResult_(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */), void(*destroy)(void*)) { + std::shared_ptr sharedClosureHolder(closureHolder, destroy); + return [sharedClosureHolder, call]() -> std::future { + auto result = call(sharedClosureHolder.get()); + return result.getFuture(); + }; + } + inline std::shared_ptr share_Func_std__future_QueryResult_(const Func_std__future_QueryResult_& value) { + return std::make_shared(value); + } + + /** + * Specialized version of `PromiseHolder`. + */ + using PromiseHolder_QueryResult_ = PromiseHolder; + inline PromiseHolder create_PromiseHolder_QueryResult_() { + return PromiseHolder(); + } + + /** + * Specialized version of `std::function(const std::string& / * query * /, const std::vector& / * params * /)>`. + */ + using Func_std__future_QueryResult__std__string_std__vector_std__string_ = std::function(const std::string& /* query */, const std::vector& /* params */)>; + inline Func_std__future_QueryResult__std__string_std__vector_std__string_ create_Func_std__future_QueryResult__std__string_std__vector_std__string_(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, std::string, std::vector), void(*destroy)(void*)) { + std::shared_ptr sharedClosureHolder(closureHolder, destroy); + return [sharedClosureHolder, call](const std::string& query, const std::vector& params) -> std::future { + auto result = call(sharedClosureHolder.get(), query, params); + return result.getFuture(); + }; + } + inline std::shared_ptr share_Func_std__future_QueryResult__std__string_std__vector_std__string_(const Func_std__future_QueryResult__std__string_std__vector_std__string_& value) { + return std::make_shared(value); + } + + /** + * Specialized version of `std::function>(const std::string& / * query * /, const std::vector& / * params * /)>`. + */ + using Func_std__future_std__future_QueryResult___std__string_std__vector_std__string_ = std::function>(const std::string& /* query */, const std::vector& /* params */)>; + inline Func_std__future_std__future_QueryResult___std__string_std__vector_std__string_ create_Func_std__future_std__future_QueryResult___std__string_std__vector_std__string_(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, std::string, std::vector), void(*destroy)(void*)) { + std::shared_ptr sharedClosureHolder(closureHolder, destroy); + return [sharedClosureHolder, call](const std::string& query, const std::vector& params) -> std::future> { + auto result = call(sharedClosureHolder.get(), query, params); + return result.getFuture(); + }; + } + inline std::shared_ptr share_Func_std__future_std__future_QueryResult___std__string_std__vector_std__string_(const Func_std__future_std__future_QueryResult___std__string_std__vector_std__string_& value) { + return std::make_shared(value); + } + + /** + * Specialized version of `PromiseHolder>`. + */ + using PromiseHolder_std__future_QueryResult__ = PromiseHolder>; + inline PromiseHolder> create_PromiseHolder_std__future_QueryResult__() { + return PromiseHolder>(); + } + /** * Specialized version of `std::function>(const Transaction& / * tx * /)>`. */ @@ -113,5 +270,197 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { inline std::shared_ptr share_Func_std__future_std__future_void___std__string_std__function_std__future_std__future_void___const_Transaction_____tx_____(const Func_std__future_std__future_void___std__string_std__function_std__future_std__future_void___const_Transaction_____tx_____& value) { return std::make_shared(value); } + + /** + * Specialized version of `std::function(const std::string& / * dbName * /, const std::string& / * query * /, const std::vector& / * params * /)>`. + */ + using Func_std__future_QueryResult__std__string_std__string_std__vector_std__string_ = std::function(const std::string& /* dbName */, const std::string& /* query */, const std::vector& /* params */)>; + inline Func_std__future_QueryResult__std__string_std__string_std__vector_std__string_ create_Func_std__future_QueryResult__std__string_std__string_std__vector_std__string_(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, std::string, std::string, std::vector), void(*destroy)(void*)) { + std::shared_ptr sharedClosureHolder(closureHolder, destroy); + return [sharedClosureHolder, call](const std::string& dbName, const std::string& query, const std::vector& params) -> std::future { + auto result = call(sharedClosureHolder.get(), dbName, query, params); + return result.getFuture(); + }; + } + inline std::shared_ptr share_Func_std__future_QueryResult__std__string_std__string_std__vector_std__string_(const Func_std__future_QueryResult__std__string_std__string_std__vector_std__string_& value) { + return std::make_shared(value); + } + + /** + * Specialized version of `std::function>(const std::string& / * dbName * /, const std::string& / * query * /, const std::vector& / * params * /)>`. + */ + using Func_std__future_std__future_QueryResult___std__string_std__string_std__vector_std__string_ = std::function>(const std::string& /* dbName */, const std::string& /* query */, const std::vector& /* params */)>; + inline Func_std__future_std__future_QueryResult___std__string_std__string_std__vector_std__string_ create_Func_std__future_std__future_QueryResult___std__string_std__string_std__vector_std__string_(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, std::string, std::string, std::vector), void(*destroy)(void*)) { + std::shared_ptr sharedClosureHolder(closureHolder, destroy); + return [sharedClosureHolder, call](const std::string& dbName, const std::string& query, const std::vector& params) -> std::future> { + auto result = call(sharedClosureHolder.get(), dbName, query, params); + return result.getFuture(); + }; + } + inline std::shared_ptr share_Func_std__future_std__future_QueryResult___std__string_std__string_std__vector_std__string_(const Func_std__future_std__future_QueryResult___std__string_std__string_std__vector_std__string_& value) { + return std::make_shared(value); + } + + /** + * Specialized version of `std::tuple`. + */ + using std__tuple_std__string_ = std::tuple; + inline std::tuple create_std__tuple_std__string_(const std::string& arg0) { + return std::tuple { arg0 }; + } + + /** + * Specialized version of `std::vector>`. + */ + using std__vector_std__vector_std__string__ = std::vector>; + inline std::vector> create_std__vector_std__vector_std__string__(size_t size) { + std::vector> vector; + vector.reserve(size); + return vector; + } + + /** + * Specialized version of `std::variant, std::vector>>`. + */ + using std__variant_std__vector_std__string___std__vector_std__vector_std__string___ = std::variant, std::vector>>; + inline std::variant, std::vector>> create_std__variant_std__vector_std__string___std__vector_std__vector_std__string___(const std::vector& value) { + return value; + } + inline std::variant, std::vector>> create_std__variant_std__vector_std__string___std__vector_std__vector_std__string___(const std::vector>& value) { + return value; + } + inline std::vector get_std__variant_std__vector_std__string___std__vector_std__vector_std__string____0(const std::variant, std::vector>>& variant) { + return std::get<0>(variant); + } + inline std::vector> get_std__variant_std__vector_std__string___std__vector_std__vector_std__string____1(const std::variant, std::vector>>& variant) { + return std::get<1>(variant); + } + + /** + * Specialized version of `std::tuple, std::vector>>>`. + */ + using std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string____ = std::tuple, std::vector>>>; + inline std::tuple, std::vector>>> create_std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string____(const std::string& arg0, const std::variant, std::vector>>& arg1) { + return std::tuple, std::vector>>> { arg0, arg1 }; + } + + /** + * Specialized version of `std::variant, std::tuple, std::vector>>>>`. + */ + using std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string_____ = std::variant, std::tuple, std::vector>>>>; + inline std::variant, std::tuple, std::vector>>>> create_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string_____(const std::tuple& value) { + return value; + } + inline std::variant, std::tuple, std::vector>>>> create_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string_____(const std::tuple, std::vector>>>& value) { + return value; + } + inline std::tuple get_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______0(const std::variant, std::tuple, std::vector>>>>& variant) { + return std::get<0>(variant); + } + inline std::tuple, std::vector>>> get_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______1(const std::variant, std::tuple, std::vector>>>>& variant) { + return std::get<1>(variant); + } + + /** + * Specialized version of `std::vector, std::tuple, std::vector>>>>>`. + */ + using std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______ = std::vector, std::tuple, std::vector>>>>>; + inline std::vector, std::tuple, std::vector>>>>> create_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______(size_t size) { + std::vector, std::tuple, std::vector>>>>> vector; + vector.reserve(size); + return vector; + } + + /** + * Specialized version of `std::function(const std::string& / * dbName * /, const std::vector, std::tuple, std::vector>>>>>& / * commands * /)>`. + */ + using Func_std__future_BatchQueryResult__std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______ = std::function(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)>; + inline Func_std__future_BatchQueryResult__std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______ create_Func_std__future_BatchQueryResult__std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, std::string, std::vector, std::tuple, std::vector>>>>>), void(*destroy)(void*)) { + std::shared_ptr sharedClosureHolder(closureHolder, destroy); + return [sharedClosureHolder, call](const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) -> std::future { + auto result = call(sharedClosureHolder.get(), dbName, commands); + return result.getFuture(); + }; + } + inline std::shared_ptr share_Func_std__future_BatchQueryResult__std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______(const Func_std__future_BatchQueryResult__std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______& value) { + return std::make_shared(value); + } + + /** + * Specialized version of `PromiseHolder`. + */ + using PromiseHolder_BatchQueryResult_ = PromiseHolder; + inline PromiseHolder create_PromiseHolder_BatchQueryResult_() { + return PromiseHolder(); + } + + /** + * Specialized version of `std::function>(const std::string& / * dbName * /, const std::vector, std::tuple, std::vector>>>>>& / * commands * /)>`. + */ + using Func_std__future_std__future_BatchQueryResult___std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______ = std::function>(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)>; + inline Func_std__future_std__future_BatchQueryResult___std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______ create_Func_std__future_std__future_BatchQueryResult___std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, std::string, std::vector, std::tuple, std::vector>>>>>), void(*destroy)(void*)) { + std::shared_ptr sharedClosureHolder(closureHolder, destroy); + return [sharedClosureHolder, call](const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) -> std::future> { + auto result = call(sharedClosureHolder.get(), dbName, commands); + return result.getFuture(); + }; + } + inline std::shared_ptr share_Func_std__future_std__future_BatchQueryResult___std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______(const Func_std__future_std__future_BatchQueryResult___std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______& value) { + return std::make_shared(value); + } + + /** + * Specialized version of `PromiseHolder>`. + */ + using PromiseHolder_std__future_BatchQueryResult__ = PromiseHolder>; + inline PromiseHolder> create_PromiseHolder_std__future_BatchQueryResult__() { + return PromiseHolder>(); + } + + /** + * Specialized version of `std::function(const std::string& / * dbName * /, const std::string& / * location * /)>`. + */ + using Func_std__future_FileLoadResult__std__string_std__string = std::function(const std::string& /* dbName */, const std::string& /* location */)>; + inline Func_std__future_FileLoadResult__std__string_std__string create_Func_std__future_FileLoadResult__std__string_std__string(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, std::string, std::string), void(*destroy)(void*)) { + std::shared_ptr sharedClosureHolder(closureHolder, destroy); + return [sharedClosureHolder, call](const std::string& dbName, const std::string& location) -> std::future { + auto result = call(sharedClosureHolder.get(), dbName, location); + return result.getFuture(); + }; + } + inline std::shared_ptr share_Func_std__future_FileLoadResult__std__string_std__string(const Func_std__future_FileLoadResult__std__string_std__string& value) { + return std::make_shared(value); + } + + /** + * Specialized version of `PromiseHolder`. + */ + using PromiseHolder_FileLoadResult_ = PromiseHolder; + inline PromiseHolder create_PromiseHolder_FileLoadResult_() { + return PromiseHolder(); + } + + /** + * Specialized version of `std::function>(const std::string& / * dbName * /, const std::string& / * location * /)>`. + */ + using Func_std__future_std__future_FileLoadResult___std__string_std__string = std::function>(const std::string& /* dbName */, const std::string& /* location */)>; + inline Func_std__future_std__future_FileLoadResult___std__string_std__string create_Func_std__future_std__future_FileLoadResult___std__string_std__string(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, std::string, std::string), void(*destroy)(void*)) { + std::shared_ptr sharedClosureHolder(closureHolder, destroy); + return [sharedClosureHolder, call](const std::string& dbName, const std::string& location) -> std::future> { + auto result = call(sharedClosureHolder.get(), dbName, location); + return result.getFuture(); + }; + } + inline std::shared_ptr share_Func_std__future_std__future_FileLoadResult___std__string_std__string(const Func_std__future_std__future_FileLoadResult___std__string_std__string& value) { + return std::make_shared(value); + } + + /** + * Specialized version of `PromiseHolder>`. + */ + using PromiseHolder_std__future_FileLoadResult__ = PromiseHolder>; + inline PromiseHolder> create_PromiseHolder_std__future_FileLoadResult__() { + return PromiseHolder>(); + } } // namespace margelo::nitro::rnquicksqlite::bridge::swift diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp index 6b22c97f..04c7dac8 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp @@ -9,14 +9,33 @@ #pragma once // Forward declarations of C++ defined types +// Forward declaration of `BatchQueryResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } +// Forward declaration of `ColumnMetadata` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } +// Forward declaration of `FileLoadResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } +// Forward declaration of `QueryResultRow` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct QueryResultRow; } +// Forward declaration of `QueryResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct QueryResult; } // Forward declaration of `Transaction` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct Transaction; } // Include C++ defined types +#include "BatchQueryResult.hpp" +#include "ColumnMetadata.hpp" +#include "FileLoadResult.hpp" +#include "QueryResult.hpp" +#include "QueryResultRow.hpp" #include "Transaction.hpp" #include #include +#include #include +#include +#include +#include // C++ helpers for Swift #include "RNQuickSQLite-Swift-Cxx-Bridge.hpp" diff --git a/nitrogen/generated/shared/c++/BatchQueryResult.hpp b/nitrogen/generated/shared/c++/BatchQueryResult.hpp new file mode 100644 index 00000000..0926b12f --- /dev/null +++ b/nitrogen/generated/shared/c++/BatchQueryResult.hpp @@ -0,0 +1,69 @@ +/// +/// BatchQueryResult.hpp +/// Sun Sep 01 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + + + +#include + +namespace margelo::nitro::rnquicksqlite { + + /** + * A struct which can be represented as a JavaScript object (BatchQueryResult). + */ + struct BatchQueryResult { + public: + std::optional rowsAffected SWIFT_PRIVATE; + + public: + explicit BatchQueryResult(std::optional rowsAffected): rowsAffected(rowsAffected) {} + }; + +} // namespace margelo::nitro::rnquicksqlite + +namespace margelo::nitro { + + using namespace margelo::nitro::rnquicksqlite; + + // C++ BatchQueryResult <> JS BatchQueryResult (object) + template <> + struct JSIConverter { + static inline BatchQueryResult fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return BatchQueryResult( + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "rowsAffected")) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const BatchQueryResult& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, "rowsAffected", JSIConverter>::toJSI(runtime, arg.rowsAffected)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "rowsAffected"))) return false; + return true; + } + }; + +} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/ColumnMetadata.hpp b/nitrogen/generated/shared/c++/ColumnMetadata.hpp new file mode 100644 index 00000000..1e39ec34 --- /dev/null +++ b/nitrogen/generated/shared/c++/ColumnMetadata.hpp @@ -0,0 +1,77 @@ +/// +/// ColumnMetadata.hpp +/// Sun Sep 01 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + + + +#include + +namespace margelo::nitro::rnquicksqlite { + + /** + * A struct which can be represented as a JavaScript object (ColumnMetadata). + */ + struct ColumnMetadata { + public: + std::string columnName SWIFT_PRIVATE; + std::string columnDeclaredType SWIFT_PRIVATE; + double columnIndex SWIFT_PRIVATE; + + public: + explicit ColumnMetadata(std::string columnName, std::string columnDeclaredType, double columnIndex): columnName(columnName), columnDeclaredType(columnDeclaredType), columnIndex(columnIndex) {} + }; + +} // namespace margelo::nitro::rnquicksqlite + +namespace margelo::nitro { + + using namespace margelo::nitro::rnquicksqlite; + + // C++ ColumnMetadata <> JS ColumnMetadata (object) + template <> + struct JSIConverter { + static inline ColumnMetadata fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return ColumnMetadata( + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "columnName")), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "columnDeclaredType")), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "columnIndex")) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const ColumnMetadata& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, "columnName", JSIConverter::toJSI(runtime, arg.columnName)); + obj.setProperty(runtime, "columnDeclaredType", JSIConverter::toJSI(runtime, arg.columnDeclaredType)); + obj.setProperty(runtime, "columnIndex", JSIConverter::toJSI(runtime, arg.columnIndex)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "columnName"))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "columnDeclaredType"))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "columnIndex"))) return false; + return true; + } + }; + +} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/FileLoadResult.hpp b/nitrogen/generated/shared/c++/FileLoadResult.hpp new file mode 100644 index 00000000..ad669efb --- /dev/null +++ b/nitrogen/generated/shared/c++/FileLoadResult.hpp @@ -0,0 +1,73 @@ +/// +/// FileLoadResult.hpp +/// Sun Sep 01 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + + + +#include + +namespace margelo::nitro::rnquicksqlite { + + /** + * A struct which can be represented as a JavaScript object (FileLoadResult). + */ + struct FileLoadResult { + public: + std::optional commands SWIFT_PRIVATE; + std::optional rowsAffected SWIFT_PRIVATE; + + public: + explicit FileLoadResult(std::optional commands, std::optional rowsAffected): commands(commands), rowsAffected(rowsAffected) {} + }; + +} // namespace margelo::nitro::rnquicksqlite + +namespace margelo::nitro { + + using namespace margelo::nitro::rnquicksqlite; + + // C++ FileLoadResult <> JS FileLoadResult (object) + template <> + struct JSIConverter { + static inline FileLoadResult fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return FileLoadResult( + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "commands")), + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "rowsAffected")) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const FileLoadResult& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, "commands", JSIConverter>::toJSI(runtime, arg.commands)); + obj.setProperty(runtime, "rowsAffected", JSIConverter>::toJSI(runtime, arg.rowsAffected)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "commands"))) return false; + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "rowsAffected"))) return false; + return true; + } + }; + +} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp index 15f4435b..ca4a0126 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp @@ -27,6 +27,18 @@ namespace margelo::nitro::rnquicksqlite { prototype.registerHybridSetter("detach", &HybridQuickSQLiteSpec::setDetach); prototype.registerHybridGetter("transaction", &HybridQuickSQLiteSpec::getTransaction); prototype.registerHybridSetter("transaction", &HybridQuickSQLiteSpec::setTransaction); + prototype.registerHybridGetter("execute", &HybridQuickSQLiteSpec::getExecute); + prototype.registerHybridSetter("execute", &HybridQuickSQLiteSpec::setExecute); + prototype.registerHybridGetter("executeAsync", &HybridQuickSQLiteSpec::getExecuteAsync); + prototype.registerHybridSetter("executeAsync", &HybridQuickSQLiteSpec::setExecuteAsync); + prototype.registerHybridGetter("executeBatch", &HybridQuickSQLiteSpec::getExecuteBatch); + prototype.registerHybridSetter("executeBatch", &HybridQuickSQLiteSpec::setExecuteBatch); + prototype.registerHybridGetter("executeBatchAsync", &HybridQuickSQLiteSpec::getExecuteBatchAsync); + prototype.registerHybridSetter("executeBatchAsync", &HybridQuickSQLiteSpec::setExecuteBatchAsync); + prototype.registerHybridGetter("loadFile", &HybridQuickSQLiteSpec::getLoadFile); + prototype.registerHybridSetter("loadFile", &HybridQuickSQLiteSpec::setLoadFile); + prototype.registerHybridGetter("loadFileAsync", &HybridQuickSQLiteSpec::getLoadFileAsync); + prototype.registerHybridSetter("loadFileAsync", &HybridQuickSQLiteSpec::setLoadFileAsync); }); } diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp index 45f7d26b..5634898c 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp @@ -16,11 +16,23 @@ // Forward declaration of `Transaction` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct Transaction; } +// Forward declaration of `QueryResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct QueryResult; } +// Forward declaration of `BatchQueryResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } +// Forward declaration of `FileLoadResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } #include #include #include #include "Transaction.hpp" +#include "QueryResult.hpp" +#include +#include "BatchQueryResult.hpp" +#include +#include +#include "FileLoadResult.hpp" namespace margelo::nitro::rnquicksqlite { @@ -58,6 +70,18 @@ namespace margelo::nitro::rnquicksqlite { virtual void setDetach(const std::function& detach) = 0; virtual std::function>(const std::string& /* dbName */, const std::function>(const Transaction& /* tx */)>& /* fn */)> getTransaction() = 0; virtual void setTransaction(const std::function>(const std::string& /* dbName */, const std::function>(const Transaction& /* tx */)>& /* fn */)>& transaction) = 0; + virtual std::function(const std::string& /* dbName */, const std::string& /* query */, const std::vector& /* params */)> getExecute() = 0; + virtual void setExecute(const std::function(const std::string& /* dbName */, const std::string& /* query */, const std::vector& /* params */)>& execute) = 0; + virtual std::function>(const std::string& /* dbName */, const std::string& /* query */, const std::vector& /* params */)> getExecuteAsync() = 0; + virtual void setExecuteAsync(const std::function>(const std::string& /* dbName */, const std::string& /* query */, const std::vector& /* params */)>& executeAsync) = 0; + virtual std::function(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)> getExecuteBatch() = 0; + virtual void setExecuteBatch(const std::function(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)>& executeBatch) = 0; + virtual std::function>(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)> getExecuteBatchAsync() = 0; + virtual void setExecuteBatchAsync(const std::function>(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)>& executeBatchAsync) = 0; + virtual std::function(const std::string& /* dbName */, const std::string& /* location */)> getLoadFile() = 0; + virtual void setLoadFile(const std::function(const std::string& /* dbName */, const std::string& /* location */)>& loadFile) = 0; + virtual std::function>(const std::string& /* dbName */, const std::string& /* location */)> getLoadFileAsync() = 0; + virtual void setLoadFileAsync(const std::function>(const std::string& /* dbName */, const std::string& /* location */)>& loadFileAsync) = 0; public: // Methods diff --git a/nitrogen/generated/shared/c++/QueryResult.hpp b/nitrogen/generated/shared/c++/QueryResult.hpp new file mode 100644 index 00000000..ff83e9f3 --- /dev/null +++ b/nitrogen/generated/shared/c++/QueryResult.hpp @@ -0,0 +1,87 @@ +/// +/// QueryResult.hpp +/// Sun Sep 01 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +// Forward declaration of `QueryResultRow` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct QueryResultRow; } +// Forward declaration of `ColumnMetadata` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } + +#include +#include +#include "QueryResultRow.hpp" +#include "ColumnMetadata.hpp" + +namespace margelo::nitro::rnquicksqlite { + + /** + * A struct which can be represented as a JavaScript object (QueryResult). + */ + struct QueryResult { + public: + std::optional insertId SWIFT_PRIVATE; + double rowsAffected SWIFT_PRIVATE; + std::optional> rows SWIFT_PRIVATE; + std::optional> metadata SWIFT_PRIVATE; + + public: + explicit QueryResult(std::optional insertId, double rowsAffected, std::optional> rows, std::optional> metadata): insertId(insertId), rowsAffected(rowsAffected), rows(rows), metadata(metadata) {} + }; + +} // namespace margelo::nitro::rnquicksqlite + +namespace margelo::nitro { + + using namespace margelo::nitro::rnquicksqlite; + + // C++ QueryResult <> JS QueryResult (object) + template <> + struct JSIConverter { + static inline QueryResult fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return QueryResult( + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "insertId")), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "rowsAffected")), + JSIConverter>>::fromJSI(runtime, obj.getProperty(runtime, "rows")), + JSIConverter>>::fromJSI(runtime, obj.getProperty(runtime, "metadata")) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const QueryResult& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, "insertId", JSIConverter>::toJSI(runtime, arg.insertId)); + obj.setProperty(runtime, "rowsAffected", JSIConverter::toJSI(runtime, arg.rowsAffected)); + obj.setProperty(runtime, "rows", JSIConverter>>::toJSI(runtime, arg.rows)); + obj.setProperty(runtime, "metadata", JSIConverter>>::toJSI(runtime, arg.metadata)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "insertId"))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "rowsAffected"))) return false; + if (!JSIConverter>>::canConvert(runtime, obj.getProperty(runtime, "rows"))) return false; + if (!JSIConverter>>::canConvert(runtime, obj.getProperty(runtime, "metadata"))) return false; + return true; + } + }; + +} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/QueryResultRow.hpp b/nitrogen/generated/shared/c++/QueryResultRow.hpp new file mode 100644 index 00000000..aad99803 --- /dev/null +++ b/nitrogen/generated/shared/c++/QueryResultRow.hpp @@ -0,0 +1,80 @@ +/// +/// QueryResultRow.hpp +/// Sun Sep 01 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + + + +#include +#include +#include +#include + +namespace margelo::nitro::rnquicksqlite { + + /** + * A struct which can be represented as a JavaScript object (QueryResultRow). + */ + struct QueryResultRow { + public: + std::vector _array SWIFT_PRIVATE; + double length SWIFT_PRIVATE; + std::function(double /* idx */)> item SWIFT_PRIVATE; + + public: + explicit QueryResultRow(std::vector _array, double length, std::function(double /* idx */)> item): _array(_array), length(length), item(item) {} + }; + +} // namespace margelo::nitro::rnquicksqlite + +namespace margelo::nitro { + + using namespace margelo::nitro::rnquicksqlite; + + // C++ QueryResultRow <> JS QueryResultRow (object) + template <> + struct JSIConverter { + static inline QueryResultRow fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return QueryResultRow( + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "_array")), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "length")), + JSIConverter(double /* idx */)>>::fromJSI(runtime, obj.getProperty(runtime, "item")) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const QueryResultRow& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, "_array", JSIConverter>::toJSI(runtime, arg._array)); + obj.setProperty(runtime, "length", JSIConverter::toJSI(runtime, arg.length)); + obj.setProperty(runtime, "item", JSIConverter(double /* idx */)>>::toJSI(runtime, arg.item)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "_array"))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "length"))) return false; + if (!JSIConverter(double /* idx */)>>::canConvert(runtime, obj.getProperty(runtime, "item"))) return false; + return true; + } + }; + +} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/Transaction.hpp b/nitrogen/generated/shared/c++/Transaction.hpp index 496f91da..3837c33e 100644 --- a/nitrogen/generated/shared/c++/Transaction.hpp +++ b/nitrogen/generated/shared/c++/Transaction.hpp @@ -19,9 +19,14 @@ #error NitroModules cannot be found! Are you sure you installed NitroModules properly? #endif +// Forward declaration of `QueryResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct QueryResult; } - - +#include +#include +#include "QueryResult.hpp" +#include +#include namespace margelo::nitro::rnquicksqlite { @@ -30,10 +35,13 @@ namespace margelo::nitro::rnquicksqlite { */ struct Transaction { public: - + std::function()> commit SWIFT_PRIVATE; + std::function(const std::string& /* query */, const std::vector& /* params */)> execute SWIFT_PRIVATE; + std::function>(const std::string& /* query */, const std::vector& /* params */)> executeAsync SWIFT_PRIVATE; + std::function()> rollback SWIFT_PRIVATE; public: - explicit Transaction(): {} + explicit Transaction(std::function()> commit, std::function(const std::string& /* query */, const std::vector& /* params */)> execute, std::function>(const std::string& /* query */, const std::vector& /* params */)> executeAsync, std::function()> rollback): commit(commit), execute(execute), executeAsync(executeAsync), rollback(rollback) {} }; } // namespace margelo::nitro::rnquicksqlite @@ -48,12 +56,18 @@ namespace margelo::nitro { static inline Transaction fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { jsi::Object obj = arg.asObject(runtime); return Transaction( - + JSIConverter()>>::fromJSI(runtime, obj.getProperty(runtime, "commit")), + JSIConverter(const std::string& /* query */, const std::vector& /* params */)>>::fromJSI(runtime, obj.getProperty(runtime, "execute")), + JSIConverter>(const std::string& /* query */, const std::vector& /* params */)>>::fromJSI(runtime, obj.getProperty(runtime, "executeAsync")), + JSIConverter()>>::fromJSI(runtime, obj.getProperty(runtime, "rollback")) ); } static inline jsi::Value toJSI(jsi::Runtime& runtime, const Transaction& arg) { jsi::Object obj(runtime); - + obj.setProperty(runtime, "commit", JSIConverter()>>::toJSI(runtime, arg.commit)); + obj.setProperty(runtime, "execute", JSIConverter(const std::string& /* query */, const std::vector& /* params */)>>::toJSI(runtime, arg.execute)); + obj.setProperty(runtime, "executeAsync", JSIConverter>(const std::string& /* query */, const std::vector& /* params */)>>::toJSI(runtime, arg.executeAsync)); + obj.setProperty(runtime, "rollback", JSIConverter()>>::toJSI(runtime, arg.rollback)); return obj; } static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { @@ -61,7 +75,10 @@ namespace margelo::nitro { return false; } jsi::Object obj = value.getObject(runtime); - + if (!JSIConverter()>>::canConvert(runtime, obj.getProperty(runtime, "commit"))) return false; + if (!JSIConverter(const std::string& /* query */, const std::vector& /* params */)>>::canConvert(runtime, obj.getProperty(runtime, "execute"))) return false; + if (!JSIConverter>(const std::string& /* query */, const std::vector& /* params */)>>::canConvert(runtime, obj.getProperty(runtime, "executeAsync"))) return false; + if (!JSIConverter()>>::canConvert(runtime, obj.getProperty(runtime, "rollback"))) return false; return true; } }; From db3118ce92e0f84ff7b97e7890858e127e4a478b Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 1 Sep 2024 15:43:03 +0200 Subject: [PATCH 009/156] more nitrogen files --- .../ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 186 +++++++++++------- .../ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp | 3 + .../shared/c++/HybridQuickSQLiteSpec.hpp | 23 ++- .../generated/shared/c++/QueryResultRow.hpp | 19 +- nitrogen/generated/shared/c++/Transaction.hpp | 23 ++- 5 files changed, 150 insertions(+), 104 deletions(-) diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index 327b8b16..55d9dcf3 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -9,6 +9,8 @@ #pragma once // Forward declarations of C++ defined types +// Forward declaration of `ArrayBuffer` to properly resolve imports. +namespace NitroModules { class ArrayBuffer; } // Forward declaration of `BatchQueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } // Forward declaration of `ColumnMetadata` to properly resolve imports. @@ -29,6 +31,7 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction; } #include "QueryResult.hpp" #include "QueryResultRow.hpp" #include "Transaction.hpp" +#include #include #include #include @@ -104,36 +107,36 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { } /** - * Specialized version of `std::vector`. + * Specialized version of `std::vector`. */ - using std__vector_std__string_ = std::vector; - inline std::vector create_std__vector_std__string_(size_t size) { - std::vector vector; + using std__vector_std__nullptr_t_ = std::vector; + inline std::vector create_std__vector_std__nullptr_t_(size_t size) { + std::vector vector; vector.reserve(size); return vector; } /** - * Specialized version of `std::function(double / * idx * /)>`. + * Specialized version of `std::function(double / * idx * /)>`. */ - using Func_std__future_std__string__double = std::function(double /* idx */)>; - inline Func_std__future_std__string__double create_Func_std__future_std__string__double(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, double), void(*destroy)(void*)) { + using Func_std__future_std__nullptr_t__double = std::function(double /* idx */)>; + inline Func_std__future_std__nullptr_t__double create_Func_std__future_std__nullptr_t__double(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, double), void(*destroy)(void*)) { std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](double idx) -> std::future { + return [sharedClosureHolder, call](double idx) -> std::future { auto result = call(sharedClosureHolder.get(), idx); return result.getFuture(); }; } - inline std::shared_ptr share_Func_std__future_std__string__double(const Func_std__future_std__string__double& value) { - return std::make_shared(value); + inline std::shared_ptr share_Func_std__future_std__nullptr_t__double(const Func_std__future_std__nullptr_t__double& value) { + return std::make_shared(value); } /** - * Specialized version of `PromiseHolder`. + * Specialized version of `PromiseHolder`. */ - using PromiseHolder_std__string_ = PromiseHolder; - inline PromiseHolder create_PromiseHolder_std__string_() { - return PromiseHolder(); + using PromiseHolder_std__nullptr_t_ = PromiseHolder; + inline PromiseHolder create_PromiseHolder_std__nullptr_t_() { + return PromiseHolder(); } /** @@ -196,33 +199,68 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { } /** - * Specialized version of `std::function(const std::string& / * query * /, const std::vector& / * params * /)>`. + * Specialized version of `std::variant>`. */ - using Func_std__future_QueryResult__std__string_std__vector_std__string_ = std::function(const std::string& /* query */, const std::vector& /* params */)>; - inline Func_std__future_QueryResult__std__string_std__vector_std__string_ create_Func_std__future_QueryResult__std__string_std__vector_std__string_(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, std::string, std::vector), void(*destroy)(void*)) { + using std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ = std::variant>; + inline std::variant> create_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(const std::string& value) { + return value; + } + inline std::variant> create_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(double value) { + return value; + } + inline std::variant> create_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(int64_t value) { + return value; + } + inline std::variant> create_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(bool value) { + return value; + } + inline std::variant> create_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(const std::shared_ptr& value) { + return value; + } + inline std::string get_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___0(const std::variant>& variant) { + return std::get<0>(variant); + } + inline double get_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___1(const std::variant>& variant) { + return std::get<1>(variant); + } + inline int64_t get_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___2(const std::variant>& variant) { + return std::get<2>(variant); + } + inline bool get_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___3(const std::variant>& variant) { + return std::get<3>(variant); + } + inline std::shared_ptr get_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___4(const std::variant>& variant) { + return std::get<4>(variant); + } + + /** + * Specialized version of `std::function(const std::string& / * query * /, const std::variant>& / * params * /)>`. + */ + using Func_std__future_QueryResult__std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ = std::function(const std::string& /* query */, const std::variant>& /* params */)>; + inline Func_std__future_QueryResult__std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ create_Func_std__future_QueryResult__std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, std::string, std::variant>), void(*destroy)(void*)) { std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& query, const std::vector& params) -> std::future { + return [sharedClosureHolder, call](const std::string& query, const std::variant>& params) -> std::future { auto result = call(sharedClosureHolder.get(), query, params); return result.getFuture(); }; } - inline std::shared_ptr share_Func_std__future_QueryResult__std__string_std__vector_std__string_(const Func_std__future_QueryResult__std__string_std__vector_std__string_& value) { - return std::make_shared(value); + inline std::shared_ptr share_Func_std__future_QueryResult__std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(const Func_std__future_QueryResult__std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__& value) { + return std::make_shared(value); } /** - * Specialized version of `std::function>(const std::string& / * query * /, const std::vector& / * params * /)>`. + * Specialized version of `std::function>(const std::string& / * query * /, const std::variant>& / * params * /)>`. */ - using Func_std__future_std__future_QueryResult___std__string_std__vector_std__string_ = std::function>(const std::string& /* query */, const std::vector& /* params */)>; - inline Func_std__future_std__future_QueryResult___std__string_std__vector_std__string_ create_Func_std__future_std__future_QueryResult___std__string_std__vector_std__string_(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, std::string, std::vector), void(*destroy)(void*)) { + using Func_std__future_std__future_QueryResult___std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ = std::function>(const std::string& /* query */, const std::variant>& /* params */)>; + inline Func_std__future_std__future_QueryResult___std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ create_Func_std__future_std__future_QueryResult___std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, std::string, std::variant>), void(*destroy)(void*)) { std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& query, const std::vector& params) -> std::future> { + return [sharedClosureHolder, call](const std::string& query, const std::variant>& params) -> std::future> { auto result = call(sharedClosureHolder.get(), query, params); return result.getFuture(); }; } - inline std::shared_ptr share_Func_std__future_std__future_QueryResult___std__string_std__vector_std__string_(const Func_std__future_std__future_QueryResult___std__string_std__vector_std__string_& value) { - return std::make_shared(value); + inline std::shared_ptr share_Func_std__future_std__future_QueryResult___std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(const Func_std__future_std__future_QueryResult___std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__& value) { + return std::make_shared(value); } /** @@ -272,33 +310,33 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { } /** - * Specialized version of `std::function(const std::string& / * dbName * /, const std::string& / * query * /, const std::vector& / * params * /)>`. + * Specialized version of `std::function(const std::string& / * dbName * /, const std::string& / * query * /, const std::variant>& / * params * /)>`. */ - using Func_std__future_QueryResult__std__string_std__string_std__vector_std__string_ = std::function(const std::string& /* dbName */, const std::string& /* query */, const std::vector& /* params */)>; - inline Func_std__future_QueryResult__std__string_std__string_std__vector_std__string_ create_Func_std__future_QueryResult__std__string_std__string_std__vector_std__string_(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, std::string, std::string, std::vector), void(*destroy)(void*)) { + using Func_std__future_QueryResult__std__string_std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ = std::function(const std::string& /* dbName */, const std::string& /* query */, const std::variant>& /* params */)>; + inline Func_std__future_QueryResult__std__string_std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ create_Func_std__future_QueryResult__std__string_std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, std::string, std::string, std::variant>), void(*destroy)(void*)) { std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& dbName, const std::string& query, const std::vector& params) -> std::future { + return [sharedClosureHolder, call](const std::string& dbName, const std::string& query, const std::variant>& params) -> std::future { auto result = call(sharedClosureHolder.get(), dbName, query, params); return result.getFuture(); }; } - inline std::shared_ptr share_Func_std__future_QueryResult__std__string_std__string_std__vector_std__string_(const Func_std__future_QueryResult__std__string_std__string_std__vector_std__string_& value) { - return std::make_shared(value); + inline std::shared_ptr share_Func_std__future_QueryResult__std__string_std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(const Func_std__future_QueryResult__std__string_std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__& value) { + return std::make_shared(value); } /** - * Specialized version of `std::function>(const std::string& / * dbName * /, const std::string& / * query * /, const std::vector& / * params * /)>`. + * Specialized version of `std::function>(const std::string& / * dbName * /, const std::string& / * query * /, const std::variant>& / * params * /)>`. */ - using Func_std__future_std__future_QueryResult___std__string_std__string_std__vector_std__string_ = std::function>(const std::string& /* dbName */, const std::string& /* query */, const std::vector& /* params */)>; - inline Func_std__future_std__future_QueryResult___std__string_std__string_std__vector_std__string_ create_Func_std__future_std__future_QueryResult___std__string_std__string_std__vector_std__string_(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, std::string, std::string, std::vector), void(*destroy)(void*)) { + using Func_std__future_std__future_QueryResult___std__string_std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ = std::function>(const std::string& /* dbName */, const std::string& /* query */, const std::variant>& /* params */)>; + inline Func_std__future_std__future_QueryResult___std__string_std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ create_Func_std__future_std__future_QueryResult___std__string_std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, std::string, std::string, std::variant>), void(*destroy)(void*)) { std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& dbName, const std::string& query, const std::vector& params) -> std::future> { + return [sharedClosureHolder, call](const std::string& dbName, const std::string& query, const std::variant>& params) -> std::future> { auto result = call(sharedClosureHolder.get(), dbName, query, params); return result.getFuture(); }; } - inline std::shared_ptr share_Func_std__future_std__future_QueryResult___std__string_std__string_std__vector_std__string_(const Func_std__future_std__future_QueryResult___std__string_std__string_std__vector_std__string_& value) { - return std::make_shared(value); + inline std::shared_ptr share_Func_std__future_std__future_QueryResult___std__string_std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(const Func_std__future_std__future_QueryResult___std__string_std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__& value) { + return std::make_shared(value); } /** @@ -310,80 +348,80 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { } /** - * Specialized version of `std::vector>`. + * Specialized version of `std::vector>`. */ - using std__vector_std__vector_std__string__ = std::vector>; - inline std::vector> create_std__vector_std__vector_std__string__(size_t size) { - std::vector> vector; + using std__vector_std__vector_std__nullptr_t__ = std::vector>; + inline std::vector> create_std__vector_std__vector_std__nullptr_t__(size_t size) { + std::vector> vector; vector.reserve(size); return vector; } /** - * Specialized version of `std::variant, std::vector>>`. + * Specialized version of `std::variant, std::vector>>`. */ - using std__variant_std__vector_std__string___std__vector_std__vector_std__string___ = std::variant, std::vector>>; - inline std::variant, std::vector>> create_std__variant_std__vector_std__string___std__vector_std__vector_std__string___(const std::vector& value) { + using std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t___ = std::variant, std::vector>>; + inline std::variant, std::vector>> create_std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t___(const std::vector& value) { return value; } - inline std::variant, std::vector>> create_std__variant_std__vector_std__string___std__vector_std__vector_std__string___(const std::vector>& value) { + inline std::variant, std::vector>> create_std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t___(const std::vector>& value) { return value; } - inline std::vector get_std__variant_std__vector_std__string___std__vector_std__vector_std__string____0(const std::variant, std::vector>>& variant) { + inline std::vector get_std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t____0(const std::variant, std::vector>>& variant) { return std::get<0>(variant); } - inline std::vector> get_std__variant_std__vector_std__string___std__vector_std__vector_std__string____1(const std::variant, std::vector>>& variant) { + inline std::vector> get_std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t____1(const std::variant, std::vector>>& variant) { return std::get<1>(variant); } /** - * Specialized version of `std::tuple, std::vector>>>`. + * Specialized version of `std::tuple, std::vector>>>`. */ - using std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string____ = std::tuple, std::vector>>>; - inline std::tuple, std::vector>>> create_std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string____(const std::string& arg0, const std::variant, std::vector>>& arg1) { - return std::tuple, std::vector>>> { arg0, arg1 }; + using std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t____ = std::tuple, std::vector>>>; + inline std::tuple, std::vector>>> create_std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t____(const std::string& arg0, const std::variant, std::vector>>& arg1) { + return std::tuple, std::vector>>> { arg0, arg1 }; } /** - * Specialized version of `std::variant, std::tuple, std::vector>>>>`. + * Specialized version of `std::variant, std::tuple, std::vector>>>>`. */ - using std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string_____ = std::variant, std::tuple, std::vector>>>>; - inline std::variant, std::tuple, std::vector>>>> create_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string_____(const std::tuple& value) { + using std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t_____ = std::variant, std::tuple, std::vector>>>>; + inline std::variant, std::tuple, std::vector>>>> create_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t_____(const std::tuple& value) { return value; } - inline std::variant, std::tuple, std::vector>>>> create_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string_____(const std::tuple, std::vector>>>& value) { + inline std::variant, std::tuple, std::vector>>>> create_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t_____(const std::tuple, std::vector>>>& value) { return value; } - inline std::tuple get_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______0(const std::variant, std::tuple, std::vector>>>>& variant) { + inline std::tuple get_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______0(const std::variant, std::tuple, std::vector>>>>& variant) { return std::get<0>(variant); } - inline std::tuple, std::vector>>> get_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______1(const std::variant, std::tuple, std::vector>>>>& variant) { + inline std::tuple, std::vector>>> get_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______1(const std::variant, std::tuple, std::vector>>>>& variant) { return std::get<1>(variant); } /** - * Specialized version of `std::vector, std::tuple, std::vector>>>>>`. + * Specialized version of `std::vector, std::tuple, std::vector>>>>>`. */ - using std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______ = std::vector, std::tuple, std::vector>>>>>; - inline std::vector, std::tuple, std::vector>>>>> create_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______(size_t size) { - std::vector, std::tuple, std::vector>>>>> vector; + using std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______ = std::vector, std::tuple, std::vector>>>>>; + inline std::vector, std::tuple, std::vector>>>>> create_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______(size_t size) { + std::vector, std::tuple, std::vector>>>>> vector; vector.reserve(size); return vector; } /** - * Specialized version of `std::function(const std::string& / * dbName * /, const std::vector, std::tuple, std::vector>>>>>& / * commands * /)>`. + * Specialized version of `std::function(const std::string& / * dbName * /, const std::vector, std::tuple, std::vector>>>>>& / * commands * /)>`. */ - using Func_std__future_BatchQueryResult__std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______ = std::function(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)>; - inline Func_std__future_BatchQueryResult__std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______ create_Func_std__future_BatchQueryResult__std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, std::string, std::vector, std::tuple, std::vector>>>>>), void(*destroy)(void*)) { + using Func_std__future_BatchQueryResult__std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______ = std::function(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)>; + inline Func_std__future_BatchQueryResult__std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______ create_Func_std__future_BatchQueryResult__std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, std::string, std::vector, std::tuple, std::vector>>>>>), void(*destroy)(void*)) { std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) -> std::future { + return [sharedClosureHolder, call](const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) -> std::future { auto result = call(sharedClosureHolder.get(), dbName, commands); return result.getFuture(); }; } - inline std::shared_ptr share_Func_std__future_BatchQueryResult__std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______(const Func_std__future_BatchQueryResult__std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______& value) { - return std::make_shared(value); + inline std::shared_ptr share_Func_std__future_BatchQueryResult__std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______(const Func_std__future_BatchQueryResult__std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______& value) { + return std::make_shared(value); } /** @@ -395,18 +433,18 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { } /** - * Specialized version of `std::function>(const std::string& / * dbName * /, const std::vector, std::tuple, std::vector>>>>>& / * commands * /)>`. + * Specialized version of `std::function>(const std::string& / * dbName * /, const std::vector, std::tuple, std::vector>>>>>& / * commands * /)>`. */ - using Func_std__future_std__future_BatchQueryResult___std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______ = std::function>(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)>; - inline Func_std__future_std__future_BatchQueryResult___std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______ create_Func_std__future_std__future_BatchQueryResult___std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, std::string, std::vector, std::tuple, std::vector>>>>>), void(*destroy)(void*)) { + using Func_std__future_std__future_BatchQueryResult___std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______ = std::function>(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)>; + inline Func_std__future_std__future_BatchQueryResult___std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______ create_Func_std__future_std__future_BatchQueryResult___std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, std::string, std::vector, std::tuple, std::vector>>>>>), void(*destroy)(void*)) { std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) -> std::future> { + return [sharedClosureHolder, call](const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) -> std::future> { auto result = call(sharedClosureHolder.get(), dbName, commands); return result.getFuture(); }; } - inline std::shared_ptr share_Func_std__future_std__future_BatchQueryResult___std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______(const Func_std__future_std__future_BatchQueryResult___std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__string___std__vector_std__vector_std__string______& value) { - return std::make_shared(value); + inline std::shared_ptr share_Func_std__future_std__future_BatchQueryResult___std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______(const Func_std__future_std__future_BatchQueryResult___std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______& value) { + return std::make_shared(value); } /** diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp index 04c7dac8..0fd4007e 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp @@ -9,6 +9,8 @@ #pragma once // Forward declarations of C++ defined types +// Forward declaration of `ArrayBuffer` to properly resolve imports. +namespace NitroModules { class ArrayBuffer; } // Forward declaration of `BatchQueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } // Forward declaration of `ColumnMetadata` to properly resolve imports. @@ -29,6 +31,7 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction; } #include "QueryResult.hpp" #include "QueryResultRow.hpp" #include "Transaction.hpp" +#include #include #include #include diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp index 5634898c..58a2f655 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp @@ -18,6 +18,8 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction; } // Forward declaration of `QueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct QueryResult; } +// Forward declaration of `ArrayBuffer` to properly resolve imports. +namespace NitroModules { class ArrayBuffer; } // Forward declaration of `BatchQueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } // Forward declaration of `FileLoadResult` to properly resolve imports. @@ -28,9 +30,10 @@ namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } #include #include "Transaction.hpp" #include "QueryResult.hpp" -#include -#include "BatchQueryResult.hpp" #include +#include +#include "BatchQueryResult.hpp" +#include #include #include "FileLoadResult.hpp" @@ -70,14 +73,14 @@ namespace margelo::nitro::rnquicksqlite { virtual void setDetach(const std::function& detach) = 0; virtual std::function>(const std::string& /* dbName */, const std::function>(const Transaction& /* tx */)>& /* fn */)> getTransaction() = 0; virtual void setTransaction(const std::function>(const std::string& /* dbName */, const std::function>(const Transaction& /* tx */)>& /* fn */)>& transaction) = 0; - virtual std::function(const std::string& /* dbName */, const std::string& /* query */, const std::vector& /* params */)> getExecute() = 0; - virtual void setExecute(const std::function(const std::string& /* dbName */, const std::string& /* query */, const std::vector& /* params */)>& execute) = 0; - virtual std::function>(const std::string& /* dbName */, const std::string& /* query */, const std::vector& /* params */)> getExecuteAsync() = 0; - virtual void setExecuteAsync(const std::function>(const std::string& /* dbName */, const std::string& /* query */, const std::vector& /* params */)>& executeAsync) = 0; - virtual std::function(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)> getExecuteBatch() = 0; - virtual void setExecuteBatch(const std::function(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)>& executeBatch) = 0; - virtual std::function>(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)> getExecuteBatchAsync() = 0; - virtual void setExecuteBatchAsync(const std::function>(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)>& executeBatchAsync) = 0; + virtual std::function(const std::string& /* dbName */, const std::string& /* query */, const std::variant>& /* params */)> getExecute() = 0; + virtual void setExecute(const std::function(const std::string& /* dbName */, const std::string& /* query */, const std::variant>& /* params */)>& execute) = 0; + virtual std::function>(const std::string& /* dbName */, const std::string& /* query */, const std::variant>& /* params */)> getExecuteAsync() = 0; + virtual void setExecuteAsync(const std::function>(const std::string& /* dbName */, const std::string& /* query */, const std::variant>& /* params */)>& executeAsync) = 0; + virtual std::function(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)> getExecuteBatch() = 0; + virtual void setExecuteBatch(const std::function(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)>& executeBatch) = 0; + virtual std::function>(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)> getExecuteBatchAsync() = 0; + virtual void setExecuteBatchAsync(const std::function>(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)>& executeBatchAsync) = 0; virtual std::function(const std::string& /* dbName */, const std::string& /* location */)> getLoadFile() = 0; virtual void setLoadFile(const std::function(const std::string& /* dbName */, const std::string& /* location */)>& loadFile) = 0; virtual std::function>(const std::string& /* dbName */, const std::string& /* location */)> getLoadFileAsync() = 0; diff --git a/nitrogen/generated/shared/c++/QueryResultRow.hpp b/nitrogen/generated/shared/c++/QueryResultRow.hpp index aad99803..7923b022 100644 --- a/nitrogen/generated/shared/c++/QueryResultRow.hpp +++ b/nitrogen/generated/shared/c++/QueryResultRow.hpp @@ -22,7 +22,6 @@ #include -#include #include #include @@ -33,12 +32,12 @@ namespace margelo::nitro::rnquicksqlite { */ struct QueryResultRow { public: - std::vector _array SWIFT_PRIVATE; + std::vector _array SWIFT_PRIVATE; double length SWIFT_PRIVATE; - std::function(double /* idx */)> item SWIFT_PRIVATE; + std::function(double /* idx */)> item SWIFT_PRIVATE; public: - explicit QueryResultRow(std::vector _array, double length, std::function(double /* idx */)> item): _array(_array), length(length), item(item) {} + explicit QueryResultRow(std::vector _array, double length, std::function(double /* idx */)> item): _array(_array), length(length), item(item) {} }; } // namespace margelo::nitro::rnquicksqlite @@ -53,16 +52,16 @@ namespace margelo::nitro { static inline QueryResultRow fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { jsi::Object obj = arg.asObject(runtime); return QueryResultRow( - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "_array")), + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "_array")), JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "length")), - JSIConverter(double /* idx */)>>::fromJSI(runtime, obj.getProperty(runtime, "item")) + JSIConverter(double /* idx */)>>::fromJSI(runtime, obj.getProperty(runtime, "item")) ); } static inline jsi::Value toJSI(jsi::Runtime& runtime, const QueryResultRow& arg) { jsi::Object obj(runtime); - obj.setProperty(runtime, "_array", JSIConverter>::toJSI(runtime, arg._array)); + obj.setProperty(runtime, "_array", JSIConverter>::toJSI(runtime, arg._array)); obj.setProperty(runtime, "length", JSIConverter::toJSI(runtime, arg.length)); - obj.setProperty(runtime, "item", JSIConverter(double /* idx */)>>::toJSI(runtime, arg.item)); + obj.setProperty(runtime, "item", JSIConverter(double /* idx */)>>::toJSI(runtime, arg.item)); return obj; } static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { @@ -70,9 +69,9 @@ namespace margelo::nitro { return false; } jsi::Object obj = value.getObject(runtime); - if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "_array"))) return false; + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "_array"))) return false; if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "length"))) return false; - if (!JSIConverter(double /* idx */)>>::canConvert(runtime, obj.getProperty(runtime, "item"))) return false; + if (!JSIConverter(double /* idx */)>>::canConvert(runtime, obj.getProperty(runtime, "item"))) return false; return true; } }; diff --git a/nitrogen/generated/shared/c++/Transaction.hpp b/nitrogen/generated/shared/c++/Transaction.hpp index 3837c33e..0e82de7e 100644 --- a/nitrogen/generated/shared/c++/Transaction.hpp +++ b/nitrogen/generated/shared/c++/Transaction.hpp @@ -21,12 +21,15 @@ // Forward declaration of `QueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct QueryResult; } +// Forward declaration of `ArrayBuffer` to properly resolve imports. +namespace NitroModules { class ArrayBuffer; } #include #include #include "QueryResult.hpp" #include -#include +#include +#include namespace margelo::nitro::rnquicksqlite { @@ -36,12 +39,12 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction { public: std::function()> commit SWIFT_PRIVATE; - std::function(const std::string& /* query */, const std::vector& /* params */)> execute SWIFT_PRIVATE; - std::function>(const std::string& /* query */, const std::vector& /* params */)> executeAsync SWIFT_PRIVATE; + std::function(const std::string& /* query */, const std::variant>& /* params */)> execute SWIFT_PRIVATE; + std::function>(const std::string& /* query */, const std::variant>& /* params */)> executeAsync SWIFT_PRIVATE; std::function()> rollback SWIFT_PRIVATE; public: - explicit Transaction(std::function()> commit, std::function(const std::string& /* query */, const std::vector& /* params */)> execute, std::function>(const std::string& /* query */, const std::vector& /* params */)> executeAsync, std::function()> rollback): commit(commit), execute(execute), executeAsync(executeAsync), rollback(rollback) {} + explicit Transaction(std::function()> commit, std::function(const std::string& /* query */, const std::variant>& /* params */)> execute, std::function>(const std::string& /* query */, const std::variant>& /* params */)> executeAsync, std::function()> rollback): commit(commit), execute(execute), executeAsync(executeAsync), rollback(rollback) {} }; } // namespace margelo::nitro::rnquicksqlite @@ -57,16 +60,16 @@ namespace margelo::nitro { jsi::Object obj = arg.asObject(runtime); return Transaction( JSIConverter()>>::fromJSI(runtime, obj.getProperty(runtime, "commit")), - JSIConverter(const std::string& /* query */, const std::vector& /* params */)>>::fromJSI(runtime, obj.getProperty(runtime, "execute")), - JSIConverter>(const std::string& /* query */, const std::vector& /* params */)>>::fromJSI(runtime, obj.getProperty(runtime, "executeAsync")), + JSIConverter(const std::string& /* query */, const std::variant>& /* params */)>>::fromJSI(runtime, obj.getProperty(runtime, "execute")), + JSIConverter>(const std::string& /* query */, const std::variant>& /* params */)>>::fromJSI(runtime, obj.getProperty(runtime, "executeAsync")), JSIConverter()>>::fromJSI(runtime, obj.getProperty(runtime, "rollback")) ); } static inline jsi::Value toJSI(jsi::Runtime& runtime, const Transaction& arg) { jsi::Object obj(runtime); obj.setProperty(runtime, "commit", JSIConverter()>>::toJSI(runtime, arg.commit)); - obj.setProperty(runtime, "execute", JSIConverter(const std::string& /* query */, const std::vector& /* params */)>>::toJSI(runtime, arg.execute)); - obj.setProperty(runtime, "executeAsync", JSIConverter>(const std::string& /* query */, const std::vector& /* params */)>>::toJSI(runtime, arg.executeAsync)); + obj.setProperty(runtime, "execute", JSIConverter(const std::string& /* query */, const std::variant>& /* params */)>>::toJSI(runtime, arg.execute)); + obj.setProperty(runtime, "executeAsync", JSIConverter>(const std::string& /* query */, const std::variant>& /* params */)>>::toJSI(runtime, arg.executeAsync)); obj.setProperty(runtime, "rollback", JSIConverter()>>::toJSI(runtime, arg.rollback)); return obj; } @@ -76,8 +79,8 @@ namespace margelo::nitro { } jsi::Object obj = value.getObject(runtime); if (!JSIConverter()>>::canConvert(runtime, obj.getProperty(runtime, "commit"))) return false; - if (!JSIConverter(const std::string& /* query */, const std::vector& /* params */)>>::canConvert(runtime, obj.getProperty(runtime, "execute"))) return false; - if (!JSIConverter>(const std::string& /* query */, const std::vector& /* params */)>>::canConvert(runtime, obj.getProperty(runtime, "executeAsync"))) return false; + if (!JSIConverter(const std::string& /* query */, const std::variant>& /* params */)>>::canConvert(runtime, obj.getProperty(runtime, "execute"))) return false; + if (!JSIConverter>(const std::string& /* query */, const std::variant>& /* params */)>>::canConvert(runtime, obj.getProperty(runtime, "executeAsync"))) return false; if (!JSIConverter()>>::canConvert(runtime, obj.getProperty(runtime, "rollback"))) return false; return true; } From a8c04f621a464471bf9948b5dcb84dce22fa1054 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 1 Sep 2024 16:01:51 +0200 Subject: [PATCH 010/156] update nitrogen files --- .../ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 228 ++++-------------- .../ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp | 12 +- .../shared/c++/HybridQuickSQLiteSpec.cpp | 36 +-- .../shared/c++/HybridQuickSQLiteSpec.hpp | 41 ++-- nitrogen/generated/shared/c++/QueryResult.hpp | 16 +- ...QueryResultRow.hpp => QueryResultRows.hpp} | 38 +-- .../generated/shared/c++/QuickDataType.hpp | 99 ++++++++ nitrogen/generated/shared/c++/QuickValue.hpp | 98 ++++++++ src/index.ts | 15 +- src/specs/QuickSQLite.nitro.ts | 44 ++-- src/types.ts | 119 ++++++--- 11 files changed, 418 insertions(+), 328 deletions(-) rename nitrogen/generated/shared/c++/{QueryResultRow.hpp => QueryResultRows.hpp} (56%) create mode 100644 nitrogen/generated/shared/c++/QuickDataType.hpp create mode 100644 nitrogen/generated/shared/c++/QuickValue.hpp diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index 55d9dcf3..f4401b50 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -17,10 +17,12 @@ namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } // Forward declaration of `FileLoadResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } -// Forward declaration of `QueryResultRow` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct QueryResultRow; } +// Forward declaration of `QueryResultRows` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct QueryResultRows; } // Forward declaration of `QueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct QueryResult; } +// Forward declaration of `QuickValue` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct QuickValue; } // Forward declaration of `Transaction` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct Transaction; } @@ -29,7 +31,8 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction; } #include "ColumnMetadata.hpp" #include "FileLoadResult.hpp" #include "QueryResult.hpp" -#include "QueryResultRow.hpp" +#include "QueryResultRows.hpp" +#include "QuickValue.hpp" #include "Transaction.hpp" #include #include @@ -49,45 +52,11 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction; } namespace margelo::nitro::rnquicksqlite::bridge::swift { /** - * Specialized version of `std::function`. + * Specialized version of `std::optional`. */ - using Func_void_std__string_std__string = std::function; - inline Func_void_std__string_std__string create_Func_void_std__string_std__string(void* closureHolder, void(*call)(void* /* closureHolder */, std::string, std::string), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& dbName, const std::string& location) -> void { - call(sharedClosureHolder.get(), dbName, location); - }; - } - inline std::shared_ptr share_Func_void_std__string_std__string(const Func_void_std__string_std__string& value) { - return std::make_shared(value); - } - - /** - * Specialized version of `std::function`. - */ - using Func_void_std__string = std::function; - inline Func_void_std__string create_Func_void_std__string(void* closureHolder, void(*call)(void* /* closureHolder */, std::string), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& dbName) -> void { - call(sharedClosureHolder.get(), dbName); - }; - } - inline std::shared_ptr share_Func_void_std__string(const Func_void_std__string& value) { - return std::make_shared(value); - } - - /** - * Specialized version of `std::function`. - */ - using Func_void_std__string_std__string_std__string_std__string = std::function; - inline Func_void_std__string_std__string_std__string_std__string create_Func_void_std__string_std__string_std__string_std__string(void* closureHolder, void(*call)(void* /* closureHolder */, std::string, std::string, std::string, std::string), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& mainDbName, const std::string& dbNameToAttach, const std::string& alias, const std::string& location) -> void { - call(sharedClosureHolder.get(), mainDbName, dbNameToAttach, alias, location); - }; - } - inline std::shared_ptr share_Func_void_std__string_std__string_std__string_std__string(const Func_void_std__string_std__string_std__string_std__string& value) { - return std::make_shared(value); + using std__optional_std__string_ = std::optional; + inline std::optional create_std__optional_std__string_(const std::string& value) { + return std::optional(value); } /** @@ -107,54 +76,44 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { } /** - * Specialized version of `std::vector`. + * Specialized version of `std::vector`. */ - using std__vector_std__nullptr_t_ = std::vector; - inline std::vector create_std__vector_std__nullptr_t_(size_t size) { - std::vector vector; + using std__vector_QuickValue_ = std::vector; + inline std::vector create_std__vector_QuickValue_(size_t size) { + std::vector vector; vector.reserve(size); return vector; } /** - * Specialized version of `std::function(double / * idx * /)>`. + * Specialized version of `std::function(double / * idx * /)>`. */ - using Func_std__future_std__nullptr_t__double = std::function(double /* idx */)>; - inline Func_std__future_std__nullptr_t__double create_Func_std__future_std__nullptr_t__double(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, double), void(*destroy)(void*)) { + using Func_std__future_QuickValue__double = std::function(double /* idx */)>; + inline Func_std__future_QuickValue__double create_Func_std__future_QuickValue__double(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, double), void(*destroy)(void*)) { std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](double idx) -> std::future { + return [sharedClosureHolder, call](double idx) -> std::future { auto result = call(sharedClosureHolder.get(), idx); return result.getFuture(); }; } - inline std::shared_ptr share_Func_std__future_std__nullptr_t__double(const Func_std__future_std__nullptr_t__double& value) { - return std::make_shared(value); + inline std::shared_ptr share_Func_std__future_QuickValue__double(const Func_std__future_QuickValue__double& value) { + return std::make_shared(value); } /** - * Specialized version of `PromiseHolder`. + * Specialized version of `PromiseHolder`. */ - using PromiseHolder_std__nullptr_t_ = PromiseHolder; - inline PromiseHolder create_PromiseHolder_std__nullptr_t_() { - return PromiseHolder(); + using PromiseHolder_QuickValue_ = PromiseHolder; + inline PromiseHolder create_PromiseHolder_QuickValue_() { + return PromiseHolder(); } /** - * Specialized version of `std::vector`. + * Specialized version of `std::optional`. */ - using std__vector_QueryResultRow_ = std::vector; - inline std::vector create_std__vector_QueryResultRow_(size_t size) { - std::vector vector; - vector.reserve(size); - return vector; - } - - /** - * Specialized version of `std::optional>`. - */ - using std__optional_std__vector_QueryResultRow__ = std::optional>; - inline std::optional> create_std__optional_std__vector_QueryResultRow__(const std::vector& value) { - return std::optional>(value); + using std__optional_QueryResultRows_ = std::optional; + inline std::optional create_std__optional_QueryResultRows_(const QueryResultRows& value) { + return std::optional(value); } /** @@ -295,48 +254,11 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { } /** - * Specialized version of `std::function>(const std::string& / * dbName * /, const std::function>(const Transaction& / * tx * /)>& / * fn * /)>`. - */ - using Func_std__future_std__future_void___std__string_std__function_std__future_std__future_void___const_Transaction_____tx_____ = std::function>(const std::string& /* dbName */, const std::function>(const Transaction& /* tx */)>& /* fn */)>; - inline Func_std__future_std__future_void___std__string_std__function_std__future_std__future_void___const_Transaction_____tx_____ create_Func_std__future_std__future_void___std__string_std__function_std__future_std__future_void___const_Transaction_____tx_____(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, std::string, std::function>(const Transaction& /* tx */)>), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& dbName, const std::function>(const Transaction& /* tx */)>& fn) -> std::future> { - auto result = call(sharedClosureHolder.get(), dbName, fn); - return result.getFuture(); - }; - } - inline std::shared_ptr share_Func_std__future_std__future_void___std__string_std__function_std__future_std__future_void___const_Transaction_____tx_____(const Func_std__future_std__future_void___std__string_std__function_std__future_std__future_void___const_Transaction_____tx_____& value) { - return std::make_shared(value); - } - - /** - * Specialized version of `std::function(const std::string& / * dbName * /, const std::string& / * query * /, const std::variant>& / * params * /)>`. - */ - using Func_std__future_QueryResult__std__string_std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ = std::function(const std::string& /* dbName */, const std::string& /* query */, const std::variant>& /* params */)>; - inline Func_std__future_QueryResult__std__string_std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ create_Func_std__future_QueryResult__std__string_std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, std::string, std::string, std::variant>), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& dbName, const std::string& query, const std::variant>& params) -> std::future { - auto result = call(sharedClosureHolder.get(), dbName, query, params); - return result.getFuture(); - }; - } - inline std::shared_ptr share_Func_std__future_QueryResult__std__string_std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(const Func_std__future_QueryResult__std__string_std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__& value) { - return std::make_shared(value); - } - - /** - * Specialized version of `std::function>(const std::string& / * dbName * /, const std::string& / * query * /, const std::variant>& / * params * /)>`. + * Specialized version of `std::optional>>`. */ - using Func_std__future_std__future_QueryResult___std__string_std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ = std::function>(const std::string& /* dbName */, const std::string& /* query */, const std::variant>& /* params */)>; - inline Func_std__future_std__future_QueryResult___std__string_std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ create_Func_std__future_std__future_QueryResult___std__string_std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, std::string, std::string, std::variant>), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& dbName, const std::string& query, const std::variant>& params) -> std::future> { - auto result = call(sharedClosureHolder.get(), dbName, query, params); - return result.getFuture(); - }; - } - inline std::shared_ptr share_Func_std__future_std__future_QueryResult___std__string_std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(const Func_std__future_std__future_QueryResult___std__string_std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__& value) { - return std::make_shared(value); + using std__optional_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___ = std::optional>>; + inline std::optional>> create_std__optional_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___(const std::variant>& value) { + return std::optional>>(value); } /** @@ -347,6 +269,16 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { return std::tuple { arg0 }; } + /** + * Specialized version of `std::vector`. + */ + using std__vector_std__nullptr_t_ = std::vector; + inline std::vector create_std__vector_std__nullptr_t_(size_t size) { + std::vector vector; + vector.reserve(size); + return vector; + } + /** * Specialized version of `std::vector>`. */ @@ -409,21 +341,6 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { return vector; } - /** - * Specialized version of `std::function(const std::string& / * dbName * /, const std::vector, std::tuple, std::vector>>>>>& / * commands * /)>`. - */ - using Func_std__future_BatchQueryResult__std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______ = std::function(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)>; - inline Func_std__future_BatchQueryResult__std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______ create_Func_std__future_BatchQueryResult__std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, std::string, std::vector, std::tuple, std::vector>>>>>), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) -> std::future { - auto result = call(sharedClosureHolder.get(), dbName, commands); - return result.getFuture(); - }; - } - inline std::shared_ptr share_Func_std__future_BatchQueryResult__std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______(const Func_std__future_BatchQueryResult__std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______& value) { - return std::make_shared(value); - } - /** * Specialized version of `PromiseHolder`. */ @@ -432,44 +349,6 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { return PromiseHolder(); } - /** - * Specialized version of `std::function>(const std::string& / * dbName * /, const std::vector, std::tuple, std::vector>>>>>& / * commands * /)>`. - */ - using Func_std__future_std__future_BatchQueryResult___std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______ = std::function>(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)>; - inline Func_std__future_std__future_BatchQueryResult___std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______ create_Func_std__future_std__future_BatchQueryResult___std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, std::string, std::vector, std::tuple, std::vector>>>>>), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) -> std::future> { - auto result = call(sharedClosureHolder.get(), dbName, commands); - return result.getFuture(); - }; - } - inline std::shared_ptr share_Func_std__future_std__future_BatchQueryResult___std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______(const Func_std__future_std__future_BatchQueryResult___std__string_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______& value) { - return std::make_shared(value); - } - - /** - * Specialized version of `PromiseHolder>`. - */ - using PromiseHolder_std__future_BatchQueryResult__ = PromiseHolder>; - inline PromiseHolder> create_PromiseHolder_std__future_BatchQueryResult__() { - return PromiseHolder>(); - } - - /** - * Specialized version of `std::function(const std::string& / * dbName * /, const std::string& / * location * /)>`. - */ - using Func_std__future_FileLoadResult__std__string_std__string = std::function(const std::string& /* dbName */, const std::string& /* location */)>; - inline Func_std__future_FileLoadResult__std__string_std__string create_Func_std__future_FileLoadResult__std__string_std__string(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, std::string, std::string), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& dbName, const std::string& location) -> std::future { - auto result = call(sharedClosureHolder.get(), dbName, location); - return result.getFuture(); - }; - } - inline std::shared_ptr share_Func_std__future_FileLoadResult__std__string_std__string(const Func_std__future_FileLoadResult__std__string_std__string& value) { - return std::make_shared(value); - } - /** * Specialized version of `PromiseHolder`. */ @@ -477,28 +356,5 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { inline PromiseHolder create_PromiseHolder_FileLoadResult_() { return PromiseHolder(); } - - /** - * Specialized version of `std::function>(const std::string& / * dbName * /, const std::string& / * location * /)>`. - */ - using Func_std__future_std__future_FileLoadResult___std__string_std__string = std::function>(const std::string& /* dbName */, const std::string& /* location */)>; - inline Func_std__future_std__future_FileLoadResult___std__string_std__string create_Func_std__future_std__future_FileLoadResult___std__string_std__string(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, std::string, std::string), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& dbName, const std::string& location) -> std::future> { - auto result = call(sharedClosureHolder.get(), dbName, location); - return result.getFuture(); - }; - } - inline std::shared_ptr share_Func_std__future_std__future_FileLoadResult___std__string_std__string(const Func_std__future_std__future_FileLoadResult___std__string_std__string& value) { - return std::make_shared(value); - } - - /** - * Specialized version of `PromiseHolder>`. - */ - using PromiseHolder_std__future_FileLoadResult__ = PromiseHolder>; - inline PromiseHolder> create_PromiseHolder_std__future_FileLoadResult__() { - return PromiseHolder>(); - } } // namespace margelo::nitro::rnquicksqlite::bridge::swift diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp index 0fd4007e..053105e4 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp @@ -17,10 +17,14 @@ namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } // Forward declaration of `FileLoadResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } -// Forward declaration of `QueryResultRow` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct QueryResultRow; } +// Forward declaration of `QueryResultRows` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct QueryResultRows; } // Forward declaration of `QueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct QueryResult; } +// Forward declaration of `QuickDataType` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { enum class QuickDataType; } +// Forward declaration of `QuickValue` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct QuickValue; } // Forward declaration of `Transaction` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct Transaction; } @@ -29,7 +33,9 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction; } #include "ColumnMetadata.hpp" #include "FileLoadResult.hpp" #include "QueryResult.hpp" -#include "QueryResultRow.hpp" +#include "QueryResultRows.hpp" +#include "QuickDataType.hpp" +#include "QuickValue.hpp" #include "Transaction.hpp" #include #include diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp index ca4a0126..c5da9dd0 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp @@ -15,30 +15,18 @@ namespace margelo::nitro::rnquicksqlite { HybridObject::loadHybridMethods(); // load custom methods/properties registerHybrids(this, [](Prototype& prototype) { - prototype.registerHybridGetter("open", &HybridQuickSQLiteSpec::getOpen); - prototype.registerHybridSetter("open", &HybridQuickSQLiteSpec::setOpen); - prototype.registerHybridGetter("close", &HybridQuickSQLiteSpec::getClose); - prototype.registerHybridSetter("close", &HybridQuickSQLiteSpec::setClose); - prototype.registerHybridGetter("delete", &HybridQuickSQLiteSpec::getDelete); - prototype.registerHybridSetter("delete", &HybridQuickSQLiteSpec::setDelete); - prototype.registerHybridGetter("attach", &HybridQuickSQLiteSpec::getAttach); - prototype.registerHybridSetter("attach", &HybridQuickSQLiteSpec::setAttach); - prototype.registerHybridGetter("detach", &HybridQuickSQLiteSpec::getDetach); - prototype.registerHybridSetter("detach", &HybridQuickSQLiteSpec::setDetach); - prototype.registerHybridGetter("transaction", &HybridQuickSQLiteSpec::getTransaction); - prototype.registerHybridSetter("transaction", &HybridQuickSQLiteSpec::setTransaction); - prototype.registerHybridGetter("execute", &HybridQuickSQLiteSpec::getExecute); - prototype.registerHybridSetter("execute", &HybridQuickSQLiteSpec::setExecute); - prototype.registerHybridGetter("executeAsync", &HybridQuickSQLiteSpec::getExecuteAsync); - prototype.registerHybridSetter("executeAsync", &HybridQuickSQLiteSpec::setExecuteAsync); - prototype.registerHybridGetter("executeBatch", &HybridQuickSQLiteSpec::getExecuteBatch); - prototype.registerHybridSetter("executeBatch", &HybridQuickSQLiteSpec::setExecuteBatch); - prototype.registerHybridGetter("executeBatchAsync", &HybridQuickSQLiteSpec::getExecuteBatchAsync); - prototype.registerHybridSetter("executeBatchAsync", &HybridQuickSQLiteSpec::setExecuteBatchAsync); - prototype.registerHybridGetter("loadFile", &HybridQuickSQLiteSpec::getLoadFile); - prototype.registerHybridSetter("loadFile", &HybridQuickSQLiteSpec::setLoadFile); - prototype.registerHybridGetter("loadFileAsync", &HybridQuickSQLiteSpec::getLoadFileAsync); - prototype.registerHybridSetter("loadFileAsync", &HybridQuickSQLiteSpec::setLoadFileAsync); + prototype.registerHybridMethod("open", &HybridQuickSQLiteSpec::open); + prototype.registerHybridMethod("close", &HybridQuickSQLiteSpec::close); + prototype.registerHybridMethod("delete", &HybridQuickSQLiteSpec::delete); + prototype.registerHybridMethod("attach", &HybridQuickSQLiteSpec::attach); + prototype.registerHybridMethod("detach", &HybridQuickSQLiteSpec::detach); + prototype.registerHybridMethod("transaction", &HybridQuickSQLiteSpec::transaction); + prototype.registerHybridMethod("execute", &HybridQuickSQLiteSpec::execute); + prototype.registerHybridMethod("executeAsync", &HybridQuickSQLiteSpec::executeAsync); + prototype.registerHybridMethod("executeBatch", &HybridQuickSQLiteSpec::executeBatch); + prototype.registerHybridMethod("executeBatchAsync", &HybridQuickSQLiteSpec::executeBatchAsync); + prototype.registerHybridMethod("loadFile", &HybridQuickSQLiteSpec::loadFile); + prototype.registerHybridMethod("loadFileAsync", &HybridQuickSQLiteSpec::loadFileAsync); }); } diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp index 58a2f655..dc1b72de 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp @@ -25,9 +25,10 @@ namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } // Forward declaration of `FileLoadResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } -#include #include +#include #include +#include #include "Transaction.hpp" #include "QueryResult.hpp" #include @@ -61,34 +62,22 @@ namespace margelo::nitro::rnquicksqlite { public: // Properties - virtual std::function getOpen() = 0; - virtual void setOpen(const std::function& open) = 0; - virtual std::function getClose() = 0; - virtual void setClose(const std::function& close) = 0; - virtual std::function getDelete() = 0; - virtual void setDelete(const std::function& delete) = 0; - virtual std::function getAttach() = 0; - virtual void setAttach(const std::function& attach) = 0; - virtual std::function getDetach() = 0; - virtual void setDetach(const std::function& detach) = 0; - virtual std::function>(const std::string& /* dbName */, const std::function>(const Transaction& /* tx */)>& /* fn */)> getTransaction() = 0; - virtual void setTransaction(const std::function>(const std::string& /* dbName */, const std::function>(const Transaction& /* tx */)>& /* fn */)>& transaction) = 0; - virtual std::function(const std::string& /* dbName */, const std::string& /* query */, const std::variant>& /* params */)> getExecute() = 0; - virtual void setExecute(const std::function(const std::string& /* dbName */, const std::string& /* query */, const std::variant>& /* params */)>& execute) = 0; - virtual std::function>(const std::string& /* dbName */, const std::string& /* query */, const std::variant>& /* params */)> getExecuteAsync() = 0; - virtual void setExecuteAsync(const std::function>(const std::string& /* dbName */, const std::string& /* query */, const std::variant>& /* params */)>& executeAsync) = 0; - virtual std::function(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)> getExecuteBatch() = 0; - virtual void setExecuteBatch(const std::function(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)>& executeBatch) = 0; - virtual std::function>(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)> getExecuteBatchAsync() = 0; - virtual void setExecuteBatchAsync(const std::function>(const std::string& /* dbName */, const std::vector, std::tuple, std::vector>>>>>& /* commands */)>& executeBatchAsync) = 0; - virtual std::function(const std::string& /* dbName */, const std::string& /* location */)> getLoadFile() = 0; - virtual void setLoadFile(const std::function(const std::string& /* dbName */, const std::string& /* location */)>& loadFile) = 0; - virtual std::function>(const std::string& /* dbName */, const std::string& /* location */)> getLoadFileAsync() = 0; - virtual void setLoadFileAsync(const std::function>(const std::string& /* dbName */, const std::string& /* location */)>& loadFileAsync) = 0; + public: // Methods - + virtual void open(const std::string& dbName, const std::optional& location) = 0; + virtual void close(const std::string& dbName) = 0; + virtual void delete(const std::string& dbName, const std::optional& location) = 0; + virtual void attach(const std::string& mainDbName, const std::string& dbNameToAttach, const std::string& alias, const std::optional& location) = 0; + virtual void detach(const std::string& mainDbName, const std::string& alias) = 0; + virtual std::future transaction(const std::string& dbName, const std::function>(const Transaction& /* tx */)>& fn) = 0; + virtual QueryResult execute(const std::string& dbName, const std::string& query, const std::optional>>& params) = 0; + virtual std::future executeAsync(const std::string& dbName, const std::string& query, const std::optional>>& params) = 0; + virtual BatchQueryResult executeBatch(const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) = 0; + virtual std::future executeBatchAsync(const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) = 0; + virtual FileLoadResult loadFile(const std::string& dbName, const std::string& location) = 0; + virtual std::future loadFileAsync(const std::string& dbName, const std::string& location) = 0; protected: // Hybrid Setup diff --git a/nitrogen/generated/shared/c++/QueryResult.hpp b/nitrogen/generated/shared/c++/QueryResult.hpp index ff83e9f3..2a007256 100644 --- a/nitrogen/generated/shared/c++/QueryResult.hpp +++ b/nitrogen/generated/shared/c++/QueryResult.hpp @@ -19,14 +19,14 @@ #error NitroModules cannot be found! Are you sure you installed NitroModules properly? #endif -// Forward declaration of `QueryResultRow` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct QueryResultRow; } +// Forward declaration of `QueryResultRows` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct QueryResultRows; } // Forward declaration of `ColumnMetadata` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } #include +#include "QueryResultRows.hpp" #include -#include "QueryResultRow.hpp" #include "ColumnMetadata.hpp" namespace margelo::nitro::rnquicksqlite { @@ -38,11 +38,11 @@ namespace margelo::nitro::rnquicksqlite { public: std::optional insertId SWIFT_PRIVATE; double rowsAffected SWIFT_PRIVATE; - std::optional> rows SWIFT_PRIVATE; + std::optional rows SWIFT_PRIVATE; std::optional> metadata SWIFT_PRIVATE; public: - explicit QueryResult(std::optional insertId, double rowsAffected, std::optional> rows, std::optional> metadata): insertId(insertId), rowsAffected(rowsAffected), rows(rows), metadata(metadata) {} + explicit QueryResult(std::optional insertId, double rowsAffected, std::optional rows, std::optional> metadata): insertId(insertId), rowsAffected(rowsAffected), rows(rows), metadata(metadata) {} }; } // namespace margelo::nitro::rnquicksqlite @@ -59,7 +59,7 @@ namespace margelo::nitro { return QueryResult( JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "insertId")), JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "rowsAffected")), - JSIConverter>>::fromJSI(runtime, obj.getProperty(runtime, "rows")), + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "rows")), JSIConverter>>::fromJSI(runtime, obj.getProperty(runtime, "metadata")) ); } @@ -67,7 +67,7 @@ namespace margelo::nitro { jsi::Object obj(runtime); obj.setProperty(runtime, "insertId", JSIConverter>::toJSI(runtime, arg.insertId)); obj.setProperty(runtime, "rowsAffected", JSIConverter::toJSI(runtime, arg.rowsAffected)); - obj.setProperty(runtime, "rows", JSIConverter>>::toJSI(runtime, arg.rows)); + obj.setProperty(runtime, "rows", JSIConverter>::toJSI(runtime, arg.rows)); obj.setProperty(runtime, "metadata", JSIConverter>>::toJSI(runtime, arg.metadata)); return obj; } @@ -78,7 +78,7 @@ namespace margelo::nitro { jsi::Object obj = value.getObject(runtime); if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "insertId"))) return false; if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "rowsAffected"))) return false; - if (!JSIConverter>>::canConvert(runtime, obj.getProperty(runtime, "rows"))) return false; + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "rows"))) return false; if (!JSIConverter>>::canConvert(runtime, obj.getProperty(runtime, "metadata"))) return false; return true; } diff --git a/nitrogen/generated/shared/c++/QueryResultRow.hpp b/nitrogen/generated/shared/c++/QueryResultRows.hpp similarity index 56% rename from nitrogen/generated/shared/c++/QueryResultRow.hpp rename to nitrogen/generated/shared/c++/QueryResultRows.hpp index 7923b022..e69f172b 100644 --- a/nitrogen/generated/shared/c++/QueryResultRow.hpp +++ b/nitrogen/generated/shared/c++/QueryResultRows.hpp @@ -1,5 +1,5 @@ /// -/// QueryResultRow.hpp +/// QueryResultRows.hpp /// Sun Sep 01 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro @@ -19,25 +19,27 @@ #error NitroModules cannot be found! Are you sure you installed NitroModules properly? #endif - +// Forward declaration of `QuickValue` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct QuickValue; } #include +#include "QuickValue.hpp" #include #include namespace margelo::nitro::rnquicksqlite { /** - * A struct which can be represented as a JavaScript object (QueryResultRow). + * A struct which can be represented as a JavaScript object (QueryResultRows). */ - struct QueryResultRow { + struct QueryResultRows { public: - std::vector _array SWIFT_PRIVATE; + std::vector _array SWIFT_PRIVATE; double length SWIFT_PRIVATE; - std::function(double /* idx */)> item SWIFT_PRIVATE; + std::function(double /* idx */)> item SWIFT_PRIVATE; public: - explicit QueryResultRow(std::vector _array, double length, std::function(double /* idx */)> item): _array(_array), length(length), item(item) {} + explicit QueryResultRows(std::vector _array, double length, std::function(double /* idx */)> item): _array(_array), length(length), item(item) {} }; } // namespace margelo::nitro::rnquicksqlite @@ -46,22 +48,22 @@ namespace margelo::nitro { using namespace margelo::nitro::rnquicksqlite; - // C++ QueryResultRow <> JS QueryResultRow (object) + // C++ QueryResultRows <> JS QueryResultRows (object) template <> - struct JSIConverter { - static inline QueryResultRow fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + struct JSIConverter { + static inline QueryResultRows fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { jsi::Object obj = arg.asObject(runtime); - return QueryResultRow( - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "_array")), + return QueryResultRows( + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "_array")), JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "length")), - JSIConverter(double /* idx */)>>::fromJSI(runtime, obj.getProperty(runtime, "item")) + JSIConverter(double /* idx */)>>::fromJSI(runtime, obj.getProperty(runtime, "item")) ); } - static inline jsi::Value toJSI(jsi::Runtime& runtime, const QueryResultRow& arg) { + static inline jsi::Value toJSI(jsi::Runtime& runtime, const QueryResultRows& arg) { jsi::Object obj(runtime); - obj.setProperty(runtime, "_array", JSIConverter>::toJSI(runtime, arg._array)); + obj.setProperty(runtime, "_array", JSIConverter>::toJSI(runtime, arg._array)); obj.setProperty(runtime, "length", JSIConverter::toJSI(runtime, arg.length)); - obj.setProperty(runtime, "item", JSIConverter(double /* idx */)>>::toJSI(runtime, arg.item)); + obj.setProperty(runtime, "item", JSIConverter(double /* idx */)>>::toJSI(runtime, arg.item)); return obj; } static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { @@ -69,9 +71,9 @@ namespace margelo::nitro { return false; } jsi::Object obj = value.getObject(runtime); - if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "_array"))) return false; + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "_array"))) return false; if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "length"))) return false; - if (!JSIConverter(double /* idx */)>>::canConvert(runtime, obj.getProperty(runtime, "item"))) return false; + if (!JSIConverter(double /* idx */)>>::canConvert(runtime, obj.getProperty(runtime, "item"))) return false; return true; } }; diff --git a/nitrogen/generated/shared/c++/QuickDataType.hpp b/nitrogen/generated/shared/c++/QuickDataType.hpp new file mode 100644 index 00000000..099979c9 --- /dev/null +++ b/nitrogen/generated/shared/c++/QuickDataType.hpp @@ -0,0 +1,99 @@ +/// +/// QuickDataType.hpp +/// Sun Sep 01 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +namespace margelo::nitro::rnquicksqlite { + + /** + * An enum which can be represented as a JavaScript union (QuickDataType). + */ + enum class QuickDataType { + NULL_VALUE SWIFT_NAME(nullValue) = 0, + TEXT SWIFT_NAME(text) = 1, + INTEGER SWIFT_NAME(integer) = 2, + INT64 SWIFT_NAME(int64) = 3, + DOUBLE SWIFT_NAME(double) = 4, + BOOLEAN SWIFT_NAME(boolean) = 5, + ARRAY_BUFFER SWIFT_NAME(arrayBuffer) = 6, + } CLOSED_ENUM; + +} // namespace margelo::nitro::rnquicksqlite + +namespace margelo::nitro { + + using namespace margelo::nitro::rnquicksqlite; + + // C++ QuickDataType <> JS QuickDataType (union) + template <> + struct JSIConverter { + static inline QuickDataType fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + std::string unionValue = JSIConverter::fromJSI(runtime, arg); + switch (hashString(unionValue.c_str(), unionValue.size())) { + case hashString("NULL_VALUE"): return QuickDataType::NULL_VALUE; + case hashString("TEXT"): return QuickDataType::TEXT; + case hashString("INTEGER"): return QuickDataType::INTEGER; + case hashString("INT64"): return QuickDataType::INT64; + case hashString("DOUBLE"): return QuickDataType::DOUBLE; + case hashString("BOOLEAN"): return QuickDataType::BOOLEAN; + case hashString("ARRAY_BUFFER"): return QuickDataType::ARRAY_BUFFER; + default: [[unlikely]] + throw std::runtime_error("Cannot convert \"" + unionValue + "\" to enum QuickDataType - invalid value!"); + } + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, QuickDataType arg) { + switch (arg) { + case QuickDataType::NULL_VALUE: return JSIConverter::toJSI(runtime, "NULL_VALUE"); + case QuickDataType::TEXT: return JSIConverter::toJSI(runtime, "TEXT"); + case QuickDataType::INTEGER: return JSIConverter::toJSI(runtime, "INTEGER"); + case QuickDataType::INT64: return JSIConverter::toJSI(runtime, "INT64"); + case QuickDataType::DOUBLE: return JSIConverter::toJSI(runtime, "DOUBLE"); + case QuickDataType::BOOLEAN: return JSIConverter::toJSI(runtime, "BOOLEAN"); + case QuickDataType::ARRAY_BUFFER: return JSIConverter::toJSI(runtime, "ARRAY_BUFFER"); + default: [[unlikely]] + throw std::runtime_error("Cannot convert QuickDataType to JS - invalid value: " + + std::to_string(static_cast(arg)) + "!"); + } + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isString()) { + return false; + } + std::string unionValue = JSIConverter::fromJSI(runtime, value); + switch (hashString(unionValue.c_str(), unionValue.size())) { + case hashString("NULL_VALUE"): + case hashString("TEXT"): + case hashString("INTEGER"): + case hashString("INT64"): + case hashString("DOUBLE"): + case hashString("BOOLEAN"): + case hashString("ARRAY_BUFFER"): + return true; + default: + return false; + } + } + }; + +} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/QuickValue.hpp b/nitrogen/generated/shared/c++/QuickValue.hpp new file mode 100644 index 00000000..d5afb741 --- /dev/null +++ b/nitrogen/generated/shared/c++/QuickValue.hpp @@ -0,0 +1,98 @@ +/// +/// QuickValue.hpp +/// Sun Sep 01 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +// Forward declaration of `QuickDataType` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { enum class QuickDataType; } +// Forward declaration of `ArrayBuffer` to properly resolve imports. +namespace NitroModules { class ArrayBuffer; } + +#include "QuickDataType.hpp" +#include +#include + +namespace margelo::nitro::rnquicksqlite { + + /** + * A struct which can be represented as a JavaScript object (QuickValue). + */ + struct QuickValue { + public: + QuickDataType dataType SWIFT_PRIVATE; + bool booleanValue SWIFT_PRIVATE; + double doubleOrIntValue SWIFT_PRIVATE; + double int64Value SWIFT_PRIVATE; + std::string textValue SWIFT_PRIVATE; + std::shared_ptr arrayBufferValue SWIFT_PRIVATE; + double arrayBufferSize SWIFT_PRIVATE; + + public: + explicit QuickValue(QuickDataType dataType, bool booleanValue, double doubleOrIntValue, double int64Value, std::string textValue, std::shared_ptr arrayBufferValue, double arrayBufferSize): dataType(dataType), booleanValue(booleanValue), doubleOrIntValue(doubleOrIntValue), int64Value(int64Value), textValue(textValue), arrayBufferValue(arrayBufferValue), arrayBufferSize(arrayBufferSize) {} + }; + +} // namespace margelo::nitro::rnquicksqlite + +namespace margelo::nitro { + + using namespace margelo::nitro::rnquicksqlite; + + // C++ QuickValue <> JS QuickValue (object) + template <> + struct JSIConverter { + static inline QuickValue fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return QuickValue( + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "dataType")), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "booleanValue")), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "doubleOrIntValue")), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "int64Value")), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "textValue")), + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "arrayBufferValue")), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "arrayBufferSize")) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const QuickValue& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, "dataType", JSIConverter::toJSI(runtime, arg.dataType)); + obj.setProperty(runtime, "booleanValue", JSIConverter::toJSI(runtime, arg.booleanValue)); + obj.setProperty(runtime, "doubleOrIntValue", JSIConverter::toJSI(runtime, arg.doubleOrIntValue)); + obj.setProperty(runtime, "int64Value", JSIConverter::toJSI(runtime, arg.int64Value)); + obj.setProperty(runtime, "textValue", JSIConverter::toJSI(runtime, arg.textValue)); + obj.setProperty(runtime, "arrayBufferValue", JSIConverter>::toJSI(runtime, arg.arrayBufferValue)); + obj.setProperty(runtime, "arrayBufferSize", JSIConverter::toJSI(runtime, arg.arrayBufferSize)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "dataType"))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "booleanValue"))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "doubleOrIntValue"))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "int64Value"))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "textValue"))) return false; + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "arrayBufferValue"))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "arrayBufferSize"))) return false; + return true; + } + }; + +} // namespace margelo::nitro diff --git a/src/index.ts b/src/index.ts index 3f1b61a7..013c5ff8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,7 @@ import { NitroModules } from 'react-native-nitro-modules'; import { QuickSQLite } from 'src/specs/QuickSQLite.nitro'; import { + ExecuteParams, PendingTransaction, QueryResult, QuickSQLiteConnection, @@ -52,7 +53,7 @@ const _execute = QuickSQLite.execute; QuickSQLite.execute = ( dbName: string, query: string, - params?: any[] | undefined + params?: ExecuteParams ): QueryResult => { const result = _execute(dbName, query, params); enhanceQueryResult(result); @@ -63,7 +64,7 @@ const _executeAsync = QuickSQLite.executeAsync; QuickSQLite.executeAsync = async ( dbName: string, query: string, - params?: any[] | undefined + params?: ExecuteParams ): Promise => { const res = await _executeAsync(dbName, query, params); enhanceQueryResult(res); @@ -81,7 +82,7 @@ QuickSQLite.transaction = async ( let isFinalized = false; // Local transaction context object implementation - const execute = (query: string, params?: any[]): QueryResult => { + const execute = (query: string, params?: ExecuteParams): QueryResult => { if (isFinalized) { throw Error( `Quick SQLite Error: Cannot execute query on finalized transaction: ${dbName}` @@ -90,7 +91,7 @@ QuickSQLite.transaction = async ( return QuickSQLite.execute(dbName, query, params); }; - const executeAsync = (query: string, params?: any[] | undefined) => { + const executeAsync = (query: string, params?: ExecuteParams) => { if (isFinalized) { throw Error( `Quick SQLite Error: Cannot execute query on finalized transaction: ${dbName}` @@ -209,7 +210,7 @@ export const typeORMDriver = { const connection = { executeSql: async ( sql: string, - params: any[] | undefined, + params: ExecuteParams | undefined, ok: (res: QueryResult) => void, fail: (msg: string) => void ) => { @@ -278,11 +279,11 @@ export const open = (options: { detach: (alias: string) => QuickSQLite.detach(options.name, alias), transaction: (fn: (tx: Transaction) => Promise | void) => QuickSQLite.transaction(options.name, fn), - execute: (query: string, params?: any[] | undefined): QueryResult => + execute: (query: string, params?: ExecuteParams | undefined): QueryResult => QuickSQLite.execute(options.name, query, params), executeAsync: ( query: string, - params?: any[] | undefined + params?: ExecuteParams | undefined ): Promise => QuickSQLite.executeAsync(options.name, query, params), executeBatch: (commands: SQLBatchTuple[]) => diff --git a/src/specs/QuickSQLite.nitro.ts b/src/specs/QuickSQLite.nitro.ts index 32811991..1719950f 100644 --- a/src/specs/QuickSQLite.nitro.ts +++ b/src/specs/QuickSQLite.nitro.ts @@ -2,38 +2,44 @@ import { HybridObject } from 'react-native-nitro-modules'; import { BatchQueryResult, FileLoadResult, - QueryResult, SQLBatchTuple, + QueryResult, Transaction, -} from 'src/types'; + ExecuteParams, + QuickValue, +} from '../types'; export interface QuickSQLite extends HybridObject<{ ios: 'c++'; android: 'c++' }> { - open: (dbName: string, location?: string) => void; - close: (dbName: string) => void; - delete: (dbName: string, location?: string) => void; - attach: ( + open(dbName: string, location?: string): void; + close(dbName: string): void; + delete(dbName: string, location?: string): void; + attach( mainDbName: string, dbNameToAttach: string, alias: string, location?: string - ) => void; - detach: (mainDbName: string, alias: string) => void; - transaction: ( + ): void; + detach(mainDbName: string, alias: string): void; + transaction( dbName: string, fn: (tx: Transaction) => Promise | void - ) => Promise; - execute: (dbName: string, query: string, params?: any[]) => QueryResult; - executeAsync: ( + ): Promise; + execute( + dbName: string, + query: string, + params?: ExecuteParams + ): QueryResult; + executeAsync( dbName: string, query: string, - params?: any[] - ) => Promise; - executeBatch: (dbName: string, commands: SQLBatchTuple[]) => BatchQueryResult; - executeBatchAsync: ( + params?: ExecuteParams + ): Promise; + executeBatch(dbName: string, commands: SQLBatchTuple[]): BatchQueryResult; + executeBatchAsync( dbName: string, commands: SQLBatchTuple[] - ) => Promise; - loadFile: (dbName: string, location: string) => FileLoadResult; - loadFileAsync: (dbName: string, location: string) => Promise; + ): Promise; + loadFile(dbName: string, location: string): FileLoadResult; + loadFileAsync(dbName: string, location: string): Promise; } diff --git a/src/types.ts b/src/types.ts index def288a0..38efd6b1 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,3 +1,33 @@ +// enum QuickDataType +// { +// NULL_VALUE, +// TEXT, +// INTEGER, +// INT64, +// DOUBLE, +// BOOLEAN, +// ARRAY_BUFFER, +// }; + +type QuickDataType = + | 'NULL_VALUE' + | 'TEXT' + | 'INTEGER' + | 'INT64' + | 'DOUBLE' + | 'BOOLEAN' + | 'ARRAY_BUFFER'; + +export interface QuickValue { + dataType: QuickDataType; + booleanValue: boolean; + doubleOrIntValue: number; + int64Value: number; + textValue: string; + arrayBufferValue: ArrayBuffer; + arrayBufferSize: number; +} + /** * Object returned by SQL Query executions { * insertId: Represent the auto-generated row id if applicable @@ -8,31 +38,35 @@ * * @interface QueryResult */ -export type QueryResult = { +export interface QueryResult { insertId?: number; rowsAffected: number; - rows?: { - /** Raw array with all dataset */ - _array: any[]; - /** The lengh of the dataset */ - length: number; - /** A convenience function to acess the index based the row object - * @param idx the row index - * @returns the row structure identified by column names - */ - item: (idx: number) => any; - }; + rows?: QueryResultRows; /** * Query metadata, avaliable only for select query results */ metadata?: ColumnMetadata[]; -}; +} + +export type ExecuteParams = number | boolean | bigint | string | ArrayBuffer; + +export interface QueryResultRows { + /** Raw array with all dataset */ + _array: QuickValue[]; + /** The lengh of the dataset */ + length: number; + /** A convenience function to acess the index based the row object + * @param idx the row index + * @returns the row structure identified by column names + */ + item: (idx: number) => QuickValue; +} /** * Column metadata * Describes some information about columns fetched by the query */ -export type ColumnMetadata = { +export interface ColumnMetadata { /** The name used for this column for this resultset */ columnName: string; /** The declared column type for this column, when fetched directly from a table or a View resulting from a table column. "UNKNOWN" for dynamic values, like function returned ones. */ @@ -40,7 +74,7 @@ export type ColumnMetadata = { /** * The index for this column for this resultset*/ columnIndex: number; -}; +} /** * Allows the execution of bulk of sql commands @@ -48,16 +82,18 @@ export type ColumnMetadata = { * If a single query must be executed many times with different arguments, its preferred * to declare it a single time, and use an array of array parameters. */ -export type SQLBatchTuple = [string] | [string, Array | Array>]; +export type SQLBatchTuple = + | [string] + | [string, Array | Array>]; /** * status: 0 or undefined for correct execution, 1 for error * message: if status === 1, here you will find error description * rowsAffected: Number of affected rows if status == 0 */ -export type BatchQueryResult = { +export interface BatchQueryResult { rowsAffected?: number; -}; +} /** * Result of loading a file and executing every line as a SQL command @@ -68,13 +104,16 @@ export interface FileLoadResult extends BatchQueryResult { } export interface Transaction { - commit: () => QueryResult; - execute: (query: string, params?: any[]) => QueryResult; - executeAsync: ( + commit(): QueryResult; + execute( + query: string, + params?: ExecuteParams + ): QueryResult; + executeAsync( query: string, - params?: any[] | undefined - ) => Promise; - rollback: () => QueryResult; + params?: ExecuteParams + ): Promise; + rollback(): QueryResult; } export interface PendingTransaction { @@ -90,16 +129,22 @@ export interface PendingTransaction { start: () => void; } -export type QuickSQLiteConnection = { - close: () => void; - delete: () => void; - attach: (dbNameToAttach: string, alias: string, location?: string) => void; - detach: (alias: string) => void; - transaction: (fn: (tx: Transaction) => Promise | void) => Promise; - execute: (query: string, params?: any[]) => QueryResult; - executeAsync: (query: string, params?: any[]) => Promise; - executeBatch: (commands: SQLBatchTuple[]) => BatchQueryResult; - executeBatchAsync: (commands: SQLBatchTuple[]) => Promise; - loadFile: (location: string) => FileLoadResult; - loadFileAsync: (location: string) => Promise; -}; +export interface QuickSQLiteConnection { + close(): void; + delete(): void; + attach(dbNameToAttach: string, alias: string, location?: string): void; + detach(alias: string): void; + transaction(fn: (tx: Transaction) => Promise | void): Promise; + execute( + query: string, + params?: ExecuteParams + ): QueryResult; + executeAsync( + query: string, + params?: ExecuteParams + ): Promise>; + executeBatch(commands: SQLBatchTuple[]): BatchQueryResult; + executeBatchAsync(commands: SQLBatchTuple[]): Promise; + loadFile(location: string): FileLoadResult; + loadFileAsync(location: string): Promise; +} From d7933a73bef1ff7b619526abba6a90d6ec40b7b3 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 1 Sep 2024 16:06:07 +0200 Subject: [PATCH 011/156] fix: naming clash --- src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index 013c5ff8..0d80287a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ import { NitroModules } from 'react-native-nitro-modules'; -import { QuickSQLite } from 'src/specs/QuickSQLite.nitro'; +import { QuickSQLite as QuickSQLiteSpec } from 'src/specs/QuickSQLite.nitro'; import { ExecuteParams, PendingTransaction, @@ -10,7 +10,7 @@ import { } from 'src/types'; const QuickSQLite = - NitroModules.createHybridObject('RNQuickSQLite'); + NitroModules.createHybridObject('RNQuickSQLite'); const locks: Record< string, From da4243c9536777cc8825458e23fcd8fc9c1c2896 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 1 Sep 2024 16:10:30 +0200 Subject: [PATCH 012/156] remove generic parameter --- src/types.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/types.ts b/src/types.ts index 38efd6b1..18203797 100644 --- a/src/types.ts +++ b/src/types.ts @@ -138,11 +138,11 @@ export interface QuickSQLiteConnection { execute( query: string, params?: ExecuteParams - ): QueryResult; + ): QueryResult; executeAsync( query: string, params?: ExecuteParams - ): Promise>; + ): Promise; executeBatch(commands: SQLBatchTuple[]): BatchQueryResult; executeBatchAsync(commands: SQLBatchTuple[]): Promise; loadFile(location: string): FileLoadResult; From b981870a95b9eb8932125410bce4d19f0b4f8a0e Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 1 Sep 2024 16:14:44 +0200 Subject: [PATCH 013/156] add nitro-modules dep to example --- example/package.json | 1 + example/yarn.lock | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/example/package.json b/example/package.json index 2f107b6e..4c7a661d 100644 --- a/example/package.json +++ b/example/package.json @@ -17,6 +17,7 @@ "nativewind": "^2.0.11", "react": "18.2.0", "react-native": "0.71.1", + "react-native-nitro-modules": "./../../react-native-nitro/packages/react-native-nitro-modules", "react-native-quick-sqlite": "./..", "react-native-safe-area-context": "^4.5.0", "reflect-metadata": "^0.1.13", diff --git a/example/yarn.lock b/example/yarn.lock index 8946ef54..766744d8 100644 --- a/example/yarn.lock +++ b/example/yarn.lock @@ -4952,6 +4952,9 @@ react-native-gradle-plugin@^0.71.13: resolved "https://registry.yarnpkg.com/react-native-gradle-plugin/-/react-native-gradle-plugin-0.71.13.tgz#6f60ff24ac712554903dfc0ae98475cb280c57a6" integrity sha512-C66LNZAXbU0YDRkWx8d/8kjesdu7fsUAc/3QPJNftSXKEvEtnFZK2aH/rIgu1s5dbTcE0fjhdVPNJMRIfKo61w== +react-native-nitro-modules@./../../react-native-nitro/packages/react-native-nitro-modules: + version "0.6.0" + react-native-quick-base64@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/react-native-quick-base64/-/react-native-quick-base64-2.0.5.tgz#461a0748f65bf83befa1c4159749d781440796c0" @@ -4960,7 +4963,7 @@ react-native-quick-base64@^2.0.5: base64-js "^1.5.1" react-native-quick-sqlite@./..: - version "8.0.0-beta.1" + version "8.1.0" react-native-safe-area-context@^4.5.0: version "4.5.0" From 301f7ae344a549ece6f905b6f204042b96af2c18 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 1 Sep 2024 16:15:45 +0200 Subject: [PATCH 014/156] chore: update ruby and gems --- .ruby-version | 2 +- Gemfile | 4 ++-- Gemfile.lock | 55 +++++++++++++++++++++++++++---------------- example/.ruby-version | 2 +- example/Gemfile | 4 ++-- example/Gemfile.lock | 55 +++++++++++++++++++++++++++---------------- 6 files changed, 76 insertions(+), 46 deletions(-) diff --git a/.ruby-version b/.ruby-version index 49cdd668..15a27998 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.7.6 +3.3.0 diff --git a/Gemfile b/Gemfile index 5db9d43d..e546134f 100644 --- a/Gemfile +++ b/Gemfile @@ -1,4 +1,4 @@ source 'https://rubygems.org' # You may use http://rbenv.org/ or https://rvm.io/ to install and use this version -ruby '2.7.6' -gem 'cocoapods', '~> 1.11', '>= 1.11.3' \ No newline at end of file +ruby '3.3.0' +gem 'cocoapods', '~> 1.15', '>= 1.15.2' diff --git a/Gemfile.lock b/Gemfile.lock index 125c3101..6300cfb9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,26 +1,35 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.6) + CFPropertyList (3.0.7) + base64 + nkf rexml - activesupport (7.0.6) + activesupport (7.1.3.3) + base64 + bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) + connection_pool (>= 2.2.5) + drb i18n (>= 1.6, < 2) minitest (>= 5.1) + mutex_m tzinfo (~> 2.0) - addressable (2.8.4) + addressable (2.8.6) public_suffix (>= 2.0.2, < 6.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) atomos (0.1.3) + base64 (0.2.0) + bigdecimal (3.1.8) claide (1.1.0) - cocoapods (1.12.1) + cocoapods (1.15.2) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.12.1) + cocoapods-core (= 1.15.2) cocoapods-deintegrate (>= 1.0.3, < 2.0) - cocoapods-downloader (>= 1.6.0, < 2.0) + cocoapods-downloader (>= 2.1, < 3.0) cocoapods-plugins (>= 1.0.0, < 2.0) cocoapods-search (>= 1.0.0, < 2.0) cocoapods-trunk (>= 1.6.0, < 2.0) @@ -32,8 +41,8 @@ GEM molinillo (~> 0.8.0) nap (~> 1.0) ruby-macho (>= 2.3.0, < 3.0) - xcodeproj (>= 1.21.0, < 2.0) - cocoapods-core (1.12.1) + xcodeproj (>= 1.23.0, < 2.0) + cocoapods-core (1.15.2) activesupport (>= 5.0, < 8) addressable (~> 2.8) algoliasearch (~> 1.0) @@ -44,7 +53,7 @@ GEM public_suffix (~> 4.0) typhoeus (~> 1.0) cocoapods-deintegrate (1.0.5) - cocoapods-downloader (1.6.3) + cocoapods-downloader (2.1) cocoapods-plugins (1.0.0) nap cocoapods-search (1.0.1) @@ -53,31 +62,37 @@ GEM netrc (~> 0.11) cocoapods-try (1.2.0) colored2 (3.1.2) - concurrent-ruby (1.2.2) + concurrent-ruby (1.2.3) + connection_pool (2.4.1) + drb (2.2.1) escape (0.0.4) ethon (0.16.0) ffi (>= 1.15.0) - ffi (1.15.5) + ffi (1.16.3) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) httpclient (2.8.3) - i18n (1.14.1) + i18n (1.14.5) concurrent-ruby (~> 1.0) - json (2.6.3) - minitest (5.18.1) + json (2.7.2) + minitest (5.23.1) molinillo (0.8.0) + mutex_m (0.2.0) nanaimo (0.3.0) nap (1.1.0) netrc (0.11.0) + nkf (0.2.0) public_suffix (4.0.7) - rexml (3.2.5) + rexml (3.2.8) + strscan (>= 3.0.9) ruby-macho (2.5.1) - typhoeus (1.4.0) + strscan (3.1.0) + typhoeus (1.4.1) ethon (>= 0.9.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - xcodeproj (1.22.0) + xcodeproj (1.24.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) @@ -89,10 +104,10 @@ PLATFORMS ruby DEPENDENCIES - cocoapods (~> 1.11, >= 1.11.3) + cocoapods (~> 1.15, >= 1.15.2) RUBY VERSION - ruby 2.7.6p219 + ruby 3.3.0p0 BUNDLED WITH - 2.3.20 + 2.5.10 diff --git a/example/.ruby-version b/example/.ruby-version index 49cdd668..15a27998 100644 --- a/example/.ruby-version +++ b/example/.ruby-version @@ -1 +1 @@ -2.7.6 +3.3.0 diff --git a/example/Gemfile b/example/Gemfile index b15113b7..fde3d3ab 100644 --- a/example/Gemfile +++ b/example/Gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' # You may use http://rbenv.org/ or https://rvm.io/ to install and use this version -ruby '2.7.6' +ruby '3.3.0' -gem 'cocoapods', '~> 1.11', '>= 1.11.3' +gem 'cocoapods', '~> 1.15', '>= 1.15.2' diff --git a/example/Gemfile.lock b/example/Gemfile.lock index 125c3101..6300cfb9 100644 --- a/example/Gemfile.lock +++ b/example/Gemfile.lock @@ -1,26 +1,35 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.6) + CFPropertyList (3.0.7) + base64 + nkf rexml - activesupport (7.0.6) + activesupport (7.1.3.3) + base64 + bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) + connection_pool (>= 2.2.5) + drb i18n (>= 1.6, < 2) minitest (>= 5.1) + mutex_m tzinfo (~> 2.0) - addressable (2.8.4) + addressable (2.8.6) public_suffix (>= 2.0.2, < 6.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) atomos (0.1.3) + base64 (0.2.0) + bigdecimal (3.1.8) claide (1.1.0) - cocoapods (1.12.1) + cocoapods (1.15.2) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.12.1) + cocoapods-core (= 1.15.2) cocoapods-deintegrate (>= 1.0.3, < 2.0) - cocoapods-downloader (>= 1.6.0, < 2.0) + cocoapods-downloader (>= 2.1, < 3.0) cocoapods-plugins (>= 1.0.0, < 2.0) cocoapods-search (>= 1.0.0, < 2.0) cocoapods-trunk (>= 1.6.0, < 2.0) @@ -32,8 +41,8 @@ GEM molinillo (~> 0.8.0) nap (~> 1.0) ruby-macho (>= 2.3.0, < 3.0) - xcodeproj (>= 1.21.0, < 2.0) - cocoapods-core (1.12.1) + xcodeproj (>= 1.23.0, < 2.0) + cocoapods-core (1.15.2) activesupport (>= 5.0, < 8) addressable (~> 2.8) algoliasearch (~> 1.0) @@ -44,7 +53,7 @@ GEM public_suffix (~> 4.0) typhoeus (~> 1.0) cocoapods-deintegrate (1.0.5) - cocoapods-downloader (1.6.3) + cocoapods-downloader (2.1) cocoapods-plugins (1.0.0) nap cocoapods-search (1.0.1) @@ -53,31 +62,37 @@ GEM netrc (~> 0.11) cocoapods-try (1.2.0) colored2 (3.1.2) - concurrent-ruby (1.2.2) + concurrent-ruby (1.2.3) + connection_pool (2.4.1) + drb (2.2.1) escape (0.0.4) ethon (0.16.0) ffi (>= 1.15.0) - ffi (1.15.5) + ffi (1.16.3) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) httpclient (2.8.3) - i18n (1.14.1) + i18n (1.14.5) concurrent-ruby (~> 1.0) - json (2.6.3) - minitest (5.18.1) + json (2.7.2) + minitest (5.23.1) molinillo (0.8.0) + mutex_m (0.2.0) nanaimo (0.3.0) nap (1.1.0) netrc (0.11.0) + nkf (0.2.0) public_suffix (4.0.7) - rexml (3.2.5) + rexml (3.2.8) + strscan (>= 3.0.9) ruby-macho (2.5.1) - typhoeus (1.4.0) + strscan (3.1.0) + typhoeus (1.4.1) ethon (>= 0.9.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - xcodeproj (1.22.0) + xcodeproj (1.24.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) @@ -89,10 +104,10 @@ PLATFORMS ruby DEPENDENCIES - cocoapods (~> 1.11, >= 1.11.3) + cocoapods (~> 1.15, >= 1.15.2) RUBY VERSION - ruby 2.7.6p219 + ruby 3.3.0p0 BUNDLED WITH - 2.3.20 + 2.5.10 From 61012d49e2ae3b1dea0ed3fe9cfcb1c670314430 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 1 Sep 2024 16:18:03 +0200 Subject: [PATCH 015/156] update example Podfile --- example/ios/Podfile.lock | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 7e0785e3..27212d0c 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -15,6 +15,9 @@ PODS: - hermes-engine/Pre-built (= 0.71.1) - hermes-engine/Pre-built (0.71.1) - libevent (2.1.12) + - NitroModules (0.6.0): + - RCT-Folly (= 2021.07.22.00) + - React-Core - RCT-Folly (2021.07.22.00): - boost - DoubleConversion @@ -234,7 +237,7 @@ PODS: - React-jsinspector (0.71.1) - React-logger (0.71.1): - glog - - react-native-quick-sqlite (8.0.6): + - react-native-quick-sqlite (8.1.0): - RCT-Folly (= 2021.07.22.00) - React-Core - react-native-safe-area-context (4.5.0): @@ -334,6 +337,7 @@ DEPENDENCIES: - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - libevent (~> 2.1.12) + - NitroModules (from `../node_modules/react-native-nitro-modules`) - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) @@ -384,6 +388,8 @@ EXTERNAL SOURCES: :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" hermes-engine: :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" + NitroModules: + :path: "../node_modules/react-native-nitro-modules" RCT-Folly: :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTRequired: @@ -454,6 +460,7 @@ SPEC CHECKSUMS: glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b hermes-engine: 922ccd744f50d9bfde09e9677bf0f3b562ea5fb9 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 + NitroModules: a1d3ce9cf15ec812b2723eec69e842f928ca5e6f RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1 RCTRequired: fd4d923b964658aa0c4091a32c8b2004c6d9e3a6 RCTTypeSafety: c276d85975bde3d8448907235c70bf0da257adfd @@ -468,7 +475,7 @@ SPEC CHECKSUMS: React-jsiexecutor: 60cf272aababc5212410e4249d17cea14fc36caa React-jsinspector: ff56004b0c974b688a6548c156d5830ad751ae07 React-logger: 60a0b5f8bed667ecf9e24fecca1f30d125de6d75 - react-native-quick-sqlite: 137564ecc340d29307214706b672c6d085186533 + react-native-quick-sqlite: b0d7096e3fbec93a340418a0cbb77e680056c3d1 react-native-safe-area-context: 39c2d8be3328df5d437ac1700f4f3a4f75716acc React-perflogger: ec8eef2a8f03ecfa6361c2c5fb9197ef4a29cc85 React-RCTActionSheet: a0c023b86cf4c862fa9c4eb0f6f91fbe878fb2de @@ -487,4 +494,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 64d5a5efcc601109dbcec3dc4b79d55c177cc8f3 -COCOAPODS: 1.12.1 +COCOAPODS: 1.15.2 From e904cecee7a0470f55cf8ac5ad4852c0295f2786 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 1 Sep 2024 23:18:30 +0200 Subject: [PATCH 016/156] fix: XCode 12 error --- example/ios/Podfile | 3 +-- example/ios/Podfile.lock | 2 +- example/package.json | 2 +- package.json | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/example/ios/Podfile b/example/ios/Podfile index de34cc36..ce299bb8 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -47,10 +47,9 @@ target 'QuickSQLiteExample' do :mac_catalyst_enabled => false ) __apply_Xcode_12_5_M1_post_install_workaround(installer) - + installer.pods_project.build_configurations.each do |config| config.build_settings['DEAD_CODE_STRIPPING'] = 'YES' end - end end diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 27212d0c..bad839d0 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -492,6 +492,6 @@ SPEC CHECKSUMS: ReactCommon: 03be76588338a27a88d103b35c3c44a3fd43d136 Yoga: 921eb014669cf9c718ada68b08d362517d564e0c -PODFILE CHECKSUM: 64d5a5efcc601109dbcec3dc4b79d55c177cc8f3 +PODFILE CHECKSUM: 710c8b61fa030877d1c5469a281f2e00aa591d40 COCOAPODS: 1.15.2 diff --git a/example/package.json b/example/package.json index 4c7a661d..1336269d 100644 --- a/example/package.json +++ b/example/package.json @@ -16,7 +16,7 @@ "mocha": "^10.1.0", "nativewind": "^2.0.11", "react": "18.2.0", - "react-native": "0.71.1", + "react-native": "0.71.11", "react-native-nitro-modules": "./../../react-native-nitro/packages/react-native-nitro-modules", "react-native-quick-sqlite": "./..", "react-native-safe-area-context": "^4.5.0", diff --git a/package.json b/package.json index a8354a51..fa0d9325 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "devDependencies": { "nitro-codegen": "^0.6.0", "react": "18.2.0", - "react-native": "0.71.0", + "react-native": "0.71.11", "react-native-builder-bob": "^0.18.2", "typescript": "^4.8.4" }, From 28f1a6189abf71fa4864e0234ebaf1434f2472e3 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 1 Sep 2024 23:19:06 +0200 Subject: [PATCH 017/156] use extra SelectQueryResult HybridObject --- .../android/RNQuickSQLite+autolinking.cmake | 3 + .../ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 121 +++++++++-------- .../ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp | 13 +- nitrogen/generated/shared/c++/ColumnType.hpp | 99 ++++++++++++++ .../c++/HybridSelectQueryResultSpec.cpp | 27 ++++ .../c++/HybridSelectQueryResultSpec.hpp | 71 ++++++++++ nitrogen/generated/shared/c++/QueryType.hpp | 91 +++++++++++++ src/specs/QueryResult.nitro.ts | 42 ++++++ src/specs/QuickSQLite.nitro.ts | 11 +- src/types.ts | 124 +++++------------- 10 files changed, 448 insertions(+), 154 deletions(-) create mode 100644 nitrogen/generated/shared/c++/ColumnType.hpp create mode 100644 nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp create mode 100644 nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp create mode 100644 nitrogen/generated/shared/c++/QueryType.hpp create mode 100644 src/specs/QueryResult.nitro.ts diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake index 2180e871..1ac23586 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake @@ -25,6 +25,9 @@ target_sources( # CMake project name (Android C++ library name) RNQuickSQLite PRIVATE # Shared Nitrogen C++ sources + ../nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp + ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp + ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp # Android-specific Nitrogen C++ sources diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index f4401b50..0851b061 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -17,6 +17,8 @@ namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } // Forward declaration of `FileLoadResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } +// Forward declaration of `HybridSelectQueryResultSpec` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } // Forward declaration of `QueryResultRows` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct QueryResultRows; } // Forward declaration of `QueryResult` to properly resolve imports. @@ -30,6 +32,7 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction; } #include "BatchQueryResult.hpp" #include "ColumnMetadata.hpp" #include "FileLoadResult.hpp" +#include "HybridSelectQueryResultSpec.hpp" #include "QueryResult.hpp" #include "QueryResultRows.hpp" #include "QuickValue.hpp" @@ -51,6 +54,24 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction; } */ namespace margelo::nitro::rnquicksqlite::bridge::swift { + /** + * Specialized version of `std::vector`. + */ + using std__vector_ColumnMetadata_ = std::vector; + inline std::vector create_std__vector_ColumnMetadata_(size_t size) { + std::vector vector; + vector.reserve(size); + return vector; + } + + /** + * Specialized version of `std::optional>`. + */ + using std__optional_std__vector_ColumnMetadata__ = std::optional>; + inline std::optional> create_std__optional_std__vector_ColumnMetadata__(const std::vector& value) { + return std::optional>(value); + } + /** * Specialized version of `std::optional`. */ @@ -76,62 +97,11 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { } /** - * Specialized version of `std::vector`. - */ - using std__vector_QuickValue_ = std::vector; - inline std::vector create_std__vector_QuickValue_(size_t size) { - std::vector vector; - vector.reserve(size); - return vector; - } - - /** - * Specialized version of `std::function(double / * idx * /)>`. - */ - using Func_std__future_QuickValue__double = std::function(double /* idx */)>; - inline Func_std__future_QuickValue__double create_Func_std__future_QuickValue__double(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, double), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](double idx) -> std::future { - auto result = call(sharedClosureHolder.get(), idx); - return result.getFuture(); - }; - } - inline std::shared_ptr share_Func_std__future_QuickValue__double(const Func_std__future_QuickValue__double& value) { - return std::make_shared(value); - } - - /** - * Specialized version of `PromiseHolder`. - */ - using PromiseHolder_QuickValue_ = PromiseHolder; - inline PromiseHolder create_PromiseHolder_QuickValue_() { - return PromiseHolder(); - } - - /** - * Specialized version of `std::optional`. - */ - using std__optional_QueryResultRows_ = std::optional; - inline std::optional create_std__optional_QueryResultRows_(const QueryResultRows& value) { - return std::optional(value); - } - - /** - * Specialized version of `std::vector`. + * Specialized version of `std::optional>`. */ - using std__vector_ColumnMetadata_ = std::vector; - inline std::vector create_std__vector_ColumnMetadata_(size_t size) { - std::vector vector; - vector.reserve(size); - return vector; - } - - /** - * Specialized version of `std::optional>`. - */ - using std__optional_std__vector_ColumnMetadata__ = std::optional>; - inline std::optional> create_std__optional_std__vector_ColumnMetadata__(const std::vector& value) { - return std::optional>(value); + using std__optional_std__shared_ptr_margelo__nitro__rnquicksqlite__HybridSelectQueryResultSpec__ = std::optional>; + inline std::optional> create_std__optional_std__shared_ptr_margelo__nitro__rnquicksqlite__HybridSelectQueryResultSpec__(const std::shared_ptr& value) { + return std::optional>(value); } /** @@ -356,5 +326,46 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { inline PromiseHolder create_PromiseHolder_FileLoadResult_() { return PromiseHolder(); } + + /** + * Specialized version of `std::vector`. + */ + using std__vector_QuickValue_ = std::vector; + inline std::vector create_std__vector_QuickValue_(size_t size) { + std::vector vector; + vector.reserve(size); + return vector; + } + + /** + * Specialized version of `std::function(double / * idx * /)>`. + */ + using Func_std__future_QuickValue__double = std::function(double /* idx */)>; + inline Func_std__future_QuickValue__double create_Func_std__future_QuickValue__double(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, double), void(*destroy)(void*)) { + std::shared_ptr sharedClosureHolder(closureHolder, destroy); + return [sharedClosureHolder, call](double idx) -> std::future { + auto result = call(sharedClosureHolder.get(), idx); + return result.getFuture(); + }; + } + inline std::shared_ptr share_Func_std__future_QuickValue__double(const Func_std__future_QuickValue__double& value) { + return std::make_shared(value); + } + + /** + * Specialized version of `PromiseHolder`. + */ + using PromiseHolder_QuickValue_ = PromiseHolder; + inline PromiseHolder create_PromiseHolder_QuickValue_() { + return PromiseHolder(); + } + + /** + * Specialized version of `std::optional`. + */ + using std__optional_QueryResultRows_ = std::optional; + inline std::optional create_std__optional_QueryResultRows_(const QueryResultRows& value) { + return std::optional(value); + } } // namespace margelo::nitro::rnquicksqlite::bridge::swift diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp index 053105e4..27f13d1c 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp @@ -15,12 +15,18 @@ namespace NitroModules { class ArrayBuffer; } namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } // Forward declaration of `ColumnMetadata` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } +// Forward declaration of `ColumnType` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { enum class ColumnType; } // Forward declaration of `FileLoadResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } +// Forward declaration of `HybridSelectQueryResultSpec` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } // Forward declaration of `QueryResultRows` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct QueryResultRows; } // Forward declaration of `QueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct QueryResult; } +// Forward declaration of `QueryType` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { enum class QueryType; } // Forward declaration of `QuickDataType` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { enum class QuickDataType; } // Forward declaration of `QuickValue` to properly resolve imports. @@ -31,15 +37,19 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction; } // Include C++ defined types #include "BatchQueryResult.hpp" #include "ColumnMetadata.hpp" +#include "ColumnType.hpp" #include "FileLoadResult.hpp" +#include "HybridSelectQueryResultSpec.hpp" #include "QueryResult.hpp" #include "QueryResultRows.hpp" +#include "QueryType.hpp" #include "QuickDataType.hpp" #include "QuickValue.hpp" #include "Transaction.hpp" #include #include #include +#include #include #include #include @@ -56,7 +66,8 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction; } #include // Forward declarations of Swift defined types - +// Forward declaration of `HybridSelectQueryResultSpecCxx` to properly resolve imports. +namespace RNQuickSQLite { class HybridSelectQueryResultSpecCxx; } // Include Swift defined types #if __has_include("RNQuickSQLite-Swift.h") diff --git a/nitrogen/generated/shared/c++/ColumnType.hpp b/nitrogen/generated/shared/c++/ColumnType.hpp new file mode 100644 index 00000000..0951808f --- /dev/null +++ b/nitrogen/generated/shared/c++/ColumnType.hpp @@ -0,0 +1,99 @@ +/// +/// ColumnType.hpp +/// Sun Sep 01 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +namespace margelo::nitro::rnquicksqlite { + + /** + * An enum which can be represented as a JavaScript union (ColumnType). + */ + enum class ColumnType { + NULL_VALUE SWIFT_NAME(nullValue) = 0, + TEXT SWIFT_NAME(text) = 1, + INTEGER SWIFT_NAME(integer) = 2, + INT64 SWIFT_NAME(int64) = 3, + DOUBLE SWIFT_NAME(double) = 4, + BOOLEAN SWIFT_NAME(boolean) = 5, + ARRAY_BUFFER SWIFT_NAME(arrayBuffer) = 6, + } CLOSED_ENUM; + +} // namespace margelo::nitro::rnquicksqlite + +namespace margelo::nitro { + + using namespace margelo::nitro::rnquicksqlite; + + // C++ ColumnType <> JS ColumnType (union) + template <> + struct JSIConverter { + static inline ColumnType fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + std::string unionValue = JSIConverter::fromJSI(runtime, arg); + switch (hashString(unionValue.c_str(), unionValue.size())) { + case hashString("NULL_VALUE"): return ColumnType::NULL_VALUE; + case hashString("TEXT"): return ColumnType::TEXT; + case hashString("INTEGER"): return ColumnType::INTEGER; + case hashString("INT64"): return ColumnType::INT64; + case hashString("DOUBLE"): return ColumnType::DOUBLE; + case hashString("BOOLEAN"): return ColumnType::BOOLEAN; + case hashString("ARRAY_BUFFER"): return ColumnType::ARRAY_BUFFER; + default: [[unlikely]] + throw std::runtime_error("Cannot convert \"" + unionValue + "\" to enum ColumnType - invalid value!"); + } + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, ColumnType arg) { + switch (arg) { + case ColumnType::NULL_VALUE: return JSIConverter::toJSI(runtime, "NULL_VALUE"); + case ColumnType::TEXT: return JSIConverter::toJSI(runtime, "TEXT"); + case ColumnType::INTEGER: return JSIConverter::toJSI(runtime, "INTEGER"); + case ColumnType::INT64: return JSIConverter::toJSI(runtime, "INT64"); + case ColumnType::DOUBLE: return JSIConverter::toJSI(runtime, "DOUBLE"); + case ColumnType::BOOLEAN: return JSIConverter::toJSI(runtime, "BOOLEAN"); + case ColumnType::ARRAY_BUFFER: return JSIConverter::toJSI(runtime, "ARRAY_BUFFER"); + default: [[unlikely]] + throw std::runtime_error("Cannot convert ColumnType to JS - invalid value: " + + std::to_string(static_cast(arg)) + "!"); + } + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isString()) { + return false; + } + std::string unionValue = JSIConverter::fromJSI(runtime, value); + switch (hashString(unionValue.c_str(), unionValue.size())) { + case hashString("NULL_VALUE"): + case hashString("TEXT"): + case hashString("INTEGER"): + case hashString("INT64"): + case hashString("DOUBLE"): + case hashString("BOOLEAN"): + case hashString("ARRAY_BUFFER"): + return true; + default: + return false; + } + } + }; + +} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp new file mode 100644 index 00000000..139beeb5 --- /dev/null +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp @@ -0,0 +1,27 @@ +/// +/// HybridSelectQueryResultSpec.cpp +/// Sun Sep 01 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#include "HybridSelectQueryResultSpec.hpp" + +namespace margelo::nitro::rnquicksqlite { + + void HybridSelectQueryResultSpec::loadHybridMethods() { + // load base methods/properties + HybridObject::loadHybridMethods(); + // load custom methods/properties + registerHybrids(this, [](Prototype& prototype) { + prototype.registerHybridGetter("metadata", &HybridSelectQueryResultSpec::getMetadata); + prototype.registerHybridSetter("metadata", &HybridSelectQueryResultSpec::setMetadata); + prototype.registerHybridMethod("getString", &HybridSelectQueryResultSpec::getString); + prototype.registerHybridMethod("getNumber", &HybridSelectQueryResultSpec::getNumber); + prototype.registerHybridMethod("getBoolean", &HybridSelectQueryResultSpec::getBoolean); + prototype.registerHybridMethod("getArrayBuffer", &HybridSelectQueryResultSpec::getArrayBuffer); + }); + } + +} // namespace margelo::nitro::rnquicksqlite diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp new file mode 100644 index 00000000..228193e6 --- /dev/null +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp @@ -0,0 +1,71 @@ +/// +/// HybridSelectQueryResultSpec.hpp +/// Sun Sep 01 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +// Forward declaration of `ColumnMetadata` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } +// Forward declaration of `ArrayBuffer` to properly resolve imports. +namespace NitroModules { class ArrayBuffer; } + +#include +#include +#include "ColumnMetadata.hpp" +#include +#include + +namespace margelo::nitro::rnquicksqlite { + + using namespace margelo::nitro; + + /** + * An abstract base class for `SelectQueryResult` + * Inherit this class to create instances of `HybridSelectQueryResultSpec` in C++. + * @example + * ```cpp + * class HybridSelectQueryResult: public HybridSelectQueryResultSpec { + * // ... + * }; + * ``` + */ + class HybridSelectQueryResultSpec: public virtual HybridObject { + public: + // Constructor + explicit HybridSelectQueryResultSpec(): HybridObject(TAG) { } + + // Destructor + virtual ~HybridSelectQueryResultSpec() { } + + public: + // Properties + virtual std::optional> getMetadata() = 0; + virtual void setMetadata(const std::optional>& metadata) = 0; + + public: + // Methods + virtual std::string getString() = 0; + virtual double getNumber() = 0; + virtual bool getBoolean() = 0; + virtual std::shared_ptr getArrayBuffer() = 0; + + protected: + // Hybrid Setup + void loadHybridMethods() override; + + protected: + // Tag for logging + static constexpr auto TAG = "SelectQueryResult"; + }; + +} // namespace margelo::nitro::rnquicksqlite diff --git a/nitrogen/generated/shared/c++/QueryType.hpp b/nitrogen/generated/shared/c++/QueryType.hpp new file mode 100644 index 00000000..e0afef4c --- /dev/null +++ b/nitrogen/generated/shared/c++/QueryType.hpp @@ -0,0 +1,91 @@ +/// +/// QueryType.hpp +/// Sun Sep 01 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +namespace margelo::nitro::rnquicksqlite { + + /** + * An enum which can be represented as a JavaScript union (QueryType). + */ + enum class QueryType { + SELECT SWIFT_NAME(select) = 0, + INSERT SWIFT_NAME(insert) = 1, + UPDATE SWIFT_NAME(update) = 2, + DELETE SWIFT_NAME(delete) = 3, + OTHER SWIFT_NAME(other) = 4, + } CLOSED_ENUM; + +} // namespace margelo::nitro::rnquicksqlite + +namespace margelo::nitro { + + using namespace margelo::nitro::rnquicksqlite; + + // C++ QueryType <> JS QueryType (union) + template <> + struct JSIConverter { + static inline QueryType fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + std::string unionValue = JSIConverter::fromJSI(runtime, arg); + switch (hashString(unionValue.c_str(), unionValue.size())) { + case hashString("SELECT"): return QueryType::SELECT; + case hashString("INSERT"): return QueryType::INSERT; + case hashString("UPDATE"): return QueryType::UPDATE; + case hashString("DELETE"): return QueryType::DELETE; + case hashString("OTHER"): return QueryType::OTHER; + default: [[unlikely]] + throw std::runtime_error("Cannot convert \"" + unionValue + "\" to enum QueryType - invalid value!"); + } + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, QueryType arg) { + switch (arg) { + case QueryType::SELECT: return JSIConverter::toJSI(runtime, "SELECT"); + case QueryType::INSERT: return JSIConverter::toJSI(runtime, "INSERT"); + case QueryType::UPDATE: return JSIConverter::toJSI(runtime, "UPDATE"); + case QueryType::DELETE: return JSIConverter::toJSI(runtime, "DELETE"); + case QueryType::OTHER: return JSIConverter::toJSI(runtime, "OTHER"); + default: [[unlikely]] + throw std::runtime_error("Cannot convert QueryType to JS - invalid value: " + + std::to_string(static_cast(arg)) + "!"); + } + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isString()) { + return false; + } + std::string unionValue = JSIConverter::fromJSI(runtime, value); + switch (hashString(unionValue.c_str(), unionValue.size())) { + case hashString("SELECT"): + case hashString("INSERT"): + case hashString("UPDATE"): + case hashString("DELETE"): + case hashString("OTHER"): + return true; + default: + return false; + } + } + }; + +} // namespace margelo::nitro diff --git a/src/specs/QueryResult.nitro.ts b/src/specs/QueryResult.nitro.ts new file mode 100644 index 00000000..6fb7a238 --- /dev/null +++ b/src/specs/QueryResult.nitro.ts @@ -0,0 +1,42 @@ +import { HybridObject } from 'react-native-nitro-modules'; + +export interface SelectQueryResult + extends HybridObject<{ ios: 'c++'; android: 'c++' }> { + /** + * Query metadata, avaliable only for select query results + */ + metadata?: ColumnMetadata[]; + + getString(): string; + getNumber(): number; + getBoolean(): boolean; + getArrayBuffer(): ArrayBuffer; +} + +type ColumnType = + | 'NULL_VALUE' + | 'TEXT' + | 'INTEGER' + | 'INT64' + | 'DOUBLE' + | 'BOOLEAN' + | 'ARRAY_BUFFER'; +// | 'null' +// | 'string' +// | 'number' +// | 'boolean' +// | 'ArrayBuffer'; + +/** + * Column metadata + * Describes some information about columns fetched by the query + */ +export interface ColumnMetadata { + /** The name used for this column for this resultset */ + columnName: string; + /** The declared column type for this column, when fetched directly from a table or a View resulting from a table column. "UNKNOWN" for dynamic values, like function returned ones. */ + columnDeclaredType: ColumnType; + /** + * The index for this column for this resultset*/ + columnIndex: number; +} diff --git a/src/specs/QuickSQLite.nitro.ts b/src/specs/QuickSQLite.nitro.ts index 1719950f..f2389705 100644 --- a/src/specs/QuickSQLite.nitro.ts +++ b/src/specs/QuickSQLite.nitro.ts @@ -1,12 +1,11 @@ import { HybridObject } from 'react-native-nitro-modules'; import { + QueryResult, BatchQueryResult, FileLoadResult, SQLBatchTuple, - QueryResult, Transaction, ExecuteParams, - QuickValue, } from '../types'; export interface QuickSQLite @@ -25,12 +24,8 @@ export interface QuickSQLite dbName: string, fn: (tx: Transaction) => Promise | void ): Promise; - execute( - dbName: string, - query: string, - params?: ExecuteParams - ): QueryResult; - executeAsync( + execute(dbName: string, query: string, params?: ExecuteParams): QueryResult; + executeAsync( dbName: string, query: string, params?: ExecuteParams diff --git a/src/types.ts b/src/types.ts index 18203797..1a17d32f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,32 +1,4 @@ -// enum QuickDataType -// { -// NULL_VALUE, -// TEXT, -// INTEGER, -// INT64, -// DOUBLE, -// BOOLEAN, -// ARRAY_BUFFER, -// }; - -type QuickDataType = - | 'NULL_VALUE' - | 'TEXT' - | 'INTEGER' - | 'INT64' - | 'DOUBLE' - | 'BOOLEAN' - | 'ARRAY_BUFFER'; - -export interface QuickValue { - dataType: QuickDataType; - booleanValue: boolean; - doubleOrIntValue: number; - int64Value: number; - textValue: string; - arrayBufferValue: ArrayBuffer; - arrayBufferSize: number; -} +import { SelectQueryResult } from './specs/QueryResult.nitro'; /** * Object returned by SQL Query executions { @@ -39,41 +11,45 @@ export interface QuickValue { * @interface QueryResult */ export interface QueryResult { + readonly queryType: QueryType; insertId?: number; rowsAffected: number; - rows?: QueryResultRows; - /** - * Query metadata, avaliable only for select query results - */ - metadata?: ColumnMetadata[]; + + selectQueryResult?: SelectQueryResult; } +export type QueryType = 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE' | 'OTHER'; + export type ExecuteParams = number | boolean | bigint | string | ArrayBuffer; -export interface QueryResultRows { - /** Raw array with all dataset */ - _array: QuickValue[]; - /** The lengh of the dataset */ - length: number; - /** A convenience function to acess the index based the row object - * @param idx the row index - * @returns the row structure identified by column names - */ - item: (idx: number) => QuickValue; +export type ExecuteQuery = ( + query: string, + params?: ExecuteParams +) => QueryResult; + +export type ExecuteAsyncQuery = ( + query: string, + params?: ExecuteParams +) => Promise; + +export interface Transaction { + commit(): QueryResult; + rollback(): QueryResult; + execute: ExecuteQuery; + executeAsync: ExecuteAsyncQuery; } -/** - * Column metadata - * Describes some information about columns fetched by the query - */ -export interface ColumnMetadata { - /** The name used for this column for this resultset */ - columnName: string; - /** The declared column type for this column, when fetched directly from a table or a View resulting from a table column. "UNKNOWN" for dynamic values, like function returned ones. */ - columnDeclaredType: string; - /** - * The index for this column for this resultset*/ - columnIndex: number; +export interface PendingTransaction { + /* + * The start function should not throw or return a promise because the + * queue just calls it and does not monitor for failures or completions. + * + * It should catch any errors and call the resolve or reject of the wrapping + * promise when complete. + * + * It should also automatically commit or rollback the transaction if needed + */ + start: () => void; } /** @@ -103,46 +79,14 @@ export interface FileLoadResult extends BatchQueryResult { commands?: number; } -export interface Transaction { - commit(): QueryResult; - execute( - query: string, - params?: ExecuteParams - ): QueryResult; - executeAsync( - query: string, - params?: ExecuteParams - ): Promise; - rollback(): QueryResult; -} - -export interface PendingTransaction { - /* - * The start function should not throw or return a promise because the - * queue just calls it and does not monitor for failures or completions. - * - * It should catch any errors and call the resolve or reject of the wrapping - * promise when complete. - * - * It should also automatically commit or rollback the transaction if needed - */ - start: () => void; -} - export interface QuickSQLiteConnection { close(): void; delete(): void; attach(dbNameToAttach: string, alias: string, location?: string): void; detach(alias: string): void; transaction(fn: (tx: Transaction) => Promise | void): Promise; - execute( - query: string, - params?: ExecuteParams - ): QueryResult; - executeAsync( - query: string, - params?: ExecuteParams - ): Promise; + execute: ExecuteQuery; + executeAsync: ExecuteAsyncQuery; executeBatch(commands: SQLBatchTuple[]): BatchQueryResult; executeBatchAsync(commands: SQLBatchTuple[]): Promise; loadFile(location: string): FileLoadResult; From 053e016bed9d2e6be9b69401d194181cb94bb7a3 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 1 Sep 2024 23:40:24 +0200 Subject: [PATCH 018/156] fix: ios build --- example/ios/Podfile.lock | 487 ++++++++++-------- .../project.pbxproj | 122 ++--- ios/QuickSQLite.mm | 2 +- 3 files changed, 323 insertions(+), 288 deletions(-) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index bad839d0..f5d50131 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -1,19 +1,19 @@ PODS: - boost (1.76.0) - DoubleConversion (1.1.6) - - FBLazyVector (0.71.1) - - FBReactNativeSpec (0.71.1): + - FBLazyVector (0.71.11) + - FBReactNativeSpec (0.71.11): - RCT-Folly (= 2021.07.22.00) - - RCTRequired (= 0.71.1) - - RCTTypeSafety (= 0.71.1) - - React-Core (= 0.71.1) - - React-jsi (= 0.71.1) - - ReactCommon/turbomodule/core (= 0.71.1) + - RCTRequired (= 0.71.11) + - RCTTypeSafety (= 0.71.11) + - React-Core (= 0.71.11) + - React-jsi (= 0.71.11) + - ReactCommon/turbomodule/core (= 0.71.11) - fmt (6.2.1) - glog (0.3.5) - - hermes-engine (0.71.1): - - hermes-engine/Pre-built (= 0.71.1) - - hermes-engine/Pre-built (0.71.1) + - hermes-engine (0.71.11): + - hermes-engine/Pre-built (= 0.71.11) + - hermes-engine/Pre-built (0.71.11) - libevent (2.1.12) - NitroModules (0.6.0): - RCT-Folly (= 2021.07.22.00) @@ -35,26 +35,26 @@ PODS: - fmt (~> 6.2.1) - glog - libevent - - RCTRequired (0.71.1) - - RCTTypeSafety (0.71.1): - - FBLazyVector (= 0.71.1) - - RCTRequired (= 0.71.1) - - React-Core (= 0.71.1) - - React (0.71.1): - - React-Core (= 0.71.1) - - React-Core/DevSupport (= 0.71.1) - - React-Core/RCTWebSocket (= 0.71.1) - - React-RCTActionSheet (= 0.71.1) - - React-RCTAnimation (= 0.71.1) - - React-RCTBlob (= 0.71.1) - - React-RCTImage (= 0.71.1) - - React-RCTLinking (= 0.71.1) - - React-RCTNetwork (= 0.71.1) - - React-RCTSettings (= 0.71.1) - - React-RCTText (= 0.71.1) - - React-RCTVibration (= 0.71.1) - - React-callinvoker (0.71.1) - - React-Codegen (0.71.1): + - RCTRequired (0.71.11) + - RCTTypeSafety (0.71.11): + - FBLazyVector (= 0.71.11) + - RCTRequired (= 0.71.11) + - React-Core (= 0.71.11) + - React (0.71.11): + - React-Core (= 0.71.11) + - React-Core/DevSupport (= 0.71.11) + - React-Core/RCTWebSocket (= 0.71.11) + - React-RCTActionSheet (= 0.71.11) + - React-RCTAnimation (= 0.71.11) + - React-RCTBlob (= 0.71.11) + - React-RCTImage (= 0.71.11) + - React-RCTLinking (= 0.71.11) + - React-RCTNetwork (= 0.71.11) + - React-RCTSettings (= 0.71.11) + - React-RCTText (= 0.71.11) + - React-RCTVibration (= 0.71.11) + - React-callinvoker (0.71.11) + - React-Codegen (0.71.11): - FBReactNativeSpec - hermes-engine - RCT-Folly @@ -65,177 +65,209 @@ PODS: - React-jsiexecutor - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - React-Core (0.71.1): + - React-Core (0.71.11): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.71.1) - - React-cxxreact (= 0.71.1) - - React-jsi (= 0.71.1) - - React-jsiexecutor (= 0.71.1) - - React-perflogger (= 0.71.1) + - React-Core/Default (= 0.71.11) + - React-cxxreact (= 0.71.11) + - React-hermes + - React-jsi (= 0.71.11) + - React-jsiexecutor (= 0.71.11) + - React-perflogger (= 0.71.11) - Yoga - - React-Core/CoreModulesHeaders (0.71.1): + - React-Core/CoreModulesHeaders (0.71.11): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.1) - - React-jsi (= 0.71.1) - - React-jsiexecutor (= 0.71.1) - - React-perflogger (= 0.71.1) + - React-cxxreact (= 0.71.11) + - React-hermes + - React-jsi (= 0.71.11) + - React-jsiexecutor (= 0.71.11) + - React-perflogger (= 0.71.11) - Yoga - - React-Core/Default (0.71.1): + - React-Core/Default (0.71.11): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-cxxreact (= 0.71.1) - - React-jsi (= 0.71.1) - - React-jsiexecutor (= 0.71.1) - - React-perflogger (= 0.71.1) + - React-cxxreact (= 0.71.11) + - React-hermes + - React-jsi (= 0.71.11) + - React-jsiexecutor (= 0.71.11) + - React-perflogger (= 0.71.11) - Yoga - - React-Core/DevSupport (0.71.1): + - React-Core/DevSupport (0.71.11): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.71.1) - - React-Core/RCTWebSocket (= 0.71.1) - - React-cxxreact (= 0.71.1) - - React-jsi (= 0.71.1) - - React-jsiexecutor (= 0.71.1) - - React-jsinspector (= 0.71.1) - - React-perflogger (= 0.71.1) + - React-Core/Default (= 0.71.11) + - React-Core/RCTWebSocket (= 0.71.11) + - React-cxxreact (= 0.71.11) + - React-hermes + - React-jsi (= 0.71.11) + - React-jsiexecutor (= 0.71.11) + - React-jsinspector (= 0.71.11) + - React-perflogger (= 0.71.11) - Yoga - - React-Core/RCTActionSheetHeaders (0.71.1): + - React-Core/RCTActionSheetHeaders (0.71.11): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.1) - - React-jsi (= 0.71.1) - - React-jsiexecutor (= 0.71.1) - - React-perflogger (= 0.71.1) + - React-cxxreact (= 0.71.11) + - React-hermes + - React-jsi (= 0.71.11) + - React-jsiexecutor (= 0.71.11) + - React-perflogger (= 0.71.11) - Yoga - - React-Core/RCTAnimationHeaders (0.71.1): + - React-Core/RCTAnimationHeaders (0.71.11): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.1) - - React-jsi (= 0.71.1) - - React-jsiexecutor (= 0.71.1) - - React-perflogger (= 0.71.1) + - React-cxxreact (= 0.71.11) + - React-hermes + - React-jsi (= 0.71.11) + - React-jsiexecutor (= 0.71.11) + - React-perflogger (= 0.71.11) - Yoga - - React-Core/RCTBlobHeaders (0.71.1): + - React-Core/RCTBlobHeaders (0.71.11): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.1) - - React-jsi (= 0.71.1) - - React-jsiexecutor (= 0.71.1) - - React-perflogger (= 0.71.1) + - React-cxxreact (= 0.71.11) + - React-hermes + - React-jsi (= 0.71.11) + - React-jsiexecutor (= 0.71.11) + - React-perflogger (= 0.71.11) - Yoga - - React-Core/RCTImageHeaders (0.71.1): + - React-Core/RCTImageHeaders (0.71.11): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.1) - - React-jsi (= 0.71.1) - - React-jsiexecutor (= 0.71.1) - - React-perflogger (= 0.71.1) + - React-cxxreact (= 0.71.11) + - React-hermes + - React-jsi (= 0.71.11) + - React-jsiexecutor (= 0.71.11) + - React-perflogger (= 0.71.11) - Yoga - - React-Core/RCTLinkingHeaders (0.71.1): + - React-Core/RCTLinkingHeaders (0.71.11): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.1) - - React-jsi (= 0.71.1) - - React-jsiexecutor (= 0.71.1) - - React-perflogger (= 0.71.1) + - React-cxxreact (= 0.71.11) + - React-hermes + - React-jsi (= 0.71.11) + - React-jsiexecutor (= 0.71.11) + - React-perflogger (= 0.71.11) - Yoga - - React-Core/RCTNetworkHeaders (0.71.1): + - React-Core/RCTNetworkHeaders (0.71.11): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.1) - - React-jsi (= 0.71.1) - - React-jsiexecutor (= 0.71.1) - - React-perflogger (= 0.71.1) + - React-cxxreact (= 0.71.11) + - React-hermes + - React-jsi (= 0.71.11) + - React-jsiexecutor (= 0.71.11) + - React-perflogger (= 0.71.11) - Yoga - - React-Core/RCTSettingsHeaders (0.71.1): + - React-Core/RCTSettingsHeaders (0.71.11): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.1) - - React-jsi (= 0.71.1) - - React-jsiexecutor (= 0.71.1) - - React-perflogger (= 0.71.1) + - React-cxxreact (= 0.71.11) + - React-hermes + - React-jsi (= 0.71.11) + - React-jsiexecutor (= 0.71.11) + - React-perflogger (= 0.71.11) - Yoga - - React-Core/RCTTextHeaders (0.71.1): + - React-Core/RCTTextHeaders (0.71.11): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.1) - - React-jsi (= 0.71.1) - - React-jsiexecutor (= 0.71.1) - - React-perflogger (= 0.71.1) + - React-cxxreact (= 0.71.11) + - React-hermes + - React-jsi (= 0.71.11) + - React-jsiexecutor (= 0.71.11) + - React-perflogger (= 0.71.11) - Yoga - - React-Core/RCTVibrationHeaders (0.71.1): + - React-Core/RCTVibrationHeaders (0.71.11): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.1) - - React-jsi (= 0.71.1) - - React-jsiexecutor (= 0.71.1) - - React-perflogger (= 0.71.1) + - React-cxxreact (= 0.71.11) + - React-hermes + - React-jsi (= 0.71.11) + - React-jsiexecutor (= 0.71.11) + - React-perflogger (= 0.71.11) - Yoga - - React-Core/RCTWebSocket (0.71.1): + - React-Core/RCTWebSocket (0.71.11): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.71.1) - - React-cxxreact (= 0.71.1) - - React-jsi (= 0.71.1) - - React-jsiexecutor (= 0.71.1) - - React-perflogger (= 0.71.1) + - React-Core/Default (= 0.71.11) + - React-cxxreact (= 0.71.11) + - React-hermes + - React-jsi (= 0.71.11) + - React-jsiexecutor (= 0.71.11) + - React-perflogger (= 0.71.11) - Yoga - - React-CoreModules (0.71.1): + - React-CoreModules (0.71.11): - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.1) - - React-Codegen (= 0.71.1) - - React-Core/CoreModulesHeaders (= 0.71.1) - - React-jsi (= 0.71.1) - - React-RCTImage (= 0.71.1) - - ReactCommon/turbomodule/core (= 0.71.1) - - React-cxxreact (0.71.1): + - RCTTypeSafety (= 0.71.11) + - React-Codegen (= 0.71.11) + - React-Core/CoreModulesHeaders (= 0.71.11) + - React-jsi (= 0.71.11) + - React-RCTBlob + - React-RCTImage (= 0.71.11) + - ReactCommon/turbomodule/core (= 0.71.11) + - React-cxxreact (0.71.11): - boost (= 1.76.0) - DoubleConversion - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.71.1) - - React-jsi (= 0.71.1) - - React-jsinspector (= 0.71.1) - - React-logger (= 0.71.1) - - React-perflogger (= 0.71.1) - - React-runtimeexecutor (= 0.71.1) - - React-hermes (0.71.1): + - React-callinvoker (= 0.71.11) + - React-jsi (= 0.71.11) + - React-jsinspector (= 0.71.11) + - React-logger (= 0.71.11) + - React-perflogger (= 0.71.11) + - React-runtimeexecutor (= 0.71.11) + - React-hermes (0.71.11): - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - RCT-Folly/Futures (= 2021.07.22.00) - - React-cxxreact (= 0.71.1) - - React-jsiexecutor (= 0.71.1) - - React-jsinspector (= 0.71.1) - - React-perflogger (= 0.71.1) - - React-jsi (0.71.1): + - React-cxxreact (= 0.71.11) + - React-jsi + - React-jsiexecutor (= 0.71.11) + - React-jsinspector (= 0.71.11) + - React-perflogger (= 0.71.11) + - React-jsi (0.71.11): - boost (= 1.76.0) - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-jsiexecutor (0.71.1): + - React-jsiexecutor (0.71.11): - DoubleConversion - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-cxxreact (= 0.71.1) - - React-jsi (= 0.71.1) - - React-perflogger (= 0.71.1) - - React-jsinspector (0.71.1) - - React-logger (0.71.1): + - React-cxxreact (= 0.71.11) + - React-jsi (= 0.71.11) + - React-perflogger (= 0.71.11) + - React-jsinspector (0.71.11) + - React-logger (0.71.11): - glog - react-native-quick-sqlite (8.1.0): - RCT-Folly (= 2021.07.22.00) @@ -246,87 +278,90 @@ PODS: - RCTTypeSafety - React-Core - ReactCommon/turbomodule/core - - React-perflogger (0.71.1) - - React-RCTActionSheet (0.71.1): - - React-Core/RCTActionSheetHeaders (= 0.71.1) - - React-RCTAnimation (0.71.1): + - React-perflogger (0.71.11) + - React-RCTActionSheet (0.71.11): + - React-Core/RCTActionSheetHeaders (= 0.71.11) + - React-RCTAnimation (0.71.11): - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.1) - - React-Codegen (= 0.71.1) - - React-Core/RCTAnimationHeaders (= 0.71.1) - - React-jsi (= 0.71.1) - - ReactCommon/turbomodule/core (= 0.71.1) - - React-RCTAppDelegate (0.71.1): + - RCTTypeSafety (= 0.71.11) + - React-Codegen (= 0.71.11) + - React-Core/RCTAnimationHeaders (= 0.71.11) + - React-jsi (= 0.71.11) + - ReactCommon/turbomodule/core (= 0.71.11) + - React-RCTAppDelegate (0.71.11): - RCT-Folly - RCTRequired - RCTTypeSafety - React-Core - ReactCommon/turbomodule/core - - React-RCTBlob (0.71.1): + - React-RCTBlob (0.71.11): + - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Codegen (= 0.71.1) - - React-Core/RCTBlobHeaders (= 0.71.1) - - React-Core/RCTWebSocket (= 0.71.1) - - React-jsi (= 0.71.1) - - React-RCTNetwork (= 0.71.1) - - ReactCommon/turbomodule/core (= 0.71.1) - - React-RCTImage (0.71.1): + - React-Codegen (= 0.71.11) + - React-Core/RCTBlobHeaders (= 0.71.11) + - React-Core/RCTWebSocket (= 0.71.11) + - React-jsi (= 0.71.11) + - React-RCTNetwork (= 0.71.11) + - ReactCommon/turbomodule/core (= 0.71.11) + - React-RCTImage (0.71.11): - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.1) - - React-Codegen (= 0.71.1) - - React-Core/RCTImageHeaders (= 0.71.1) - - React-jsi (= 0.71.1) - - React-RCTNetwork (= 0.71.1) - - ReactCommon/turbomodule/core (= 0.71.1) - - React-RCTLinking (0.71.1): - - React-Codegen (= 0.71.1) - - React-Core/RCTLinkingHeaders (= 0.71.1) - - React-jsi (= 0.71.1) - - ReactCommon/turbomodule/core (= 0.71.1) - - React-RCTNetwork (0.71.1): + - RCTTypeSafety (= 0.71.11) + - React-Codegen (= 0.71.11) + - React-Core/RCTImageHeaders (= 0.71.11) + - React-jsi (= 0.71.11) + - React-RCTNetwork (= 0.71.11) + - ReactCommon/turbomodule/core (= 0.71.11) + - React-RCTLinking (0.71.11): + - React-Codegen (= 0.71.11) + - React-Core/RCTLinkingHeaders (= 0.71.11) + - React-jsi (= 0.71.11) + - ReactCommon/turbomodule/core (= 0.71.11) + - React-RCTNetwork (0.71.11): - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.1) - - React-Codegen (= 0.71.1) - - React-Core/RCTNetworkHeaders (= 0.71.1) - - React-jsi (= 0.71.1) - - ReactCommon/turbomodule/core (= 0.71.1) - - React-RCTSettings (0.71.1): + - RCTTypeSafety (= 0.71.11) + - React-Codegen (= 0.71.11) + - React-Core/RCTNetworkHeaders (= 0.71.11) + - React-jsi (= 0.71.11) + - ReactCommon/turbomodule/core (= 0.71.11) + - React-RCTSettings (0.71.11): - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.1) - - React-Codegen (= 0.71.1) - - React-Core/RCTSettingsHeaders (= 0.71.1) - - React-jsi (= 0.71.1) - - ReactCommon/turbomodule/core (= 0.71.1) - - React-RCTText (0.71.1): - - React-Core/RCTTextHeaders (= 0.71.1) - - React-RCTVibration (0.71.1): + - RCTTypeSafety (= 0.71.11) + - React-Codegen (= 0.71.11) + - React-Core/RCTSettingsHeaders (= 0.71.11) + - React-jsi (= 0.71.11) + - ReactCommon/turbomodule/core (= 0.71.11) + - React-RCTText (0.71.11): + - React-Core/RCTTextHeaders (= 0.71.11) + - React-RCTVibration (0.71.11): - RCT-Folly (= 2021.07.22.00) - - React-Codegen (= 0.71.1) - - React-Core/RCTVibrationHeaders (= 0.71.1) - - React-jsi (= 0.71.1) - - ReactCommon/turbomodule/core (= 0.71.1) - - React-runtimeexecutor (0.71.1): - - React-jsi (= 0.71.1) - - ReactCommon/turbomodule/bridging (0.71.1): + - React-Codegen (= 0.71.11) + - React-Core/RCTVibrationHeaders (= 0.71.11) + - React-jsi (= 0.71.11) + - ReactCommon/turbomodule/core (= 0.71.11) + - React-runtimeexecutor (0.71.11): + - React-jsi (= 0.71.11) + - ReactCommon/turbomodule/bridging (0.71.11): - DoubleConversion - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.71.1) - - React-Core (= 0.71.1) - - React-cxxreact (= 0.71.1) - - React-jsi (= 0.71.1) - - React-logger (= 0.71.1) - - React-perflogger (= 0.71.1) - - ReactCommon/turbomodule/core (0.71.1): + - React-callinvoker (= 0.71.11) + - React-Core (= 0.71.11) + - React-cxxreact (= 0.71.11) + - React-jsi (= 0.71.11) + - React-logger (= 0.71.11) + - React-perflogger (= 0.71.11) + - ReactCommon/turbomodule/core (0.71.11): - DoubleConversion - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.71.1) - - React-Core (= 0.71.1) - - React-cxxreact (= 0.71.1) - - React-jsi (= 0.71.1) - - React-logger (= 0.71.1) - - React-perflogger (= 0.71.1) + - React-callinvoker (= 0.71.11) + - React-Core (= 0.71.11) + - React-cxxreact (= 0.71.11) + - React-jsi (= 0.71.11) + - React-logger (= 0.71.11) + - React-perflogger (= 0.71.11) - Yoga (1.14.0) DEPENDENCIES: @@ -454,44 +489,44 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: boost: 57d2868c099736d80fcd648bf211b4431e51a558 DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 - FBLazyVector: ad72713385db5289b19f1ead07e8e4aa26dcb01d - FBReactNativeSpec: df2602c11e33d310433496e28a48b4b2be652a61 + FBLazyVector: c511d4cd0210f416cb5c289bd5ae6b36d909b048 + FBReactNativeSpec: a911fb22def57aef1d74215e8b6b8761d25c1c54 fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b - hermes-engine: 922ccd744f50d9bfde09e9677bf0f3b562ea5fb9 + hermes-engine: 34c863b446d0135b85a6536fa5fd89f48196f848 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 NitroModules: a1d3ce9cf15ec812b2723eec69e842f928ca5e6f RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1 - RCTRequired: fd4d923b964658aa0c4091a32c8b2004c6d9e3a6 - RCTTypeSafety: c276d85975bde3d8448907235c70bf0da257adfd - React: e481a67971af1ce9639c9f746b753dd0e84ca108 - React-callinvoker: 1051c04a94fa9d243786b86380606bad701a3b31 - React-Codegen: 14b1e716d361d5ad95e0ce1a338f3fa0733a98b5 - React-Core: 698fc3baecb80d511d987475a16d036cec6d287f - React-CoreModules: 59245305f41ff0adfeac334acc0594dea4585a7c - React-cxxreact: 49accd2954b0f532805dbcd1918fa6962f32f247 - React-hermes: d068733294581a085e95b6024e8d951b005e26d3 - React-jsi: 122b9bce14f4c6c7cb58f28f87912cfe091885fa - React-jsiexecutor: 60cf272aababc5212410e4249d17cea14fc36caa - React-jsinspector: ff56004b0c974b688a6548c156d5830ad751ae07 - React-logger: 60a0b5f8bed667ecf9e24fecca1f30d125de6d75 + RCTRequired: f6187ec763637e6a57f5728dd9a3bdabc6d6b4e0 + RCTTypeSafety: a01aca2dd3b27fa422d5239252ad38e54e958750 + React: 741b4f5187e7a2137b69c88e65f940ba40600b4b + React-callinvoker: 72ba74b2d5d690c497631191ae6eeca0c043d9cf + React-Codegen: 8a7cda1633e4940de8a710f6bf5cae5dd673546e + React-Core: 72bb19702c465b6451a40501a2879532bec9acee + React-CoreModules: ffd19b082fc36b9b463fedf30955138b5426c053 + React-cxxreact: 8b3dd87e3b8ea96dd4ad5c7bac8f31f1cc3da97f + React-hermes: be95942c3f47fc032da1387360413f00dae0ea68 + React-jsi: 9978e2a64c2a4371b40e109f4ef30a33deaa9bcb + React-jsiexecutor: 18b5b33c5f2687a784a61bc8176611b73524ae77 + React-jsinspector: b6ed4cb3ffa27a041cd440300503dc512b761450 + React-logger: 186dd536128ae5924bc38ed70932c00aa740cd5b react-native-quick-sqlite: b0d7096e3fbec93a340418a0cbb77e680056c3d1 react-native-safe-area-context: 39c2d8be3328df5d437ac1700f4f3a4f75716acc - React-perflogger: ec8eef2a8f03ecfa6361c2c5fb9197ef4a29cc85 - React-RCTActionSheet: a0c023b86cf4c862fa9c4eb0f6f91fbe878fb2de - React-RCTAnimation: 168d53718c74153947c0109f55900faa64d79439 - React-RCTAppDelegate: a8efbab128b34aa07a9491c85a41401210b1bec5 - React-RCTBlob: 9bcbfc893bfda9f6b2eb016329d38c0f6366d31a - React-RCTImage: 3fcd4570b4b0f1ac2f4b4b6308dba33ce66c5b50 - React-RCTLinking: 1edb8e1bb3fc39bf9e13c63d6aaaa3f0c3d18683 - React-RCTNetwork: 500a79e0e0f67678077df727fabba87a55c043e1 - React-RCTSettings: cc4414eb84ad756d619076c3999fecbf12896d6f - React-RCTText: 2a34261f3da6e34f47a62154def657546ebfa5e1 - React-RCTVibration: 49d531ec8498e0afa2c9b22c2205784372e3d4f3 - React-runtimeexecutor: 311feb67600774723fe10eb8801d3138cae9ad67 - ReactCommon: 03be76588338a27a88d103b35c3c44a3fd43d136 - Yoga: 921eb014669cf9c718ada68b08d362517d564e0c + React-perflogger: e706562ab7eb8eb590aa83a224d26fa13963d7f2 + React-RCTActionSheet: 57d4bd98122f557479a3359ad5dad8e109e20c5a + React-RCTAnimation: ccf3ef00101ea74bda73a045d79a658b36728a60 + React-RCTAppDelegate: d0c28a35c65e9a0aef287ac0dafe1b71b1ac180c + React-RCTBlob: 1700b92ece4357af0a49719c9638185ad2902e95 + React-RCTImage: f2e4904566ccccaa4b704170fcc5ae144ca347bf + React-RCTLinking: 52a3740e3651e30aa11dff5a6debed7395dd8169 + React-RCTNetwork: ea0976f2b3ffc7877cd7784e351dc460adf87b12 + React-RCTSettings: ed5ac992b23e25c65c3cc31f11b5c940ae5e3e60 + React-RCTText: c9dfc6722621d56332b4f3a19ac38105e7504145 + React-RCTVibration: f09f08de63e4122deb32506e20ca4cae6e4e14c1 + React-runtimeexecutor: 4817d63dbc9d658f8dc0ec56bd9b83ce531129f0 + ReactCommon: 08723d2ed328c5cbcb0de168f231bc7bae7f8aa1 + Yoga: f7decafdc5e8c125e6fa0da38a687e35238420fa -PODFILE CHECKSUM: 710c8b61fa030877d1c5469a281f2e00aa591d40 +PODFILE CHECKSUM: 4493525a2c9f97c6e617260ed7e9db08e655e6fa COCOAPODS: 1.15.2 diff --git a/example/ios/QuickSQLiteExample.xcodeproj/project.pbxproj b/example/ios/QuickSQLiteExample.xcodeproj/project.pbxproj index 2b4ac78f..a613ea77 100644 --- a/example/ios/QuickSQLiteExample.xcodeproj/project.pbxproj +++ b/example/ios/QuickSQLiteExample.xcodeproj/project.pbxproj @@ -8,12 +8,12 @@ /* Begin PBXBuildFile section */ 00E356F31AD99517003FC87E /* QuickSQLiteExampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* QuickSQLiteExampleTests.m */; }; - 0C80B921A6F3F58F76C31292 /* libPods-QuickSQLiteExample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DCACB8F33CDC322A6C60F78 /* libPods-QuickSQLiteExample.a */; }; 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 7699B88040F8A987B510C191 /* libPods-QuickSQLiteExample-QuickSQLiteExampleTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19F6CBCC0A4E27FBF8BF4A61 /* libPods-QuickSQLiteExample-QuickSQLiteExampleTests.a */; }; 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; + D7537A007033719516C57748 /* libPods-QuickSQLiteExample-QuickSQLiteExampleTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F61ADDCA341B787B4A3AFAFC /* libPods-QuickSQLiteExample-QuickSQLiteExampleTests.a */; }; + F6FA2C48029804D08B79E96F /* libPods-QuickSQLiteExample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E776B313FBFED7863A3D /* libPods-QuickSQLiteExample.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -30,20 +30,20 @@ 00E356EE1AD99517003FC87E /* QuickSQLiteExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = QuickSQLiteExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 00E356F21AD99517003FC87E /* QuickSQLiteExampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QuickSQLiteExampleTests.m; sourceTree = ""; }; + 03D39CB013C879B46EC1C979 /* Pods-QuickSQLiteExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QuickSQLiteExample.release.xcconfig"; path = "Target Support Files/Pods-QuickSQLiteExample/Pods-QuickSQLiteExample.release.xcconfig"; sourceTree = ""; }; + 1251E54A0A604DFB2905E20E /* Pods-QuickSQLiteExample-QuickSQLiteExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QuickSQLiteExample-QuickSQLiteExampleTests.debug.xcconfig"; path = "Target Support Files/Pods-QuickSQLiteExample-QuickSQLiteExampleTests/Pods-QuickSQLiteExample-QuickSQLiteExampleTests.debug.xcconfig"; sourceTree = ""; }; 13B07F961A680F5B00A75B9A /* QuickSQLiteExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = QuickSQLiteExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = QuickSQLiteExample/AppDelegate.h; sourceTree = ""; }; 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = QuickSQLiteExample/AppDelegate.mm; sourceTree = ""; }; 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = QuickSQLiteExample/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = QuickSQLiteExample/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = QuickSQLiteExample/main.m; sourceTree = ""; }; - 19F6CBCC0A4E27FBF8BF4A61 /* libPods-QuickSQLiteExample-QuickSQLiteExampleTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-QuickSQLiteExample-QuickSQLiteExampleTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B4392A12AC88292D35C810B /* Pods-QuickSQLiteExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QuickSQLiteExample.debug.xcconfig"; path = "Target Support Files/Pods-QuickSQLiteExample/Pods-QuickSQLiteExample.debug.xcconfig"; sourceTree = ""; }; - 5709B34CF0A7D63546082F79 /* Pods-QuickSQLiteExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QuickSQLiteExample.release.xcconfig"; path = "Target Support Files/Pods-QuickSQLiteExample/Pods-QuickSQLiteExample.release.xcconfig"; sourceTree = ""; }; - 5B7EB9410499542E8C5724F5 /* Pods-QuickSQLiteExample-QuickSQLiteExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QuickSQLiteExample-QuickSQLiteExampleTests.debug.xcconfig"; path = "Target Support Files/Pods-QuickSQLiteExample-QuickSQLiteExampleTests/Pods-QuickSQLiteExample-QuickSQLiteExampleTests.debug.xcconfig"; sourceTree = ""; }; - 5DCACB8F33CDC322A6C60F78 /* libPods-QuickSQLiteExample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-QuickSQLiteExample.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = QuickSQLiteExample/LaunchScreen.storyboard; sourceTree = ""; }; - 89C6BE57DB24E9ADA2F236DE /* Pods-QuickSQLiteExample-QuickSQLiteExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QuickSQLiteExample-QuickSQLiteExampleTests.release.xcconfig"; path = "Target Support Files/Pods-QuickSQLiteExample-QuickSQLiteExampleTests/Pods-QuickSQLiteExample-QuickSQLiteExampleTests.release.xcconfig"; sourceTree = ""; }; + BCC1E776B313FBFED7863A3D /* libPods-QuickSQLiteExample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-QuickSQLiteExample.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + CA20110A9117BB91D9E63081 /* Pods-QuickSQLiteExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QuickSQLiteExample.debug.xcconfig"; path = "Target Support Files/Pods-QuickSQLiteExample/Pods-QuickSQLiteExample.debug.xcconfig"; sourceTree = ""; }; + CE317F99C7B7933DEB58C2E6 /* Pods-QuickSQLiteExample-QuickSQLiteExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QuickSQLiteExample-QuickSQLiteExampleTests.release.xcconfig"; path = "Target Support Files/Pods-QuickSQLiteExample-QuickSQLiteExampleTests/Pods-QuickSQLiteExample-QuickSQLiteExampleTests.release.xcconfig"; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; + F61ADDCA341B787B4A3AFAFC /* libPods-QuickSQLiteExample-QuickSQLiteExampleTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-QuickSQLiteExample-QuickSQLiteExampleTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -51,7 +51,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 7699B88040F8A987B510C191 /* libPods-QuickSQLiteExample-QuickSQLiteExampleTests.a in Frameworks */, + D7537A007033719516C57748 /* libPods-QuickSQLiteExample-QuickSQLiteExampleTests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -59,7 +59,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0C80B921A6F3F58F76C31292 /* libPods-QuickSQLiteExample.a in Frameworks */, + F6FA2C48029804D08B79E96F /* libPods-QuickSQLiteExample.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -100,8 +100,8 @@ isa = PBXGroup; children = ( ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - 5DCACB8F33CDC322A6C60F78 /* libPods-QuickSQLiteExample.a */, - 19F6CBCC0A4E27FBF8BF4A61 /* libPods-QuickSQLiteExample-QuickSQLiteExampleTests.a */, + BCC1E776B313FBFED7863A3D /* libPods-QuickSQLiteExample.a */, + F61ADDCA341B787B4A3AFAFC /* libPods-QuickSQLiteExample-QuickSQLiteExampleTests.a */, ); name = Frameworks; sourceTree = ""; @@ -140,10 +140,10 @@ BBD78D7AC51CEA395F1C20DB /* Pods */ = { isa = PBXGroup; children = ( - 3B4392A12AC88292D35C810B /* Pods-QuickSQLiteExample.debug.xcconfig */, - 5709B34CF0A7D63546082F79 /* Pods-QuickSQLiteExample.release.xcconfig */, - 5B7EB9410499542E8C5724F5 /* Pods-QuickSQLiteExample-QuickSQLiteExampleTests.debug.xcconfig */, - 89C6BE57DB24E9ADA2F236DE /* Pods-QuickSQLiteExample-QuickSQLiteExampleTests.release.xcconfig */, + CA20110A9117BB91D9E63081 /* Pods-QuickSQLiteExample.debug.xcconfig */, + 03D39CB013C879B46EC1C979 /* Pods-QuickSQLiteExample.release.xcconfig */, + 1251E54A0A604DFB2905E20E /* Pods-QuickSQLiteExample-QuickSQLiteExampleTests.debug.xcconfig */, + CE317F99C7B7933DEB58C2E6 /* Pods-QuickSQLiteExample-QuickSQLiteExampleTests.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -155,12 +155,12 @@ isa = PBXNativeTarget; buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "QuickSQLiteExampleTests" */; buildPhases = ( - A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */, + 2CDC9C54CCFE5D9F92A50675 /* [CP] Check Pods Manifest.lock */, 00E356EA1AD99517003FC87E /* Sources */, 00E356EB1AD99517003FC87E /* Frameworks */, 00E356EC1AD99517003FC87E /* Resources */, - C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */, - F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */, + 6930F3E39E7F1174A4E95A27 /* [CP] Embed Pods Frameworks */, + 9DED98E0C31C147A92DCCCAA /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -176,14 +176,14 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "QuickSQLiteExample" */; buildPhases = ( - C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */, + 8851BB48F109827B5AB11D8D /* [CP] Check Pods Manifest.lock */, FD10A7F022414F080027D42C /* Start Packager */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */, - E235C05ADACE081382539298 /* [CP] Copy Pods Resources */, + 8E5F855203FCB612A133F818 /* [CP] Embed Pods Frameworks */, + 61FCFD127542643806B76DAD /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -266,24 +266,7 @@ shellPath = /bin/sh; shellScript = "set -e\n\nWITH_ENVIRONMENT=\"../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; }; - 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-QuickSQLiteExample/Pods-QuickSQLiteExample-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-QuickSQLiteExample/Pods-QuickSQLiteExample-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-QuickSQLiteExample/Pods-QuickSQLiteExample-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */ = { + 2CDC9C54CCFE5D9F92A50675 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -305,29 +288,24 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = { + 61FCFD127542643806B76DAD /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-QuickSQLiteExample/Pods-QuickSQLiteExample-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-QuickSQLiteExample-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-QuickSQLiteExample/Pods-QuickSQLiteExample-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-QuickSQLiteExample/Pods-QuickSQLiteExample-resources.sh\"\n"; showEnvVarsInLog = 0; }; - C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */ = { + 6930F3E39E7F1174A4E95A27 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -344,24 +322,46 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-QuickSQLiteExample-QuickSQLiteExampleTests/Pods-QuickSQLiteExample-QuickSQLiteExampleTests-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - E235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = { + 8851BB48F109827B5AB11D8D /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-QuickSQLiteExample/Pods-QuickSQLiteExample-resources-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Copy Pods Resources"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-QuickSQLiteExample/Pods-QuickSQLiteExample-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-QuickSQLiteExample-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-QuickSQLiteExample/Pods-QuickSQLiteExample-resources.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 8E5F855203FCB612A133F818 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-QuickSQLiteExample/Pods-QuickSQLiteExample-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-QuickSQLiteExample/Pods-QuickSQLiteExample-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-QuickSQLiteExample/Pods-QuickSQLiteExample-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */ = { + 9DED98E0C31C147A92DCCCAA /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -430,7 +430,7 @@ /* Begin XCBuildConfiguration section */ 00E356F61AD99517003FC87E /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5B7EB9410499542E8C5724F5 /* Pods-QuickSQLiteExample-QuickSQLiteExampleTests.debug.xcconfig */; + baseConfigurationReference = 1251E54A0A604DFB2905E20E /* Pods-QuickSQLiteExample-QuickSQLiteExampleTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -457,7 +457,7 @@ }; 00E356F71AD99517003FC87E /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 89C6BE57DB24E9ADA2F236DE /* Pods-QuickSQLiteExample-QuickSQLiteExampleTests.release.xcconfig */; + baseConfigurationReference = CE317F99C7B7933DEB58C2E6 /* Pods-QuickSQLiteExample-QuickSQLiteExampleTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; COPY_PHASE_STRIP = NO; @@ -481,7 +481,7 @@ }; 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-QuickSQLiteExample.debug.xcconfig */; + baseConfigurationReference = CA20110A9117BB91D9E63081 /* Pods-QuickSQLiteExample.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; @@ -507,7 +507,7 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5709B34CF0A7D63546082F79 /* Pods-QuickSQLiteExample.release.xcconfig */; + baseConfigurationReference = 03D39CB013C879B46EC1C979 /* Pods-QuickSQLiteExample.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; diff --git a/ios/QuickSQLite.mm b/ios/QuickSQLite.mm index 519f31a0..592093bf 100644 --- a/ios/QuickSQLite.mm +++ b/ios/QuickSQLite.mm @@ -3,7 +3,7 @@ #import #import -#import +#import #import #import "../cpp/bindings.h" From 7729a540b5a79ff50bfce7410442218bf2a8bd33 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Mon, 2 Sep 2024 09:24:18 +0200 Subject: [PATCH 019/156] implement first native hybrid function --- cpp/QuickSQLite.cpp | 24 +++ cpp/QuickSQLite.hpp | 28 +++ cpp/bindings.cpp | 439 ++------------------------------------------ 3 files changed, 66 insertions(+), 425 deletions(-) create mode 100644 cpp/QuickSQLite.cpp create mode 100644 cpp/QuickSQLite.hpp diff --git a/cpp/QuickSQLite.cpp b/cpp/QuickSQLite.cpp new file mode 100644 index 00000000..51cb2543 --- /dev/null +++ b/cpp/QuickSQLite.cpp @@ -0,0 +1,24 @@ +#include "QuickSQLite.hpp" + +QuickSQLite::QuickSQLite() : margelo::nitro::HybridObject(TAG) {} + +void QuickSQLite::open(std::string dbName, std::optional location) { + std::string tempDocPath = std::string(docPathStr); + if (location) { + tempDocPath = tempDocPath + "/" + *location; + } + + SQLiteOPResult result = sqliteOpenDb(dbName, tempDocPath); + + if (result.type == SQLiteError) + { + throw std::runtime_error(result.errorMessage.c_str()); + } +} + +void QuickSQLite::loadHybridMethods() { + HybridObject::loadHybridMethods(); + registerHybrids(this, [](margelo::nitro::Prototype& prototype) { + prototype.registerHybridMethod("open", &QuickSQLite::open); + }); +} diff --git a/cpp/QuickSQLite.hpp b/cpp/QuickSQLite.hpp new file mode 100644 index 00000000..5e1f7594 --- /dev/null +++ b/cpp/QuickSQLite.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include "sqliteBridge.h" +#include "logs.h" +#include "sqlfileloader.h" +#include "sqlbatchexecutor.h" +#include +#include +#include "macros.h" +#include +#include +#include + +class QuickSQLite: public margelo::nitro::HybridObject { +private: + string docPathStr; + +public: + explicit QuickSQLite(); + + void open(std::string dbName, std::optional location); + +public: + void loadHybridMethods() override; + +private: + static constexpr auto TAG = "QuickSQLite"; +}; diff --git a/cpp/bindings.cpp b/cpp/bindings.cpp index 34adcd0a..3fcce4cf 100644 --- a/cpp/bindings.cpp +++ b/cpp/bindings.cpp @@ -9,442 +9,31 @@ #include #include "macros.h" #include +#include +#include +#include "QuickSQLite.hpp" using namespace std; using namespace facebook; -namespace osp { -string docPathStr; -std::shared_ptr invoker; +namespace margelo { 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); +void load() { + margelo::nitro::HybridObjectRegistry::registerHybridObjectConstructor( + "QuickSQLite", + []() -> std::shared_ptr { + return std::make_shared(); } + ); +} - 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)); +void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker, const char *docPath) +{ + load(); } } From de77eec207917230c0c935a77621b5e72149dd70 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Mon, 2 Sep 2024 11:01:11 +0200 Subject: [PATCH 020/156] upgrade to RN 0.75.2 --- example/ios/Podfile.lock | 2 +- example/package.json | 6 +++--- package.json | 4 ++-- react-native-quick-sqlite.podspec | 4 +++- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index f5d50131..8d06d9ef 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -510,7 +510,7 @@ SPEC CHECKSUMS: React-jsiexecutor: 18b5b33c5f2687a784a61bc8176611b73524ae77 React-jsinspector: b6ed4cb3ffa27a041cd440300503dc512b761450 React-logger: 186dd536128ae5924bc38ed70932c00aa740cd5b - react-native-quick-sqlite: b0d7096e3fbec93a340418a0cbb77e680056c3d1 + react-native-quick-sqlite: b72efe3f5286e2aaf4cacd1207128937abcb8209 react-native-safe-area-context: 39c2d8be3328df5d437ac1700f4f3a4f75716acc React-perflogger: e706562ab7eb8eb590aa83a224d26fa13963d7f2 React-RCTActionSheet: 57d4bd98122f557479a3359ad5dad8e109e20c5a diff --git a/example/package.json b/example/package.json index 1336269d..e2184864 100644 --- a/example/package.json +++ b/example/package.json @@ -13,11 +13,10 @@ "chai": "^4.3.7", "chance": "^1.1.9", "events": "^3.3.0", - "mocha": "^10.1.0", "nativewind": "^2.0.11", "react": "18.2.0", - "react-native": "0.71.11", - "react-native-nitro-modules": "./../../react-native-nitro/packages/react-native-nitro-modules", + "react-native": "0.75.2", + "react-native-nitro-modules": "^0.6.0", "react-native-quick-sqlite": "./..", "react-native-safe-area-context": "^4.5.0", "reflect-metadata": "^0.1.13", @@ -32,6 +31,7 @@ "@babel/preset-env": "^7.14.0", "@babel/runtime": "^7.12.5", "@tsconfig/react-native": "^2.0.2", + "mocha": "^10.1.0", "@types/chai": "^4.3.4", "@types/chance": "^1.1.3", "@types/mocha": "^10.0.1", diff --git a/package.json b/package.json index fa0d9325..38d755de 100644 --- a/package.json +++ b/package.json @@ -48,13 +48,13 @@ "devDependencies": { "nitro-codegen": "^0.6.0", "react": "18.2.0", - "react-native": "0.71.11", + "react-native": "0.75.2", "react-native-builder-bob": "^0.18.2", "typescript": "^4.8.4" }, "peerDependencies": { "react": "*", - "react-native": "*", + "react-native": ">=0.74.0", "react-native-nitro-modules": "*" }, "prettier": { diff --git a/react-native-quick-sqlite.podspec b/react-native-quick-sqlite.podspec index 53f832ae..927ef26a 100644 --- a/react-native-quick-sqlite.podspec +++ b/react-native-quick-sqlite.podspec @@ -16,7 +16,9 @@ Pod::Spec.new do |s| 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++' } s.header_mappings_dir = "cpp" From 6b70ea714b6a42f22c05cc6ff265e43666547552 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Mon, 2 Sep 2024 11:01:28 +0200 Subject: [PATCH 021/156] disable typeORM stuff --- src/index.ts | 166 +++++++++++++++++++++++++-------------------------- 1 file changed, 83 insertions(+), 83 deletions(-) diff --git a/src/index.ts b/src/index.ts index 0d80287a..184d4de7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,18 +20,18 @@ const locks: Record< // Enhance some host functions // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work -const enhanceQueryResult = (result: QueryResult): void => { - // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work - if (result.rows == null) { - result.rows = { - _array: [], - length: 0, - item: (idx: number) => result.rows._array[idx], - }; - } else { - result.rows.item = (idx: number) => result.rows._array[idx]; - } -}; +// const enhanceQueryResult = (result: QueryResult): void => { +// // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work +// if (result.rows == null) { +// result.rows = { +// _array: [], +// length: 0, +// item: (idx: number) => result.rows._array[idx], +// }; +// } else { +// result.rows.item = (idx: number) => result.rows._array[idx]; +// } +// }; const _open = QuickSQLite.open; QuickSQLite.open = (dbName: string, location?: string) => { @@ -56,7 +56,7 @@ QuickSQLite.execute = ( params?: ExecuteParams ): QueryResult => { const result = _execute(dbName, query, params); - enhanceQueryResult(result); + // enhanceQueryResult(result); return result; }; @@ -67,7 +67,7 @@ QuickSQLite.executeAsync = async ( params?: ExecuteParams ): Promise => { const res = await _executeAsync(dbName, query, params); - enhanceQueryResult(res); + // enhanceQueryResult(res); return res; }; @@ -195,75 +195,75 @@ const startNextTransaction = (dbName: string) => { * DO NOT USE THIS! THIS IS MEANT FOR TYPEORM * If you are looking for a convenience wrapper use `connect` */ -export const typeORMDriver = { - openDatabase: ( - options: { - name: string; - location?: string; - }, - ok: (db: any) => void, - fail: (msg: string) => void - ): any => { - try { - QuickSQLite.open(options.name, options.location); - - const connection = { - executeSql: async ( - sql: string, - params: ExecuteParams | undefined, - ok: (res: QueryResult) => void, - fail: (msg: string) => void - ) => { - try { - let response = await QuickSQLite.executeAsync( - options.name, - sql, - params - ); - enhanceQueryResult(response); - ok(response); - } catch (e) { - fail(e); - } - }, - transaction: ( - fn: (tx: Transaction) => Promise - ): Promise => { - return QuickSQLite.transaction(options.name, fn); - }, - close: (ok: any, fail: any) => { - try { - QuickSQLite.close(options.name); - ok(); - } catch (e) { - fail(e); - } - }, - attach: ( - dbNameToAttach: string, - alias: string, - location: string | undefined, - callback: () => void - ) => { - QuickSQLite.attach(options.name, dbNameToAttach, alias, location); - - callback(); - }, - detach: (alias, callback: () => void) => { - QuickSQLite.detach(options.name, alias); - - callback(); - }, - }; - - ok(connection); - - return connection; - } catch (e) { - fail(e); - } - }, -}; +// export const typeORMDriver = { +// openDatabase: ( +// options: { +// name: string; +// location?: string; +// }, +// ok: (db: any) => void, +// fail: (msg: string) => void +// ): any => { +// try { +// QuickSQLite.open(options.name, options.location); + +// const connection = { +// executeSql: async ( +// sql: string, +// params: ExecuteParams | undefined, +// ok: (res: QueryResult) => void, +// fail: (msg: string) => void +// ) => { +// try { +// let response = await QuickSQLite.executeAsync( +// options.name, +// sql, +// params +// ); +// enhanceQueryResult(response); +// ok(response); +// } catch (e) { +// fail(e); +// } +// }, +// transaction: ( +// fn: (tx: Transaction) => Promise +// ): Promise => { +// return QuickSQLite.transaction(options.name, fn); +// }, +// close: (ok: any, fail: any) => { +// try { +// QuickSQLite.close(options.name); +// ok(); +// } catch (e) { +// fail(e); +// } +// }, +// attach: ( +// dbNameToAttach: string, +// alias: string, +// location: string | undefined, +// callback: () => void +// ) => { +// QuickSQLite.attach(options.name, dbNameToAttach, alias, location); + +// callback(); +// }, +// detach: (alias, callback: () => void) => { +// QuickSQLite.detach(options.name, alias); + +// callback(); +// }, +// }; + +// ok(connection); + +// return connection; +// } catch (e) { +// fail(e); +// } +// }, +// }; export const open = (options: { name: string; From 06716a61db00448f74118a455d607227fb2fe203 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Mon, 2 Sep 2024 11:02:08 +0200 Subject: [PATCH 022/156] upgrade JDK version and gradle settings --- android/.project | 19 ++++++++++++++++++- .../org.eclipse.buildship.core.prefs | 8 ++++---- android/.settings/org.eclipse.jdt.core.prefs | 4 ++++ 3 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 android/.settings/org.eclipse.jdt.core.prefs diff --git a/android/.project b/android/.project index 0e0a1bac..c3381543 100644 --- a/android/.project +++ b/android/.project @@ -1,10 +1,15 @@ - android_ + react-native-quick-sqlite Project android_ created by Buildship. + + org.eclipse.jdt.core.javabuilder + + + org.eclipse.buildship.core.gradleprojectbuilder @@ -12,6 +17,18 @@ + org.eclipse.jdt.core.javanature org.eclipse.buildship.core.gradleprojectnature + + + 1716472255033 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + diff --git a/android/.settings/org.eclipse.buildship.core.prefs b/android/.settings/org.eclipse.buildship.core.prefs index 8c253d67..75fc6f54 100644 --- a/android/.settings/org.eclipse.buildship.core.prefs +++ b/android/.settings/org.eclipse.buildship.core.prefs @@ -1,11 +1,11 @@ -arguments= +arguments=--init-script /var/folders/b1/xj_1nb1j5w9gx10ntjfr6jc40000gn/T/db3b08fc4a9ef609cb16b96b200fa13e563f396e9bb1ed0905fdab7bc3bc513b.gradle --init-script /var/folders/b1/xj_1nb1j5w9gx10ntjfr6jc40000gn/T/52cde0cfcf3e28b8b7510e992210d9614505e0911af0c190bd590d7158574963.gradle auto.sync=false build.scans.enabled=false -connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(6.0)) -connection.project.dir= +connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(8.9)) +connection.project.dir=../example/android eclipse.preferences.version=1 gradle.user.home= -java.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home +java.home=/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home jvm.arguments= offline.mode=false override.workspace.settings=true diff --git a/android/.settings/org.eclipse.jdt.core.prefs b/android/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..60e5b016 --- /dev/null +++ b/android/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=27 +org.eclipse.jdt.core.compiler.compliance=27 +org.eclipse.jdt.core.compiler.source=27 From d104b11b8e2f62f08218bc03bb021422058ec923 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Mon, 2 Sep 2024 11:54:52 +0200 Subject: [PATCH 023/156] migrate codebase to RN0.75.2 --- .gitignore | 3 +- Gemfile | 5 +- babel.config.js | 4 +- cpp/QuickSQLite.cpp | 2 +- example/.gitignore | 15 ++++- example/ios/Podfile | 29 ++++------ .../project.pbxproj | 12 ++-- example/ios/QuickSQLiteExample/AppDelegate.mm | 17 ++---- example/ios/QuickSQLiteExample/Info.plist | 15 ++--- example/metro.config.js | 29 ++++++---- example/package.json | 55 ++++++++++++++++--- example/tsconfig.json | 4 +- package.json | 41 ++++++++++++-- 13 files changed, 156 insertions(+), 75 deletions(-) diff --git a/.gitignore b/.gitignore index 8fe028f6..5a5298bc 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,7 @@ DerivedData *.hmap *.ipa *.xcuserstate +**/.xcode.env.local project.xcworkspace # Android/IJ @@ -47,7 +48,7 @@ vendor/ # Cocoapods # -example/ios/Pods +**/Pods example/vendor/bundle # Temporary files created by Metro to check the health of the file watcher diff --git a/Gemfile b/Gemfile index e546134f..9e2a1474 100644 --- a/Gemfile +++ b/Gemfile @@ -1,4 +1,7 @@ source 'https://rubygems.org' # You may use http://rbenv.org/ or https://rvm.io/ to install and use this version ruby '3.3.0' -gem 'cocoapods', '~> 1.15', '>= 1.15.2' + +# Exclude problematic versions of cocoapods and activesupport that causes build failures. +gem 'cocoapods', '>= 1.13', '!= 1.15.0', '!= 1.15.1' +gem 'activesupport', '>= 6.1.7.5', '!= 7.1.0' diff --git a/babel.config.js b/babel.config.js index 51c3da3d..a4b40953 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,8 +1,8 @@ module.exports = { - presets: ['module:metro-react-native-babel-preset'], + presets: ['module:@react-native/babel-preset'], plugins: [ 'babel-plugin-transform-typescript-metadata', ['@babel/plugin-proposal-decorators', { legacy: true }], ['@babel/plugin-proposal-class-properties', { loose: true }], ], -}; +} diff --git a/cpp/QuickSQLite.cpp b/cpp/QuickSQLite.cpp index 51cb2543..bf2068b4 100644 --- a/cpp/QuickSQLite.cpp +++ b/cpp/QuickSQLite.cpp @@ -6,7 +6,7 @@ void QuickSQLite::open(std::string dbName, std::optional location) std::string tempDocPath = std::string(docPathStr); if (location) { tempDocPath = tempDocPath + "/" + *location; - } + }esli SQLiteOPResult result = sqliteOpenDb(dbName, tempDocPath); diff --git a/example/.gitignore b/example/.gitignore index f704db64..7fced3ae 100644 --- a/example/.gitignore +++ b/example/.gitignore @@ -20,7 +20,7 @@ DerivedData *.hmap *.ipa *.xcuserstate -ios/.xcode.env.local +**/.xcode.env.local # Android/IntelliJ # @@ -54,5 +54,16 @@ yarn-error.log *.jsbundle # Ruby / CocoaPods -/ios/Pods/ +**/Pods/ /vendor/bundle/ + +# testing +/coverage + +# Yarn +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions diff --git a/example/ios/Podfile b/example/ios/Podfile index ce299bb8..63fc042a 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -1,5 +1,9 @@ -require_relative '../node_modules/react-native/scripts/react_native_pods' -require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' +# Resolve react_native_pods.rb with node to allow for hoisting +require Pod::Executable.execute_command('node', ['-p', + 'require.resolve( + "react-native/scripts/react_native_pods.rb", + {paths: [process.argv[1]]}, + )', __dir__]).strip platform :ios, min_ios_version_supported prepare_react_native_project! @@ -13,21 +17,8 @@ linkage = ENV['USE_FRAMEWORKS'] target 'QuickSQLiteExample' do config = use_native_modules! - # Flags change depending on the env values. - flags = get_default_flags() - use_react_native!( :path => config[:reactNativePath], - # Hermes is now enabled by default. Disable by setting this flag to false. - # Upcoming versions of React Native may rely on get_default_flags(), but - # we make it explicit here to aid in the React Native upgrade process. - :hermes_enabled => flags[:hermes_enabled], - :fabric_enabled => flags[:fabric_enabled], - # Enables Flipper. - # - # Note that if you have use_frameworks! enabled, Flipper will not work and - # you should disable the next line. - :flipper_configuration => FlipperConfiguration.disabled, # An absolute path to your application root. :app_path => "#{Pod::Config.instance.installation_root}/.." ) @@ -40,13 +31,13 @@ target 'QuickSQLiteExample' do end post_install do |installer| + # https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202 react_native_post_install( installer, - # Set `mac_catalyst_enabled` to `true` in order to apply patches - # necessary for Mac Catalyst builds - :mac_catalyst_enabled => false + config[:reactNativePath], + :mac_catalyst_enabled => false, + # :ccache_enabled => true ) - __apply_Xcode_12_5_M1_post_install_workaround(installer) installer.pods_project.build_configurations.each do |config| config.build_settings['DEAD_CODE_STRIPPING'] = 'YES' diff --git a/example/ios/QuickSQLiteExample.xcodeproj/project.pbxproj b/example/ios/QuickSQLiteExample.xcodeproj/project.pbxproj index a613ea77..a93a52cc 100644 --- a/example/ios/QuickSQLiteExample.xcodeproj/project.pbxproj +++ b/example/ios/QuickSQLiteExample.xcodeproj/project.pbxproj @@ -534,7 +534,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -578,7 +578,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.4; + IPHONEOS_DEPLOYMENT_TARGET = 13.4; LD_RUNPATH_SEARCH_PATHS = ( /usr/lib/swift, "$(inherited)", @@ -595,6 +595,8 @@ "-DFOLLY_NO_CONFIG", "-DFOLLY_MOBILE=1", "-DFOLLY_USE_LIBCPP=1", + "-DFOLLY_CFG_NO_COROUTINES=1", + "-DFOLLY_HAVE_CLOCK_GETTIME=1", ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; @@ -606,7 +608,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -643,7 +645,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.4; + IPHONEOS_DEPLOYMENT_TARGET = 13.4; LD_RUNPATH_SEARCH_PATHS = ( /usr/lib/swift, "$(inherited)", @@ -659,6 +661,8 @@ "-DFOLLY_NO_CONFIG", "-DFOLLY_MOBILE=1", "-DFOLLY_USE_LIBCPP=1", + "-DFOLLY_CFG_NO_COROUTINES=1", + "-DFOLLY_HAVE_CLOCK_GETTIME=1", ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; diff --git a/example/ios/QuickSQLiteExample/AppDelegate.mm b/example/ios/QuickSQLiteExample/AppDelegate.mm index 04b8e3a5..a6173194 100644 --- a/example/ios/QuickSQLiteExample/AppDelegate.mm +++ b/example/ios/QuickSQLiteExample/AppDelegate.mm @@ -11,6 +11,11 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( } - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge +{ + return [self bundleURL]; +} + +- (NSURL *)bundleURL { #if DEBUG return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; @@ -19,14 +24,4 @@ - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge #endif } -/// This method controls whether the `concurrentRoot`feature of React18 is turned on or off. -/// -/// @see: https://reactjs.org/blog/2022/03/29/react-v18.html -/// @note: This requires to be rendering on Fabric (i.e. on the New Architecture). -/// @return: `true` if the `concurrentRoot` feature is enabled. Otherwise, it returns `false`. -- (BOOL)concurrentRootEnabled -{ - return true; -} - -@end \ No newline at end of file +@end diff --git a/example/ios/QuickSQLiteExample/Info.plist b/example/ios/QuickSQLiteExample/Info.plist index 9b18af21..1b9a707f 100644 --- a/example/ios/QuickSQLiteExample/Info.plist +++ b/example/ios/QuickSQLiteExample/Info.plist @@ -26,14 +26,11 @@ NSAppTransportSecurity - NSExceptionDomains - - localhost - - NSExceptionAllowsInsecureHTTPLoads - - - + + NSAllowsArbitraryLoads + + NSAllowsLocalNetworking + NSLocationWhenInUseUsageDescription @@ -41,7 +38,7 @@ LaunchScreen UIRequiredDeviceCapabilities - armv7 + arm64 UISupportedInterfaceOrientations diff --git a/example/metro.config.js b/example/metro.config.js index c6e1921a..fe70b316 100644 --- a/example/metro.config.js +++ b/example/metro.config.js @@ -1,14 +1,16 @@ -const path = require('path'); -const exclusionList = require('metro-config/src/defaults/exclusionList'); -const escape = require('escape-string-regexp'); -const pak = require('../package.json'); +const path = require('path') +const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config') +const exclusionList = require('metro-config/src/defaults/exclusionList') +const escape = require('escape-string-regexp') +const pak = require('../package.json') -const root = path.resolve(__dirname, '..'); +const root = path.resolve(__dirname, '..') const modules = Object.keys({ ...pak.peerDependencies, -}); -module.exports = { +}) + +const config = { projectRoot: __dirname, watchFolders: [root], @@ -17,13 +19,14 @@ module.exports = { resolver: { blockList: exclusionList( modules.map( - m => new RegExp(`^${escape(path.join(root, 'node_modules', m))}\\/.*$`), - ), + (m) => + new RegExp(`^${escape(path.join(root, 'node_modules', m))}\\/.*$`) + ) ), extraNodeModules: modules.reduce((acc, name) => { - acc[name] = path.join(__dirname, 'node_modules', name); - return acc; + acc[name] = path.join(__dirname, 'node_modules', name) + return acc }, {}), }, transformer: { @@ -34,4 +37,6 @@ module.exports = { }, }), }, -}; +} + +module.exports = mergeConfig(getDefaultConfig(__dirname), config) diff --git a/example/package.json b/example/package.json index e2184864..a80abf05 100644 --- a/example/package.json +++ b/example/package.json @@ -16,7 +16,7 @@ "nativewind": "^2.0.11", "react": "18.2.0", "react-native": "0.75.2", - "react-native-nitro-modules": "^0.6.0", + "react-native-nitro-modules": "./../../react-native-nitro/packages/react-native-nitro-modules", "react-native-quick-sqlite": "./..", "react-native-safe-area-context": "^4.5.0", "reflect-metadata": "^0.1.13", @@ -30,21 +30,62 @@ "@babel/plugin-proposal-decorators": "^7.20.5", "@babel/preset-env": "^7.14.0", "@babel/runtime": "^7.12.5", + "@react-native/babel-preset": "0.75.2", + "@react-native/eslint-config": "0.75.2", + "@react-native/metro-config": "0.75.2", + "@react-native/typescript-config": "0.75.2", "@tsconfig/react-native": "^2.0.2", "mocha": "^10.1.0", "@types/chai": "^4.3.4", "@types/chance": "^1.1.3", "@types/mocha": "^10.0.1", - "@types/react": "^18.0.24", - "@types/react-native": "^0.70.6", + "@types/react": "^18.3.1", + "@types/react-native": "^0.75.2", "@types/react-test-renderer": "^18.0.0", "babel-plugin-module-resolver": "^4.1.0", "babel-plugin-transform-typescript-metadata": "^0.3.2", - "metro-react-native-babel-preset": "0.73.5", "patch-package": "^6.5.0", "postinstall-postinstall": "^2.1.0", - "prettier": "^2.4.1", - "react-test-renderer": "18.1.0", - "typescript": "^4.8.4" + "prettier": "^2.8.8", + "react-test-renderer": "18.3.1", + "typescript": "^5.0.4" + }, + "engines": { + "node": ">=18" + }, + "packageManager": "yarn@3.6.4", + "eslintConfig": { + "root": true, + "extends": [ + "@react-native", + "prettier" + ], + "plugins": [ + "prettier" + ], + "rules": { + "prettier/prettier": [ + "warn", + { + "quoteProps": "consistent", + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "es5", + "useTabs": false + } + ] + } + }, + "eslintIgnore": [ + "node_modules/", + "lib/" + ], + "prettier": { + "quoteProps": "consistent", + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "es5", + "useTabs": false, + "semi": false } } diff --git a/example/tsconfig.json b/example/tsconfig.json index 11abf816..27f9fd2e 100644 --- a/example/tsconfig.json +++ b/example/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@tsconfig/react-native/tsconfig.json", + "extends": "@react-native/typescript-config/tsconfig.json", "compilerOptions": { "skipLibCheck": true, "paths": { @@ -7,6 +7,6 @@ }, "allowSyntheticDefaultImports": true, "emitDecoratorMetadata": true, - "experimentalDecorators": true, + "experimentalDecorators": true } } diff --git a/package.json b/package.json index 38d755de..5d0ed4ea 100644 --- a/package.json +++ b/package.json @@ -45,9 +45,13 @@ "publishConfig": { "registry": "https://registry.npmjs.org/" }, + "dependencies": {}, "devDependencies": { + "@react-native/eslint-config": "0.75.2", + "@react-native/typescript-config": "0.75.2", "nitro-codegen": "^0.6.0", "react": "18.2.0", + "react": "18.3.1", "react-native": "0.75.2", "react-native-builder-bob": "^0.18.2", "typescript": "^4.8.4" @@ -57,12 +61,43 @@ "react-native": ">=0.74.0", "react-native-nitro-modules": "*" }, + "engines": { + "node": ">=18" + }, + "packageManager": "yarn@3.6.4", + "eslintConfig": { + "root": true, + "extends": [ + "@react-native", + "prettier" + ], + "plugins": [ + "prettier" + ], + "rules": { + "prettier/prettier": [ + "warn", + { + "quoteProps": "consistent", + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "es5", + "useTabs": false + } + ] + } + }, + "eslintIgnore": [ + "node_modules/", + "lib/" + ], "prettier": { "quoteProps": "consistent", "singleQuote": true, "tabWidth": 2, "trailingComma": "es5", - "useTabs": false + "useTabs": false, + "semi": false }, "react-native-builder-bob": { "source": "src", @@ -77,7 +112,5 @@ } ] ] - }, - "dependencies": {}, - "packageManager": "yarn@1.22.19+sha1.4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447" + } } From 0af5d40c041cb568c9af3442fb85d0b7e702cc95 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Mon, 2 Sep 2024 12:00:34 +0200 Subject: [PATCH 024/156] remove yarn version dependency --- example/package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/example/package.json b/example/package.json index a80abf05..b69ede65 100644 --- a/example/package.json +++ b/example/package.json @@ -16,7 +16,7 @@ "nativewind": "^2.0.11", "react": "18.2.0", "react-native": "0.75.2", - "react-native-nitro-modules": "./../../react-native-nitro/packages/react-native-nitro-modules", + "react-native-nitro-modules": "^0.6.0", "react-native-quick-sqlite": "./..", "react-native-safe-area-context": "^4.5.0", "reflect-metadata": "^0.1.13", @@ -53,7 +53,6 @@ "engines": { "node": ">=18" }, - "packageManager": "yarn@3.6.4", "eslintConfig": { "root": true, "extends": [ From e9238f468a8939099b4c4590bf52305141879eb9 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Mon, 2 Sep 2024 12:06:27 +0200 Subject: [PATCH 025/156] update pods --- example/ios/Podfile.lock | 1917 ++++++++++++++--- .../project.pbxproj | 27 +- .../QuickSQLiteExample/PrivacyInfo.xcprivacy | 37 + 3 files changed, 1668 insertions(+), 313 deletions(-) create mode 100644 example/ios/QuickSQLiteExample/PrivacyInfo.xcprivacy diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 8d06d9ef..1486aca5 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -1,414 +1,1625 @@ PODS: - - boost (1.76.0) + - boost (1.84.0) - DoubleConversion (1.1.6) - - FBLazyVector (0.71.11) - - FBReactNativeSpec (0.71.11): - - RCT-Folly (= 2021.07.22.00) - - RCTRequired (= 0.71.11) - - RCTTypeSafety (= 0.71.11) - - React-Core (= 0.71.11) - - React-jsi (= 0.71.11) - - ReactCommon/turbomodule/core (= 0.71.11) - - fmt (6.2.1) + - FBLazyVector (0.75.2) + - fmt (9.1.0) - glog (0.3.5) - - hermes-engine (0.71.11): - - hermes-engine/Pre-built (= 0.71.11) - - hermes-engine/Pre-built (0.71.11) - - libevent (2.1.12) + - hermes-engine (0.75.2): + - hermes-engine/Pre-built (= 0.75.2) + - hermes-engine/Pre-built (0.75.2) - NitroModules (0.6.0): - - RCT-Folly (= 2021.07.22.00) + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety - React-Core - - RCT-Folly (2021.07.22.00): + - 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 - - fmt (~> 6.2.1) + - fmt (= 9.1.0) - glog - - RCT-Folly/Default (= 2021.07.22.00) - - RCT-Folly/Default (2021.07.22.00): + - RCT-Folly/Default (= 2024.01.01.00) + - RCT-Folly/Default (2024.01.01.00): - boost - DoubleConversion - - fmt (~> 6.2.1) + - fmt (= 9.1.0) - glog - - RCT-Folly/Futures (2021.07.22.00): + - RCT-Folly/Fabric (2024.01.01.00): - boost - DoubleConversion - - fmt (~> 6.2.1) - - glog - - libevent - - RCTRequired (0.71.11) - - RCTTypeSafety (0.71.11): - - FBLazyVector (= 0.71.11) - - RCTRequired (= 0.71.11) - - React-Core (= 0.71.11) - - React (0.71.11): - - React-Core (= 0.71.11) - - React-Core/DevSupport (= 0.71.11) - - React-Core/RCTWebSocket (= 0.71.11) - - React-RCTActionSheet (= 0.71.11) - - React-RCTAnimation (= 0.71.11) - - React-RCTBlob (= 0.71.11) - - React-RCTImage (= 0.71.11) - - React-RCTLinking (= 0.71.11) - - React-RCTNetwork (= 0.71.11) - - React-RCTSettings (= 0.71.11) - - React-RCTText (= 0.71.11) - - React-RCTVibration (= 0.71.11) - - React-callinvoker (0.71.11) - - React-Codegen (0.71.11): - - FBReactNativeSpec - - hermes-engine - - RCT-Folly - - RCTRequired - - RCTTypeSafety - - React-Core - - React-jsi - - React-jsiexecutor - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - React-Core (0.71.11): + - fmt (= 9.1.0) + - glog + - RCTDeprecation (0.75.2) + - RCTRequired (0.75.2) + - RCTTypeSafety (0.75.2): + - FBLazyVector (= 0.75.2) + - RCTRequired (= 0.75.2) + - React-Core (= 0.75.2) + - React (0.75.2): + - React-Core (= 0.75.2) + - React-Core/DevSupport (= 0.75.2) + - React-Core/RCTWebSocket (= 0.75.2) + - React-RCTActionSheet (= 0.75.2) + - React-RCTAnimation (= 0.75.2) + - React-RCTBlob (= 0.75.2) + - React-RCTImage (= 0.75.2) + - React-RCTLinking (= 0.75.2) + - React-RCTNetwork (= 0.75.2) + - React-RCTSettings (= 0.75.2) + - React-RCTText (= 0.75.2) + - React-RCTVibration (= 0.75.2) + - React-callinvoker (0.75.2) + - React-Core (0.75.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.71.11) - - React-cxxreact (= 0.71.11) + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default (= 0.75.2) + - React-cxxreact + - React-featureflags - React-hermes - - React-jsi (= 0.71.11) - - React-jsiexecutor (= 0.71.11) - - React-perflogger (= 0.71.11) + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) - Yoga - - React-Core/CoreModulesHeaders (0.71.11): + - React-Core/CoreModulesHeaders (0.75.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation - React-Core/Default - - React-cxxreact (= 0.71.11) + - React-cxxreact + - React-featureflags - React-hermes - - React-jsi (= 0.71.11) - - React-jsiexecutor (= 0.71.11) - - React-perflogger (= 0.71.11) + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) - Yoga - - React-Core/Default (0.71.11): + - React-Core/Default (0.75.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-cxxreact (= 0.71.11) + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-cxxreact + - React-featureflags - React-hermes - - React-jsi (= 0.71.11) - - React-jsiexecutor (= 0.71.11) - - React-perflogger (= 0.71.11) + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) - Yoga - - React-Core/DevSupport (0.71.11): + - React-Core/DevSupport (0.75.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.71.11) - - React-Core/RCTWebSocket (= 0.71.11) - - React-cxxreact (= 0.71.11) + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default (= 0.75.2) + - React-Core/RCTWebSocket (= 0.75.2) + - React-cxxreact + - React-featureflags - React-hermes - - React-jsi (= 0.71.11) - - React-jsiexecutor (= 0.71.11) - - React-jsinspector (= 0.71.11) - - React-perflogger (= 0.71.11) + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTActionSheetHeaders (0.71.11): + - React-Core/RCTActionSheetHeaders (0.75.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation - React-Core/Default - - React-cxxreact (= 0.71.11) + - React-cxxreact + - React-featureflags - React-hermes - - React-jsi (= 0.71.11) - - React-jsiexecutor (= 0.71.11) - - React-perflogger (= 0.71.11) + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTAnimationHeaders (0.71.11): + - React-Core/RCTAnimationHeaders (0.75.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation - React-Core/Default - - React-cxxreact (= 0.71.11) + - React-cxxreact + - React-featureflags - React-hermes - - React-jsi (= 0.71.11) - - React-jsiexecutor (= 0.71.11) - - React-perflogger (= 0.71.11) + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTBlobHeaders (0.71.11): + - React-Core/RCTBlobHeaders (0.75.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation - React-Core/Default - - React-cxxreact (= 0.71.11) + - React-cxxreact + - React-featureflags - React-hermes - - React-jsi (= 0.71.11) - - React-jsiexecutor (= 0.71.11) - - React-perflogger (= 0.71.11) + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTImageHeaders (0.71.11): + - React-Core/RCTImageHeaders (0.75.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation - React-Core/Default - - React-cxxreact (= 0.71.11) + - React-cxxreact + - React-featureflags - React-hermes - - React-jsi (= 0.71.11) - - React-jsiexecutor (= 0.71.11) - - React-perflogger (= 0.71.11) + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTLinkingHeaders (0.71.11): + - React-Core/RCTLinkingHeaders (0.75.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation - React-Core/Default - - React-cxxreact (= 0.71.11) + - React-cxxreact + - React-featureflags - React-hermes - - React-jsi (= 0.71.11) - - React-jsiexecutor (= 0.71.11) - - React-perflogger (= 0.71.11) + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTNetworkHeaders (0.71.11): + - React-Core/RCTNetworkHeaders (0.75.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation - React-Core/Default - - React-cxxreact (= 0.71.11) + - React-cxxreact + - React-featureflags - React-hermes - - React-jsi (= 0.71.11) - - React-jsiexecutor (= 0.71.11) - - React-perflogger (= 0.71.11) + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTSettingsHeaders (0.71.11): + - React-Core/RCTSettingsHeaders (0.75.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation - React-Core/Default - - React-cxxreact (= 0.71.11) + - React-cxxreact + - React-featureflags - React-hermes - - React-jsi (= 0.71.11) - - React-jsiexecutor (= 0.71.11) - - React-perflogger (= 0.71.11) + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTTextHeaders (0.71.11): + - React-Core/RCTTextHeaders (0.75.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation - React-Core/Default - - React-cxxreact (= 0.71.11) + - React-cxxreact + - React-featureflags - React-hermes - - React-jsi (= 0.71.11) - - React-jsiexecutor (= 0.71.11) - - React-perflogger (= 0.71.11) + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTVibrationHeaders (0.71.11): + - React-Core/RCTVibrationHeaders (0.75.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation - React-Core/Default - - React-cxxreact (= 0.71.11) + - React-cxxreact + - React-featureflags - React-hermes - - React-jsi (= 0.71.11) - - React-jsiexecutor (= 0.71.11) - - React-perflogger (= 0.71.11) + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) - Yoga - - React-Core/RCTWebSocket (0.71.11): + - React-Core/RCTWebSocket (0.75.2): - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.71.11) - - React-cxxreact (= 0.71.11) + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default (= 0.75.2) + - React-cxxreact + - React-featureflags - React-hermes - - React-jsi (= 0.71.11) - - React-jsiexecutor (= 0.71.11) - - React-perflogger (= 0.71.11) - - Yoga - - React-CoreModules (0.71.11): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.11) - - React-Codegen (= 0.71.11) - - React-Core/CoreModulesHeaders (= 0.71.11) - - React-jsi (= 0.71.11) + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.0) + - Yoga + - React-CoreModules (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - RCT-Folly (= 2024.01.01.00) + - RCTTypeSafety (= 0.75.2) + - React-Core/CoreModulesHeaders (= 0.75.2) + - React-jsi (= 0.75.2) + - React-jsinspector + - React-NativeModulesApple - React-RCTBlob - - React-RCTImage (= 0.71.11) - - ReactCommon/turbomodule/core (= 0.71.11) - - React-cxxreact (0.71.11): - - boost (= 1.76.0) + - React-RCTImage (= 0.75.2) + - ReactCodegen + - ReactCommon + - SocketRocket (= 0.7.0) + - React-cxxreact (0.75.2): + - boost + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-callinvoker (= 0.75.2) + - React-debug (= 0.75.2) + - React-jsi (= 0.75.2) + - React-jsinspector + - React-logger (= 0.75.2) + - React-perflogger (= 0.75.2) + - React-runtimeexecutor (= 0.75.2) + - React-debug (0.75.2) + - React-defaultsnativemodule (0.75.2): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-domnativemodule + - React-Fabric + - React-featureflags + - React-featureflagsnativemodule + - React-graphics + - React-idlecallbacksnativemodule + - React-ImageManager + - React-microtasksnativemodule + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - React-domnativemodule (0.75.2): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-FabricComponents + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - React-Fabric (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/animations (= 0.75.2) + - React-Fabric/attributedstring (= 0.75.2) + - React-Fabric/componentregistry (= 0.75.2) + - React-Fabric/componentregistrynative (= 0.75.2) + - React-Fabric/components (= 0.75.2) + - React-Fabric/core (= 0.75.2) + - React-Fabric/dom (= 0.75.2) + - React-Fabric/imagemanager (= 0.75.2) + - React-Fabric/leakchecker (= 0.75.2) + - React-Fabric/mounting (= 0.75.2) + - React-Fabric/observers (= 0.75.2) + - React-Fabric/scheduler (= 0.75.2) + - React-Fabric/telemetry (= 0.75.2) + - React-Fabric/templateprocessor (= 0.75.2) + - React-Fabric/uimanager (= 0.75.2) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/animations (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/attributedstring (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/componentregistry (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/componentregistrynative (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/components/legacyviewmanagerinterop (= 0.75.2) + - React-Fabric/components/root (= 0.75.2) + - React-Fabric/components/view (= 0.75.2) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/legacyviewmanagerinterop (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/root (0.75.2): - DoubleConversion + - fmt (= 9.1.0) - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.71.11) - - React-jsi (= 0.71.11) - - React-jsinspector (= 0.71.11) - - React-logger (= 0.71.11) - - React-perflogger (= 0.71.11) - - React-runtimeexecutor (= 0.71.11) - - React-hermes (0.71.11): + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/view (0.75.2): - DoubleConversion + - fmt (= 9.1.0) - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - RCT-Folly/Futures (= 2021.07.22.00) - - React-cxxreact (= 0.71.11) + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics - React-jsi - - React-jsiexecutor (= 0.71.11) - - React-jsinspector (= 0.71.11) - - React-perflogger (= 0.71.11) - - React-jsi (0.71.11): - - boost (= 1.76.0) + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - Yoga + - React-Fabric/core (0.75.2): - DoubleConversion + - fmt (= 9.1.0) - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-jsiexecutor (0.71.11): + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/dom (0.75.2): - DoubleConversion + - fmt (= 9.1.0) - glog - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-cxxreact (= 0.71.11) - - React-jsi (= 0.71.11) - - React-perflogger (= 0.71.11) - - React-jsinspector (0.71.11) - - React-logger (0.71.11): + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/imagemanager (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/leakchecker (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/mounting (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/observers (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/observers/events (= 0.75.2) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/observers/events (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/scheduler (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/observers/events + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-performancetimeline + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/telemetry (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/templateprocessor (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/uimanager (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/uimanager/consistency (= 0.75.2) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererconsistency + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/uimanager/consistency (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererconsistency + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-FabricComponents (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-FabricComponents/components (= 0.75.2) + - React-FabricComponents/textlayoutmanager (= 0.75.2) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-FabricComponents/components/inputaccessory (= 0.75.2) + - React-FabricComponents/components/iostextinput (= 0.75.2) + - React-FabricComponents/components/modal (= 0.75.2) + - React-FabricComponents/components/rncore (= 0.75.2) + - React-FabricComponents/components/safeareaview (= 0.75.2) + - React-FabricComponents/components/scrollview (= 0.75.2) + - React-FabricComponents/components/text (= 0.75.2) + - React-FabricComponents/components/textinput (= 0.75.2) + - React-FabricComponents/components/unimplementedview (= 0.75.2) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/inputaccessory (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/iostextinput (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/modal (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/rncore (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/safeareaview (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/scrollview (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/text (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/textinput (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/unimplementedview (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/textlayoutmanager (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricImage (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired (= 0.75.2) + - RCTTypeSafety (= 0.75.2) + - React-Fabric + - React-graphics + - React-ImageManager + - React-jsi + - React-jsiexecutor (= 0.75.2) + - React-logger + - React-rendererdebug + - React-utils + - ReactCommon + - Yoga + - React-featureflags (0.75.2) + - React-featureflagsnativemodule (0.75.2): + - 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-graphics (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - React-jsi + - React-jsiexecutor + - React-utils + - React-hermes (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-cxxreact (= 0.75.2) + - React-jsi + - React-jsiexecutor (= 0.75.2) + - React-jsinspector + - React-perflogger (= 0.75.2) + - React-runtimeexecutor + - React-idlecallbacksnativemodule (0.75.2): + - 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-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - React-ImageManager (0.75.2): + - glog + - RCT-Folly/Fabric + - React-Core/Default + - React-debug + - React-Fabric + - React-graphics + - React-rendererdebug + - React-utils + - React-jserrorhandler (0.75.2): + - RCT-Folly/Fabric (= 2024.01.01.00) + - React-debug + - React-jsi + - React-jsi (0.75.2): + - boost + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-jsiexecutor (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-cxxreact (= 0.75.2) + - React-jsi (= 0.75.2) + - React-jsinspector + - React-perflogger (= 0.75.2) + - React-jsinspector (0.75.2): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-featureflags + - React-jsi + - React-runtimeexecutor (= 0.75.2) + - React-jsitracing (0.75.2): + - React-jsi + - React-logger (0.75.2): + - glog + - React-Mapbuffer (0.75.2): + - glog + - React-debug + - React-microtasksnativemodule (0.75.2): + - 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-quick-sqlite (8.1.0): - - RCT-Folly (= 2021.07.22.00) + - 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.5.0): - RCT-Folly - RCTRequired - RCTTypeSafety - React-Core - ReactCommon/turbomodule/core - - React-perflogger (0.71.11) - - React-RCTActionSheet (0.71.11): - - React-Core/RCTActionSheetHeaders (= 0.71.11) - - React-RCTAnimation (0.71.11): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.11) - - React-Codegen (= 0.71.11) - - React-Core/RCTAnimationHeaders (= 0.71.11) - - React-jsi (= 0.71.11) - - ReactCommon/turbomodule/core (= 0.71.11) - - React-RCTAppDelegate (0.71.11): + - React-nativeconfig (0.75.2) + - React-NativeModulesApple (0.75.2): + - glog + - hermes-engine + - React-callinvoker + - React-Core + - React-cxxreact + - React-jsi + - React-jsinspector + - React-runtimeexecutor + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - React-perflogger (0.75.2) + - React-performancetimeline (0.75.2): + - RCT-Folly (= 2024.01.01.00) + - React-cxxreact + - React-RCTActionSheet (0.75.2): + - React-Core/RCTActionSheetHeaders (= 0.75.2) + - React-RCTAnimation (0.75.2): + - RCT-Folly (= 2024.01.01.00) + - RCTTypeSafety + - React-Core/RCTAnimationHeaders + - React-jsi + - React-NativeModulesApple + - ReactCodegen + - ReactCommon + - React-RCTAppDelegate (0.75.2): + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-CoreModules + - React-debug + - React-defaultsnativemodule + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-nativeconfig + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-RCTNetwork + - React-rendererdebug + - React-RuntimeApple + - React-RuntimeCore + - React-RuntimeHermes + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon + - React-RCTBlob (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-Core/RCTBlobHeaders + - React-Core/RCTWebSocket + - React-jsi + - React-jsinspector + - React-NativeModulesApple + - React-RCTNetwork + - ReactCodegen + - ReactCommon + - React-RCTFabric (0.75.2): + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - React-Core + - React-debug + - React-Fabric + - React-FabricComponents + - React-FabricImage + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-jsinspector + - React-nativeconfig + - React-performancetimeline + - React-RCTImage + - React-RCTText + - React-rendererconsistency + - React-rendererdebug + - React-runtimescheduler + - React-utils + - Yoga + - React-RCTImage (0.75.2): + - RCT-Folly (= 2024.01.01.00) + - RCTTypeSafety + - React-Core/RCTImageHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTNetwork + - ReactCodegen + - ReactCommon + - React-RCTLinking (0.75.2): + - React-Core/RCTLinkingHeaders (= 0.75.2) + - React-jsi (= 0.75.2) + - React-NativeModulesApple + - ReactCodegen + - ReactCommon + - ReactCommon/turbomodule/core (= 0.75.2) + - React-RCTNetwork (0.75.2): + - RCT-Folly (= 2024.01.01.00) + - RCTTypeSafety + - React-Core/RCTNetworkHeaders + - React-jsi + - React-NativeModulesApple + - ReactCodegen + - ReactCommon + - React-RCTSettings (0.75.2): + - RCT-Folly (= 2024.01.01.00) + - RCTTypeSafety + - React-Core/RCTSettingsHeaders + - React-jsi + - React-NativeModulesApple + - ReactCodegen + - ReactCommon + - React-RCTText (0.75.2): + - React-Core/RCTTextHeaders (= 0.75.2) + - Yoga + - React-RCTVibration (0.75.2): + - RCT-Folly (= 2024.01.01.00) + - React-Core/RCTVibrationHeaders + - React-jsi + - React-NativeModulesApple + - ReactCodegen + - ReactCommon + - React-rendererconsistency (0.75.2) + - React-rendererdebug (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - RCT-Folly (= 2024.01.01.00) + - React-debug + - React-rncore (0.75.2) + - React-RuntimeApple (0.75.2): + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - React-callinvoker + - React-Core/Default + - React-CoreModules + - React-cxxreact + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-Mapbuffer + - React-NativeModulesApple + - React-RCTFabric + - React-RuntimeCore + - React-runtimeexecutor + - React-RuntimeHermes + - React-runtimescheduler + - React-utils + - React-RuntimeCore (0.75.2): + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - React-cxxreact + - React-featureflags + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - React-runtimeexecutor (0.75.2): + - React-jsi (= 0.75.2) + - React-RuntimeHermes (0.75.2): + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - React-featureflags + - React-hermes + - React-jsi + - React-jsinspector + - React-jsitracing + - React-nativeconfig + - React-RuntimeCore + - React-utils + - React-runtimescheduler (0.75.2): + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-callinvoker + - React-cxxreact + - React-debug + - React-featureflags + - React-jsi + - React-rendererconsistency + - React-rendererdebug + - React-runtimeexecutor + - React-utils + - React-utils (0.75.2): + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-debug + - React-jsi (= 0.75.2) + - ReactCodegen (0.75.2): + - DoubleConversion + - glog + - hermes-engine - RCT-Folly - RCTRequired - RCTTypeSafety - React-Core + - React-debug + - React-Fabric + - React-FabricImage + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-NativeModulesApple + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - React-RCTBlob (0.71.11): - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-Codegen (= 0.71.11) - - React-Core/RCTBlobHeaders (= 0.71.11) - - React-Core/RCTWebSocket (= 0.71.11) - - React-jsi (= 0.71.11) - - React-RCTNetwork (= 0.71.11) - - ReactCommon/turbomodule/core (= 0.71.11) - - React-RCTImage (0.71.11): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.11) - - React-Codegen (= 0.71.11) - - React-Core/RCTImageHeaders (= 0.71.11) - - React-jsi (= 0.71.11) - - React-RCTNetwork (= 0.71.11) - - ReactCommon/turbomodule/core (= 0.71.11) - - React-RCTLinking (0.71.11): - - React-Codegen (= 0.71.11) - - React-Core/RCTLinkingHeaders (= 0.71.11) - - React-jsi (= 0.71.11) - - ReactCommon/turbomodule/core (= 0.71.11) - - React-RCTNetwork (0.71.11): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.11) - - React-Codegen (= 0.71.11) - - React-Core/RCTNetworkHeaders (= 0.71.11) - - React-jsi (= 0.71.11) - - ReactCommon/turbomodule/core (= 0.71.11) - - React-RCTSettings (0.71.11): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.11) - - React-Codegen (= 0.71.11) - - React-Core/RCTSettingsHeaders (= 0.71.11) - - React-jsi (= 0.71.11) - - ReactCommon/turbomodule/core (= 0.71.11) - - React-RCTText (0.71.11): - - React-Core/RCTTextHeaders (= 0.71.11) - - React-RCTVibration (0.71.11): - - RCT-Folly (= 2021.07.22.00) - - React-Codegen (= 0.71.11) - - React-Core/RCTVibrationHeaders (= 0.71.11) - - React-jsi (= 0.71.11) - - ReactCommon/turbomodule/core (= 0.71.11) - - React-runtimeexecutor (0.71.11): - - React-jsi (= 0.71.11) - - ReactCommon/turbomodule/bridging (0.71.11): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.71.11) - - React-Core (= 0.71.11) - - React-cxxreact (= 0.71.11) - - React-jsi (= 0.71.11) - - React-logger (= 0.71.11) - - React-perflogger (= 0.71.11) - - ReactCommon/turbomodule/core (0.71.11): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.71.11) - - React-Core (= 0.71.11) - - React-cxxreact (= 0.71.11) - - React-jsi (= 0.71.11) - - React-logger (= 0.71.11) - - React-perflogger (= 0.71.11) - - Yoga (1.14.0) + - ReactCommon (0.75.2): + - ReactCommon/turbomodule (= 0.75.2) + - ReactCommon/turbomodule (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-callinvoker (= 0.75.2) + - React-cxxreact (= 0.75.2) + - React-jsi (= 0.75.2) + - React-logger (= 0.75.2) + - React-perflogger (= 0.75.2) + - ReactCommon/turbomodule/bridging (= 0.75.2) + - ReactCommon/turbomodule/core (= 0.75.2) + - ReactCommon/turbomodule/bridging (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-callinvoker (= 0.75.2) + - React-cxxreact (= 0.75.2) + - React-jsi (= 0.75.2) + - React-logger (= 0.75.2) + - React-perflogger (= 0.75.2) + - ReactCommon/turbomodule/core (0.75.2): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-callinvoker (= 0.75.2) + - React-cxxreact (= 0.75.2) + - React-debug (= 0.75.2) + - React-featureflags (= 0.75.2) + - React-jsi (= 0.75.2) + - React-logger (= 0.75.2) + - React-perflogger (= 0.75.2) + - React-utils (= 0.75.2) + - SocketRocket (0.7.0) + - Yoga (0.0.0) DEPENDENCIES: - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) + - 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`) - - libevent (~> 2.1.12) - NitroModules (from `../node_modules/react-native-nitro-modules`) - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) + - RCT-Folly/Fabric (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) + - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) + - RCTRequired (from `../node_modules/react-native/Libraries/Required`) - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) - React (from `../node_modules/react-native/`) - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) - - React-Codegen (from `build/generated/ios`) - React-Core (from `../node_modules/react-native/`) - React-Core/RCTWebSocket (from `../node_modules/react-native/`) - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - React-debug (from `../node_modules/react-native/ReactCommon/react/debug`) + - React-defaultsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/defaults`) + - React-domnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/dom`) + - React-Fabric (from `../node_modules/react-native/ReactCommon`) + - React-FabricComponents (from `../node_modules/react-native/ReactCommon`) + - React-FabricImage (from `../node_modules/react-native/ReactCommon`) + - React-featureflags (from `../node_modules/react-native/ReactCommon/react/featureflags`) + - React-featureflagsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`) + - React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`) - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) + - React-idlecallbacksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`) + - React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) + - React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`) - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) - - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) + - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`) + - React-jsitracing (from `../node_modules/react-native/ReactCommon/hermes/executor/`) - 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 `../..`) - 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`) - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) + - React-performancetimeline (from `../node_modules/react-native/ReactCommon/react/performance/timeline`) - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`) - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) + - React-RCTFabric (from `../node_modules/react-native/React`) - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) - React-RCTText (from `../node_modules/react-native/Libraries/Text`) - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) + - React-rendererconsistency (from `../node_modules/react-native/ReactCommon/react/renderer/consistency`) + - React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`) + - React-rncore (from `../node_modules/react-native/ReactCommon`) + - React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) + - React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`) - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) + - React-RuntimeHermes (from `../node_modules/react-native/ReactCommon/react/runtime`) + - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) + - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) + - ReactCodegen (from `build/generated/ios`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: trunk: - - fmt - - libevent + - SocketRocket EXTERNAL SOURCES: boost: @@ -417,48 +1628,85 @@ EXTERNAL SOURCES: :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" FBLazyVector: :path: "../node_modules/react-native/Libraries/FBLazyVector" - FBReactNativeSpec: - :path: "../node_modules/react-native/React/FBReactNativeSpec" + fmt: + :podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec" glog: :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" hermes-engine: :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" + :tag: hermes-2024-08-15-RNv0.75.1-4b3bf912cc0f705b51b71ce1a5b8bd79b93a451b NitroModules: :path: "../node_modules/react-native-nitro-modules" RCT-Folly: :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" + RCTDeprecation: + :path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" RCTRequired: - :path: "../node_modules/react-native/Libraries/RCTRequired" + :path: "../node_modules/react-native/Libraries/Required" RCTTypeSafety: :path: "../node_modules/react-native/Libraries/TypeSafety" React: :path: "../node_modules/react-native/" React-callinvoker: :path: "../node_modules/react-native/ReactCommon/callinvoker" - React-Codegen: - :path: build/generated/ios React-Core: :path: "../node_modules/react-native/" React-CoreModules: :path: "../node_modules/react-native/React/CoreModules" React-cxxreact: :path: "../node_modules/react-native/ReactCommon/cxxreact" + React-debug: + :path: "../node_modules/react-native/ReactCommon/react/debug" + React-defaultsnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/defaults" + React-domnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/dom" + React-Fabric: + :path: "../node_modules/react-native/ReactCommon" + React-FabricComponents: + :path: "../node_modules/react-native/ReactCommon" + React-FabricImage: + :path: "../node_modules/react-native/ReactCommon" + React-featureflags: + :path: "../node_modules/react-native/ReactCommon/react/featureflags" + React-featureflagsnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/featureflags" + React-graphics: + :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics" React-hermes: :path: "../node_modules/react-native/ReactCommon/hermes" + React-idlecallbacksnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" + React-ImageManager: + :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" + React-jserrorhandler: + :path: "../node_modules/react-native/ReactCommon/jserrorhandler" React-jsi: :path: "../node_modules/react-native/ReactCommon/jsi" React-jsiexecutor: :path: "../node_modules/react-native/ReactCommon/jsiexecutor" React-jsinspector: - :path: "../node_modules/react-native/ReactCommon/jsinspector" + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern" + React-jsitracing: + :path: "../node_modules/react-native/ReactCommon/hermes/executor/" React-logger: :path: "../node_modules/react-native/ReactCommon/logger" + React-Mapbuffer: + :path: "../node_modules/react-native/ReactCommon" + React-microtasksnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" react-native-quick-sqlite: :path: "../.." react-native-safe-area-context: :path: "../node_modules/react-native-safe-area-context" + React-nativeconfig: + :path: "../node_modules/react-native/ReactCommon" + React-NativeModulesApple: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" React-perflogger: :path: "../node_modules/react-native/ReactCommon/reactperflogger" + React-performancetimeline: + :path: "../node_modules/react-native/ReactCommon/react/performance/timeline" React-RCTActionSheet: :path: "../node_modules/react-native/Libraries/ActionSheetIOS" React-RCTAnimation: @@ -467,6 +1715,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/Libraries/AppDelegate" React-RCTBlob: :path: "../node_modules/react-native/Libraries/Blob" + React-RCTFabric: + :path: "../node_modules/react-native/React" React-RCTImage: :path: "../node_modules/react-native/Libraries/Image" React-RCTLinking: @@ -479,54 +1729,99 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/Libraries/Text" React-RCTVibration: :path: "../node_modules/react-native/Libraries/Vibration" + React-rendererconsistency: + :path: "../node_modules/react-native/ReactCommon/react/renderer/consistency" + React-rendererdebug: + :path: "../node_modules/react-native/ReactCommon/react/renderer/debug" + React-rncore: + :path: "../node_modules/react-native/ReactCommon" + React-RuntimeApple: + :path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios" + React-RuntimeCore: + :path: "../node_modules/react-native/ReactCommon/react/runtime" React-runtimeexecutor: :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" + React-RuntimeHermes: + :path: "../node_modules/react-native/ReactCommon/react/runtime" + React-runtimescheduler: + :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" + React-utils: + :path: "../node_modules/react-native/ReactCommon/react/utils" + ReactCodegen: + :path: build/generated/ios ReactCommon: :path: "../node_modules/react-native/ReactCommon" Yoga: :path: "../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: - boost: 57d2868c099736d80fcd648bf211b4431e51a558 - DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 - FBLazyVector: c511d4cd0210f416cb5c289bd5ae6b36d909b048 - FBReactNativeSpec: a911fb22def57aef1d74215e8b6b8761d25c1c54 - fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 - glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b - hermes-engine: 34c863b446d0135b85a6536fa5fd89f48196f848 - libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 - NitroModules: a1d3ce9cf15ec812b2723eec69e842f928ca5e6f - RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1 - RCTRequired: f6187ec763637e6a57f5728dd9a3bdabc6d6b4e0 - RCTTypeSafety: a01aca2dd3b27fa422d5239252ad38e54e958750 - React: 741b4f5187e7a2137b69c88e65f940ba40600b4b - React-callinvoker: 72ba74b2d5d690c497631191ae6eeca0c043d9cf - React-Codegen: 8a7cda1633e4940de8a710f6bf5cae5dd673546e - React-Core: 72bb19702c465b6451a40501a2879532bec9acee - React-CoreModules: ffd19b082fc36b9b463fedf30955138b5426c053 - React-cxxreact: 8b3dd87e3b8ea96dd4ad5c7bac8f31f1cc3da97f - React-hermes: be95942c3f47fc032da1387360413f00dae0ea68 - React-jsi: 9978e2a64c2a4371b40e109f4ef30a33deaa9bcb - React-jsiexecutor: 18b5b33c5f2687a784a61bc8176611b73524ae77 - React-jsinspector: b6ed4cb3ffa27a041cd440300503dc512b761450 - React-logger: 186dd536128ae5924bc38ed70932c00aa740cd5b - react-native-quick-sqlite: b72efe3f5286e2aaf4cacd1207128937abcb8209 + boost: 4cb898d0bf20404aab1850c656dcea009429d6c1 + DoubleConversion: 76ab83afb40bddeeee456813d9c04f67f78771b5 + FBLazyVector: 38bb611218305c3bc61803e287b8a81c6f63b619 + fmt: 4c2741a687cc09f0634a2e2c72a838b99f1ff120 + glog: 69ef571f3de08433d766d614c73a9838a06bf7eb + hermes-engine: 3b6e0717ca847e2fc90a201e59db36caf04dee88 + NitroModules: 289195c62d66109b106e0da79967606568f95f6e + RCT-Folly: 4464f4d875961fce86008d45f4ecf6cef6de0740 + RCTDeprecation: 34cbf122b623037ea9facad2e92e53434c5c7422 + RCTRequired: 24c446d7bcd0f517d516b6265d8df04dc3eb1219 + RCTTypeSafety: ef5e91bd791abd3a99b2c75fd565791102a66352 + React: 643f06bc294806d2db2526b424fdf759e107f514 + React-callinvoker: 34d1fa0c340104f324e2521f546196beb44dfad2 + React-Core: facd883836d8d1cc1949d2053c58eab5fb22eb75 + React-CoreModules: f92a2cb11d22f6066823ca547c61e900325dfe44 + React-cxxreact: f5595a4cbfe5a4e9d401dffa2c1c78bbbbbe75e4 + React-debug: 4a91c177b5b2efcc546fb50bc2f676f3f589efab + React-defaultsnativemodule: bb94c3db425b01c760f41a253de8536b3f5497f0 + React-domnativemodule: 6c581fd39812cafb024171e091c00905b2c3a3e2 + React-Fabric: a33cc1fdc62a3085774783bb30970531589d2028 + React-FabricComponents: 98de5f94cbd35d407f4fc78855298b562d8289cb + React-FabricImage: 0ce8fd83844d9edef5825116d38f0e208b9ad786 + React-featureflags: 37a78859ad71db758e2efdcbdb7384afefa8701e + React-featureflagsnativemodule: 52b46e161a151b4653cf1762285e8e899d534e3f + React-graphics: c16f1bab97a5d473831a79360d84300e93a614e5 + React-hermes: 7801f8c0e12f326524b461dc368d3e74f3d2a385 + React-idlecallbacksnativemodule: 58de2ac968ee80947d19dc8fe20def607e5c2de8 + React-ImageManager: 98a1e5b0b05528dde47ebcd953d916ac66d46c09 + React-jserrorhandler: 08f1c3465a71a6549c27ad82809ce145ad52d4f1 + React-jsi: 161428ab2c706d5fcd9878d260ff1513fdb356ab + React-jsiexecutor: abfdc7526151c6755f836235bbaa53b267a0803c + React-jsinspector: f0786053a1a258a4d8dde859d1a820c26ee686f0 + React-jsitracing: 52b849a77d02e2dc262a3031454c23be8dabb4d9 + React-logger: 8db32983d75dc2ad54f278f344ccb9b256e694fc + React-Mapbuffer: 1c08607305558666fd16678b85ef135e455d5c96 + React-microtasksnativemodule: 87b8de96f937faefece8afd2cb3a518321b2ef99 + react-native-quick-sqlite: 5a5071f4ef16555675fedbb2b2c333f67fc0614e react-native-safe-area-context: 39c2d8be3328df5d437ac1700f4f3a4f75716acc - React-perflogger: e706562ab7eb8eb590aa83a224d26fa13963d7f2 - React-RCTActionSheet: 57d4bd98122f557479a3359ad5dad8e109e20c5a - React-RCTAnimation: ccf3ef00101ea74bda73a045d79a658b36728a60 - React-RCTAppDelegate: d0c28a35c65e9a0aef287ac0dafe1b71b1ac180c - React-RCTBlob: 1700b92ece4357af0a49719c9638185ad2902e95 - React-RCTImage: f2e4904566ccccaa4b704170fcc5ae144ca347bf - React-RCTLinking: 52a3740e3651e30aa11dff5a6debed7395dd8169 - React-RCTNetwork: ea0976f2b3ffc7877cd7784e351dc460adf87b12 - React-RCTSettings: ed5ac992b23e25c65c3cc31f11b5c940ae5e3e60 - React-RCTText: c9dfc6722621d56332b4f3a19ac38105e7504145 - React-RCTVibration: f09f08de63e4122deb32506e20ca4cae6e4e14c1 - React-runtimeexecutor: 4817d63dbc9d658f8dc0ec56bd9b83ce531129f0 - ReactCommon: 08723d2ed328c5cbcb0de168f231bc7bae7f8aa1 - Yoga: f7decafdc5e8c125e6fa0da38a687e35238420fa + React-nativeconfig: 57781b79e11d5af7573e6f77cbf1143b71802a6d + React-NativeModulesApple: 7ff2e2cfb2e5fa5bdedcecf28ce37e696c6ef1e1 + React-perflogger: 8a360ccf603de6ddbe9ff8f54383146d26e6c936 + React-performancetimeline: 3cfec915adcb3653a5a633b41e711903844c35d8 + React-RCTActionSheet: 1c0e26a88eec41215089cf4436e38188cfe9f01a + React-RCTAnimation: d87207841b1e2ae1389e684262ea8c73c887cb04 + React-RCTAppDelegate: 4ec7824c0cc9cc4b146ca8ee0fd81b10c316a440 + React-RCTBlob: 79b42cb7db55f34079297687a480dbcf37f023f6 + React-RCTFabric: 1dd1661db93716f8cb116e451bd9c211a8d15716 + React-RCTImage: 0c10a75de59f7384a2a55545d5f36fe783e6ecda + React-RCTLinking: bf08f4f655bf777af292b8d97449072c8bb196ca + React-RCTNetwork: 1b690846b40fc5685af58e088720657db6814637 + React-RCTSettings: 097e420926dd44153fb25174835b572aded224d6 + React-RCTText: d8fe2ae9f95b2ccd03b2f534286e938254791992 + React-RCTVibration: 976466dba32c0981a836e45ce38bcd4c8d6d924e + React-rendererconsistency: ee0d6f1b4420e1ad5bb01c02170e7ecbd278e307 + React-rendererdebug: 7fbf02f30d1e0bb0d96d65cf2548219cb53b29b6 + React-rncore: 7ffc5be03adbf0a5cbf1b654483f487a899cff08 + React-RuntimeApple: e623f002e1871de30a443291171d3f2fb134a6ec + React-RuntimeCore: a67357d4f073b1dbe6fbefc5273072027f201e1c + React-runtimeexecutor: 5bb52479abf8081086afb0397dc33dc97202a439 + React-RuntimeHermes: 860cf64708a12a2fa62366fe51fe000121fa031b + React-runtimescheduler: fff88d51ad2c8815fc75930dbac224d680593e6b + React-utils: 81a715d9c0a2a49047e77a86f3a2247408540deb + ReactCodegen: 60973d382704c793c605b9be0fc7f31cb279442f + ReactCommon: 6ef348087d250257c44c0204461c03f036650e9b + SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d + Yoga: a1d7895431387402a674fd0d1c04ec85e87909b8 -PODFILE CHECKSUM: 4493525a2c9f97c6e617260ed7e9db08e655e6fa +PODFILE CHECKSUM: 8fe700daf9cc3fc6804ba2712d56a463d52d62e8 COCOAPODS: 1.15.2 diff --git a/example/ios/QuickSQLiteExample.xcodeproj/project.pbxproj b/example/ios/QuickSQLiteExample.xcodeproj/project.pbxproj index a93a52cc..7bd905ce 100644 --- a/example/ios/QuickSQLiteExample.xcodeproj/project.pbxproj +++ b/example/ios/QuickSQLiteExample.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 17EA225CB5C6FBE4FF95B3B8 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = B62F4C3A8445C44CF7F54399 /* PrivacyInfo.xcprivacy */; }; 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; D7537A007033719516C57748 /* libPods-QuickSQLiteExample-QuickSQLiteExampleTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F61ADDCA341B787B4A3AFAFC /* libPods-QuickSQLiteExample-QuickSQLiteExampleTests.a */; }; F6FA2C48029804D08B79E96F /* libPods-QuickSQLiteExample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCC1E776B313FBFED7863A3D /* libPods-QuickSQLiteExample.a */; }; @@ -39,6 +40,7 @@ 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = QuickSQLiteExample/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = QuickSQLiteExample/main.m; sourceTree = ""; }; 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = QuickSQLiteExample/LaunchScreen.storyboard; sourceTree = ""; }; + B62F4C3A8445C44CF7F54399 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = QuickSQLiteExample/PrivacyInfo.xcprivacy; sourceTree = ""; }; BCC1E776B313FBFED7863A3D /* libPods-QuickSQLiteExample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-QuickSQLiteExample.a"; sourceTree = BUILT_PRODUCTS_DIR; }; CA20110A9117BB91D9E63081 /* Pods-QuickSQLiteExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QuickSQLiteExample.debug.xcconfig"; path = "Target Support Files/Pods-QuickSQLiteExample/Pods-QuickSQLiteExample.debug.xcconfig"; sourceTree = ""; }; CE317F99C7B7933DEB58C2E6 /* Pods-QuickSQLiteExample-QuickSQLiteExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QuickSQLiteExample-QuickSQLiteExampleTests.release.xcconfig"; path = "Target Support Files/Pods-QuickSQLiteExample-QuickSQLiteExampleTests/Pods-QuickSQLiteExample-QuickSQLiteExampleTests.release.xcconfig"; sourceTree = ""; }; @@ -92,6 +94,7 @@ 13B07FB61A68108700A75B9A /* Info.plist */, 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, 13B07FB71A68108700A75B9A /* main.m */, + B62F4C3A8445C44CF7F54399 /* PrivacyInfo.xcprivacy */, ); name = QuickSQLiteExample; sourceTree = ""; @@ -244,6 +247,7 @@ files = ( 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + 17EA225CB5C6FBE4FF95B3B8 /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -533,8 +537,9 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CC = ""; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -560,6 +565,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + CXX = ""; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; @@ -579,6 +585,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 13.4; + LD = ""; + LDPLUSPLUS = ""; LD_RUNPATH_SEARCH_PATHS = ( /usr/lib/swift, "$(inherited)", @@ -598,8 +606,14 @@ "-DFOLLY_CFG_NO_COROUTINES=1", "-DFOLLY_HAVE_CLOCK_GETTIME=1", ); + OTHER_LDFLAGS = ( + "$(inherited)", + " ", + ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + USE_HERMES = true; }; name = Debug; }; @@ -607,8 +621,9 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CC = ""; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -634,6 +649,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; + CXX = ""; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; @@ -646,6 +662,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 13.4; + LD = ""; + LDPLUSPLUS = ""; LD_RUNPATH_SEARCH_PATHS = ( /usr/lib/swift, "$(inherited)", @@ -664,8 +682,13 @@ "-DFOLLY_CFG_NO_COROUTINES=1", "-DFOLLY_HAVE_CLOCK_GETTIME=1", ); + OTHER_LDFLAGS = ( + "$(inherited)", + " ", + ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; + USE_HERMES = true; VALIDATE_PRODUCT = YES; }; name = Release; diff --git a/example/ios/QuickSQLiteExample/PrivacyInfo.xcprivacy b/example/ios/QuickSQLiteExample/PrivacyInfo.xcprivacy new file mode 100644 index 00000000..41b8317f --- /dev/null +++ b/example/ios/QuickSQLiteExample/PrivacyInfo.xcprivacy @@ -0,0 +1,37 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategorySystemBootTime + NSPrivacyAccessedAPITypeReasons + + 35F9.1 + + + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + From ec7861849d59e3ccc2beea44d91b8fa3e76beb56 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 4 Sep 2024 23:19:17 +0200 Subject: [PATCH 026/156] fix: TurboModule import --- ios/QuickSQLite.mm | 2 +- .../android/RNQuickSQLite+autolinking.cmake | 4 +- .../android/RNQuickSQLite+autolinking.gradle | 2 +- .../ios/RNQuickSQLite+autolinking.rb | 2 +- .../ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp | 2 +- .../ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 49 +-------- .../ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp | 11 +-- .../generated/shared/c++/BatchQueryResult.hpp | 2 +- .../generated/shared/c++/ColumnMetadata.hpp | 16 +-- nitrogen/generated/shared/c++/ColumnType.hpp | 2 +- .../generated/shared/c++/FileLoadResult.hpp | 2 +- .../shared/c++/HybridQuickSQLiteSpec.cpp | 2 +- .../shared/c++/HybridQuickSQLiteSpec.hpp | 2 +- .../c++/HybridSelectQueryResultSpec.cpp | 2 +- .../c++/HybridSelectQueryResultSpec.hpp | 2 +- nitrogen/generated/shared/c++/QueryResult.hpp | 34 +++---- .../generated/shared/c++/QueryResultRows.hpp | 81 --------------- nitrogen/generated/shared/c++/QueryType.hpp | 2 +- .../generated/shared/c++/QuickDataType.hpp | 99 ------------------- nitrogen/generated/shared/c++/QuickValue.hpp | 98 ------------------ nitrogen/generated/shared/c++/Transaction.hpp | 14 +-- 21 files changed, 48 insertions(+), 382 deletions(-) delete mode 100644 nitrogen/generated/shared/c++/QueryResultRows.hpp delete mode 100644 nitrogen/generated/shared/c++/QuickDataType.hpp delete mode 100644 nitrogen/generated/shared/c++/QuickValue.hpp diff --git a/ios/QuickSQLite.mm b/ios/QuickSQLite.mm index 592093bf..519f31a0 100644 --- a/ios/QuickSQLite.mm +++ b/ios/QuickSQLite.mm @@ -3,7 +3,7 @@ #import #import -#import +#import #import #import "../cpp/bindings.h" diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake index 1ac23586..0e76ee28 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake @@ -1,6 +1,6 @@ # # RNQuickSQLite+autolinking.cmake -# Sun Sep 01 2024 +# Wed Sep 04 2024 # This file was generated by nitrogen. DO NOT MODIFY THIS FILE. # https://github.com/mrousavy/nitro # Copyright © 2024 Marc Rousavy @ Margelo @@ -27,8 +27,6 @@ target_sources( # Shared Nitrogen C++ sources ../nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp - ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp - ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp # Android-specific Nitrogen C++ sources ) diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle b/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle index f54b1134..e40b751b 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle @@ -1,6 +1,6 @@ /// /// RNQuickSQLite+autolinking.gradle -/// Sun Sep 01 2024 +/// Wed Sep 04 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb b/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb index b7fccb2a..35e76648 100644 --- a/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb +++ b/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb @@ -1,6 +1,6 @@ # # RNQuickSQLite+autolinking.rb -# Sun Sep 01 2024 +# Wed Sep 04 2024 # This file was generated by nitrogen. DO NOT MODIFY THIS FILE. # https://github.com/mrousavy/nitro # Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp index fba36231..4edd702a 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Bridge.cpp -/// Sun Sep 01 2024 +/// Wed Sep 04 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index 0851b061..00e52daf 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Bridge.hpp -/// Sun Sep 01 2024 +/// Wed Sep 04 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo @@ -19,12 +19,8 @@ namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } // Forward declaration of `HybridSelectQueryResultSpec` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } -// Forward declaration of `QueryResultRows` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct QueryResultRows; } // Forward declaration of `QueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct QueryResult; } -// Forward declaration of `QuickValue` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct QuickValue; } // Forward declaration of `Transaction` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct Transaction; } @@ -34,8 +30,6 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction; } #include "FileLoadResult.hpp" #include "HybridSelectQueryResultSpec.hpp" #include "QueryResult.hpp" -#include "QueryResultRows.hpp" -#include "QuickValue.hpp" #include "Transaction.hpp" #include #include @@ -326,46 +320,5 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { inline PromiseHolder create_PromiseHolder_FileLoadResult_() { return PromiseHolder(); } - - /** - * Specialized version of `std::vector`. - */ - using std__vector_QuickValue_ = std::vector; - inline std::vector create_std__vector_QuickValue_(size_t size) { - std::vector vector; - vector.reserve(size); - return vector; - } - - /** - * Specialized version of `std::function(double / * idx * /)>`. - */ - using Func_std__future_QuickValue__double = std::function(double /* idx */)>; - inline Func_std__future_QuickValue__double create_Func_std__future_QuickValue__double(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, double), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](double idx) -> std::future { - auto result = call(sharedClosureHolder.get(), idx); - return result.getFuture(); - }; - } - inline std::shared_ptr share_Func_std__future_QuickValue__double(const Func_std__future_QuickValue__double& value) { - return std::make_shared(value); - } - - /** - * Specialized version of `PromiseHolder`. - */ - using PromiseHolder_QuickValue_ = PromiseHolder; - inline PromiseHolder create_PromiseHolder_QuickValue_() { - return PromiseHolder(); - } - - /** - * Specialized version of `std::optional`. - */ - using std__optional_QueryResultRows_ = std::optional; - inline std::optional create_std__optional_QueryResultRows_(const QueryResultRows& value) { - return std::optional(value); - } } // namespace margelo::nitro::rnquicksqlite::bridge::swift diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp index 27f13d1c..a16ed5aa 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Umbrella.hpp -/// Sun Sep 01 2024 +/// Wed Sep 04 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo @@ -21,16 +21,10 @@ namespace margelo::nitro::rnquicksqlite { enum class ColumnType; } namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } // Forward declaration of `HybridSelectQueryResultSpec` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } -// Forward declaration of `QueryResultRows` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct QueryResultRows; } // Forward declaration of `QueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct QueryResult; } // Forward declaration of `QueryType` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { enum class QueryType; } -// Forward declaration of `QuickDataType` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { enum class QuickDataType; } -// Forward declaration of `QuickValue` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct QuickValue; } // Forward declaration of `Transaction` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct Transaction; } @@ -41,10 +35,7 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction; } #include "FileLoadResult.hpp" #include "HybridSelectQueryResultSpec.hpp" #include "QueryResult.hpp" -#include "QueryResultRows.hpp" #include "QueryType.hpp" -#include "QuickDataType.hpp" -#include "QuickValue.hpp" #include "Transaction.hpp" #include #include diff --git a/nitrogen/generated/shared/c++/BatchQueryResult.hpp b/nitrogen/generated/shared/c++/BatchQueryResult.hpp index 0926b12f..0a83039c 100644 --- a/nitrogen/generated/shared/c++/BatchQueryResult.hpp +++ b/nitrogen/generated/shared/c++/BatchQueryResult.hpp @@ -1,6 +1,6 @@ /// /// BatchQueryResult.hpp -/// Sun Sep 01 2024 +/// Wed Sep 04 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/ColumnMetadata.hpp b/nitrogen/generated/shared/c++/ColumnMetadata.hpp index 1e39ec34..cf9c7083 100644 --- a/nitrogen/generated/shared/c++/ColumnMetadata.hpp +++ b/nitrogen/generated/shared/c++/ColumnMetadata.hpp @@ -1,6 +1,6 @@ /// /// ColumnMetadata.hpp -/// Sun Sep 01 2024 +/// Wed Sep 04 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo @@ -19,9 +19,11 @@ #error NitroModules cannot be found! Are you sure you installed NitroModules properly? #endif - +// Forward declaration of `ColumnType` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { enum class ColumnType; } #include +#include "ColumnType.hpp" namespace margelo::nitro::rnquicksqlite { @@ -31,11 +33,11 @@ namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata { public: std::string columnName SWIFT_PRIVATE; - std::string columnDeclaredType SWIFT_PRIVATE; + ColumnType columnDeclaredType SWIFT_PRIVATE; double columnIndex SWIFT_PRIVATE; public: - explicit ColumnMetadata(std::string columnName, std::string columnDeclaredType, double columnIndex): columnName(columnName), columnDeclaredType(columnDeclaredType), columnIndex(columnIndex) {} + explicit ColumnMetadata(std::string columnName, ColumnType columnDeclaredType, double columnIndex): columnName(columnName), columnDeclaredType(columnDeclaredType), columnIndex(columnIndex) {} }; } // namespace margelo::nitro::rnquicksqlite @@ -51,14 +53,14 @@ namespace margelo::nitro { jsi::Object obj = arg.asObject(runtime); return ColumnMetadata( JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "columnName")), - JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "columnDeclaredType")), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "columnDeclaredType")), JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "columnIndex")) ); } static inline jsi::Value toJSI(jsi::Runtime& runtime, const ColumnMetadata& arg) { jsi::Object obj(runtime); obj.setProperty(runtime, "columnName", JSIConverter::toJSI(runtime, arg.columnName)); - obj.setProperty(runtime, "columnDeclaredType", JSIConverter::toJSI(runtime, arg.columnDeclaredType)); + obj.setProperty(runtime, "columnDeclaredType", JSIConverter::toJSI(runtime, arg.columnDeclaredType)); obj.setProperty(runtime, "columnIndex", JSIConverter::toJSI(runtime, arg.columnIndex)); return obj; } @@ -68,7 +70,7 @@ namespace margelo::nitro { } jsi::Object obj = value.getObject(runtime); if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "columnName"))) return false; - if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "columnDeclaredType"))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "columnDeclaredType"))) return false; if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "columnIndex"))) return false; return true; } diff --git a/nitrogen/generated/shared/c++/ColumnType.hpp b/nitrogen/generated/shared/c++/ColumnType.hpp index 0951808f..35269daf 100644 --- a/nitrogen/generated/shared/c++/ColumnType.hpp +++ b/nitrogen/generated/shared/c++/ColumnType.hpp @@ -1,6 +1,6 @@ /// /// ColumnType.hpp -/// Sun Sep 01 2024 +/// Wed Sep 04 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/FileLoadResult.hpp b/nitrogen/generated/shared/c++/FileLoadResult.hpp index ad669efb..2100b3f2 100644 --- a/nitrogen/generated/shared/c++/FileLoadResult.hpp +++ b/nitrogen/generated/shared/c++/FileLoadResult.hpp @@ -1,6 +1,6 @@ /// /// FileLoadResult.hpp -/// Sun Sep 01 2024 +/// Wed Sep 04 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp index c5da9dd0..e09b3b5e 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp @@ -1,6 +1,6 @@ /// /// HybridQuickSQLiteSpec.cpp -/// Sun Sep 01 2024 +/// Wed Sep 04 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp index dc1b72de..7f988cea 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp @@ -1,6 +1,6 @@ /// /// HybridQuickSQLiteSpec.hpp -/// Sun Sep 01 2024 +/// Wed Sep 04 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp index 139beeb5..8bace2e2 100644 --- a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp @@ -1,6 +1,6 @@ /// /// HybridSelectQueryResultSpec.cpp -/// Sun Sep 01 2024 +/// Wed Sep 04 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp index 228193e6..4bd99369 100644 --- a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp @@ -1,6 +1,6 @@ /// /// HybridSelectQueryResultSpec.hpp -/// Sun Sep 01 2024 +/// Wed Sep 04 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/QueryResult.hpp b/nitrogen/generated/shared/c++/QueryResult.hpp index 2a007256..30096674 100644 --- a/nitrogen/generated/shared/c++/QueryResult.hpp +++ b/nitrogen/generated/shared/c++/QueryResult.hpp @@ -1,6 +1,6 @@ /// /// QueryResult.hpp -/// Sun Sep 01 2024 +/// Wed Sep 04 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo @@ -19,15 +19,15 @@ #error NitroModules cannot be found! Are you sure you installed NitroModules properly? #endif -// Forward declaration of `QueryResultRows` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct QueryResultRows; } -// Forward declaration of `ColumnMetadata` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } +// Forward declaration of `QueryType` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { enum class QueryType; } +// Forward declaration of `HybridSelectQueryResultSpec` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } +#include "QueryType.hpp" #include -#include "QueryResultRows.hpp" -#include -#include "ColumnMetadata.hpp" +#include +#include "HybridSelectQueryResultSpec.hpp" namespace margelo::nitro::rnquicksqlite { @@ -36,13 +36,13 @@ namespace margelo::nitro::rnquicksqlite { */ struct QueryResult { public: + QueryType queryType SWIFT_PRIVATE; std::optional insertId SWIFT_PRIVATE; double rowsAffected SWIFT_PRIVATE; - std::optional rows SWIFT_PRIVATE; - std::optional> metadata SWIFT_PRIVATE; + std::optional> selectQueryResult SWIFT_PRIVATE; public: - explicit QueryResult(std::optional insertId, double rowsAffected, std::optional rows, std::optional> metadata): insertId(insertId), rowsAffected(rowsAffected), rows(rows), metadata(metadata) {} + explicit QueryResult(QueryType queryType, std::optional insertId, double rowsAffected, std::optional> selectQueryResult): queryType(queryType), insertId(insertId), rowsAffected(rowsAffected), selectQueryResult(selectQueryResult) {} }; } // namespace margelo::nitro::rnquicksqlite @@ -57,18 +57,18 @@ namespace margelo::nitro { static inline QueryResult fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { jsi::Object obj = arg.asObject(runtime); return QueryResult( + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "queryType")), JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "insertId")), JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "rowsAffected")), - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "rows")), - JSIConverter>>::fromJSI(runtime, obj.getProperty(runtime, "metadata")) + JSIConverter>>::fromJSI(runtime, obj.getProperty(runtime, "selectQueryResult")) ); } static inline jsi::Value toJSI(jsi::Runtime& runtime, const QueryResult& arg) { jsi::Object obj(runtime); + obj.setProperty(runtime, "queryType", JSIConverter::toJSI(runtime, arg.queryType)); obj.setProperty(runtime, "insertId", JSIConverter>::toJSI(runtime, arg.insertId)); obj.setProperty(runtime, "rowsAffected", JSIConverter::toJSI(runtime, arg.rowsAffected)); - obj.setProperty(runtime, "rows", JSIConverter>::toJSI(runtime, arg.rows)); - obj.setProperty(runtime, "metadata", JSIConverter>>::toJSI(runtime, arg.metadata)); + obj.setProperty(runtime, "selectQueryResult", JSIConverter>>::toJSI(runtime, arg.selectQueryResult)); return obj; } static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { @@ -76,10 +76,10 @@ namespace margelo::nitro { return false; } jsi::Object obj = value.getObject(runtime); + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "queryType"))) return false; if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "insertId"))) return false; if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "rowsAffected"))) return false; - if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "rows"))) return false; - if (!JSIConverter>>::canConvert(runtime, obj.getProperty(runtime, "metadata"))) return false; + if (!JSIConverter>>::canConvert(runtime, obj.getProperty(runtime, "selectQueryResult"))) return false; return true; } }; diff --git a/nitrogen/generated/shared/c++/QueryResultRows.hpp b/nitrogen/generated/shared/c++/QueryResultRows.hpp deleted file mode 100644 index e69f172b..00000000 --- a/nitrogen/generated/shared/c++/QueryResultRows.hpp +++ /dev/null @@ -1,81 +0,0 @@ -/// -/// QueryResultRows.hpp -/// Sun Sep 01 2024 -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - -// Forward declaration of `QuickValue` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct QuickValue; } - -#include -#include "QuickValue.hpp" -#include -#include - -namespace margelo::nitro::rnquicksqlite { - - /** - * A struct which can be represented as a JavaScript object (QueryResultRows). - */ - struct QueryResultRows { - public: - std::vector _array SWIFT_PRIVATE; - double length SWIFT_PRIVATE; - std::function(double /* idx */)> item SWIFT_PRIVATE; - - public: - explicit QueryResultRows(std::vector _array, double length, std::function(double /* idx */)> item): _array(_array), length(length), item(item) {} - }; - -} // namespace margelo::nitro::rnquicksqlite - -namespace margelo::nitro { - - using namespace margelo::nitro::rnquicksqlite; - - // C++ QueryResultRows <> JS QueryResultRows (object) - template <> - struct JSIConverter { - static inline QueryResultRows fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { - jsi::Object obj = arg.asObject(runtime); - return QueryResultRows( - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "_array")), - JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "length")), - JSIConverter(double /* idx */)>>::fromJSI(runtime, obj.getProperty(runtime, "item")) - ); - } - static inline jsi::Value toJSI(jsi::Runtime& runtime, const QueryResultRows& arg) { - jsi::Object obj(runtime); - obj.setProperty(runtime, "_array", JSIConverter>::toJSI(runtime, arg._array)); - obj.setProperty(runtime, "length", JSIConverter::toJSI(runtime, arg.length)); - obj.setProperty(runtime, "item", JSIConverter(double /* idx */)>>::toJSI(runtime, arg.item)); - return obj; - } - static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { - if (!value.isObject()) { - return false; - } - jsi::Object obj = value.getObject(runtime); - if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "_array"))) return false; - if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "length"))) return false; - if (!JSIConverter(double /* idx */)>>::canConvert(runtime, obj.getProperty(runtime, "item"))) return false; - return true; - } - }; - -} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/QueryType.hpp b/nitrogen/generated/shared/c++/QueryType.hpp index e0afef4c..32f26a97 100644 --- a/nitrogen/generated/shared/c++/QueryType.hpp +++ b/nitrogen/generated/shared/c++/QueryType.hpp @@ -1,6 +1,6 @@ /// /// QueryType.hpp -/// Sun Sep 01 2024 +/// Wed Sep 04 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/QuickDataType.hpp b/nitrogen/generated/shared/c++/QuickDataType.hpp deleted file mode 100644 index 099979c9..00000000 --- a/nitrogen/generated/shared/c++/QuickDataType.hpp +++ /dev/null @@ -1,99 +0,0 @@ -/// -/// QuickDataType.hpp -/// Sun Sep 01 2024 -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - -namespace margelo::nitro::rnquicksqlite { - - /** - * An enum which can be represented as a JavaScript union (QuickDataType). - */ - enum class QuickDataType { - NULL_VALUE SWIFT_NAME(nullValue) = 0, - TEXT SWIFT_NAME(text) = 1, - INTEGER SWIFT_NAME(integer) = 2, - INT64 SWIFT_NAME(int64) = 3, - DOUBLE SWIFT_NAME(double) = 4, - BOOLEAN SWIFT_NAME(boolean) = 5, - ARRAY_BUFFER SWIFT_NAME(arrayBuffer) = 6, - } CLOSED_ENUM; - -} // namespace margelo::nitro::rnquicksqlite - -namespace margelo::nitro { - - using namespace margelo::nitro::rnquicksqlite; - - // C++ QuickDataType <> JS QuickDataType (union) - template <> - struct JSIConverter { - static inline QuickDataType fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { - std::string unionValue = JSIConverter::fromJSI(runtime, arg); - switch (hashString(unionValue.c_str(), unionValue.size())) { - case hashString("NULL_VALUE"): return QuickDataType::NULL_VALUE; - case hashString("TEXT"): return QuickDataType::TEXT; - case hashString("INTEGER"): return QuickDataType::INTEGER; - case hashString("INT64"): return QuickDataType::INT64; - case hashString("DOUBLE"): return QuickDataType::DOUBLE; - case hashString("BOOLEAN"): return QuickDataType::BOOLEAN; - case hashString("ARRAY_BUFFER"): return QuickDataType::ARRAY_BUFFER; - default: [[unlikely]] - throw std::runtime_error("Cannot convert \"" + unionValue + "\" to enum QuickDataType - invalid value!"); - } - } - static inline jsi::Value toJSI(jsi::Runtime& runtime, QuickDataType arg) { - switch (arg) { - case QuickDataType::NULL_VALUE: return JSIConverter::toJSI(runtime, "NULL_VALUE"); - case QuickDataType::TEXT: return JSIConverter::toJSI(runtime, "TEXT"); - case QuickDataType::INTEGER: return JSIConverter::toJSI(runtime, "INTEGER"); - case QuickDataType::INT64: return JSIConverter::toJSI(runtime, "INT64"); - case QuickDataType::DOUBLE: return JSIConverter::toJSI(runtime, "DOUBLE"); - case QuickDataType::BOOLEAN: return JSIConverter::toJSI(runtime, "BOOLEAN"); - case QuickDataType::ARRAY_BUFFER: return JSIConverter::toJSI(runtime, "ARRAY_BUFFER"); - default: [[unlikely]] - throw std::runtime_error("Cannot convert QuickDataType to JS - invalid value: " - + std::to_string(static_cast(arg)) + "!"); - } - } - static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { - if (!value.isString()) { - return false; - } - std::string unionValue = JSIConverter::fromJSI(runtime, value); - switch (hashString(unionValue.c_str(), unionValue.size())) { - case hashString("NULL_VALUE"): - case hashString("TEXT"): - case hashString("INTEGER"): - case hashString("INT64"): - case hashString("DOUBLE"): - case hashString("BOOLEAN"): - case hashString("ARRAY_BUFFER"): - return true; - default: - return false; - } - } - }; - -} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/QuickValue.hpp b/nitrogen/generated/shared/c++/QuickValue.hpp deleted file mode 100644 index d5afb741..00000000 --- a/nitrogen/generated/shared/c++/QuickValue.hpp +++ /dev/null @@ -1,98 +0,0 @@ -/// -/// QuickValue.hpp -/// Sun Sep 01 2024 -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - -// Forward declaration of `QuickDataType` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { enum class QuickDataType; } -// Forward declaration of `ArrayBuffer` to properly resolve imports. -namespace NitroModules { class ArrayBuffer; } - -#include "QuickDataType.hpp" -#include -#include - -namespace margelo::nitro::rnquicksqlite { - - /** - * A struct which can be represented as a JavaScript object (QuickValue). - */ - struct QuickValue { - public: - QuickDataType dataType SWIFT_PRIVATE; - bool booleanValue SWIFT_PRIVATE; - double doubleOrIntValue SWIFT_PRIVATE; - double int64Value SWIFT_PRIVATE; - std::string textValue SWIFT_PRIVATE; - std::shared_ptr arrayBufferValue SWIFT_PRIVATE; - double arrayBufferSize SWIFT_PRIVATE; - - public: - explicit QuickValue(QuickDataType dataType, bool booleanValue, double doubleOrIntValue, double int64Value, std::string textValue, std::shared_ptr arrayBufferValue, double arrayBufferSize): dataType(dataType), booleanValue(booleanValue), doubleOrIntValue(doubleOrIntValue), int64Value(int64Value), textValue(textValue), arrayBufferValue(arrayBufferValue), arrayBufferSize(arrayBufferSize) {} - }; - -} // namespace margelo::nitro::rnquicksqlite - -namespace margelo::nitro { - - using namespace margelo::nitro::rnquicksqlite; - - // C++ QuickValue <> JS QuickValue (object) - template <> - struct JSIConverter { - static inline QuickValue fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { - jsi::Object obj = arg.asObject(runtime); - return QuickValue( - JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "dataType")), - JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "booleanValue")), - JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "doubleOrIntValue")), - JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "int64Value")), - JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "textValue")), - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "arrayBufferValue")), - JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "arrayBufferSize")) - ); - } - static inline jsi::Value toJSI(jsi::Runtime& runtime, const QuickValue& arg) { - jsi::Object obj(runtime); - obj.setProperty(runtime, "dataType", JSIConverter::toJSI(runtime, arg.dataType)); - obj.setProperty(runtime, "booleanValue", JSIConverter::toJSI(runtime, arg.booleanValue)); - obj.setProperty(runtime, "doubleOrIntValue", JSIConverter::toJSI(runtime, arg.doubleOrIntValue)); - obj.setProperty(runtime, "int64Value", JSIConverter::toJSI(runtime, arg.int64Value)); - obj.setProperty(runtime, "textValue", JSIConverter::toJSI(runtime, arg.textValue)); - obj.setProperty(runtime, "arrayBufferValue", JSIConverter>::toJSI(runtime, arg.arrayBufferValue)); - obj.setProperty(runtime, "arrayBufferSize", JSIConverter::toJSI(runtime, arg.arrayBufferSize)); - return obj; - } - static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { - if (!value.isObject()) { - return false; - } - jsi::Object obj = value.getObject(runtime); - if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "dataType"))) return false; - if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "booleanValue"))) return false; - if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "doubleOrIntValue"))) return false; - if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "int64Value"))) return false; - if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "textValue"))) return false; - if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "arrayBufferValue"))) return false; - if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "arrayBufferSize"))) return false; - return true; - } - }; - -} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/Transaction.hpp b/nitrogen/generated/shared/c++/Transaction.hpp index 0e82de7e..8cb27783 100644 --- a/nitrogen/generated/shared/c++/Transaction.hpp +++ b/nitrogen/generated/shared/c++/Transaction.hpp @@ -1,6 +1,6 @@ /// /// Transaction.hpp -/// Sun Sep 01 2024 +/// Wed Sep 04 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo @@ -39,12 +39,12 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction { public: std::function()> commit SWIFT_PRIVATE; + std::function()> rollback SWIFT_PRIVATE; std::function(const std::string& /* query */, const std::variant>& /* params */)> execute SWIFT_PRIVATE; std::function>(const std::string& /* query */, const std::variant>& /* params */)> executeAsync SWIFT_PRIVATE; - std::function()> rollback SWIFT_PRIVATE; public: - explicit Transaction(std::function()> commit, std::function(const std::string& /* query */, const std::variant>& /* params */)> execute, std::function>(const std::string& /* query */, const std::variant>& /* params */)> executeAsync, std::function()> rollback): commit(commit), execute(execute), executeAsync(executeAsync), rollback(rollback) {} + explicit Transaction(std::function()> commit, std::function()> rollback, std::function(const std::string& /* query */, const std::variant>& /* params */)> execute, std::function>(const std::string& /* query */, const std::variant>& /* params */)> executeAsync): commit(commit), rollback(rollback), execute(execute), executeAsync(executeAsync) {} }; } // namespace margelo::nitro::rnquicksqlite @@ -60,17 +60,17 @@ namespace margelo::nitro { jsi::Object obj = arg.asObject(runtime); return Transaction( JSIConverter()>>::fromJSI(runtime, obj.getProperty(runtime, "commit")), + JSIConverter()>>::fromJSI(runtime, obj.getProperty(runtime, "rollback")), JSIConverter(const std::string& /* query */, const std::variant>& /* params */)>>::fromJSI(runtime, obj.getProperty(runtime, "execute")), - JSIConverter>(const std::string& /* query */, const std::variant>& /* params */)>>::fromJSI(runtime, obj.getProperty(runtime, "executeAsync")), - JSIConverter()>>::fromJSI(runtime, obj.getProperty(runtime, "rollback")) + JSIConverter>(const std::string& /* query */, const std::variant>& /* params */)>>::fromJSI(runtime, obj.getProperty(runtime, "executeAsync")) ); } static inline jsi::Value toJSI(jsi::Runtime& runtime, const Transaction& arg) { jsi::Object obj(runtime); obj.setProperty(runtime, "commit", JSIConverter()>>::toJSI(runtime, arg.commit)); + obj.setProperty(runtime, "rollback", JSIConverter()>>::toJSI(runtime, arg.rollback)); obj.setProperty(runtime, "execute", JSIConverter(const std::string& /* query */, const std::variant>& /* params */)>>::toJSI(runtime, arg.execute)); obj.setProperty(runtime, "executeAsync", JSIConverter>(const std::string& /* query */, const std::variant>& /* params */)>>::toJSI(runtime, arg.executeAsync)); - obj.setProperty(runtime, "rollback", JSIConverter()>>::toJSI(runtime, arg.rollback)); return obj; } static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { @@ -79,9 +79,9 @@ namespace margelo::nitro { } jsi::Object obj = value.getObject(runtime); if (!JSIConverter()>>::canConvert(runtime, obj.getProperty(runtime, "commit"))) return false; + if (!JSIConverter()>>::canConvert(runtime, obj.getProperty(runtime, "rollback"))) return false; if (!JSIConverter(const std::string& /* query */, const std::variant>& /* params */)>>::canConvert(runtime, obj.getProperty(runtime, "execute"))) return false; if (!JSIConverter>(const std::string& /* query */, const std::variant>& /* params */)>>::canConvert(runtime, obj.getProperty(runtime, "executeAsync"))) return false; - if (!JSIConverter()>>::canConvert(runtime, obj.getProperty(runtime, "rollback"))) return false; return true; } }; From 93588da7210acbd523a8ba1008dc3f4625530ae4 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 4 Sep 2024 23:19:48 +0200 Subject: [PATCH 027/156] add more scripts --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index 5d0ed4ea..d6a6b925 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,10 @@ "typescript": "tsc --noEmit", "prepare": "bob build", "example": "yarn --cwd example", + "lint": "eslint \"**/*.{js,ts,tsx}\" --fix", + "lint-ci": "eslint \"**/*.{js,ts,tsx}\" -f @jamesacarr/github-actions", "pods": "cd example/ios && bundle exec pod install", + "specs": "bun run --filter=\"**\" typescript && bun nitro-codegen --logLevel=\"debug\"", "bootstrap": "yarn example && yarn && yarn pods", "bump": "./bump-version.sh" }, From 315dab12d9c367ae98f08094ec6308f400d5a9f8 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 4 Sep 2024 23:20:39 +0200 Subject: [PATCH 028/156] load nitrogen in podspec --- package.json | 1 - react-native-quick-sqlite.podspec | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index d6a6b925..c594e978 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,6 @@ "engines": { "node": ">=18" }, - "packageManager": "yarn@3.6.4", "eslintConfig": { "root": true, "extends": [ diff --git a/react-native-quick-sqlite.podspec b/react-native-quick-sqlite.podspec index 927ef26a..2ba06dec 100644 --- a/react-native-quick-sqlite.podspec +++ b/react-native-quick-sqlite.podspec @@ -24,6 +24,9 @@ Pod::Spec.new do |s| s.header_mappings_dir = "cpp" s.source_files = "ios/**/*.{h,hpp,m,mm}", "cpp/**/*.{h,cpp,c}" + load 'nitrogen/generated/ios/RNQuickSQLite+autolinking.rb' + add_nitrogen_files(s) + if defined?(install_modules_dependencies()) install_modules_dependencies(s) else From fe8200a39bd21802ecb6d40713e6cc77d8420686 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 4 Sep 2024 23:20:52 +0200 Subject: [PATCH 029/156] add Onload --- cpp/OnLoad.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 cpp/OnLoad.cpp diff --git a/cpp/OnLoad.cpp b/cpp/OnLoad.cpp new file mode 100644 index 00000000..caeb19ef --- /dev/null +++ b/cpp/OnLoad.cpp @@ -0,0 +1,20 @@ +#include + +// Call this at app startup to register the HybridObjects +void load() { + HybridObjectRegistry::registerHybridObjectConstructor("QuickSQLite", []() -> std::shared_ptr { + return std::make_shared(); + }); + HybridObjectRegistry::registerHybridObjectConstructor("QueryResult", []() -> std::shared_ptr { + return std::make_shared(); + }); +} + +class OnLoad { +public: + OnLoad() { + load(); + } +}; + +static OnLoad onLoad; From ac0316355c909c6190f0b1c989ad482813b2934c Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 4 Sep 2024 23:22:22 +0200 Subject: [PATCH 030/156] move specs --- cpp/{ => specs}/QuickSQLite.cpp | 0 cpp/{ => specs}/QuickSQLite.hpp | 8 ++++++-- 2 files changed, 6 insertions(+), 2 deletions(-) rename cpp/{ => specs}/QuickSQLite.cpp (100%) rename cpp/{ => specs}/QuickSQLite.hpp (77%) diff --git a/cpp/QuickSQLite.cpp b/cpp/specs/QuickSQLite.cpp similarity index 100% rename from cpp/QuickSQLite.cpp rename to cpp/specs/QuickSQLite.cpp diff --git a/cpp/QuickSQLite.hpp b/cpp/specs/QuickSQLite.hpp similarity index 77% rename from cpp/QuickSQLite.hpp rename to cpp/specs/QuickSQLite.hpp index 5e1f7594..7cb46836 100644 --- a/cpp/QuickSQLite.hpp +++ b/cpp/specs/QuickSQLite.hpp @@ -9,9 +9,11 @@ #include "macros.h" #include #include -#include +#include "HybridQuickSQLiteSpec.hpp" -class QuickSQLite: public margelo::nitro::HybridObject { +namespace margelo::nitro::rnquicksqlite { + +class QuickSQLite: public HybridQuickSQLiteSpec { private: string docPathStr; @@ -26,3 +28,5 @@ class QuickSQLite: public margelo::nitro::HybridObject { private: static constexpr auto TAG = "QuickSQLite"; }; + +} From 888820a6a992adfa55f960ce76cbde806a8f8fe8 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 4 Sep 2024 23:22:31 +0200 Subject: [PATCH 031/156] remove rn @types --- example/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/example/package.json b/example/package.json index b69ede65..ccab0e52 100644 --- a/example/package.json +++ b/example/package.json @@ -40,7 +40,6 @@ "@types/chance": "^1.1.3", "@types/mocha": "^10.0.1", "@types/react": "^18.3.1", - "@types/react-native": "^0.75.2", "@types/react-test-renderer": "^18.0.0", "babel-plugin-module-resolver": "^4.1.0", "babel-plugin-transform-typescript-metadata": "^0.3.2", From 1b229ac583821db8c57df7d3272e7f690d8a0740 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 4 Sep 2024 23:39:29 +0200 Subject: [PATCH 032/156] fix lint --- src/index.ts | 298 ++++++++++++++++++++++++++------------------------- src/types.ts | 56 +++++----- 2 files changed, 178 insertions(+), 176 deletions(-) diff --git a/src/index.ts b/src/index.ts index 184d4de7..c2307e3c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ -import { NitroModules } from 'react-native-nitro-modules'; -import { QuickSQLite as QuickSQLiteSpec } from 'src/specs/QuickSQLite.nitro'; +import { NitroModules } from 'react-native-nitro-modules' +import { QuickSQLite as QuickSQLiteSpec } from 'src/specs/QuickSQLite.nitro' import { ExecuteParams, PendingTransaction, @@ -7,182 +7,184 @@ import { QuickSQLiteConnection, SQLBatchTuple, Transaction, -} from 'src/types'; +} from 'src/types' + +export * from './types' const QuickSQLite = - NitroModules.createHybridObject('RNQuickSQLite'); + NitroModules.createHybridObject('RNQuickSQLite') const locks: Record< string, { queue: PendingTransaction[]; inProgress: boolean } -> = {}; +> = {} // Enhance some host functions // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work -// const enhanceQueryResult = (result: QueryResult): void => { -// // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work -// if (result.rows == null) { -// result.rows = { -// _array: [], -// length: 0, -// item: (idx: number) => result.rows._array[idx], -// }; -// } else { -// result.rows.item = (idx: number) => result.rows._array[idx]; -// } -// }; - -const _open = QuickSQLite.open; +const enhanceQueryResult = (result: QueryResult): void => { + // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work + // if (result.rows == null) { + // result.rows = { + // _array: [], + // length: 0, + // item: (idx: number) => result.rows._array[idx], + // }; + // } else { + // result.rows.item = (idx: number) => result.rows._array[idx]; + // } +} + +const _open = QuickSQLite.open QuickSQLite.open = (dbName: string, location?: string) => { - _open(dbName, location); + _open(dbName, location) locks[dbName] = { queue: [], inProgress: false, - }; -}; + } +} -const _close = QuickSQLite.close; +const _close = QuickSQLite.close QuickSQLite.close = (dbName: string) => { - _close(dbName); - delete locks[dbName]; -}; + _close(dbName) + delete locks[dbName] +} -const _execute = QuickSQLite.execute; +const _execute = QuickSQLite.execute QuickSQLite.execute = ( dbName: string, query: string, params?: ExecuteParams ): QueryResult => { - const result = _execute(dbName, query, params); + const result = _execute(dbName, query, params) // enhanceQueryResult(result); - return result; -}; + return result +} -const _executeAsync = QuickSQLite.executeAsync; +const _executeAsync = QuickSQLite.executeAsync QuickSQLite.executeAsync = async ( dbName: string, query: string, params?: ExecuteParams ): Promise => { - const res = await _executeAsync(dbName, query, params); + const res = await _executeAsync(dbName, query, params) // enhanceQueryResult(res); - return res; -}; + return res +} QuickSQLite.transaction = async ( dbName: string, fn: (tx: Transaction) => Promise ): Promise => { if (!locks[dbName]) { - throw Error(`Quick SQLite Error: No lock found on db: ${dbName}`); + throw Error(`Quick SQLite Error: No lock found on db: ${dbName}`) } - let isFinalized = false; + let isFinalized = false // Local transaction context object implementation const execute = (query: string, params?: ExecuteParams): QueryResult => { if (isFinalized) { throw Error( `Quick SQLite Error: Cannot execute query on finalized transaction: ${dbName}` - ); + ) } - return QuickSQLite.execute(dbName, query, params); - }; + return QuickSQLite.execute(dbName, query, params) + } const executeAsync = (query: string, params?: ExecuteParams) => { if (isFinalized) { throw Error( `Quick SQLite Error: Cannot execute query on finalized transaction: ${dbName}` - ); + ) } - return QuickSQLite.executeAsync(dbName, query, params); - }; + return QuickSQLite.executeAsync(dbName, query, params) + } const commit = () => { if (isFinalized) { throw Error( `Quick SQLite Error: Cannot execute commit on finalized transaction: ${dbName}` - ); + ) } - const result = QuickSQLite.execute(dbName, 'COMMIT'); - isFinalized = true; - return result; - }; + const result = QuickSQLite.execute(dbName, 'COMMIT') + isFinalized = true + return result + } const rollback = () => { if (isFinalized) { throw Error( `Quick SQLite Error: Cannot execute rollback on finalized transaction: ${dbName}` - ); + ) } - const result = QuickSQLite.execute(dbName, 'ROLLBACK'); - isFinalized = true; - return result; - }; + const result = QuickSQLite.execute(dbName, 'ROLLBACK') + isFinalized = true + return result + } async function run() { try { - await QuickSQLite.executeAsync(dbName, 'BEGIN TRANSACTION'); + await QuickSQLite.executeAsync(dbName, 'BEGIN TRANSACTION') await fn({ commit, execute, executeAsync, rollback, - }); + }) if (!isFinalized) { - commit(); + commit() } } catch (executionError) { if (!isFinalized) { try { - rollback(); + rollback() } catch (rollbackError) { - throw rollbackError; + throw rollbackError } } - throw executionError; + throw executionError } finally { - locks[dbName].inProgress = false; - isFinalized = false; - startNextTransaction(dbName); + locks[dbName].inProgress = false + isFinalized = false + startNextTransaction(dbName) } } return await new Promise((resolve, reject) => { const tx: PendingTransaction = { start: () => { - run().then(resolve).catch(reject); + run().then(resolve).catch(reject) }, - }; + } - locks[dbName].queue.push(tx); - startNextTransaction(dbName); - }); -}; + locks[dbName].queue.push(tx) + startNextTransaction(dbName) + }) +} const startNextTransaction = (dbName: string) => { if (!locks[dbName]) { - throw Error(`Lock not found for db: ${dbName}`); + throw Error(`Lock not found for db: ${dbName}`) } if (locks[dbName].inProgress) { // Transaction is already in process bail out - return; + return } if (locks[dbName].queue.length) { - locks[dbName].inProgress = true; - const tx = locks[dbName].queue.shift(); + locks[dbName].inProgress = true + const tx = locks[dbName].queue.shift() setImmediate(() => { - tx.start(); - }); + tx.start() + }) } -}; +} // _________ _______ ______ ____ _____ __ __ _____ _____ // |__ __\ \ / / __ \| ____/ __ \| __ \| \/ | /\ | __ \_ _| @@ -195,81 +197,81 @@ const startNextTransaction = (dbName: string) => { * DO NOT USE THIS! THIS IS MEANT FOR TYPEORM * If you are looking for a convenience wrapper use `connect` */ -// export const typeORMDriver = { -// openDatabase: ( -// options: { -// name: string; -// location?: string; -// }, -// ok: (db: any) => void, -// fail: (msg: string) => void -// ): any => { -// try { -// QuickSQLite.open(options.name, options.location); - -// const connection = { -// executeSql: async ( -// sql: string, -// params: ExecuteParams | undefined, -// ok: (res: QueryResult) => void, -// fail: (msg: string) => void -// ) => { -// try { -// let response = await QuickSQLite.executeAsync( -// options.name, -// sql, -// params -// ); -// enhanceQueryResult(response); -// ok(response); -// } catch (e) { -// fail(e); -// } -// }, -// transaction: ( -// fn: (tx: Transaction) => Promise -// ): Promise => { -// return QuickSQLite.transaction(options.name, fn); -// }, -// close: (ok: any, fail: any) => { -// try { -// QuickSQLite.close(options.name); -// ok(); -// } catch (e) { -// fail(e); -// } -// }, -// attach: ( -// dbNameToAttach: string, -// alias: string, -// location: string | undefined, -// callback: () => void -// ) => { -// QuickSQLite.attach(options.name, dbNameToAttach, alias, location); - -// callback(); -// }, -// detach: (alias, callback: () => void) => { -// QuickSQLite.detach(options.name, alias); - -// callback(); -// }, -// }; - -// ok(connection); - -// return connection; -// } catch (e) { -// fail(e); -// } -// }, -// }; +export const typeORMDriver = { + openDatabase: ( + options: { + name: string + location?: string + }, + ok: (db: any) => void, + fail: (msg: string) => void + ): any => { + try { + QuickSQLite.open(options.name, options.location) + + const connection = { + executeSql: async ( + sql: string, + params: ExecuteParams | undefined, + ok: (res: QueryResult) => void, + fail: (msg: string) => void + ) => { + try { + let response = await QuickSQLite.executeAsync( + options.name, + sql, + params + ) + enhanceQueryResult(response) + ok(response) + } catch (e) { + fail(e) + } + }, + transaction: ( + fn: (tx: Transaction) => Promise + ): Promise => { + return QuickSQLite.transaction(options.name, fn) + }, + close: (ok: any, fail: any) => { + try { + QuickSQLite.close(options.name) + ok() + } catch (e) { + fail(e) + } + }, + attach: ( + dbNameToAttach: string, + alias: string, + location: string | undefined, + callback: () => void + ) => { + QuickSQLite.attach(options.name, dbNameToAttach, alias, location) + + callback() + }, + detach: (alias, callback: () => void) => { + QuickSQLite.detach(options.name, alias) + + callback() + }, + } + + ok(connection) + + return connection + } catch (e) { + fail(e) + } + }, +} export const open = (options: { - name: string; - location?: string; + name: string + location?: string }): QuickSQLiteConnection => { - QuickSQLite.open(options.name, options.location); + QuickSQLite.open(options.name, options.location) return { close: () => QuickSQLite.close(options.name), @@ -294,5 +296,5 @@ export const open = (options: { QuickSQLite.loadFile(options.name, location), loadFileAsync: (location: string) => QuickSQLite.loadFileAsync(options.name, location), - }; -}; + } +} diff --git a/src/types.ts b/src/types.ts index 1a17d32f..3a3b069e 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,4 +1,4 @@ -import { SelectQueryResult } from './specs/QueryResult.nitro'; +import { SelectQueryResult } from './specs/QueryResult.nitro' /** * Object returned by SQL Query executions { @@ -11,32 +11,32 @@ import { SelectQueryResult } from './specs/QueryResult.nitro'; * @interface QueryResult */ export interface QueryResult { - readonly queryType: QueryType; - insertId?: number; - rowsAffected: number; + readonly queryType: QueryType + insertId?: number + rowsAffected: number - selectQueryResult?: SelectQueryResult; + selectQueryResult?: SelectQueryResult } -export type QueryType = 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE' | 'OTHER'; +export type QueryType = 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE' | 'OTHER' -export type ExecuteParams = number | boolean | bigint | string | ArrayBuffer; +export type ExecuteParams = number | boolean | bigint | string | ArrayBuffer export type ExecuteQuery = ( query: string, params?: ExecuteParams -) => QueryResult; +) => QueryResult export type ExecuteAsyncQuery = ( query: string, params?: ExecuteParams -) => Promise; +) => Promise export interface Transaction { - commit(): QueryResult; - rollback(): QueryResult; - execute: ExecuteQuery; - executeAsync: ExecuteAsyncQuery; + commit(): QueryResult + rollback(): QueryResult + execute: ExecuteQuery + executeAsync: ExecuteAsyncQuery } export interface PendingTransaction { @@ -49,7 +49,7 @@ export interface PendingTransaction { * * It should also automatically commit or rollback the transaction if needed */ - start: () => void; + start: () => void } /** @@ -60,7 +60,7 @@ export interface PendingTransaction { */ export type SQLBatchTuple = | [string] - | [string, Array | Array>]; + | [string, Array | Array>] /** * status: 0 or undefined for correct execution, 1 for error @@ -68,7 +68,7 @@ export type SQLBatchTuple = * rowsAffected: Number of affected rows if status == 0 */ export interface BatchQueryResult { - rowsAffected?: number; + rowsAffected?: number } /** @@ -76,19 +76,19 @@ export interface BatchQueryResult { * Similar to BatchQueryResult */ export interface FileLoadResult extends BatchQueryResult { - commands?: number; + commands?: number } export interface QuickSQLiteConnection { - close(): void; - delete(): void; - attach(dbNameToAttach: string, alias: string, location?: string): void; - detach(alias: string): void; - transaction(fn: (tx: Transaction) => Promise | void): Promise; - execute: ExecuteQuery; - executeAsync: ExecuteAsyncQuery; - executeBatch(commands: SQLBatchTuple[]): BatchQueryResult; - executeBatchAsync(commands: SQLBatchTuple[]): Promise; - loadFile(location: string): FileLoadResult; - loadFileAsync(location: string): Promise; + close(): void + delete(): void + attach(dbNameToAttach: string, alias: string, location?: string): void + detach(alias: string): void + transaction(fn: (tx: Transaction) => Promise | void): Promise + execute: ExecuteQuery + executeAsync: ExecuteAsyncQuery + executeBatch(commands: SQLBatchTuple[]): BatchQueryResult + executeBatchAsync(commands: SQLBatchTuple[]): Promise + loadFile(location: string): FileLoadResult + loadFileAsync(location: string): Promise } From be94a8f3580b5a433fca34110b5b8f7e6a11b4b4 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 4 Sep 2024 23:53:19 +0200 Subject: [PATCH 033/156] rename podspec --- ...ck-sqlite.podspec => RNQuickSQLite.podspec | 2 +- example/ios/Podfile | 2 +- example/ios/Podfile.lock | 317 +++++++++--------- 3 files changed, 156 insertions(+), 165 deletions(-) rename react-native-quick-sqlite.podspec => RNQuickSQLite.podspec (96%) diff --git a/react-native-quick-sqlite.podspec b/RNQuickSQLite.podspec similarity index 96% rename from react-native-quick-sqlite.podspec rename to RNQuickSQLite.podspec index 2ba06dec..44513124 100644 --- a/react-native-quick-sqlite.podspec +++ b/RNQuickSQLite.podspec @@ -3,7 +3,7 @@ require "json" package = JSON.parse(File.read(File.join(__dir__, "package.json"))) 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"] diff --git a/example/ios/Podfile b/example/ios/Podfile index 63fc042a..094b4bc8 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -23,7 +23,7 @@ target 'QuickSQLiteExample' do :app_path => "#{Pod::Config.instance.installation_root}/.." ) - pod 'react-native-quick-sqlite', :path => '../..' + pod 'RNQuickSQLite', :path => '../..' target 'QuickSQLiteExampleTests' do inherit! :complete diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 1486aca5..4c73609e 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -1258,33 +1258,6 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - react-native-quick-sqlite (8.1.0): - - 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.5.0): - - RCT-Folly - - RCTRequired - - RCTTypeSafety - - React-Core - - ReactCommon/turbomodule/core - React-nativeconfig (0.75.2) - React-NativeModulesApple (0.75.2): - glog @@ -1545,77 +1518,98 @@ PODS: - React-logger (= 0.75.2) - React-perflogger (= 0.75.2) - React-utils (= 0.75.2) + - RNQuickSQLite (8.1.0): + - 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 - SocketRocket (0.7.0) - Yoga (0.0.0) DEPENDENCIES: - - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) - - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - - 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`) - - RCTRequired (from `../node_modules/react-native/Libraries/Required`) - - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) - - React (from `../node_modules/react-native/`) - - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) - - React-Core (from `../node_modules/react-native/`) - - React-Core/RCTWebSocket (from `../node_modules/react-native/`) - - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) - - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) - - React-debug (from `../node_modules/react-native/ReactCommon/react/debug`) - - React-defaultsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/defaults`) - - React-domnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/dom`) - - React-Fabric (from `../node_modules/react-native/ReactCommon`) - - React-FabricComponents (from `../node_modules/react-native/ReactCommon`) - - React-FabricImage (from `../node_modules/react-native/ReactCommon`) - - React-featureflags (from `../node_modules/react-native/ReactCommon/react/featureflags`) - - React-featureflagsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`) - - React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`) - - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) - - React-idlecallbacksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`) - - React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) - - React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`) - - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) - - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) - - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`) - - React-jsitracing (from `../node_modules/react-native/ReactCommon/hermes/executor/`) - - 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 `../..`) - - 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`) - - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) - - React-performancetimeline (from `../node_modules/react-native/ReactCommon/react/performance/timeline`) - - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) - - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`) - - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) - - React-RCTFabric (from `../node_modules/react-native/React`) - - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) - - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) - - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) - - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) - - React-RCTText (from `../node_modules/react-native/Libraries/Text`) - - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) - - React-rendererconsistency (from `../node_modules/react-native/ReactCommon/react/renderer/consistency`) - - React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`) - - React-rncore (from `../node_modules/react-native/ReactCommon`) - - React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) - - React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`) - - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) - - React-RuntimeHermes (from `../node_modules/react-native/ReactCommon/react/runtime`) - - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) - - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) + - boost (from `../../node_modules/react-native/third-party-podspecs/boost.podspec`) + - DoubleConversion (from `../../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) + - FBLazyVector (from `../../node_modules/react-native/Libraries/FBLazyVector`) + - 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`) + - RCTRequired (from `../../node_modules/react-native/Libraries/Required`) + - RCTTypeSafety (from `../../node_modules/react-native/Libraries/TypeSafety`) + - React (from `../../node_modules/react-native/`) + - React-callinvoker (from `../../node_modules/react-native/ReactCommon/callinvoker`) + - React-Core (from `../../node_modules/react-native/`) + - React-Core/RCTWebSocket (from `../../node_modules/react-native/`) + - React-CoreModules (from `../../node_modules/react-native/React/CoreModules`) + - React-cxxreact (from `../../node_modules/react-native/ReactCommon/cxxreact`) + - React-debug (from `../../node_modules/react-native/ReactCommon/react/debug`) + - React-defaultsnativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/defaults`) + - React-domnativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/dom`) + - React-Fabric (from `../../node_modules/react-native/ReactCommon`) + - React-FabricComponents (from `../../node_modules/react-native/ReactCommon`) + - React-FabricImage (from `../../node_modules/react-native/ReactCommon`) + - React-featureflags (from `../../node_modules/react-native/ReactCommon/react/featureflags`) + - React-featureflagsnativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`) + - React-graphics (from `../../node_modules/react-native/ReactCommon/react/renderer/graphics`) + - React-hermes (from `../../node_modules/react-native/ReactCommon/hermes`) + - React-idlecallbacksnativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`) + - React-ImageManager (from `../../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) + - React-jserrorhandler (from `../../node_modules/react-native/ReactCommon/jserrorhandler`) + - React-jsi (from `../../node_modules/react-native/ReactCommon/jsi`) + - React-jsiexecutor (from `../../node_modules/react-native/ReactCommon/jsiexecutor`) + - React-jsinspector (from `../../node_modules/react-native/ReactCommon/jsinspector-modern`) + - React-jsitracing (from `../../node_modules/react-native/ReactCommon/hermes/executor/`) + - 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-nativeconfig (from `../../node_modules/react-native/ReactCommon`) + - React-NativeModulesApple (from `../../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) + - React-perflogger (from `../../node_modules/react-native/ReactCommon/reactperflogger`) + - React-performancetimeline (from `../../node_modules/react-native/ReactCommon/react/performance/timeline`) + - React-RCTActionSheet (from `../../node_modules/react-native/Libraries/ActionSheetIOS`) + - React-RCTAnimation (from `../../node_modules/react-native/Libraries/NativeAnimation`) + - React-RCTAppDelegate (from `../../node_modules/react-native/Libraries/AppDelegate`) + - React-RCTBlob (from `../../node_modules/react-native/Libraries/Blob`) + - React-RCTFabric (from `../../node_modules/react-native/React`) + - React-RCTImage (from `../../node_modules/react-native/Libraries/Image`) + - React-RCTLinking (from `../../node_modules/react-native/Libraries/LinkingIOS`) + - React-RCTNetwork (from `../../node_modules/react-native/Libraries/Network`) + - React-RCTSettings (from `../../node_modules/react-native/Libraries/Settings`) + - React-RCTText (from `../../node_modules/react-native/Libraries/Text`) + - React-RCTVibration (from `../../node_modules/react-native/Libraries/Vibration`) + - React-rendererconsistency (from `../../node_modules/react-native/ReactCommon/react/renderer/consistency`) + - React-rendererdebug (from `../../node_modules/react-native/ReactCommon/react/renderer/debug`) + - React-rncore (from `../../node_modules/react-native/ReactCommon`) + - React-RuntimeApple (from `../../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) + - React-RuntimeCore (from `../../node_modules/react-native/ReactCommon/react/runtime`) + - React-runtimeexecutor (from `../../node_modules/react-native/ReactCommon/runtimeexecutor`) + - React-RuntimeHermes (from `../../node_modules/react-native/ReactCommon/react/runtime`) + - React-runtimescheduler (from `../../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) + - React-utils (from `../../node_modules/react-native/ReactCommon/react/utils`) - ReactCodegen (from `build/generated/ios`) - - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) + - ReactCommon/turbomodule/core (from `../../node_modules/react-native/ReactCommon`) + - RNQuickSQLite (from `../..`) + - Yoga (from `../../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: trunk: @@ -1623,136 +1617,134 @@ SPEC REPOS: EXTERNAL SOURCES: boost: - :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" + :podspec: "../../node_modules/react-native/third-party-podspecs/boost.podspec" DoubleConversion: - :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + :podspec: "../../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" FBLazyVector: - :path: "../node_modules/react-native/Libraries/FBLazyVector" + :path: "../../node_modules/react-native/Libraries/FBLazyVector" fmt: - :podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec" + :podspec: "../../node_modules/react-native/third-party-podspecs/fmt.podspec" glog: - :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" + :podspec: "../../node_modules/react-native/third-party-podspecs/glog.podspec" hermes-engine: - :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" + :podspec: "../../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" :tag: hermes-2024-08-15-RNv0.75.1-4b3bf912cc0f705b51b71ce1a5b8bd79b93a451b NitroModules: - :path: "../node_modules/react-native-nitro-modules" + :path: "../../node_modules/react-native-nitro-modules" RCT-Folly: - :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" + :podspec: "../../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTDeprecation: - :path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" + :path: "../../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" RCTRequired: - :path: "../node_modules/react-native/Libraries/Required" + :path: "../../node_modules/react-native/Libraries/Required" RCTTypeSafety: - :path: "../node_modules/react-native/Libraries/TypeSafety" + :path: "../../node_modules/react-native/Libraries/TypeSafety" React: - :path: "../node_modules/react-native/" + :path: "../../node_modules/react-native/" React-callinvoker: - :path: "../node_modules/react-native/ReactCommon/callinvoker" + :path: "../../node_modules/react-native/ReactCommon/callinvoker" React-Core: - :path: "../node_modules/react-native/" + :path: "../../node_modules/react-native/" React-CoreModules: - :path: "../node_modules/react-native/React/CoreModules" + :path: "../../node_modules/react-native/React/CoreModules" React-cxxreact: - :path: "../node_modules/react-native/ReactCommon/cxxreact" + :path: "../../node_modules/react-native/ReactCommon/cxxreact" React-debug: - :path: "../node_modules/react-native/ReactCommon/react/debug" + :path: "../../node_modules/react-native/ReactCommon/react/debug" React-defaultsnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/defaults" + :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/defaults" React-domnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/dom" + :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/dom" React-Fabric: - :path: "../node_modules/react-native/ReactCommon" + :path: "../../node_modules/react-native/ReactCommon" React-FabricComponents: - :path: "../node_modules/react-native/ReactCommon" + :path: "../../node_modules/react-native/ReactCommon" React-FabricImage: - :path: "../node_modules/react-native/ReactCommon" + :path: "../../node_modules/react-native/ReactCommon" React-featureflags: - :path: "../node_modules/react-native/ReactCommon/react/featureflags" + :path: "../../node_modules/react-native/ReactCommon/react/featureflags" React-featureflagsnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/featureflags" + :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/featureflags" React-graphics: - :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics" + :path: "../../node_modules/react-native/ReactCommon/react/renderer/graphics" React-hermes: - :path: "../node_modules/react-native/ReactCommon/hermes" + :path: "../../node_modules/react-native/ReactCommon/hermes" React-idlecallbacksnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" + :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" React-ImageManager: - :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" + :path: "../../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" React-jserrorhandler: - :path: "../node_modules/react-native/ReactCommon/jserrorhandler" + :path: "../../node_modules/react-native/ReactCommon/jserrorhandler" React-jsi: - :path: "../node_modules/react-native/ReactCommon/jsi" + :path: "../../node_modules/react-native/ReactCommon/jsi" React-jsiexecutor: - :path: "../node_modules/react-native/ReactCommon/jsiexecutor" + :path: "../../node_modules/react-native/ReactCommon/jsiexecutor" React-jsinspector: - :path: "../node_modules/react-native/ReactCommon/jsinspector-modern" + :path: "../../node_modules/react-native/ReactCommon/jsinspector-modern" React-jsitracing: - :path: "../node_modules/react-native/ReactCommon/hermes/executor/" + :path: "../../node_modules/react-native/ReactCommon/hermes/executor/" React-logger: - :path: "../node_modules/react-native/ReactCommon/logger" + :path: "../../node_modules/react-native/ReactCommon/logger" React-Mapbuffer: - :path: "../node_modules/react-native/ReactCommon" + :path: "../../node_modules/react-native/ReactCommon" React-microtasksnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" - react-native-quick-sqlite: - :path: "../.." - react-native-safe-area-context: - :path: "../node_modules/react-native-safe-area-context" + :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" React-nativeconfig: - :path: "../node_modules/react-native/ReactCommon" + :path: "../../node_modules/react-native/ReactCommon" React-NativeModulesApple: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" + :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" React-perflogger: - :path: "../node_modules/react-native/ReactCommon/reactperflogger" + :path: "../../node_modules/react-native/ReactCommon/reactperflogger" React-performancetimeline: - :path: "../node_modules/react-native/ReactCommon/react/performance/timeline" + :path: "../../node_modules/react-native/ReactCommon/react/performance/timeline" React-RCTActionSheet: - :path: "../node_modules/react-native/Libraries/ActionSheetIOS" + :path: "../../node_modules/react-native/Libraries/ActionSheetIOS" React-RCTAnimation: - :path: "../node_modules/react-native/Libraries/NativeAnimation" + :path: "../../node_modules/react-native/Libraries/NativeAnimation" React-RCTAppDelegate: - :path: "../node_modules/react-native/Libraries/AppDelegate" + :path: "../../node_modules/react-native/Libraries/AppDelegate" React-RCTBlob: - :path: "../node_modules/react-native/Libraries/Blob" + :path: "../../node_modules/react-native/Libraries/Blob" React-RCTFabric: - :path: "../node_modules/react-native/React" + :path: "../../node_modules/react-native/React" React-RCTImage: - :path: "../node_modules/react-native/Libraries/Image" + :path: "../../node_modules/react-native/Libraries/Image" React-RCTLinking: - :path: "../node_modules/react-native/Libraries/LinkingIOS" + :path: "../../node_modules/react-native/Libraries/LinkingIOS" React-RCTNetwork: - :path: "../node_modules/react-native/Libraries/Network" + :path: "../../node_modules/react-native/Libraries/Network" React-RCTSettings: - :path: "../node_modules/react-native/Libraries/Settings" + :path: "../../node_modules/react-native/Libraries/Settings" React-RCTText: - :path: "../node_modules/react-native/Libraries/Text" + :path: "../../node_modules/react-native/Libraries/Text" React-RCTVibration: - :path: "../node_modules/react-native/Libraries/Vibration" + :path: "../../node_modules/react-native/Libraries/Vibration" React-rendererconsistency: - :path: "../node_modules/react-native/ReactCommon/react/renderer/consistency" + :path: "../../node_modules/react-native/ReactCommon/react/renderer/consistency" React-rendererdebug: - :path: "../node_modules/react-native/ReactCommon/react/renderer/debug" + :path: "../../node_modules/react-native/ReactCommon/react/renderer/debug" React-rncore: - :path: "../node_modules/react-native/ReactCommon" + :path: "../../node_modules/react-native/ReactCommon" React-RuntimeApple: - :path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios" + :path: "../../node_modules/react-native/ReactCommon/react/runtime/platform/ios" React-RuntimeCore: - :path: "../node_modules/react-native/ReactCommon/react/runtime" + :path: "../../node_modules/react-native/ReactCommon/react/runtime" React-runtimeexecutor: - :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" + :path: "../../node_modules/react-native/ReactCommon/runtimeexecutor" React-RuntimeHermes: - :path: "../node_modules/react-native/ReactCommon/react/runtime" + :path: "../../node_modules/react-native/ReactCommon/react/runtime" React-runtimescheduler: - :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" + :path: "../../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" React-utils: - :path: "../node_modules/react-native/ReactCommon/react/utils" + :path: "../../node_modules/react-native/ReactCommon/react/utils" ReactCodegen: :path: build/generated/ios ReactCommon: - :path: "../node_modules/react-native/ReactCommon" + :path: "../../node_modules/react-native/ReactCommon" + RNQuickSQLite: + :path: "../.." Yoga: - :path: "../node_modules/react-native/ReactCommon/yoga" + :path: "../../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: boost: 4cb898d0bf20404aab1850c656dcea009429d6c1 @@ -1791,8 +1783,6 @@ SPEC CHECKSUMS: React-logger: 8db32983d75dc2ad54f278f344ccb9b256e694fc React-Mapbuffer: 1c08607305558666fd16678b85ef135e455d5c96 React-microtasksnativemodule: 87b8de96f937faefece8afd2cb3a518321b2ef99 - react-native-quick-sqlite: 5a5071f4ef16555675fedbb2b2c333f67fc0614e - react-native-safe-area-context: 39c2d8be3328df5d437ac1700f4f3a4f75716acc React-nativeconfig: 57781b79e11d5af7573e6f77cbf1143b71802a6d React-NativeModulesApple: 7ff2e2cfb2e5fa5bdedcecf28ce37e696c6ef1e1 React-perflogger: 8a360ccf603de6ddbe9ff8f54383146d26e6c936 @@ -1817,11 +1807,12 @@ SPEC CHECKSUMS: React-RuntimeHermes: 860cf64708a12a2fa62366fe51fe000121fa031b React-runtimescheduler: fff88d51ad2c8815fc75930dbac224d680593e6b React-utils: 81a715d9c0a2a49047e77a86f3a2247408540deb - ReactCodegen: 60973d382704c793c605b9be0fc7f31cb279442f + ReactCodegen: 4eedb2fdd079174d6fc3c80b1cccafbe4ff1be8d ReactCommon: 6ef348087d250257c44c0204461c03f036650e9b + RNQuickSQLite: 29e32154e56d68f7899153b238227552d0c8ec8d SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d Yoga: a1d7895431387402a674fd0d1c04ec85e87909b8 -PODFILE CHECKSUM: 8fe700daf9cc3fc6804ba2712d56a463d52d62e8 +PODFILE CHECKSUM: fb1f25ec426569e124696e15aa6e6d5ba3bd2adf COCOAPODS: 1.15.2 From bf7ba4c5b6134c7b9ac27faf3e5f7682bc9d64fd Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 4 Sep 2024 23:53:29 +0200 Subject: [PATCH 034/156] fix: ts --- example/src/App.tsx | 26 +- example/src/Database.ts | 34 +- example/src/model/Book.ts | 10 +- example/src/model/User.ts | 14 +- example/src/tests/MochaRNAdapter.ts | 65 ++- example/src/tests/MochaSetup.ts | 36 +- example/src/tests/index.ts | 4 +- example/src/tests/rawQueries.spec.ts | 648 +++++++++++++-------------- example/src/tests/typeorm.spec.ts | 50 +-- 9 files changed, 442 insertions(+), 445 deletions(-) diff --git a/example/src/App.tsx b/example/src/App.tsx index 271ac8a0..c4ef2746 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -1,19 +1,19 @@ -import React, {useEffect, useState} from 'react'; -import {SafeAreaView, ScrollView, Text} from 'react-native'; -import 'reflect-metadata'; -import {registerBaseTests, runTests} from './tests/index'; +import React, { useEffect, useState } from 'react' +import { SafeAreaView, ScrollView, Text } from 'react-native' +import 'reflect-metadata' +import { registerBaseTests, runTests } from './tests/index' // import {registerTypeORMTests} from './tests/typeorm.spec'; export default function App() { - const [results, setResults] = useState([]); + const [results, setResults] = useState([]) useEffect(() => { - setResults([]); + setResults([]) runTests( - registerBaseTests, + registerBaseTests // registerTypeORMTests - ).then(setResults); - }, []); + ).then(setResults) + }, []) return ( @@ -27,7 +27,7 @@ export default function App() { {r.description} - ); + ) } if (r.type === 'incorrect') { @@ -35,16 +35,16 @@ export default function App() { 🔴 {r.description}: {r.errorMsg} - ); + ) } return ( 🟢 {r.description} - ); + ) })} - ); + ) } diff --git a/example/src/Database.ts b/example/src/Database.ts index 36c2f856..15ddd92e 100644 --- a/example/src/Database.ts +++ b/example/src/Database.ts @@ -1,9 +1,9 @@ -import { DataSource } from 'typeorm'; -import { typeORMDriver } from 'react-native-quick-sqlite'; -import { Book } from './model/Book'; -import { User } from './model/User'; +import { DataSource } from 'typeorm' +import { typeORMDriver } from 'react-native-quick-sqlite' +import { Book } from './model/Book' +import { User } from './model/User' // import { Buffer } from 'buffer'; -let datasource: DataSource; +let datasource: DataSource export async function typeORMInit() { datasource = new DataSource({ @@ -13,11 +13,11 @@ export async function typeORMInit() { driver: typeORMDriver, entities: [Book, User], synchronize: true, - }); + }) - await datasource.initialize(); + await datasource.initialize() - const bookRepository = datasource.getRepository(Book); + const bookRepository = datasource.getRepository(Book) // const userRepository = getRepository(User); // const user1 = new User(); // user1.name = 'John Seedman 🤯'; @@ -31,11 +31,11 @@ export async function typeORMInit() { // '/9j/4AAQSkZJRgABAQEAYABgAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2NjIpLCBxdWFsaXR5ID0gOTAK/9sAQwADAgIDAgIDAwMDBAMDBAUIBQUEBAUKBwcGCAwKDAwLCgsLDQ4SEA0OEQ4LCxAWEBETFBUVFQwPFxgWFBgSFBUU/9sAQwEDBAQFBAUJBQUJFA0LDRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8AAEQgAUABQAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A8hooor+iD+YQo/CiigAo9a+h/wBmn9ku4+OOmXOvapqkmjeH4pjbxGCMPNcyAAttzwqjIGSDk5GODXsOuf8ABOPSHt2OkeM763mA4F7aJMp/75KYrwa+eYHDVXRqT1W+jdvuPosPw/mOKoqvSp+69tUr/ez4Xor2T4qfsoePvhZDNeT2Met6RHlmvtLJkEa+roQGX3OCB6142DkZr1aGJo4qHPRkpLyPHxOFr4Sfs68HF+Yd6PSiiuk5Qoor2v8AZF+FUPxU+MNjFfQibR9JQ6jeIwysm0gRxn1DOVyO6hq5sTXhhaMq09oq51YXDzxdeFCnvJ2Pa/2bf2JtK1vwxb+JPiHb3Ez3yCW00dZXhEcR5DylSG3N1CgjA65JwPPv2sv2ddA+FsEGu+FPOt9OacW1zYTSmURlgSrozZbHGCCT1GK/QfX9UXSbB5CcHHFfnR+1n8aF8Za1J4U04h7SxuRJeXAPDzKCBGPZcnJ9eO3P5vlmYZhj8xUlJ8vVfZS9P6Z+qZtlmW5blbhKC5tk/tOXr+a2sfV/7Dox+zrof/Xzd/8Ao969uu9WhtHCu4Uk45NeJfsPf8m66F/183f/AKPeuQ/bdvpoPhXqnlSvE6XNsyujEMpE6YII6GvExdH6xmk6N7c02vvZ9Bg6/wBVyenXtflpp29In048ceoQkjBzXxZ+1f8Ass24gvPF3hGzW2vIgZr7TYFwk69WkjUdHHUqPvdev3l/ZC/avv7nXLLwR40vGuxdsIdN1adsyCQ/dhlP8W7orHnOAc5BH2X4gsFu7NzjkCraxeQYtd/wkv6+4yjLBcSYJ6afjF/195+MgYMMiivUv2k/h3H8OfinfQWkQi0zUV+3WyKMKm4kOg+jA4HYFa8tr9gw1eGKoxrQ2krn4jisNPB150Km8XYK+6v+Cceixx+G/GerbQZp7uC13dwqIzY/OT9K+Fa+6v8AgnHrUUvhvxnpOQJoLuC629yroy5/OP8AWvD4i5v7NqW8vzR9Bwvy/wBqU+btK33M9r/aD8Sy+GfBWt6jF9+ysZp0B7sqEgfmBX5Uq7ylpJGMkjks7sclieSTX6v/AB58JyeLfBOuaZCP3t7YzW6E9mZCFP5kV+UJjeFmjlRo5UJR0YYKkcEEeteJwlyclX+a6+7+rn0HGnP7Sj/LZ/fpf9D9Lv2G72B/2dtKVZVY293dRygH7jeaWwfwZT+NcH+25qkE3wx1KMOA0lzbogP8R81WwPwUn8K+SPhh8bvFvwhkuh4evkS0uyGnsblPMgkYDAbbkENjjKkH1zVP4jfFjxJ8VLyGbXruNoYSWitLZPLhRj1bGSSfck1o8hr/ANqfWuZcnNzee97WMlxHh1lH1PlftOXl8trXv6ficnBNJbSxzQu0U0bB0dDhlYHIIPrmv2D+G/iR/G3wz8N65MB52paZb3UuBgB2jUsPzJr8fIIJLmaOGGNpZpGCIiDJZicAAeua/YL4c+HH8EfDLw5oc2PO03TILaUg8F1jAb/x4Go4t5PZ0f5rv7tL/oXwXz+1rW+Gy++7t+p8Z/t56VGIfDmoBQJIrqa3z6h0Df8AtP8AWvkavrP9u3Wo5U8PaeGBkkupbjHsiBf/AGpXyZXscOc39nQv3f5s8Pinl/tSduyv9yD8a9q/ZF+K0Pwr+MNjLfziHR9WQ6deOxwse8gxyH0CuFyeylq8VoPNe9iaEMVRlRntJWPnMLiJ4SvCvT3i7n7SalZJfW7IcH0r4Y/aj/ZP1U6zeeLvB9k16twxlv8AS4FzJv7yxL/FnqVHOeRnJx1H7Jv7XVtd6bZeCvG16Le+gVYNO1W4bCXCDhYpGPRxwAx4YYB+b731+Jre5HJFfkCeLyDF7a/hJf19x+3tYLiTBLXT8Yv+vkz8XZYngmeKVGilQlXjcbWUjqCD0NLBDJczRwwo8ssjBUjjBZmJ6AAdTX7A+Ivhf4M8YSebrnhnSNXmxgTXlnHJIB/vEZ/WneG/hv4N8ES+dofhrR9HmxjzrOzjjkx/vAZ/Wvqf9bafJ/BfN66fl+h8f/qXV57e2XL6a/df9T5P/ZH/AGSNR0/WrLxx44smsvsrCbTdIuFxL5n8M0q/w7eqqec4Jxjn638Za4mmac67hvYdM1JrXiy102Ftrhnx618PftO/tNLqAu/DXhq7E91JmK8v4WysC9CiEdXPQkfd+vT5WUsXn+LWmv4RX9fefYxjguHME9dPxk/6+48W/aD8fp8QviZe3FvL5unWA+x27g8PtJLuPqxOD3AFecfjSKoRQAMAUtfr+Fw8cLRjRhtFWPxDF4meMrzr1N5O4UUUV1HIIRkc16/8NP2pvHnwzt4rKG/XWtJjAVLLUwZPLX0RwQyj0GSB6V5DRXNXw1HFR5K0VJeZ14bFV8JP2lCbi/I+y9L/AOCgdq8A/tLwte28uOfsl0kqk/8AAguKqa5+3xBLCw03w1ezSEcfarlIgP8AvkNXx/RXhf6uZdzX5H97/wAz6L/WjNOXl9ovWy/yPTfiJ+0X40+IyS21xerpWmycNaaflN49HcksfcZAPpXmKqFGAMD2paK93D4ajhYclGKivI+dxOLr4uftK83J+YUUUV0nKf/Z', // 'base64' // ).buffer; - const book1 = new Book(); - book1.id = Math.random().toString(); - book1.title = 'Lord of the rings'; + const book1 = new Book() + book1.id = Math.random().toString() + book1.title = 'Lord of the rings' - await bookRepository.save(book1); + await bookRepository.save(book1) // await userRepository.save(user1); // const users = await userRepository.find(); // // const users = await userRepository.find({ @@ -45,18 +45,18 @@ export async function typeORMInit() { } export async function typeORMGetBooks() { - const bookRepository = datasource.getRepository(Book); - return await bookRepository.find(); + const bookRepository = datasource.getRepository(Book) + return await bookRepository.find() } export async function executeFailingTypeORMQuery() { - const bookRepository = datasource.getRepository(Book); + const bookRepository = datasource.getRepository(Book) try { const manualQuery = await bookRepository.query(` SELECT * From UnexistingTable - `); + `) } catch (e) { - console.warn('should have cached'); + console.warn('should have cached') } } diff --git a/example/src/model/Book.ts b/example/src/model/Book.ts index b9576f2d..c4f4a91f 100644 --- a/example/src/model/Book.ts +++ b/example/src/model/Book.ts @@ -1,18 +1,18 @@ -import 'reflect-metadata'; +import 'reflect-metadata' import { Entity, Column, PrimaryGeneratedColumn, OneToOne, JoinColumn, -} from 'typeorm/browser'; -import { BaseEntity } from 'typeorm'; +} from 'typeorm/browser' +import { BaseEntity } from 'typeorm' @Entity() export class Book extends BaseEntity { @PrimaryGeneratedColumn('uuid') - id!: string; + id!: string @Column() - title!: string; + title!: string } diff --git a/example/src/model/User.ts b/example/src/model/User.ts index f59a796f..167a3bfb 100644 --- a/example/src/model/User.ts +++ b/example/src/model/User.ts @@ -5,29 +5,29 @@ import { PrimaryGeneratedColumn, OneToOne, JoinColumn, -} from 'typeorm/browser'; +} from 'typeorm/browser' @Entity('user') export class User { @PrimaryGeneratedColumn('uuid') - id!: string; + id!: string @Column('text') - name!: string; + name!: string @Column('int') - age!: number; + age!: number @Column('float') - networth!: number; + networth!: number // @OneToOne(type => Book) // @JoinColumn() // favoriteBook!: Book; @Column('simple-json') - metadata: { nickname: string }; + metadata: { nickname: string } @Column('blob') - avatar: ArrayBuffer; + avatar: ArrayBuffer } diff --git a/example/src/tests/MochaRNAdapter.ts b/example/src/tests/MochaRNAdapter.ts index 5c4c0454..ac8e3e24 100644 --- a/example/src/tests/MochaRNAdapter.ts +++ b/example/src/tests/MochaRNAdapter.ts @@ -1,54 +1,51 @@ -import 'mocha'; -import type * as MochaTypes from 'mocha'; +import 'mocha' +import type * as MochaTypes from 'mocha' -export const rootSuite = new Mocha.Suite('') as MochaTypes.Suite; -rootSuite.timeout(10 * 1000); +export const rootSuite = new Mocha.Suite('') as MochaTypes.Suite +rootSuite.timeout(10 * 1000) -let mochaContext = rootSuite; -let only = false; +let mochaContext = rootSuite +let only = false export const clearTests = () => { - rootSuite.suites = []; - rootSuite.tests = []; - mochaContext = rootSuite; - only = false; -}; + rootSuite.suites = [] + rootSuite.tests = [] + mochaContext = rootSuite + only = false +} export const it = ( name: string, - f: MochaTypes.Func | MochaTypes.AsyncFunc, + f: MochaTypes.Func | MochaTypes.AsyncFunc ): void => { if (!only) { - const test = new Mocha.Test(name, f); - mochaContext.addTest(test); + const test = new Mocha.Test(name, f) + mochaContext.addTest(test) } -}; +} export const itOnly = ( name: string, - f: MochaTypes.Func | MochaTypes.AsyncFunc, + f: MochaTypes.Func | MochaTypes.AsyncFunc ): void => { - clearTests(); - const test = new Mocha.Test(name, f); - mochaContext.addTest(test); - only = true; -}; + clearTests() + const test = new Mocha.Test(name, f) + mochaContext.addTest(test) + only = true +} export const describe = (name: string, f: () => void): void => { - const prevMochaContext = mochaContext; - mochaContext = new Mocha.Suite( - name, - prevMochaContext.ctx, - ) as MochaTypes.Suite; - prevMochaContext.addSuite(mochaContext); - f(); - mochaContext = prevMochaContext; -}; + const prevMochaContext = mochaContext + mochaContext = new Mocha.Suite(name, prevMochaContext.ctx) as MochaTypes.Suite + prevMochaContext.addSuite(mochaContext) + f() + mochaContext = prevMochaContext +} export const beforeEach = (f: () => void): void => { - mochaContext.beforeEach(f); -}; + mochaContext.beforeEach(f) +} export const beforeAll = (f: any) => { - mochaContext.beforeAll(f); -}; + mochaContext.beforeAll(f) +} diff --git a/example/src/tests/MochaSetup.ts b/example/src/tests/MochaSetup.ts index 0aeaa4a3..6a376dae 100644 --- a/example/src/tests/MochaSetup.ts +++ b/example/src/tests/MochaSetup.ts @@ -1,7 +1,7 @@ -import 'mocha'; -import type * as MochaTypes from 'mocha'; +import Mocha from 'mocha' +import type * as MochaTypes from 'mocha' // import type { RowItemType } from '../navigators/children/TestingScreen/RowItemType'; -import { clearTests, rootSuite } from './MochaRNAdapter'; +import { clearTests, rootSuite } from './MochaRNAdapter' export async function runTests(...registrators: Array<() => void>) { // testRegistrators: Array<() => void> = [] @@ -15,22 +15,22 @@ export async function runTests(...registrators: Array<() => void>) { EVENT_TEST_PASS, EVENT_SUITE_BEGIN, EVENT_SUITE_END, - } = Mocha.Runner.constants; + } = Mocha.Runner.constants - clearTests(); - const results = []; - var runner = new Mocha.Runner(rootSuite) as MochaTypes.Runner; + clearTests() + const results = [] + var runner = new Mocha.Runner(rootSuite) as MochaTypes.Runner runner .once(EVENT_RUN_BEGIN, () => {}) .on(EVENT_SUITE_BEGIN, (suite: MochaTypes.Suite) => { - const name = suite.title; + const name = suite.title if (name !== '') { results.push({ description: name, key: Math.random().toString(), type: 'grouping', - }); + }) } }) .on(EVENT_TEST_PASS, (test: MochaTypes.Runnable) => { @@ -38,7 +38,7 @@ export async function runTests(...registrators: Array<() => void>) { description: test.title, key: Math.random().toString(), type: 'correct', - }); + }) // console.log(`${indent()}pass: ${test.fullTitle()}`); }) .on(EVENT_TEST_FAIL, (test: MochaTypes.Runnable, err: Error) => { @@ -47,25 +47,25 @@ export async function runTests(...registrators: Array<() => void>) { key: Math.random().toString(), type: 'incorrect', errorMsg: err.message, - }); + }) // console.log( // `${indent()}fail: ${test.fullTitle()} - error: ${err.message}` // ); }) .once(EVENT_RUN_END, () => { - resolve(results); - }); + resolve(results) + }) registrators.forEach((register) => { - register(); - }); - runner.run(); - }); + register() + }) + runner.run() + }) // return () => { // console.log('aborting'); // runner.abort(); // }; - return promise; + return promise } diff --git a/example/src/tests/index.ts b/example/src/tests/index.ts index 3c967fb5..cda48210 100644 --- a/example/src/tests/index.ts +++ b/example/src/tests/index.ts @@ -1,2 +1,2 @@ -export { runTests } from './MochaSetup'; -export { registerBaseTests } from './rawQueries.spec'; +export { runTests } from './MochaSetup' +export { registerBaseTests } from './rawQueries.spec' diff --git a/example/src/tests/rawQueries.spec.ts b/example/src/tests/rawQueries.spec.ts index bdc7dc05..25df604d 100644 --- a/example/src/tests/rawQueries.spec.ts +++ b/example/src/tests/rawQueries.spec.ts @@ -1,70 +1,70 @@ -import Chance from 'chance'; +import Chance from 'chance' import { open, QuickSQLiteConnection, SQLBatchTuple, -} from 'react-native-quick-sqlite'; -import {beforeEach, describe, it} from './MochaRNAdapter'; -import chai from 'chai'; +} from 'react-native-quick-sqlite' +import { beforeEach, describe, it } from './MochaRNAdapter' +import chai from 'chai' -let expect = chai.expect; -const chance = new Chance(); -let db: QuickSQLiteConnection; +let expect = chai.expect +const chance = new Chance() +let db: QuickSQLiteConnection export function registerBaseTests() { beforeEach(() => { try { if (db) { - db.close(); - db.delete(); + db.close() + db.delete() } db = open({ name: 'test', - }); + }) - db.execute('DROP TABLE IF EXISTS User;'); + db.execute('DROP TABLE IF EXISTS User;') db.execute( - 'CREATE TABLE User ( id INT PRIMARY KEY, name TEXT NOT NULL, age INT, networth REAL) STRICT;', - ); + 'CREATE TABLE User ( id INT PRIMARY KEY, name TEXT NOT NULL, age INT, networth REAL) STRICT;' + ) } catch (e) { - console.warn('error on before each', e); + console.warn('error on before each', e) } - }); + }) describe('Raw queries', () => { it('Insert', async () => { - const id = chance.integer(); - const name = chance.name(); - const age = chance.integer(); - const networth = chance.floating(); + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() const res = db.execute( 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth], - ); + [id, name, age, networth] + ) - expect(res.rowsAffected).to.equal(1); - expect(res.insertId).to.equal(1); - expect(res.metadata).to.eql([]); - expect(res.rows?._array).to.eql([]); - expect(res.rows?.length).to.equal(0); - expect(res.rows?.item).to.be.a('function'); - }); + expect(res.rowsAffected).to.equal(1) + expect(res.insertId).to.equal(1) + expect(res.metadata).to.eql([]) + expect(res.rows?._array).to.eql([]) + expect(res.rows?.length).to.equal(0) + expect(res.rows?.item).to.be.a('function') + }) it('Query without params', async () => { - const id = chance.integer(); - const name = chance.name(); - const age = chance.integer(); - const networth = chance.floating(); + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() db.execute( 'INSERT INTO User (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth], - ); + [id, name, age, networth] + ) - const res = db.execute('SELECT * FROM User'); + const res = db.execute('SELECT * FROM User') - expect(res.rowsAffected).to.equal(1); - expect(res.insertId).to.equal(1); + expect(res.rowsAffected).to.equal(1) + expect(res.insertId).to.equal(1) expect(res.rows?._array).to.eql([ { id, @@ -72,23 +72,23 @@ export function registerBaseTests() { age, networth, }, - ]); - }); + ]) + }) it('Query with params', async () => { - const id = chance.integer(); - const name = chance.name(); - const age = chance.integer(); - const networth = chance.floating(); + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() db.execute( 'INSERT INTO User (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth], - ); + [id, name, age, networth] + ) - const res = db.execute('SELECT * FROM User WHERE id = ?', [id]); + const res = db.execute('SELECT * FROM User WHERE id = ?', [id]) - expect(res.rowsAffected).to.equal(1); - expect(res.insertId).to.equal(1); + expect(res.rowsAffected).to.equal(1) + expect(res.insertId).to.equal(1) expect(res.rows?._array).to.eql([ { id, @@ -96,50 +96,50 @@ export function registerBaseTests() { age, networth, }, - ]); - }); + ]) + }) it('Failed insert', async () => { - const id = chance.string(); - const name = chance.name(); - const age = chance.string(); - const networth = chance.string(); + const id = chance.string() + const name = chance.name() + const age = chance.string() + const networth = chance.string() // expect( try { db.execute( 'INSERT INTO User (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth], - ); + [id, name, age, networth] + ) } catch (e: any) { - expect(typeof e).to.equal('object'); + expect(typeof e).to.equal('object') expect(e.message).to.include( - `cannot store TEXT value in INT column User.id`, - ); + `cannot store TEXT value in INT column User.id` + ) } - }); + }) it('Transaction, auto commit', async () => { - const id = chance.integer(); - const name = chance.name(); - const age = chance.integer(); - const networth = chance.floating(); + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() - await db.transaction(tx => { + await db.transaction((tx) => { const res = tx.execute( 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth], - ); - - expect(res.rowsAffected).to.equal(1); - expect(res.insertId).to.equal(1); - expect(res.metadata).to.eql([]); - expect(res.rows?._array).to.eql([]); - expect(res.rows?.length).to.equal(0); - expect(res.rows?.item).to.be.a('function'); - }); - - const res = db.execute('SELECT * FROM User'); + [id, name, age, networth] + ) + + expect(res.rowsAffected).to.equal(1) + expect(res.insertId).to.equal(1) + expect(res.metadata).to.eql([]) + expect(res.rows?._array).to.eql([]) + expect(res.rows?.length).to.equal(0) + expect(res.rows?.item).to.be.a('function') + }) + + const res = db.execute('SELECT * FROM User') expect(res.rows?._array).to.eql([ { id, @@ -147,32 +147,32 @@ export function registerBaseTests() { age, networth, }, - ]); - }); + ]) + }) it('Transaction, manual commit', async () => { - const id = chance.integer(); - const name = chance.name(); - const age = chance.integer(); - const networth = chance.floating(); + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() - await db.transaction(tx => { + await db.transaction((tx) => { const res = tx.execute( 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth], - ); + [id, name, age, networth] + ) - expect(res.rowsAffected).to.equal(1); - expect(res.insertId).to.equal(1); - expect(res.metadata).to.eql([]); - expect(res.rows?._array).to.eql([]); - expect(res.rows?.length).to.equal(0); - expect(res.rows?.item).to.be.a('function'); + expect(res.rowsAffected).to.equal(1) + expect(res.insertId).to.equal(1) + expect(res.metadata).to.eql([]) + expect(res.rows?._array).to.eql([]) + expect(res.rows?.length).to.equal(0) + expect(res.rows?.item).to.be.a('function') - tx.commit(); - }); + tx.commit() + }) - const res = db.execute('SELECT * FROM User'); + const res = db.execute('SELECT * FROM User') expect(res.rows?._array).to.eql([ { id, @@ -180,23 +180,23 @@ export function registerBaseTests() { age, networth, }, - ]); - }); + ]) + }) it('Transaction, executed in order', async () => { // ARRANGE: Setup for multiple transactions - const iterations = 10; - const actual: unknown[] = []; + const iterations = 10 + const actual: unknown[] = [] // ARRANGE: Generate expected data - const id = chance.integer(); - const name = chance.name(); - const age = chance.integer(); + const id = chance.integer() + const name = chance.name() + const age = chance.integer() // ACT: Start multiple transactions to upsert and select the same record - const promises = []; + const promises = [] for (let iteration = 1; iteration <= iterations; iteration++) { - const promised = db.transaction(tx => { + const promised = db.transaction((tx) => { // ACT: Upsert statement to create record / increment the value tx.execute( ` @@ -208,63 +208,63 @@ export function registerBaseTests() { WHERE [id] = ? ), 0) `, - [id, name, age, id], - ); + [id, name, age, id] + ) // ACT: Select statement to get incremented value and store it for checking later const results = tx.execute( 'SELECT [networth] FROM [User] WHERE [id] = ?', - [id], - ); + [id] + ) - actual.push(results.rows?._array[0].networth); - }); + actual.push(results.rows?._array[0].networth) + }) - promises.push(promised); + promises.push(promised) } // ACT: Wait for all transactions to complete - await Promise.all(promises); + await Promise.all(promises) // ASSERT: That the expected values where returned const expected = Array(iterations) .fill(0) - .map((_, index) => index * 1000); + .map((_, index) => index * 1000) expect(actual).to.eql( expected, - 'Each transaction should read a different value', - ); - }); + 'Each transaction should read a different value' + ) + }) it('Transaction, cannot execute after commit', async () => { - const id = chance.integer(); - const name = chance.name(); - const age = chance.integer(); - const networth = chance.floating(); + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() - await db.transaction(tx => { + await db.transaction((tx) => { const res = tx.execute( 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth], - ); + [id, name, age, networth] + ) - expect(res.rowsAffected).to.equal(1); - expect(res.insertId).to.equal(1); - expect(res.metadata).to.eql([]); - expect(res.rows?._array).to.eql([]); - expect(res.rows?.length).to.equal(0); - expect(res.rows?.item).to.be.a('function'); + expect(res.rowsAffected).to.equal(1) + expect(res.insertId).to.equal(1) + expect(res.metadata).to.eql([]) + expect(res.rows?._array).to.eql([]) + expect(res.rows?.length).to.equal(0) + expect(res.rows?.item).to.be.a('function') - tx.commit(); + tx.commit() try { - tx.execute('SELECT * FROM "User"'); + tx.execute('SELECT * FROM "User"') } catch (e) { - expect(!!e).to.equal(true); + expect(!!e).to.equal(true) } - }); + }) - const res = db.execute('SELECT * FROM User'); + const res = db.execute('SELECT * FROM User') expect(res.rows?._array).to.eql([ { id, @@ -272,135 +272,135 @@ export function registerBaseTests() { age, networth, }, - ]); - }); + ]) + }) it('Incorrect transaction, manual rollback', async () => { - const id = chance.string(); - const name = chance.name(); - const age = chance.integer(); - const networth = chance.floating(); + const id = chance.string() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() - await db.transaction(tx => { + await db.transaction((tx) => { try { tx.execute( 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth], - ); + [id, name, age, networth] + ) } catch (e) { - tx.rollback(); + tx.rollback() } - }); + }) - const res = db.execute('SELECT * FROM User'); - expect(res.rows?._array).to.eql([]); - }); + const res = db.execute('SELECT * FROM User') + expect(res.rows?._array).to.eql([]) + }) it('Correctly throws', () => { - const id = chance.string(); - const name = chance.name(); - const age = chance.integer(); - const networth = chance.floating(); + const id = chance.string() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() try { db.execute( 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth], - ); + [id, name, age, networth] + ) } catch (e: any) { - expect(!!e).to.equal(true); + expect(!!e).to.equal(true) } - }); + }) it('Rollback', async () => { - const id = chance.integer(); - const name = chance.name(); - const age = chance.integer(); - const networth = chance.floating(); + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() - await db.transaction(tx => { + await db.transaction((tx) => { tx.execute( 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth], - ); - tx.rollback(); - const res = db.execute('SELECT * FROM User'); - expect(res.rows?._array).to.eql([]); - }); - }); + [id, name, age, networth] + ) + tx.rollback() + const res = db.execute('SELECT * FROM User') + expect(res.rows?._array).to.eql([]) + }) + }) it('Transaction, rejects on callback error', async () => { - const promised = db.transaction(tx => { - throw new Error('Error from callback'); - }); + const promised = db.transaction((tx) => { + throw new Error('Error from callback') + }) // ASSERT: should return a promise that eventually rejects - expect(promised).to.have.property('then').that.is.a('function'); + expect(promised).to.have.property('then').that.is.a('function') try { - await promised; - expect.fail('Should not resolve'); + await promised + expect.fail('Should not resolve') } catch (e) { - expect(e).to.be.a.instanceof(Error); - expect((e as Error)?.message).to.equal('Error from callback'); + expect(e).to.be.a.instanceof(Error) + expect((e as Error)?.message).to.equal('Error from callback') } - }); + }) it('Transaction, rejects on invalid query', async () => { - const promised = db.transaction(tx => { - console.log('execute bad start'); - tx.execute('SELECT * FROM [tableThatDoesNotExist];'); - console.log('execute bad done'); - }); + const promised = db.transaction((tx) => { + console.log('execute bad start') + tx.execute('SELECT * FROM [tableThatDoesNotExist];') + console.log('execute bad done') + }) // ASSERT: should return a promise that eventually rejects - expect(promised).to.have.property('then').that.is.a('function'); + expect(promised).to.have.property('then').that.is.a('function') try { - await promised; - expect.fail('Should not resolve'); + await promised + expect.fail('Should not resolve') } catch (e) { - expect(e).to.be.a.instanceof(Error); + expect(e).to.be.a.instanceof(Error) expect((e as Error)?.message).to.include( - 'no such table: tableThatDoesNotExist', - ); + 'no such table: tableThatDoesNotExist' + ) } - }); + }) it('Transaction, handle async callback', async () => { - let ranCallback = false; - const promised = db.transaction(async tx => { - await new Promise(done => { - setTimeout(() => done(), 50); - }); - tx.execute('SELECT * FROM [User];'); - ranCallback = true; - }); + let ranCallback = false + const promised = db.transaction(async (tx) => { + await new Promise((done) => { + setTimeout(() => done(), 50) + }) + tx.execute('SELECT * FROM [User];') + ranCallback = true + }) // ASSERT: should return a promise that eventually rejects - expect(promised).to.have.property('then').that.is.a('function'); - await promised; - expect(ranCallback).to.equal(true, 'Should handle async callback'); - }); + expect(promised).to.have.property('then').that.is.a('function') + await promised + expect(ranCallback).to.equal(true, 'Should handle async callback') + }) it('Async transaction, auto commit', async () => { - const id = chance.integer(); - const name = chance.name(); - const age = chance.integer(); - const networth = chance.floating(); + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() - await db.transaction(async tx => { + await db.transaction(async (tx) => { const res = await tx.executeAsync( 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth], - ); - - expect(res.rowsAffected).to.equal(1); - expect(res.insertId).to.equal(1); - expect(res.metadata).to.eql([]); - expect(res.rows?._array).to.eql([]); - expect(res.rows?.length).to.equal(0); - expect(res.rows?.item).to.be.a('function'); - }); - - const res = db.execute('SELECT * FROM User'); + [id, name, age, networth] + ) + + expect(res.rowsAffected).to.equal(1) + expect(res.insertId).to.equal(1) + expect(res.metadata).to.eql([]) + expect(res.rows?._array).to.eql([]) + expect(res.rows?.length).to.equal(0) + expect(res.rows?.item).to.be.a('function') + }) + + const res = db.execute('SELECT * FROM User') expect(res.rows?._array).to.eql([ { id, @@ -408,48 +408,48 @@ export function registerBaseTests() { age, networth, }, - ]); - }); + ]) + }) it('Async transaction, auto rollback', async () => { - const id = chance.string(); // Causes error because it should be an integer - const name = chance.name(); - const age = chance.integer(); - const networth = chance.floating(); + const id = chance.string() // Causes error because it should be an integer + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() try { - await db.transaction(async tx => { + await db.transaction(async (tx) => { await tx.executeAsync( 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth], - ); - }); + [id, name, age, networth] + ) + }) } catch (error) { - expect(error).to.be.instanceOf(Error); + expect(error).to.be.instanceOf(Error) expect((error as Error).message) .to.include('SQL execution error') - .and.to.include('cannot store TEXT value in INT column User.id'); + .and.to.include('cannot store TEXT value in INT column User.id') - const res = db.execute('SELECT * FROM User'); - expect(res.rows?._array).to.eql([]); + const res = db.execute('SELECT * FROM User') + expect(res.rows?._array).to.eql([]) } - }); + }) it('Async transaction, manual commit', async () => { - const id = chance.integer(); - const name = chance.name(); - const age = chance.integer(); - const networth = chance.floating(); + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() - await db.transaction(async tx => { + await db.transaction(async (tx) => { await tx.executeAsync( 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth], - ); - tx.commit(); - }); + [id, name, age, networth] + ) + tx.commit() + }) - const res = db.execute('SELECT * FROM User'); + const res = db.execute('SELECT * FROM User') expect(res.rows?._array).to.eql([ { id, @@ -457,41 +457,41 @@ export function registerBaseTests() { age, networth, }, - ]); - }); + ]) + }) it('Async transaction, manual rollback', async () => { - const id = chance.integer(); - const name = chance.name(); - const age = chance.integer(); - const networth = chance.floating(); + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() - await db.transaction(async tx => { + await db.transaction(async (tx) => { await tx.executeAsync( 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth], - ); - tx.rollback(); - }); + [id, name, age, networth] + ) + tx.rollback() + }) - const res = db.execute('SELECT * FROM User'); - expect(res.rows?._array).to.eql([]); - }); + const res = db.execute('SELECT * FROM User') + expect(res.rows?._array).to.eql([]) + }) it('Async transaction, executed in order', async () => { // ARRANGE: Setup for multiple transactions - const iterations = 10; - const actual: unknown[] = []; + const iterations = 10 + const actual: unknown[] = [] // ARRANGE: Generate expected data - const id = chance.integer(); - const name = chance.name(); - const age = chance.integer(); + const id = chance.integer() + const name = chance.name() + const age = chance.integer() // ACT: Start multiple async transactions to upsert and select the same record - const promises = []; + const promises = [] for (let iteration = 1; iteration <= iterations; iteration++) { - const promised = db.transaction(async tx => { + const promised = db.transaction(async (tx) => { // ACT: Upsert statement to create record / increment the value await tx.executeAsync( ` @@ -503,78 +503,78 @@ export function registerBaseTests() { WHERE [id] = ? ), 0) `, - [id, name, age, id], - ); + [id, name, age, id] + ) // ACT: Select statement to get incremented value and store it for checking later const results = await tx.executeAsync( 'SELECT [networth] FROM [User] WHERE [id] = ?', - [id], - ); + [id] + ) - actual.push(results.rows?._array[0].networth); - }); + actual.push(results.rows?._array[0].networth) + }) - promises.push(promised); + promises.push(promised) } // ACT: Wait for all transactions to complete - await Promise.all(promises); + await Promise.all(promises) // ASSERT: That the expected values where returned const expected = Array(iterations) .fill(0) - .map((_, index) => index * 1000); + .map((_, index) => index * 1000) expect(actual).to.eql( expected, - 'Each transaction should read a different value', - ); - }); + 'Each transaction should read a different value' + ) + }) it('Async transaction, rejects on callback error', async () => { - const promised = db.transaction(async tx => { - throw new Error('Error from callback'); - }); + const promised = db.transaction(async (tx) => { + throw new Error('Error from callback') + }) // ASSERT: should return a promise that eventually rejects - expect(promised).to.have.property('then').that.is.a('function'); + expect(promised).to.have.property('then').that.is.a('function') try { - await promised; - expect.fail('Should not resolve'); + await promised + expect.fail('Should not resolve') } catch (e) { - expect(e).to.be.a.instanceof(Error); - expect((e as Error)?.message).to.equal('Error from callback'); + expect(e).to.be.a.instanceof(Error) + expect((e as Error)?.message).to.equal('Error from callback') } - }); + }) it('Async transaction, rejects on invalid query', async () => { - const promised = db.transaction(async tx => { - await tx.executeAsync('SELECT * FROM [tableThatDoesNotExist];'); - }); + const promised = db.transaction(async (tx) => { + await tx.executeAsync('SELECT * FROM [tableThatDoesNotExist];') + }) // ASSERT: should return a promise that eventually rejects - expect(promised).to.have.property('then').that.is.a('function'); + expect(promised).to.have.property('then').that.is.a('function') try { - await promised; - expect.fail('Should not resolve'); + await promised + expect.fail('Should not resolve') } catch (e) { - expect(e).to.be.a.instanceof(Error); + expect(e).to.be.a.instanceof(Error) expect((e as Error)?.message).to.include( - 'no such table: tableThatDoesNotExist', - ); + 'no such table: tableThatDoesNotExist' + ) } - }); + }) it('Batch execute', () => { - const id1 = chance.integer(); - const name1 = chance.name(); - const age1 = chance.integer(); - const networth1 = chance.floating(); + const id1 = chance.integer() + const name1 = chance.name() + const age1 = chance.integer() + const networth1 = chance.floating() - const id2 = chance.integer(); - const name2 = chance.name(); - const age2 = chance.integer(); - const networth2 = chance.floating(); + const id2 = chance.integer() + const name2 = chance.name() + const age2 = chance.integer() + const networth2 = chance.floating() const commands: SQLBatchTuple[] = [ [ @@ -585,32 +585,32 @@ export function registerBaseTests() { 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', [id2, name2, age2, networth2], ], - ]; + ] - db.executeBatch(commands); + db.executeBatch(commands) - const res = db.execute('SELECT * FROM User'); + const res = db.execute('SELECT * FROM User') expect(res.rows?._array).to.eql([ - {id: id1, name: name1, age: age1, networth: networth1}, + { id: id1, name: name1, age: age1, networth: networth1 }, { id: id2, name: name2, age: age2, networth: networth2, }, - ]); - }); + ]) + }) it('Async batch execute', async () => { - const id1 = chance.integer(); - const name1 = chance.name(); - const age1 = chance.integer(); - const networth1 = chance.floating(); + const id1 = chance.integer() + const name1 = chance.name() + const age1 = chance.integer() + const networth1 = chance.floating() - const id2 = chance.integer(); - const name2 = chance.name(); - const age2 = chance.integer(); - const networth2 = chance.floating(); + const id2 = chance.integer() + const name2 = chance.name() + const age2 = chance.integer() + const networth2 = chance.floating() const commands: SQLBatchTuple[] = [ [ @@ -621,20 +621,20 @@ export function registerBaseTests() { 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', [id2, name2, age2, networth2], ], - ]; + ] - await db.executeBatchAsync(commands); + await db.executeBatchAsync(commands) - const res = db.execute('SELECT * FROM User'); + const res = db.execute('SELECT * FROM User') expect(res.rows?._array).to.eql([ - {id: id1, name: name1, age: age1, networth: networth1}, + { id: id1, name: name1, age: age1, networth: networth1 }, { id: id2, name: name2, age: age2, networth: networth2, }, - ]); - }); - }); + ]) + }) + }) } diff --git a/example/src/tests/typeorm.spec.ts b/example/src/tests/typeorm.spec.ts index 811bc879..b7d9f14e 100644 --- a/example/src/tests/typeorm.spec.ts +++ b/example/src/tests/typeorm.spec.ts @@ -1,15 +1,15 @@ -import {DataSource, Repository} from 'typeorm'; -import {beforeAll, beforeEach, it, describe} from './MochaRNAdapter'; -import {typeORMDriver} from 'react-native-quick-sqlite'; -import {User} from '../model/User'; -import {Book} from '../model/Book'; -import chai from 'chai'; +import { DataSource, Repository } from 'typeorm' +import { beforeAll, beforeEach, it, describe } from './MochaRNAdapter' +import { typeORMDriver } from 'react-native-quick-sqlite' +import { User } from '../model/User' +import { Book } from '../model/Book' +import chai from 'chai' -let expect = chai.expect; +let expect = chai.expect -let dataSource: DataSource; -let userRepository: Repository; -let bookRepository: Repository; +let dataSource: DataSource +let userRepository: Repository +let bookRepository: Repository export function registerTypeORMTests() { describe('Typeorm tests', () => { @@ -21,28 +21,28 @@ export function registerTypeORMTests() { driver: typeORMDriver, entities: [User, Book], synchronize: true, - }); + }) dataSource .initialize() .then(() => { - userRepository = dataSource.getRepository(User); - bookRepository = dataSource.getRepository(Book); - done(); + userRepository = dataSource.getRepository(User) + bookRepository = dataSource.getRepository(Book) + done() }) - .catch(e => { - console.error('error initializing typeORM datasource', e); - throw e; - }); - }); + .catch((e) => { + console.error('error initializing typeORM datasource', e) + throw e + }) + }) beforeEach(async () => { - await userRepository.clear(); - await bookRepository.clear(); - }); + await userRepository.clear() + await bookRepository.clear() + }) it('basic test', async () => { - expect(1).to.equal(2); - }); - }); + expect(1).to.equal(2) + }) + }) } From 70cce45e90c15fcc0b488634553f81f51add9159 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 4 Sep 2024 23:53:52 +0200 Subject: [PATCH 035/156] fix: ts --- src/specs/QueryResult.nitro.ts | 20 ++++++++++---------- src/specs/QuickSQLite.nitro.ts | 28 ++++++++++++++-------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/specs/QueryResult.nitro.ts b/src/specs/QueryResult.nitro.ts index 6fb7a238..5a9bf023 100644 --- a/src/specs/QueryResult.nitro.ts +++ b/src/specs/QueryResult.nitro.ts @@ -1,16 +1,16 @@ -import { HybridObject } from 'react-native-nitro-modules'; +import { HybridObject } from 'react-native-nitro-modules' export interface SelectQueryResult extends HybridObject<{ ios: 'c++'; android: 'c++' }> { /** * Query metadata, avaliable only for select query results */ - metadata?: ColumnMetadata[]; + metadata?: ColumnMetadata[] - getString(): string; - getNumber(): number; - getBoolean(): boolean; - getArrayBuffer(): ArrayBuffer; + getString(): string + getNumber(): number + getBoolean(): boolean + getArrayBuffer(): ArrayBuffer } type ColumnType = @@ -20,7 +20,7 @@ type ColumnType = | 'INT64' | 'DOUBLE' | 'BOOLEAN' - | 'ARRAY_BUFFER'; + | 'ARRAY_BUFFER' // | 'null' // | 'string' // | 'number' @@ -33,10 +33,10 @@ type ColumnType = */ export interface ColumnMetadata { /** The name used for this column for this resultset */ - columnName: string; + columnName: string /** The declared column type for this column, when fetched directly from a table or a View resulting from a table column. "UNKNOWN" for dynamic values, like function returned ones. */ - columnDeclaredType: ColumnType; + columnDeclaredType: ColumnType /** * The index for this column for this resultset*/ - columnIndex: number; + columnIndex: number } diff --git a/src/specs/QuickSQLite.nitro.ts b/src/specs/QuickSQLite.nitro.ts index f2389705..bb9e89f7 100644 --- a/src/specs/QuickSQLite.nitro.ts +++ b/src/specs/QuickSQLite.nitro.ts @@ -1,4 +1,4 @@ -import { HybridObject } from 'react-native-nitro-modules'; +import { HybridObject } from 'react-native-nitro-modules' import { QueryResult, BatchQueryResult, @@ -6,35 +6,35 @@ import { SQLBatchTuple, Transaction, ExecuteParams, -} from '../types'; +} from '../types' export interface QuickSQLite extends HybridObject<{ ios: 'c++'; android: 'c++' }> { - open(dbName: string, location?: string): void; - close(dbName: string): void; - delete(dbName: string, location?: string): void; + open(dbName: string, location?: string): void + close(dbName: string): void + delete(dbName: string, location?: string): void attach( mainDbName: string, dbNameToAttach: string, alias: string, location?: string - ): void; - detach(mainDbName: string, alias: string): void; + ): void + detach(mainDbName: string, alias: string): void transaction( dbName: string, fn: (tx: Transaction) => Promise | void - ): Promise; - execute(dbName: string, query: string, params?: ExecuteParams): QueryResult; + ): Promise + execute(dbName: string, query: string, params?: ExecuteParams): QueryResult executeAsync( dbName: string, query: string, params?: ExecuteParams - ): Promise; - executeBatch(dbName: string, commands: SQLBatchTuple[]): BatchQueryResult; + ): Promise + executeBatch(dbName: string, commands: SQLBatchTuple[]): BatchQueryResult executeBatchAsync( dbName: string, commands: SQLBatchTuple[] - ): Promise; - loadFile(dbName: string, location: string): FileLoadResult; - loadFileAsync(dbName: string, location: string): Promise; + ): Promise + loadFile(dbName: string, location: string): FileLoadResult + loadFileAsync(dbName: string, location: string): Promise } From 638fb8e8de8cc45628bac83344215a4a431f3b95 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Thu, 5 Sep 2024 14:54:02 +0200 Subject: [PATCH 036/156] remove unnecessary JSI files --- cpp/OnLoad.cpp | 40 +++++++++++++++++++++++++--- cpp/bindings.cpp | 39 ---------------------------- cpp/bindings.h | 11 -------- ios/QuickSQLite.h | 8 ------ ios/QuickSQLite.mm | 65 ---------------------------------------------- 5 files changed, 36 insertions(+), 127 deletions(-) delete mode 100644 cpp/bindings.cpp delete mode 100644 cpp/bindings.h delete mode 100644 ios/QuickSQLite.h delete mode 100644 ios/QuickSQLite.mm diff --git a/cpp/OnLoad.cpp b/cpp/OnLoad.cpp index caeb19ef..e1bdfa2f 100644 --- a/cpp/OnLoad.cpp +++ b/cpp/OnLoad.cpp @@ -1,19 +1,51 @@ #include +#include "HybridQuickSQLiteSpec.hpp" +#include "HybridSelectQueryResultSpec.hpp" +#include "sqliteBridge.h" + +using namespace margelo::nitro; + +void clearState() { + sqliteCloseAll(); +} + // Call this at app startup to register the HybridObjects -void load() { +void registerHybridObjectConstructors() { HybridObjectRegistry::registerHybridObjectConstructor("QuickSQLite", []() -> std::shared_ptr { return std::make_shared(); }); - HybridObjectRegistry::registerHybridObjectConstructor("QueryResult", []() -> std::shared_ptr { - return std::make_shared(); + HybridObjectRegistry::registerHybridObjectConstructor("SelectQueryResult", []() -> std::shared_ptr { + return std::make_shared(); }); } class OnLoad { public: OnLoad() { - load(); + registerHybridObjectConstructors(); + + // Get appGroupID value from Info.plist using key "AppGroup" + NSString *appGroupID = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"ReactNativeQuickSQLite_AppGroup"]; + NSString *documentPath; + + if (appGroupID != nil) { + // Get the app groups container storage url + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSURL *storeUrl = [fileManager containerURLForSecurityApplicationGroupIdentifier:appGroupID]; + + if (storeUrl == nil) { + NSLog(@"Invalid AppGroup ID provided (%@). Check the value of \"AppGroup\" in your Info.plist file", appGroupID); + return @false; + } + NSLog(@"Configured with AppGroup ID: %@", appGroupID); + + documentPath = [storeUrl path]; + } else { + // Get iOS app's document directory (to safely store database .sqlite3 file) + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true); + documentPath = [paths objectAtIndex:0]; + } } }; diff --git a/cpp/bindings.cpp b/cpp/bindings.cpp deleted file mode 100644 index 3fcce4cf..00000000 --- a/cpp/bindings.cpp +++ /dev/null @@ -1,39 +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 -#include -#include -#include "QuickSQLite.hpp" - -using namespace std; -using namespace facebook; - -namespace margelo { - -void clearState() { - sqliteCloseAll(); -} - -void load() { - margelo::nitro::HybridObjectRegistry::registerHybridObjectConstructor( - "QuickSQLite", - []() -> std::shared_ptr { - return std::make_shared(); - } - ); -} - -void install(jsi::Runtime &rt, std::shared_ptr jsCallInvoker, const char *docPath) -{ - load(); -} - -} diff --git a/cpp/bindings.h b/cpp/bindings.h deleted file mode 100644 index 2cc23043..00000000 --- a/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/ios/QuickSQLite.h b/ios/QuickSQLite.h deleted file mode 100644 index 3276c8f0..00000000 --- a/ios/QuickSQLite.h +++ /dev/null @@ -1,8 +0,0 @@ -#import -#import - -@interface QuickSQLite : NSObject - -@property(nonatomic, assign) BOOL setBridgeOnMainQueue; - -@end diff --git a/ios/QuickSQLite.mm b/ios/QuickSQLite.mm deleted file mode 100644 index 519f31a0..00000000 --- a/ios/QuickSQLite.mm +++ /dev/null @@ -1,65 +0,0 @@ -#import "QuickSQLite.h" - -#import - -#import -#import -#import - -#import "../cpp/bindings.h" - -@implementation QuickSQLite - -RCT_EXPORT_MODULE(QuickSQLite) - - -RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install) { - NSLog(@"Installing QuickSQLite module..."); - - RCTBridge *bridge = [RCTBridge currentBridge]; - RCTCxxBridge *cxxBridge = (RCTCxxBridge *)bridge; - if (cxxBridge == nil) { - return @false; - } - - using namespace facebook; - - auto jsiRuntime = (jsi::Runtime *)cxxBridge.runtime; - if (jsiRuntime == nil) { - return @false; - } - auto &runtime = *jsiRuntime; - auto callInvoker = bridge.jsCallInvoker; - - // Get appGroupID value from Info.plist using key "AppGroup" - NSString *appGroupID = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"ReactNativeQuickSQLite_AppGroup"]; - NSString *documentPath; - - if (appGroupID != nil) { - // Get the app groups container storage url - NSFileManager *fileManager = [NSFileManager defaultManager]; - NSURL *storeUrl = [fileManager containerURLForSecurityApplicationGroupIdentifier:appGroupID]; - - if (storeUrl == nil) { - NSLog(@"Invalid AppGroup ID provided (%@). Check the value of \"AppGroup\" in your Info.plist file", appGroupID); - return @false; - } - NSLog(@"Configured with AppGroup ID: %@", appGroupID); - - documentPath = [storeUrl path]; - } else { - // Get iOS app's document directory (to safely store database .sqlite3 file) - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true); - documentPath = [paths objectAtIndex:0]; - } - - osp::install(runtime, callInvoker, [documentPath UTF8String]); - return @true; -} - -- (void)invalidate { - osp::clearState(); -} - - -@end From 71765f87430aaa2b040fb473d0b5fe41c5cca1fd Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Thu, 5 Sep 2024 14:54:48 +0200 Subject: [PATCH 037/156] fix: CPP headers not found --- RNQuickSQLite.podspec | 4 ++-- example/ios/Podfile.lock | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/RNQuickSQLite.podspec b/RNQuickSQLite.podspec index 44513124..07859f72 100644 --- a/RNQuickSQLite.podspec +++ b/RNQuickSQLite.podspec @@ -10,7 +10,7 @@ Pod::Spec.new do |s| s.license = package["license"] s.authors = package["author"] - s.platforms = { :ios => "10.0" } + s.platforms = { :ios => min_ios_version_supported } s.source = { :git => "https://github.com/margelo/react-native-quick-sqlite.git", :tag => "#{s.version}" } s.pod_target_xcconfig = { @@ -21,7 +21,7 @@ Pod::Spec.new do |s| 'CLANG_CXX_LIBRARY' => 'libc++' } - s.header_mappings_dir = "cpp" + # s.header_mappings_dir = "cpp" s.source_files = "ios/**/*.{h,hpp,m,mm}", "cpp/**/*.{h,cpp,c}" load 'nitrogen/generated/ios/RNQuickSQLite+autolinking.rb' diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 4c73609e..35d39e4b 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -1809,7 +1809,7 @@ SPEC CHECKSUMS: React-utils: 81a715d9c0a2a49047e77a86f3a2247408540deb ReactCodegen: 4eedb2fdd079174d6fc3c80b1cccafbe4ff1be8d ReactCommon: 6ef348087d250257c44c0204461c03f036650e9b - RNQuickSQLite: 29e32154e56d68f7899153b238227552d0c8ec8d + RNQuickSQLite: c3e822c842d346edb9abbb20f9f57687d0468ca5 SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d Yoga: a1d7895431387402a674fd0d1c04ec85e87909b8 From 8c322392c249a7eb71f8eb507d2ff3ac5dcb3e8c Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Thu, 5 Sep 2024 15:53:07 +0200 Subject: [PATCH 038/156] fix: onload and spec initialization --- RNQuickSQLite.podspec | 2 +- cpp/OnLoad.cpp | 45 ++++++--------------------------- cpp/OnLoad.hpp | 15 +++++++++++ cpp/specs/QuickSQLite.cpp | 11 +++----- cpp/specs/QuickSQLite.hpp | 17 ++++++++++--- cpp/specs/SelectQueryResult.cpp | 5 ++++ cpp/specs/SelectQueryResult.hpp | 34 +++++++++++++++++++++++++ ios/OnLoad.mm | 44 ++++++++++++++++++++++++++++++++ 8 files changed, 123 insertions(+), 50 deletions(-) create mode 100644 cpp/OnLoad.hpp create mode 100644 cpp/specs/SelectQueryResult.cpp create mode 100644 cpp/specs/SelectQueryResult.hpp create mode 100644 ios/OnLoad.mm diff --git a/RNQuickSQLite.podspec b/RNQuickSQLite.podspec index 07859f72..2e90def3 100644 --- a/RNQuickSQLite.podspec +++ b/RNQuickSQLite.podspec @@ -22,7 +22,7 @@ Pod::Spec.new do |s| } # s.header_mappings_dir = "cpp" - s.source_files = "ios/**/*.{h,hpp,m,mm}", "cpp/**/*.{h,cpp,c}" + s.source_files = "ios/**/*.{h,hpp,m,mm}", "cpp/**/*.{h,hpp,c,cpp}" load 'nitrogen/generated/ios/RNQuickSQLite+autolinking.rb' add_nitrogen_files(s) diff --git a/cpp/OnLoad.cpp b/cpp/OnLoad.cpp index e1bdfa2f..20b56e73 100644 --- a/cpp/OnLoad.cpp +++ b/cpp/OnLoad.cpp @@ -1,7 +1,6 @@ -#include -#include "HybridQuickSQLiteSpec.hpp" -#include "HybridSelectQueryResultSpec.hpp" -#include "sqliteBridge.h" +#include "OnLoad.hpp" +#include "specs/QuickSQLite.hpp" +#include "specs/SelectQueryResult.hpp" using namespace margelo::nitro; @@ -9,44 +8,16 @@ void clearState() { sqliteCloseAll(); } - // Call this at app startup to register the HybridObjects void registerHybridObjectConstructors() { HybridObjectRegistry::registerHybridObjectConstructor("QuickSQLite", []() -> std::shared_ptr { - return std::make_shared(); + return std::make_shared(); }); HybridObjectRegistry::registerHybridObjectConstructor("SelectQueryResult", []() -> std::shared_ptr { - return std::make_shared(); + return std::make_shared(); }); } -class OnLoad { -public: - OnLoad() { - registerHybridObjectConstructors(); - - // Get appGroupID value from Info.plist using key "AppGroup" - NSString *appGroupID = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"ReactNativeQuickSQLite_AppGroup"]; - NSString *documentPath; - - if (appGroupID != nil) { - // Get the app groups container storage url - NSFileManager *fileManager = [NSFileManager defaultManager]; - NSURL *storeUrl = [fileManager containerURLForSecurityApplicationGroupIdentifier:appGroupID]; - - if (storeUrl == nil) { - NSLog(@"Invalid AppGroup ID provided (%@). Check the value of \"AppGroup\" in your Info.plist file", appGroupID); - return @false; - } - NSLog(@"Configured with AppGroup ID: %@", appGroupID); - - documentPath = [storeUrl path]; - } else { - // Get iOS app's document directory (to safely store database .sqlite3 file) - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true); - documentPath = [paths objectAtIndex:0]; - } - } -}; - -static OnLoad onLoad; +// OnLoad::OnLoad() { +// registerHybridObjectConstructors(); +// } diff --git a/cpp/OnLoad.hpp b/cpp/OnLoad.hpp new file mode 100644 index 00000000..5c441d30 --- /dev/null +++ b/cpp/OnLoad.hpp @@ -0,0 +1,15 @@ +#include +#include "HybridQuickSQLiteSpec.hpp" +#include "HybridSelectQueryResultSpec.hpp" +#include "sqliteBridge.h" + +void clearState(); + +void registerHybridObjectConstructors(); + +// class OnLoad { +// public: +// OnLoad() +// }; + +// static OnLoad onLoad; diff --git a/cpp/specs/QuickSQLite.cpp b/cpp/specs/QuickSQLite.cpp index bf2068b4..205ca739 100644 --- a/cpp/specs/QuickSQLite.cpp +++ b/cpp/specs/QuickSQLite.cpp @@ -1,12 +1,14 @@ #include "QuickSQLite.hpp" +using namespace margelo::nitro; + QuickSQLite::QuickSQLite() : margelo::nitro::HybridObject(TAG) {} void QuickSQLite::open(std::string dbName, std::optional location) { std::string tempDocPath = std::string(docPathStr); if (location) { tempDocPath = tempDocPath + "/" + *location; - }esli + } SQLiteOPResult result = sqliteOpenDb(dbName, tempDocPath); @@ -15,10 +17,3 @@ void QuickSQLite::open(std::string dbName, std::optional location) throw std::runtime_error(result.errorMessage.c_str()); } } - -void QuickSQLite::loadHybridMethods() { - HybridObject::loadHybridMethods(); - registerHybrids(this, [](margelo::nitro::Prototype& prototype) { - prototype.registerHybridMethod("open", &QuickSQLite::open); - }); -} diff --git a/cpp/specs/QuickSQLite.hpp b/cpp/specs/QuickSQLite.hpp index 7cb46836..707df3c4 100644 --- a/cpp/specs/QuickSQLite.hpp +++ b/cpp/specs/QuickSQLite.hpp @@ -15,18 +15,27 @@ namespace margelo::nitro::rnquicksqlite { class QuickSQLite: public HybridQuickSQLiteSpec { private: - string docPathStr; + static std::string docPathStr; + std::shared_ptr pool = std::make_shared(); public: + static void setDocPath(std::string docPath) { + docPathStr = docPath; + } + explicit QuickSQLite(); void open(std::string dbName, std::optional location); -public: - void loadHybridMethods() override; + void loadHybridMethods() override { + HybridObject::loadHybridMethods(); + registerHybrids(this, [](margelo::nitro::Prototype& prototype) { + prototype.registerHybridMethod("open", &QuickSQLite::open); + }); + } private: - static constexpr auto TAG = "QuickSQLite"; + static constexpr auto TAG = "QuickSQLite"; }; } diff --git a/cpp/specs/SelectQueryResult.cpp b/cpp/specs/SelectQueryResult.cpp new file mode 100644 index 00000000..7ba48fbd --- /dev/null +++ b/cpp/specs/SelectQueryResult.cpp @@ -0,0 +1,5 @@ +#include "SelectQueryResult.hpp" + +using namespace margelo::nitro; + +SelectQueryResult::SelectQueryResult() : margelo::nitro::HybridObject(TAG) {} diff --git a/cpp/specs/SelectQueryResult.hpp b/cpp/specs/SelectQueryResult.hpp new file mode 100644 index 00000000..f2d8a873 --- /dev/null +++ b/cpp/specs/SelectQueryResult.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include "sqliteBridge.h" +#include "logs.h" +#include "sqlfileloader.h" +#include "sqlbatchexecutor.h" +#include +#include +#include "macros.h" +#include +#include +#include "HybridQuickSQLiteSpec.hpp" + +namespace margelo::nitro::rnquicksqlite { + +class SelectQueryResult: public HybridQuickSQLiteSpec { +public: + + explicit SelectQueryResult(); + + // void open(std::string dbName, std::optional location); + + // void loadHybridMethods() override { + // HybridObject::loadHybridMethods(); + // registerHybrids(this, [](margelo::nitro::Prototype& prototype) { + // prototype.registerHybridMethod("open", &QuickSQLite::open); + // }); + // } + +private: + static constexpr auto TAG = "SelectQueryResult"; +}; + +} diff --git a/ios/OnLoad.mm b/ios/OnLoad.mm new file mode 100644 index 00000000..baf47cb4 --- /dev/null +++ b/ios/OnLoad.mm @@ -0,0 +1,44 @@ +#import +#import "RNQuickSQLite-Swift-Cxx-Umbrella.hpp" +#import "OnLoad.hpp" +#import "QuickSQLite.hpp" + +@interface OnLoad : NSObject +@end + +@implementation OnLoad + +using namespace margelo::nitro; +using namespace margelo::nitro::rnquicksqlite; + ++ (void)load { + registerHybridObjectConstructors(); + + // Get appGroupID value from Info.plist using key "AppGroup" + NSString *appGroupID = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"ReactNativeQuickSQLite_AppGroup"]; + NSString *documentPath; + + if (appGroupID != nil) { + // Get the app groups container storage url + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSURL *storeUrl = [fileManager containerURLForSecurityApplicationGroupIdentifier:appGroupID]; + + if (storeUrl == nil) { + NSLog(@"Invalid AppGroup ID provided (%@). Check the value of \"AppGroup\" in your Info.plist file", appGroupID); + @throw [NSException exceptionWithName:@"SQLiteInitializationException" + reason:@"Error while initializing SQLite database (AppGroup)" + userInfo:nil]; + } + NSLog(@"Configured with AppGroup ID: %@", appGroupID); + + documentPath = [storeUrl path]; + } else { + // Get iOS app's document directory (to safely store database .sqlite3 file) + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true); + documentPath = [paths objectAtIndex:0]; + } + + QuickSQLite::setDocPath([documentPath UTF8String]); +} + +@end From 74a29bdeb197ad860c4bd1b0d1b006729295e5e3 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Thu, 5 Sep 2024 15:53:13 +0200 Subject: [PATCH 039/156] update specs --- nitrogen/generated/android/RNQuickSQLite+autolinking.cmake | 2 +- nitrogen/generated/android/RNQuickSQLite+autolinking.gradle | 2 +- nitrogen/generated/ios/RNQuickSQLite+autolinking.rb | 2 +- nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp | 2 +- nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 2 +- nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp | 2 +- nitrogen/generated/shared/c++/BatchQueryResult.hpp | 2 +- nitrogen/generated/shared/c++/ColumnMetadata.hpp | 2 +- nitrogen/generated/shared/c++/ColumnType.hpp | 2 +- nitrogen/generated/shared/c++/FileLoadResult.hpp | 2 +- nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp | 2 +- nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp | 2 +- nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp | 2 +- nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp | 2 +- nitrogen/generated/shared/c++/QueryResult.hpp | 2 +- nitrogen/generated/shared/c++/QueryType.hpp | 2 +- nitrogen/generated/shared/c++/Transaction.hpp | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake index 0e76ee28..e5c5c632 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake @@ -1,6 +1,6 @@ # # RNQuickSQLite+autolinking.cmake -# Wed Sep 04 2024 +# Thu Sep 05 2024 # This file was generated by nitrogen. DO NOT MODIFY THIS FILE. # https://github.com/mrousavy/nitro # Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle b/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle index e40b751b..feeb0a51 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle @@ -1,6 +1,6 @@ /// /// RNQuickSQLite+autolinking.gradle -/// Wed Sep 04 2024 +/// Thu Sep 05 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb b/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb index 35e76648..9e6c581f 100644 --- a/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb +++ b/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb @@ -1,6 +1,6 @@ # # RNQuickSQLite+autolinking.rb -# Wed Sep 04 2024 +# Thu Sep 05 2024 # This file was generated by nitrogen. DO NOT MODIFY THIS FILE. # https://github.com/mrousavy/nitro # Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp index 4edd702a..ee9112f8 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Bridge.cpp -/// Wed Sep 04 2024 +/// Thu Sep 05 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index 00e52daf..bd9b4664 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Bridge.hpp -/// Wed Sep 04 2024 +/// Thu Sep 05 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp index a16ed5aa..a308f589 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Umbrella.hpp -/// Wed Sep 04 2024 +/// Thu Sep 05 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/BatchQueryResult.hpp b/nitrogen/generated/shared/c++/BatchQueryResult.hpp index 0a83039c..142aec76 100644 --- a/nitrogen/generated/shared/c++/BatchQueryResult.hpp +++ b/nitrogen/generated/shared/c++/BatchQueryResult.hpp @@ -1,6 +1,6 @@ /// /// BatchQueryResult.hpp -/// Wed Sep 04 2024 +/// Thu Sep 05 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/ColumnMetadata.hpp b/nitrogen/generated/shared/c++/ColumnMetadata.hpp index cf9c7083..277704ec 100644 --- a/nitrogen/generated/shared/c++/ColumnMetadata.hpp +++ b/nitrogen/generated/shared/c++/ColumnMetadata.hpp @@ -1,6 +1,6 @@ /// /// ColumnMetadata.hpp -/// Wed Sep 04 2024 +/// Thu Sep 05 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/ColumnType.hpp b/nitrogen/generated/shared/c++/ColumnType.hpp index 35269daf..081d4455 100644 --- a/nitrogen/generated/shared/c++/ColumnType.hpp +++ b/nitrogen/generated/shared/c++/ColumnType.hpp @@ -1,6 +1,6 @@ /// /// ColumnType.hpp -/// Wed Sep 04 2024 +/// Thu Sep 05 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/FileLoadResult.hpp b/nitrogen/generated/shared/c++/FileLoadResult.hpp index 2100b3f2..552499db 100644 --- a/nitrogen/generated/shared/c++/FileLoadResult.hpp +++ b/nitrogen/generated/shared/c++/FileLoadResult.hpp @@ -1,6 +1,6 @@ /// /// FileLoadResult.hpp -/// Wed Sep 04 2024 +/// Thu Sep 05 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp index e09b3b5e..4b463314 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp @@ -1,6 +1,6 @@ /// /// HybridQuickSQLiteSpec.cpp -/// Wed Sep 04 2024 +/// Thu Sep 05 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp index 7f988cea..018db2a9 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp @@ -1,6 +1,6 @@ /// /// HybridQuickSQLiteSpec.hpp -/// Wed Sep 04 2024 +/// Thu Sep 05 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp index 8bace2e2..53bf3813 100644 --- a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp @@ -1,6 +1,6 @@ /// /// HybridSelectQueryResultSpec.cpp -/// Wed Sep 04 2024 +/// Thu Sep 05 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp index 4bd99369..31dc9bc5 100644 --- a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp @@ -1,6 +1,6 @@ /// /// HybridSelectQueryResultSpec.hpp -/// Wed Sep 04 2024 +/// Thu Sep 05 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/QueryResult.hpp b/nitrogen/generated/shared/c++/QueryResult.hpp index 30096674..00243140 100644 --- a/nitrogen/generated/shared/c++/QueryResult.hpp +++ b/nitrogen/generated/shared/c++/QueryResult.hpp @@ -1,6 +1,6 @@ /// /// QueryResult.hpp -/// Wed Sep 04 2024 +/// Thu Sep 05 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/QueryType.hpp b/nitrogen/generated/shared/c++/QueryType.hpp index 32f26a97..adfdc9e3 100644 --- a/nitrogen/generated/shared/c++/QueryType.hpp +++ b/nitrogen/generated/shared/c++/QueryType.hpp @@ -1,6 +1,6 @@ /// /// QueryType.hpp -/// Wed Sep 04 2024 +/// Thu Sep 05 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/Transaction.hpp b/nitrogen/generated/shared/c++/Transaction.hpp index 8cb27783..849413c2 100644 --- a/nitrogen/generated/shared/c++/Transaction.hpp +++ b/nitrogen/generated/shared/c++/Transaction.hpp @@ -1,6 +1,6 @@ /// /// Transaction.hpp -/// Wed Sep 04 2024 +/// Thu Sep 05 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo From 5078cfaa2251dafb0edb7e6745bf321d1970b9e5 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Thu, 5 Sep 2024 17:14:08 +0200 Subject: [PATCH 040/156] rename delete function --- nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp | 2 +- nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp index 4b463314..4ddf3f35 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp @@ -17,7 +17,7 @@ namespace margelo::nitro::rnquicksqlite { registerHybrids(this, [](Prototype& prototype) { prototype.registerHybridMethod("open", &HybridQuickSQLiteSpec::open); prototype.registerHybridMethod("close", &HybridQuickSQLiteSpec::close); - prototype.registerHybridMethod("delete", &HybridQuickSQLiteSpec::delete); + prototype.registerHybridMethod("drop", &HybridQuickSQLiteSpec::drop); prototype.registerHybridMethod("attach", &HybridQuickSQLiteSpec::attach); prototype.registerHybridMethod("detach", &HybridQuickSQLiteSpec::detach); prototype.registerHybridMethod("transaction", &HybridQuickSQLiteSpec::transaction); diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp index 018db2a9..fc5f5e2e 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp @@ -68,7 +68,7 @@ namespace margelo::nitro::rnquicksqlite { // Methods virtual void open(const std::string& dbName, const std::optional& location) = 0; virtual void close(const std::string& dbName) = 0; - virtual void delete(const std::string& dbName, const std::optional& location) = 0; + virtual void drop(const std::string& dbName, const std::optional& location) = 0; virtual void attach(const std::string& mainDbName, const std::string& dbNameToAttach, const std::string& alias, const std::optional& location) = 0; virtual void detach(const std::string& mainDbName, const std::string& alias) = 0; virtual std::future transaction(const std::string& dbName, const std::function>(const Transaction& /* tx */)>& fn) = 0; From 6a548da83658c9e9af5ade8e68c6d68c9eda2e5a Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 6 Sep 2024 01:12:21 +0200 Subject: [PATCH 041/156] fix: OnLoad and use generated specs --- cpp/OnLoad.cpp | 8 +++--- cpp/OnLoad.hpp | 2 ++ cpp/specs/HybridQuickSQLiteSpec.cpp | 32 +++++++++++++++++++++ cpp/specs/HybridSelectQueryResult.cpp | 3 ++ cpp/specs/QuickSQLite.cpp | 19 ------------- cpp/specs/QuickSQLite.hpp | 41 --------------------------- cpp/specs/SelectQueryResult.cpp | 5 ---- cpp/specs/SelectQueryResult.hpp | 34 ---------------------- ios/OnLoad.mm | 35 +++++++++++------------ 9 files changed, 58 insertions(+), 121 deletions(-) create mode 100644 cpp/specs/HybridQuickSQLiteSpec.cpp create mode 100644 cpp/specs/HybridSelectQueryResult.cpp delete mode 100644 cpp/specs/QuickSQLite.cpp delete mode 100644 cpp/specs/QuickSQLite.hpp delete mode 100644 cpp/specs/SelectQueryResult.cpp delete mode 100644 cpp/specs/SelectQueryResult.hpp diff --git a/cpp/OnLoad.cpp b/cpp/OnLoad.cpp index 20b56e73..f2b70157 100644 --- a/cpp/OnLoad.cpp +++ b/cpp/OnLoad.cpp @@ -1,6 +1,6 @@ #include "OnLoad.hpp" -#include "specs/QuickSQLite.hpp" -#include "specs/SelectQueryResult.hpp" +#include "HybridQuickSQLiteSpec.hpp" +#include "HybridSelectQueryResultSpec.hpp" using namespace margelo::nitro; @@ -11,10 +11,10 @@ void clearState() { // Call this at app startup to register the HybridObjects void registerHybridObjectConstructors() { HybridObjectRegistry::registerHybridObjectConstructor("QuickSQLite", []() -> std::shared_ptr { - return std::make_shared(); + return std::make_shared(); }); HybridObjectRegistry::registerHybridObjectConstructor("SelectQueryResult", []() -> std::shared_ptr { - return std::make_shared(); + return std::make_shared(); }); } diff --git a/cpp/OnLoad.hpp b/cpp/OnLoad.hpp index 5c441d30..147d055c 100644 --- a/cpp/OnLoad.hpp +++ b/cpp/OnLoad.hpp @@ -3,6 +3,8 @@ #include "HybridSelectQueryResultSpec.hpp" #include "sqliteBridge.h" +std::string docPathStr; + void clearState(); void registerHybridObjectConstructors(); diff --git a/cpp/specs/HybridQuickSQLiteSpec.cpp b/cpp/specs/HybridQuickSQLiteSpec.cpp new file mode 100644 index 00000000..2307267d --- /dev/null +++ b/cpp/specs/HybridQuickSQLiteSpec.cpp @@ -0,0 +1,32 @@ +#include "sqliteBridge.h" +#include "logs.h" +#include "JSIHelper.h" +#include "ThreadPool.h" +#include "sqlfileloader.h" +#include "sqlbatchexecutor.h" +#include +#include +#include "macros.h" +#include +#include "HybridQuickSQLiteSpec.hpp" +#include "OnLoad.hpp" + +using namespace margelo::nitro; + +namespace margelo::nitro::rnquicksqlite { + +void HybridQuickSQLiteSpec::open(const std::string& dbName, const std::optional& location) { + std::string tempDocPath = std::string(docPathStr); + if (location) { + tempDocPath = tempDocPath + "/" + *location; + } + + SQLiteOPResult result = sqliteOpenDb(dbName, tempDocPath); + + if (result.type == SQLiteError) + { + throw std::runtime_error(result.errorMessage.c_str()); + } +} + +} diff --git a/cpp/specs/HybridSelectQueryResult.cpp b/cpp/specs/HybridSelectQueryResult.cpp new file mode 100644 index 00000000..7990d031 --- /dev/null +++ b/cpp/specs/HybridSelectQueryResult.cpp @@ -0,0 +1,3 @@ +#include "HybridSelectQueryResultSpec.hpp" + +using namespace margelo::nitro; diff --git a/cpp/specs/QuickSQLite.cpp b/cpp/specs/QuickSQLite.cpp deleted file mode 100644 index 205ca739..00000000 --- a/cpp/specs/QuickSQLite.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "QuickSQLite.hpp" - -using namespace margelo::nitro; - -QuickSQLite::QuickSQLite() : margelo::nitro::HybridObject(TAG) {} - -void QuickSQLite::open(std::string dbName, std::optional location) { - std::string tempDocPath = std::string(docPathStr); - if (location) { - tempDocPath = tempDocPath + "/" + *location; - } - - SQLiteOPResult result = sqliteOpenDb(dbName, tempDocPath); - - if (result.type == SQLiteError) - { - throw std::runtime_error(result.errorMessage.c_str()); - } -} diff --git a/cpp/specs/QuickSQLite.hpp b/cpp/specs/QuickSQLite.hpp deleted file mode 100644 index 707df3c4..00000000 --- a/cpp/specs/QuickSQLite.hpp +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once - -#include "sqliteBridge.h" -#include "logs.h" -#include "sqlfileloader.h" -#include "sqlbatchexecutor.h" -#include -#include -#include "macros.h" -#include -#include -#include "HybridQuickSQLiteSpec.hpp" - -namespace margelo::nitro::rnquicksqlite { - -class QuickSQLite: public HybridQuickSQLiteSpec { -private: - static std::string docPathStr; - std::shared_ptr pool = std::make_shared(); - -public: - static void setDocPath(std::string docPath) { - docPathStr = docPath; - } - - explicit QuickSQLite(); - - void open(std::string dbName, std::optional location); - - void loadHybridMethods() override { - HybridObject::loadHybridMethods(); - registerHybrids(this, [](margelo::nitro::Prototype& prototype) { - prototype.registerHybridMethod("open", &QuickSQLite::open); - }); - } - -private: - static constexpr auto TAG = "QuickSQLite"; -}; - -} diff --git a/cpp/specs/SelectQueryResult.cpp b/cpp/specs/SelectQueryResult.cpp deleted file mode 100644 index 7ba48fbd..00000000 --- a/cpp/specs/SelectQueryResult.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include "SelectQueryResult.hpp" - -using namespace margelo::nitro; - -SelectQueryResult::SelectQueryResult() : margelo::nitro::HybridObject(TAG) {} diff --git a/cpp/specs/SelectQueryResult.hpp b/cpp/specs/SelectQueryResult.hpp deleted file mode 100644 index f2d8a873..00000000 --- a/cpp/specs/SelectQueryResult.hpp +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include "sqliteBridge.h" -#include "logs.h" -#include "sqlfileloader.h" -#include "sqlbatchexecutor.h" -#include -#include -#include "macros.h" -#include -#include -#include "HybridQuickSQLiteSpec.hpp" - -namespace margelo::nitro::rnquicksqlite { - -class SelectQueryResult: public HybridQuickSQLiteSpec { -public: - - explicit SelectQueryResult(); - - // void open(std::string dbName, std::optional location); - - // void loadHybridMethods() override { - // HybridObject::loadHybridMethods(); - // registerHybrids(this, [](margelo::nitro::Prototype& prototype) { - // prototype.registerHybridMethod("open", &QuickSQLite::open); - // }); - // } - -private: - static constexpr auto TAG = "SelectQueryResult"; -}; - -} diff --git a/ios/OnLoad.mm b/ios/OnLoad.mm index baf47cb4..7da36b81 100644 --- a/ios/OnLoad.mm +++ b/ios/OnLoad.mm @@ -1,7 +1,6 @@ #import #import "RNQuickSQLite-Swift-Cxx-Umbrella.hpp" #import "OnLoad.hpp" -#import "QuickSQLite.hpp" @interface OnLoad : NSObject @end @@ -19,26 +18,26 @@ + (void)load { NSString *documentPath; if (appGroupID != nil) { - // Get the app groups container storage url - NSFileManager *fileManager = [NSFileManager defaultManager]; - NSURL *storeUrl = [fileManager containerURLForSecurityApplicationGroupIdentifier:appGroupID]; - - if (storeUrl == nil) { - NSLog(@"Invalid AppGroup ID provided (%@). Check the value of \"AppGroup\" in your Info.plist file", appGroupID); - @throw [NSException exceptionWithName:@"SQLiteInitializationException" - reason:@"Error while initializing SQLite database (AppGroup)" - userInfo:nil]; - } - NSLog(@"Configured with AppGroup ID: %@", appGroupID); - - documentPath = [storeUrl path]; + // Get the app groups container storage url + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSURL *storeUrl = [fileManager containerURLForSecurityApplicationGroupIdentifier:appGroupID]; + + if (storeUrl == nil) { + NSLog(@"Invalid AppGroup ID provided (%@). Check the value of \"AppGroup\" in your Info.plist file", appGroupID); + @throw [NSException exceptionWithName:@"SQLiteInitializationException" + reason:@"Error while initializing SQLite database (AppGroup)" + userInfo:nil]; + } + NSLog(@"Configured with AppGroup ID: %@", appGroupID); + + documentPath = [storeUrl path]; } else { - // Get iOS app's document directory (to safely store database .sqlite3 file) - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true); - documentPath = [paths objectAtIndex:0]; + // Get iOS app's document directory (to safely store database .sqlite3 file) + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true); + documentPath = [paths objectAtIndex:0]; } - QuickSQLite::setDocPath([documentPath UTF8String]); + docPathStr = [documentPath UTF8String]; } @end From 9a2585c149536f76a0a85512b139c7b85862a589 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 6 Sep 2024 01:12:35 +0200 Subject: [PATCH 042/156] update generated files --- nitrogen/generated/android/RNQuickSQLite+autolinking.cmake | 2 +- nitrogen/generated/android/RNQuickSQLite+autolinking.gradle | 2 +- nitrogen/generated/ios/RNQuickSQLite+autolinking.rb | 2 +- nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp | 2 +- nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 2 +- nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp | 2 +- nitrogen/generated/shared/c++/BatchQueryResult.hpp | 2 +- nitrogen/generated/shared/c++/ColumnMetadata.hpp | 2 +- nitrogen/generated/shared/c++/ColumnType.hpp | 2 +- nitrogen/generated/shared/c++/FileLoadResult.hpp | 2 +- nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp | 2 +- nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp | 2 +- nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp | 2 +- nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp | 2 +- nitrogen/generated/shared/c++/QueryResult.hpp | 2 +- nitrogen/generated/shared/c++/QueryType.hpp | 2 +- nitrogen/generated/shared/c++/Transaction.hpp | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake index e5c5c632..64a54f46 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake @@ -1,6 +1,6 @@ # # RNQuickSQLite+autolinking.cmake -# Thu Sep 05 2024 +# Fri Sep 06 2024 # This file was generated by nitrogen. DO NOT MODIFY THIS FILE. # https://github.com/mrousavy/nitro # Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle b/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle index feeb0a51..a71c98b5 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle @@ -1,6 +1,6 @@ /// /// RNQuickSQLite+autolinking.gradle -/// Thu Sep 05 2024 +/// Fri Sep 06 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb b/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb index 9e6c581f..303122f5 100644 --- a/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb +++ b/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb @@ -1,6 +1,6 @@ # # RNQuickSQLite+autolinking.rb -# Thu Sep 05 2024 +# Fri Sep 06 2024 # This file was generated by nitrogen. DO NOT MODIFY THIS FILE. # https://github.com/mrousavy/nitro # Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp index ee9112f8..34c931e8 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Bridge.cpp -/// Thu Sep 05 2024 +/// Fri Sep 06 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index bd9b4664..89477110 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Bridge.hpp -/// Thu Sep 05 2024 +/// Fri Sep 06 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp index a308f589..0c56ed1b 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Umbrella.hpp -/// Thu Sep 05 2024 +/// Fri Sep 06 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/BatchQueryResult.hpp b/nitrogen/generated/shared/c++/BatchQueryResult.hpp index 142aec76..bdbb2331 100644 --- a/nitrogen/generated/shared/c++/BatchQueryResult.hpp +++ b/nitrogen/generated/shared/c++/BatchQueryResult.hpp @@ -1,6 +1,6 @@ /// /// BatchQueryResult.hpp -/// Thu Sep 05 2024 +/// Fri Sep 06 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/ColumnMetadata.hpp b/nitrogen/generated/shared/c++/ColumnMetadata.hpp index 277704ec..d9796b05 100644 --- a/nitrogen/generated/shared/c++/ColumnMetadata.hpp +++ b/nitrogen/generated/shared/c++/ColumnMetadata.hpp @@ -1,6 +1,6 @@ /// /// ColumnMetadata.hpp -/// Thu Sep 05 2024 +/// Fri Sep 06 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/ColumnType.hpp b/nitrogen/generated/shared/c++/ColumnType.hpp index 081d4455..2c74c484 100644 --- a/nitrogen/generated/shared/c++/ColumnType.hpp +++ b/nitrogen/generated/shared/c++/ColumnType.hpp @@ -1,6 +1,6 @@ /// /// ColumnType.hpp -/// Thu Sep 05 2024 +/// Fri Sep 06 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/FileLoadResult.hpp b/nitrogen/generated/shared/c++/FileLoadResult.hpp index 552499db..221f42f8 100644 --- a/nitrogen/generated/shared/c++/FileLoadResult.hpp +++ b/nitrogen/generated/shared/c++/FileLoadResult.hpp @@ -1,6 +1,6 @@ /// /// FileLoadResult.hpp -/// Thu Sep 05 2024 +/// Fri Sep 06 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp index 4ddf3f35..ea61995b 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp @@ -1,6 +1,6 @@ /// /// HybridQuickSQLiteSpec.cpp -/// Thu Sep 05 2024 +/// Fri Sep 06 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp index fc5f5e2e..c0698bf2 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp @@ -1,6 +1,6 @@ /// /// HybridQuickSQLiteSpec.hpp -/// Thu Sep 05 2024 +/// Fri Sep 06 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp index 53bf3813..066a52de 100644 --- a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp @@ -1,6 +1,6 @@ /// /// HybridSelectQueryResultSpec.cpp -/// Thu Sep 05 2024 +/// Fri Sep 06 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp index 31dc9bc5..96a456c9 100644 --- a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp @@ -1,6 +1,6 @@ /// /// HybridSelectQueryResultSpec.hpp -/// Thu Sep 05 2024 +/// Fri Sep 06 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/QueryResult.hpp b/nitrogen/generated/shared/c++/QueryResult.hpp index 00243140..445ece5d 100644 --- a/nitrogen/generated/shared/c++/QueryResult.hpp +++ b/nitrogen/generated/shared/c++/QueryResult.hpp @@ -1,6 +1,6 @@ /// /// QueryResult.hpp -/// Thu Sep 05 2024 +/// Fri Sep 06 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/QueryType.hpp b/nitrogen/generated/shared/c++/QueryType.hpp index adfdc9e3..8fe419e4 100644 --- a/nitrogen/generated/shared/c++/QueryType.hpp +++ b/nitrogen/generated/shared/c++/QueryType.hpp @@ -1,6 +1,6 @@ /// /// QueryType.hpp -/// Thu Sep 05 2024 +/// Fri Sep 06 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/Transaction.hpp b/nitrogen/generated/shared/c++/Transaction.hpp index 849413c2..7fc08de4 100644 --- a/nitrogen/generated/shared/c++/Transaction.hpp +++ b/nitrogen/generated/shared/c++/Transaction.hpp @@ -1,6 +1,6 @@ /// /// Transaction.hpp -/// Thu Sep 05 2024 +/// Fri Sep 06 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo From 3d75e2594ebaaf4f3e768875158b2ae1d2fea52c Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 6 Sep 2024 01:13:19 +0200 Subject: [PATCH 043/156] rename internal delete function to drop to avoid keyword clash --- src/index.ts | 4 ++-- src/specs/QuickSQLite.nitro.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/index.ts b/src/index.ts index c2307e3c..809e265f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,7 +12,7 @@ import { export * from './types' const QuickSQLite = - NitroModules.createHybridObject('RNQuickSQLite') + NitroModules.createHybridObject('QuickSQLite') const locks: Record< string, @@ -275,7 +275,7 @@ export const open = (options: { return { close: () => QuickSQLite.close(options.name), - delete: () => QuickSQLite.delete(options.name, options.location), + delete: () => QuickSQLite.drop(options.name, options.location), attach: (dbNameToAttach: string, alias: string, location?: string) => QuickSQLite.attach(options.name, dbNameToAttach, alias, location), detach: (alias: string) => QuickSQLite.detach(options.name, alias), diff --git a/src/specs/QuickSQLite.nitro.ts b/src/specs/QuickSQLite.nitro.ts index bb9e89f7..06250924 100644 --- a/src/specs/QuickSQLite.nitro.ts +++ b/src/specs/QuickSQLite.nitro.ts @@ -12,7 +12,7 @@ export interface QuickSQLite extends HybridObject<{ ios: 'c++'; android: 'c++' }> { open(dbName: string, location?: string): void close(dbName: string): void - delete(dbName: string, location?: string): void + drop(dbName: string, location?: string): void attach( mainDbName: string, dbNameToAttach: string, From 0548315ee3cd3c300eb7e109da302e0426d24050 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 6 Sep 2024 09:26:37 +0200 Subject: [PATCH 044/156] update specs --- .../android/RNQuickSQLite+autolinking.cmake | 1 - .../ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 269 +----------------- .../ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp | 22 +- .../generated/shared/c++/BatchQueryResult.hpp | 69 ----- .../generated/shared/c++/FileLoadResult.hpp | 73 ----- .../shared/c++/HybridQuickSQLiteSpec.cpp | 33 --- .../shared/c++/HybridQuickSQLiteSpec.hpp | 91 ------ nitrogen/generated/shared/c++/QueryResult.hpp | 87 ------ nitrogen/generated/shared/c++/QueryType.hpp | 91 ------ nitrogen/generated/shared/c++/Transaction.hpp | 89 ------ ...lt.nitro.ts => SelectQueryResult.nitro.ts} | 0 11 files changed, 9 insertions(+), 816 deletions(-) delete mode 100644 nitrogen/generated/shared/c++/BatchQueryResult.hpp delete mode 100644 nitrogen/generated/shared/c++/FileLoadResult.hpp delete mode 100644 nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp delete mode 100644 nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp delete mode 100644 nitrogen/generated/shared/c++/QueryResult.hpp delete mode 100644 nitrogen/generated/shared/c++/QueryType.hpp delete mode 100644 nitrogen/generated/shared/c++/Transaction.hpp rename src/specs/{QueryResult.nitro.ts => SelectQueryResult.nitro.ts} (100%) diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake index 64a54f46..da4f4694 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake @@ -26,7 +26,6 @@ target_sources( RNQuickSQLite PRIVATE # Shared Nitrogen C++ sources ../nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp - ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp # Android-specific Nitrogen C++ sources ) diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index 89477110..f54685e1 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -9,37 +9,15 @@ #pragma once // Forward declarations of C++ defined types -// Forward declaration of `ArrayBuffer` to properly resolve imports. -namespace NitroModules { class ArrayBuffer; } -// Forward declaration of `BatchQueryResult` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } // Forward declaration of `ColumnMetadata` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } -// Forward declaration of `FileLoadResult` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } -// Forward declaration of `HybridSelectQueryResultSpec` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } -// Forward declaration of `QueryResult` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct QueryResult; } -// Forward declaration of `Transaction` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct Transaction; } // Include C++ defined types -#include "BatchQueryResult.hpp" #include "ColumnMetadata.hpp" -#include "FileLoadResult.hpp" -#include "HybridSelectQueryResultSpec.hpp" -#include "QueryResult.hpp" -#include "Transaction.hpp" -#include #include -#include #include -#include #include #include -#include -#include #include /** @@ -48,24 +26,6 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction; } */ namespace margelo::nitro::rnquicksqlite::bridge::swift { - /** - * Specialized version of `std::vector`. - */ - using std__vector_ColumnMetadata_ = std::vector; - inline std::vector create_std__vector_ColumnMetadata_(size_t size) { - std::vector vector; - vector.reserve(size); - return vector; - } - - /** - * Specialized version of `std::optional>`. - */ - using std__optional_std__vector_ColumnMetadata__ = std::optional>; - inline std::optional> create_std__optional_std__vector_ColumnMetadata__(const std::vector& value) { - return std::optional>(value); - } - /** * Specialized version of `std::optional`. */ @@ -91,234 +51,21 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { } /** - * Specialized version of `std::optional>`. - */ - using std__optional_std__shared_ptr_margelo__nitro__rnquicksqlite__HybridSelectQueryResultSpec__ = std::optional>; - inline std::optional> create_std__optional_std__shared_ptr_margelo__nitro__rnquicksqlite__HybridSelectQueryResultSpec__(const std::shared_ptr& value) { - return std::optional>(value); - } - - /** - * Specialized version of `std::function()>`. - */ - using Func_std__future_QueryResult_ = std::function()>; - inline Func_std__future_QueryResult_ create_Func_std__future_QueryResult_(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call]() -> std::future { - auto result = call(sharedClosureHolder.get()); - return result.getFuture(); - }; - } - inline std::shared_ptr share_Func_std__future_QueryResult_(const Func_std__future_QueryResult_& value) { - return std::make_shared(value); - } - - /** - * Specialized version of `PromiseHolder`. - */ - using PromiseHolder_QueryResult_ = PromiseHolder; - inline PromiseHolder create_PromiseHolder_QueryResult_() { - return PromiseHolder(); - } - - /** - * Specialized version of `std::variant>`. - */ - using std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ = std::variant>; - inline std::variant> create_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(const std::string& value) { - return value; - } - inline std::variant> create_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(double value) { - return value; - } - inline std::variant> create_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(int64_t value) { - return value; - } - inline std::variant> create_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(bool value) { - return value; - } - inline std::variant> create_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(const std::shared_ptr& value) { - return value; - } - inline std::string get_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___0(const std::variant>& variant) { - return std::get<0>(variant); - } - inline double get_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___1(const std::variant>& variant) { - return std::get<1>(variant); - } - inline int64_t get_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___2(const std::variant>& variant) { - return std::get<2>(variant); - } - inline bool get_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___3(const std::variant>& variant) { - return std::get<3>(variant); - } - inline std::shared_ptr get_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___4(const std::variant>& variant) { - return std::get<4>(variant); - } - - /** - * Specialized version of `std::function(const std::string& / * query * /, const std::variant>& / * params * /)>`. - */ - using Func_std__future_QueryResult__std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ = std::function(const std::string& /* query */, const std::variant>& /* params */)>; - inline Func_std__future_QueryResult__std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ create_Func_std__future_QueryResult__std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, std::string, std::variant>), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& query, const std::variant>& params) -> std::future { - auto result = call(sharedClosureHolder.get(), query, params); - return result.getFuture(); - }; - } - inline std::shared_ptr share_Func_std__future_QueryResult__std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(const Func_std__future_QueryResult__std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__& value) { - return std::make_shared(value); - } - - /** - * Specialized version of `std::function>(const std::string& / * query * /, const std::variant>& / * params * /)>`. - */ - using Func_std__future_std__future_QueryResult___std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ = std::function>(const std::string& /* query */, const std::variant>& /* params */)>; - inline Func_std__future_std__future_QueryResult___std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ create_Func_std__future_std__future_QueryResult___std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, std::string, std::variant>), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& query, const std::variant>& params) -> std::future> { - auto result = call(sharedClosureHolder.get(), query, params); - return result.getFuture(); - }; - } - inline std::shared_ptr share_Func_std__future_std__future_QueryResult___std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(const Func_std__future_std__future_QueryResult___std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__& value) { - return std::make_shared(value); - } - - /** - * Specialized version of `PromiseHolder>`. - */ - using PromiseHolder_std__future_QueryResult__ = PromiseHolder>; - inline PromiseHolder> create_PromiseHolder_std__future_QueryResult__() { - return PromiseHolder>(); - } - - /** - * Specialized version of `std::function>(const Transaction& / * tx * /)>`. - */ - using Func_std__future_std__future_void___Transaction = std::function>(const Transaction& /* tx */)>; - inline Func_std__future_std__future_void___Transaction create_Func_std__future_std__future_void___Transaction(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, Transaction), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const Transaction& tx) -> std::future> { - auto result = call(sharedClosureHolder.get(), tx); - return result.getFuture(); - }; - } - inline std::shared_ptr share_Func_std__future_std__future_void___Transaction(const Func_std__future_std__future_void___Transaction& value) { - return std::make_shared(value); - } - - /** - * Specialized version of `PromiseHolder>`. - */ - using PromiseHolder_std__future_void__ = PromiseHolder>; - inline PromiseHolder> create_PromiseHolder_std__future_void__() { - return PromiseHolder>(); - } - - /** - * Specialized version of `std::optional>>`. - */ - using std__optional_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___ = std::optional>>; - inline std::optional>> create_std__optional_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___(const std::variant>& value) { - return std::optional>>(value); - } - - /** - * Specialized version of `std::tuple`. - */ - using std__tuple_std__string_ = std::tuple; - inline std::tuple create_std__tuple_std__string_(const std::string& arg0) { - return std::tuple { arg0 }; - } - - /** - * Specialized version of `std::vector`. - */ - using std__vector_std__nullptr_t_ = std::vector; - inline std::vector create_std__vector_std__nullptr_t_(size_t size) { - std::vector vector; - vector.reserve(size); - return vector; - } - - /** - * Specialized version of `std::vector>`. - */ - using std__vector_std__vector_std__nullptr_t__ = std::vector>; - inline std::vector> create_std__vector_std__vector_std__nullptr_t__(size_t size) { - std::vector> vector; - vector.reserve(size); - return vector; - } - - /** - * Specialized version of `std::variant, std::vector>>`. - */ - using std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t___ = std::variant, std::vector>>; - inline std::variant, std::vector>> create_std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t___(const std::vector& value) { - return value; - } - inline std::variant, std::vector>> create_std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t___(const std::vector>& value) { - return value; - } - inline std::vector get_std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t____0(const std::variant, std::vector>>& variant) { - return std::get<0>(variant); - } - inline std::vector> get_std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t____1(const std::variant, std::vector>>& variant) { - return std::get<1>(variant); - } - - /** - * Specialized version of `std::tuple, std::vector>>>`. - */ - using std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t____ = std::tuple, std::vector>>>; - inline std::tuple, std::vector>>> create_std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t____(const std::string& arg0, const std::variant, std::vector>>& arg1) { - return std::tuple, std::vector>>> { arg0, arg1 }; - } - - /** - * Specialized version of `std::variant, std::tuple, std::vector>>>>`. - */ - using std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t_____ = std::variant, std::tuple, std::vector>>>>; - inline std::variant, std::tuple, std::vector>>>> create_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t_____(const std::tuple& value) { - return value; - } - inline std::variant, std::tuple, std::vector>>>> create_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t_____(const std::tuple, std::vector>>>& value) { - return value; - } - inline std::tuple get_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______0(const std::variant, std::tuple, std::vector>>>>& variant) { - return std::get<0>(variant); - } - inline std::tuple, std::vector>>> get_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______1(const std::variant, std::tuple, std::vector>>>>& variant) { - return std::get<1>(variant); - } - - /** - * Specialized version of `std::vector, std::tuple, std::vector>>>>>`. + * Specialized version of `std::vector`. */ - using std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______ = std::vector, std::tuple, std::vector>>>>>; - inline std::vector, std::tuple, std::vector>>>>> create_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______(size_t size) { - std::vector, std::tuple, std::vector>>>>> vector; + using std__vector_ColumnMetadata_ = std::vector; + inline std::vector create_std__vector_ColumnMetadata_(size_t size) { + std::vector vector; vector.reserve(size); return vector; } /** - * Specialized version of `PromiseHolder`. - */ - using PromiseHolder_BatchQueryResult_ = PromiseHolder; - inline PromiseHolder create_PromiseHolder_BatchQueryResult_() { - return PromiseHolder(); - } - - /** - * Specialized version of `PromiseHolder`. + * Specialized version of `std::optional>`. */ - using PromiseHolder_FileLoadResult_ = PromiseHolder; - inline PromiseHolder create_PromiseHolder_FileLoadResult_() { - return PromiseHolder(); + using std__optional_std__vector_ColumnMetadata__ = std::optional>; + inline std::optional> create_std__optional_std__vector_ColumnMetadata__(const std::vector& value) { + return std::optional>(value); } } // namespace margelo::nitro::rnquicksqlite::bridge::swift diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp index 0c56ed1b..775444f9 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp @@ -11,40 +11,21 @@ // Forward declarations of C++ defined types // Forward declaration of `ArrayBuffer` to properly resolve imports. namespace NitroModules { class ArrayBuffer; } -// Forward declaration of `BatchQueryResult` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } // Forward declaration of `ColumnMetadata` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } // Forward declaration of `ColumnType` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { enum class ColumnType; } -// Forward declaration of `FileLoadResult` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } -// Forward declaration of `HybridSelectQueryResultSpec` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } -// Forward declaration of `QueryResult` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct QueryResult; } // Forward declaration of `QueryType` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { enum class QueryType; } -// Forward declaration of `Transaction` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct Transaction; } // Include C++ defined types -#include "BatchQueryResult.hpp" #include "ColumnMetadata.hpp" #include "ColumnType.hpp" -#include "FileLoadResult.hpp" -#include "HybridSelectQueryResultSpec.hpp" -#include "QueryResult.hpp" #include "QueryType.hpp" -#include "Transaction.hpp" #include -#include #include -#include #include #include -#include -#include #include // C++ helpers for Swift @@ -57,8 +38,7 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction; } #include // Forward declarations of Swift defined types -// Forward declaration of `HybridSelectQueryResultSpecCxx` to properly resolve imports. -namespace RNQuickSQLite { class HybridSelectQueryResultSpecCxx; } + // Include Swift defined types #if __has_include("RNQuickSQLite-Swift.h") diff --git a/nitrogen/generated/shared/c++/BatchQueryResult.hpp b/nitrogen/generated/shared/c++/BatchQueryResult.hpp deleted file mode 100644 index bdbb2331..00000000 --- a/nitrogen/generated/shared/c++/BatchQueryResult.hpp +++ /dev/null @@ -1,69 +0,0 @@ -/// -/// BatchQueryResult.hpp -/// Fri Sep 06 2024 -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - - - -#include - -namespace margelo::nitro::rnquicksqlite { - - /** - * A struct which can be represented as a JavaScript object (BatchQueryResult). - */ - struct BatchQueryResult { - public: - std::optional rowsAffected SWIFT_PRIVATE; - - public: - explicit BatchQueryResult(std::optional rowsAffected): rowsAffected(rowsAffected) {} - }; - -} // namespace margelo::nitro::rnquicksqlite - -namespace margelo::nitro { - - using namespace margelo::nitro::rnquicksqlite; - - // C++ BatchQueryResult <> JS BatchQueryResult (object) - template <> - struct JSIConverter { - static inline BatchQueryResult fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { - jsi::Object obj = arg.asObject(runtime); - return BatchQueryResult( - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "rowsAffected")) - ); - } - static inline jsi::Value toJSI(jsi::Runtime& runtime, const BatchQueryResult& arg) { - jsi::Object obj(runtime); - obj.setProperty(runtime, "rowsAffected", JSIConverter>::toJSI(runtime, arg.rowsAffected)); - return obj; - } - static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { - if (!value.isObject()) { - return false; - } - jsi::Object obj = value.getObject(runtime); - if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "rowsAffected"))) return false; - return true; - } - }; - -} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/FileLoadResult.hpp b/nitrogen/generated/shared/c++/FileLoadResult.hpp deleted file mode 100644 index 221f42f8..00000000 --- a/nitrogen/generated/shared/c++/FileLoadResult.hpp +++ /dev/null @@ -1,73 +0,0 @@ -/// -/// FileLoadResult.hpp -/// Fri Sep 06 2024 -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - - - -#include - -namespace margelo::nitro::rnquicksqlite { - - /** - * A struct which can be represented as a JavaScript object (FileLoadResult). - */ - struct FileLoadResult { - public: - std::optional commands SWIFT_PRIVATE; - std::optional rowsAffected SWIFT_PRIVATE; - - public: - explicit FileLoadResult(std::optional commands, std::optional rowsAffected): commands(commands), rowsAffected(rowsAffected) {} - }; - -} // namespace margelo::nitro::rnquicksqlite - -namespace margelo::nitro { - - using namespace margelo::nitro::rnquicksqlite; - - // C++ FileLoadResult <> JS FileLoadResult (object) - template <> - struct JSIConverter { - static inline FileLoadResult fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { - jsi::Object obj = arg.asObject(runtime); - return FileLoadResult( - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "commands")), - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "rowsAffected")) - ); - } - static inline jsi::Value toJSI(jsi::Runtime& runtime, const FileLoadResult& arg) { - jsi::Object obj(runtime); - obj.setProperty(runtime, "commands", JSIConverter>::toJSI(runtime, arg.commands)); - obj.setProperty(runtime, "rowsAffected", JSIConverter>::toJSI(runtime, arg.rowsAffected)); - return obj; - } - static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { - if (!value.isObject()) { - return false; - } - jsi::Object obj = value.getObject(runtime); - if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "commands"))) return false; - if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "rowsAffected"))) return false; - return true; - } - }; - -} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp deleted file mode 100644 index ea61995b..00000000 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/// -/// HybridQuickSQLiteSpec.cpp -/// Fri Sep 06 2024 -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#include "HybridQuickSQLiteSpec.hpp" - -namespace margelo::nitro::rnquicksqlite { - - void HybridQuickSQLiteSpec::loadHybridMethods() { - // load base methods/properties - HybridObject::loadHybridMethods(); - // load custom methods/properties - registerHybrids(this, [](Prototype& prototype) { - prototype.registerHybridMethod("open", &HybridQuickSQLiteSpec::open); - prototype.registerHybridMethod("close", &HybridQuickSQLiteSpec::close); - prototype.registerHybridMethod("drop", &HybridQuickSQLiteSpec::drop); - prototype.registerHybridMethod("attach", &HybridQuickSQLiteSpec::attach); - prototype.registerHybridMethod("detach", &HybridQuickSQLiteSpec::detach); - prototype.registerHybridMethod("transaction", &HybridQuickSQLiteSpec::transaction); - prototype.registerHybridMethod("execute", &HybridQuickSQLiteSpec::execute); - prototype.registerHybridMethod("executeAsync", &HybridQuickSQLiteSpec::executeAsync); - prototype.registerHybridMethod("executeBatch", &HybridQuickSQLiteSpec::executeBatch); - prototype.registerHybridMethod("executeBatchAsync", &HybridQuickSQLiteSpec::executeBatchAsync); - prototype.registerHybridMethod("loadFile", &HybridQuickSQLiteSpec::loadFile); - prototype.registerHybridMethod("loadFileAsync", &HybridQuickSQLiteSpec::loadFileAsync); - }); - } - -} // namespace margelo::nitro::rnquicksqlite diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp deleted file mode 100644 index c0698bf2..00000000 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp +++ /dev/null @@ -1,91 +0,0 @@ -/// -/// HybridQuickSQLiteSpec.hpp -/// Fri Sep 06 2024 -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - -// Forward declaration of `Transaction` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct Transaction; } -// Forward declaration of `QueryResult` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct QueryResult; } -// Forward declaration of `ArrayBuffer` to properly resolve imports. -namespace NitroModules { class ArrayBuffer; } -// Forward declaration of `BatchQueryResult` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } -// Forward declaration of `FileLoadResult` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } - -#include -#include -#include -#include -#include "Transaction.hpp" -#include "QueryResult.hpp" -#include -#include -#include "BatchQueryResult.hpp" -#include -#include -#include "FileLoadResult.hpp" - -namespace margelo::nitro::rnquicksqlite { - - using namespace margelo::nitro; - - /** - * An abstract base class for `QuickSQLite` - * Inherit this class to create instances of `HybridQuickSQLiteSpec` in C++. - * @example - * ```cpp - * class HybridQuickSQLite: public HybridQuickSQLiteSpec { - * // ... - * }; - * ``` - */ - class HybridQuickSQLiteSpec: public virtual HybridObject { - public: - // Constructor - explicit HybridQuickSQLiteSpec(): HybridObject(TAG) { } - - // Destructor - virtual ~HybridQuickSQLiteSpec() { } - - public: - // Properties - - - public: - // Methods - virtual void open(const std::string& dbName, const std::optional& location) = 0; - virtual void close(const std::string& dbName) = 0; - virtual void drop(const std::string& dbName, const std::optional& location) = 0; - virtual void attach(const std::string& mainDbName, const std::string& dbNameToAttach, const std::string& alias, const std::optional& location) = 0; - virtual void detach(const std::string& mainDbName, const std::string& alias) = 0; - virtual std::future transaction(const std::string& dbName, const std::function>(const Transaction& /* tx */)>& fn) = 0; - virtual QueryResult execute(const std::string& dbName, const std::string& query, const std::optional>>& params) = 0; - virtual std::future executeAsync(const std::string& dbName, const std::string& query, const std::optional>>& params) = 0; - virtual BatchQueryResult executeBatch(const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) = 0; - virtual std::future executeBatchAsync(const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) = 0; - virtual FileLoadResult loadFile(const std::string& dbName, const std::string& location) = 0; - virtual std::future loadFileAsync(const std::string& dbName, const std::string& location) = 0; - - protected: - // Hybrid Setup - void loadHybridMethods() override; - - protected: - // Tag for logging - static constexpr auto TAG = "QuickSQLite"; - }; - -} // namespace margelo::nitro::rnquicksqlite diff --git a/nitrogen/generated/shared/c++/QueryResult.hpp b/nitrogen/generated/shared/c++/QueryResult.hpp deleted file mode 100644 index 445ece5d..00000000 --- a/nitrogen/generated/shared/c++/QueryResult.hpp +++ /dev/null @@ -1,87 +0,0 @@ -/// -/// QueryResult.hpp -/// Fri Sep 06 2024 -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - -// Forward declaration of `QueryType` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { enum class QueryType; } -// Forward declaration of `HybridSelectQueryResultSpec` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } - -#include "QueryType.hpp" -#include -#include -#include "HybridSelectQueryResultSpec.hpp" - -namespace margelo::nitro::rnquicksqlite { - - /** - * A struct which can be represented as a JavaScript object (QueryResult). - */ - struct QueryResult { - public: - QueryType queryType SWIFT_PRIVATE; - std::optional insertId SWIFT_PRIVATE; - double rowsAffected SWIFT_PRIVATE; - std::optional> selectQueryResult SWIFT_PRIVATE; - - public: - explicit QueryResult(QueryType queryType, std::optional insertId, double rowsAffected, std::optional> selectQueryResult): queryType(queryType), insertId(insertId), rowsAffected(rowsAffected), selectQueryResult(selectQueryResult) {} - }; - -} // namespace margelo::nitro::rnquicksqlite - -namespace margelo::nitro { - - using namespace margelo::nitro::rnquicksqlite; - - // C++ QueryResult <> JS QueryResult (object) - template <> - struct JSIConverter { - static inline QueryResult fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { - jsi::Object obj = arg.asObject(runtime); - return QueryResult( - JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "queryType")), - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "insertId")), - JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "rowsAffected")), - JSIConverter>>::fromJSI(runtime, obj.getProperty(runtime, "selectQueryResult")) - ); - } - static inline jsi::Value toJSI(jsi::Runtime& runtime, const QueryResult& arg) { - jsi::Object obj(runtime); - obj.setProperty(runtime, "queryType", JSIConverter::toJSI(runtime, arg.queryType)); - obj.setProperty(runtime, "insertId", JSIConverter>::toJSI(runtime, arg.insertId)); - obj.setProperty(runtime, "rowsAffected", JSIConverter::toJSI(runtime, arg.rowsAffected)); - obj.setProperty(runtime, "selectQueryResult", JSIConverter>>::toJSI(runtime, arg.selectQueryResult)); - return obj; - } - static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { - if (!value.isObject()) { - return false; - } - jsi::Object obj = value.getObject(runtime); - if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "queryType"))) return false; - if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "insertId"))) return false; - if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "rowsAffected"))) return false; - if (!JSIConverter>>::canConvert(runtime, obj.getProperty(runtime, "selectQueryResult"))) return false; - return true; - } - }; - -} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/QueryType.hpp b/nitrogen/generated/shared/c++/QueryType.hpp deleted file mode 100644 index 8fe419e4..00000000 --- a/nitrogen/generated/shared/c++/QueryType.hpp +++ /dev/null @@ -1,91 +0,0 @@ -/// -/// QueryType.hpp -/// Fri Sep 06 2024 -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - -namespace margelo::nitro::rnquicksqlite { - - /** - * An enum which can be represented as a JavaScript union (QueryType). - */ - enum class QueryType { - SELECT SWIFT_NAME(select) = 0, - INSERT SWIFT_NAME(insert) = 1, - UPDATE SWIFT_NAME(update) = 2, - DELETE SWIFT_NAME(delete) = 3, - OTHER SWIFT_NAME(other) = 4, - } CLOSED_ENUM; - -} // namespace margelo::nitro::rnquicksqlite - -namespace margelo::nitro { - - using namespace margelo::nitro::rnquicksqlite; - - // C++ QueryType <> JS QueryType (union) - template <> - struct JSIConverter { - static inline QueryType fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { - std::string unionValue = JSIConverter::fromJSI(runtime, arg); - switch (hashString(unionValue.c_str(), unionValue.size())) { - case hashString("SELECT"): return QueryType::SELECT; - case hashString("INSERT"): return QueryType::INSERT; - case hashString("UPDATE"): return QueryType::UPDATE; - case hashString("DELETE"): return QueryType::DELETE; - case hashString("OTHER"): return QueryType::OTHER; - default: [[unlikely]] - throw std::runtime_error("Cannot convert \"" + unionValue + "\" to enum QueryType - invalid value!"); - } - } - static inline jsi::Value toJSI(jsi::Runtime& runtime, QueryType arg) { - switch (arg) { - case QueryType::SELECT: return JSIConverter::toJSI(runtime, "SELECT"); - case QueryType::INSERT: return JSIConverter::toJSI(runtime, "INSERT"); - case QueryType::UPDATE: return JSIConverter::toJSI(runtime, "UPDATE"); - case QueryType::DELETE: return JSIConverter::toJSI(runtime, "DELETE"); - case QueryType::OTHER: return JSIConverter::toJSI(runtime, "OTHER"); - default: [[unlikely]] - throw std::runtime_error("Cannot convert QueryType to JS - invalid value: " - + std::to_string(static_cast(arg)) + "!"); - } - } - static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { - if (!value.isString()) { - return false; - } - std::string unionValue = JSIConverter::fromJSI(runtime, value); - switch (hashString(unionValue.c_str(), unionValue.size())) { - case hashString("SELECT"): - case hashString("INSERT"): - case hashString("UPDATE"): - case hashString("DELETE"): - case hashString("OTHER"): - return true; - default: - return false; - } - } - }; - -} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/Transaction.hpp b/nitrogen/generated/shared/c++/Transaction.hpp deleted file mode 100644 index 7fc08de4..00000000 --- a/nitrogen/generated/shared/c++/Transaction.hpp +++ /dev/null @@ -1,89 +0,0 @@ -/// -/// Transaction.hpp -/// Fri Sep 06 2024 -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - -// Forward declaration of `QueryResult` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct QueryResult; } -// Forward declaration of `ArrayBuffer` to properly resolve imports. -namespace NitroModules { class ArrayBuffer; } - -#include -#include -#include "QueryResult.hpp" -#include -#include -#include - -namespace margelo::nitro::rnquicksqlite { - - /** - * A struct which can be represented as a JavaScript object (Transaction). - */ - struct Transaction { - public: - std::function()> commit SWIFT_PRIVATE; - std::function()> rollback SWIFT_PRIVATE; - std::function(const std::string& /* query */, const std::variant>& /* params */)> execute SWIFT_PRIVATE; - std::function>(const std::string& /* query */, const std::variant>& /* params */)> executeAsync SWIFT_PRIVATE; - - public: - explicit Transaction(std::function()> commit, std::function()> rollback, std::function(const std::string& /* query */, const std::variant>& /* params */)> execute, std::function>(const std::string& /* query */, const std::variant>& /* params */)> executeAsync): commit(commit), rollback(rollback), execute(execute), executeAsync(executeAsync) {} - }; - -} // namespace margelo::nitro::rnquicksqlite - -namespace margelo::nitro { - - using namespace margelo::nitro::rnquicksqlite; - - // C++ Transaction <> JS Transaction (object) - template <> - struct JSIConverter { - static inline Transaction fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { - jsi::Object obj = arg.asObject(runtime); - return Transaction( - JSIConverter()>>::fromJSI(runtime, obj.getProperty(runtime, "commit")), - JSIConverter()>>::fromJSI(runtime, obj.getProperty(runtime, "rollback")), - JSIConverter(const std::string& /* query */, const std::variant>& /* params */)>>::fromJSI(runtime, obj.getProperty(runtime, "execute")), - JSIConverter>(const std::string& /* query */, const std::variant>& /* params */)>>::fromJSI(runtime, obj.getProperty(runtime, "executeAsync")) - ); - } - static inline jsi::Value toJSI(jsi::Runtime& runtime, const Transaction& arg) { - jsi::Object obj(runtime); - obj.setProperty(runtime, "commit", JSIConverter()>>::toJSI(runtime, arg.commit)); - obj.setProperty(runtime, "rollback", JSIConverter()>>::toJSI(runtime, arg.rollback)); - obj.setProperty(runtime, "execute", JSIConverter(const std::string& /* query */, const std::variant>& /* params */)>>::toJSI(runtime, arg.execute)); - obj.setProperty(runtime, "executeAsync", JSIConverter>(const std::string& /* query */, const std::variant>& /* params */)>>::toJSI(runtime, arg.executeAsync)); - return obj; - } - static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { - if (!value.isObject()) { - return false; - } - jsi::Object obj = value.getObject(runtime); - if (!JSIConverter()>>::canConvert(runtime, obj.getProperty(runtime, "commit"))) return false; - if (!JSIConverter()>>::canConvert(runtime, obj.getProperty(runtime, "rollback"))) return false; - if (!JSIConverter(const std::string& /* query */, const std::variant>& /* params */)>>::canConvert(runtime, obj.getProperty(runtime, "execute"))) return false; - if (!JSIConverter>(const std::string& /* query */, const std::variant>& /* params */)>>::canConvert(runtime, obj.getProperty(runtime, "executeAsync"))) return false; - return true; - } - }; - -} // namespace margelo::nitro diff --git a/src/specs/QueryResult.nitro.ts b/src/specs/SelectQueryResult.nitro.ts similarity index 100% rename from src/specs/QueryResult.nitro.ts rename to src/specs/SelectQueryResult.nitro.ts From cc4a75dd52ec9d78cc0bcf07fd0874ecd9c5ca27 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 6 Sep 2024 09:28:30 +0200 Subject: [PATCH 045/156] fix: specs --- .../android/RNQuickSQLite+autolinking.cmake | 1 + .../ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 253 ++++++++++++++++++ .../ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp | 22 +- .../generated/shared/c++/BatchQueryResult.hpp | 69 +++++ .../generated/shared/c++/FileLoadResult.hpp | 73 +++++ .../shared/c++/HybridQuickSQLiteSpec.cpp | 33 +++ .../shared/c++/HybridQuickSQLiteSpec.hpp | 91 +++++++ nitrogen/generated/shared/c++/QueryResult.hpp | 87 ++++++ nitrogen/generated/shared/c++/QueryType.hpp | 91 +++++++ nitrogen/generated/shared/c++/Transaction.hpp | 89 ++++++ 10 files changed, 808 insertions(+), 1 deletion(-) create mode 100644 nitrogen/generated/shared/c++/BatchQueryResult.hpp create mode 100644 nitrogen/generated/shared/c++/FileLoadResult.hpp create mode 100644 nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp create mode 100644 nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp create mode 100644 nitrogen/generated/shared/c++/QueryResult.hpp create mode 100644 nitrogen/generated/shared/c++/QueryType.hpp create mode 100644 nitrogen/generated/shared/c++/Transaction.hpp diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake index da4f4694..8a5dc111 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake @@ -25,6 +25,7 @@ target_sources( # CMake project name (Android C++ library name) RNQuickSQLite PRIVATE # Shared Nitrogen C++ sources + ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp ../nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp # Android-specific Nitrogen C++ sources diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index f54685e1..ed44a7e3 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -9,15 +9,37 @@ #pragma once // Forward declarations of C++ defined types +// Forward declaration of `ArrayBuffer` to properly resolve imports. +namespace NitroModules { class ArrayBuffer; } +// Forward declaration of `BatchQueryResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } // Forward declaration of `ColumnMetadata` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } +// Forward declaration of `FileLoadResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } +// Forward declaration of `HybridSelectQueryResultSpec` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } +// Forward declaration of `QueryResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct QueryResult; } +// Forward declaration of `Transaction` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct Transaction; } // Include C++ defined types +#include "BatchQueryResult.hpp" #include "ColumnMetadata.hpp" +#include "FileLoadResult.hpp" +#include "HybridSelectQueryResultSpec.hpp" +#include "QueryResult.hpp" +#include "Transaction.hpp" +#include #include +#include #include +#include #include #include +#include +#include #include /** @@ -50,6 +72,237 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { return std::optional(value); } + /** + * Specialized version of `std::optional>`. + */ + using std__optional_std__shared_ptr_margelo__nitro__rnquicksqlite__HybridSelectQueryResultSpec__ = std::optional>; + inline std::optional> create_std__optional_std__shared_ptr_margelo__nitro__rnquicksqlite__HybridSelectQueryResultSpec__(const std::shared_ptr& value) { + return std::optional>(value); + } + + /** + * Specialized version of `std::function()>`. + */ + using Func_std__future_QueryResult_ = std::function()>; + inline Func_std__future_QueryResult_ create_Func_std__future_QueryResult_(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */), void(*destroy)(void*)) { + std::shared_ptr sharedClosureHolder(closureHolder, destroy); + return [sharedClosureHolder, call]() -> std::future { + auto result = call(sharedClosureHolder.get()); + return result.getFuture(); + }; + } + inline std::shared_ptr share_Func_std__future_QueryResult_(const Func_std__future_QueryResult_& value) { + return std::make_shared(value); + } + + /** + * Specialized version of `PromiseHolder`. + */ + using PromiseHolder_QueryResult_ = PromiseHolder; + inline PromiseHolder create_PromiseHolder_QueryResult_() { + return PromiseHolder(); + } + + /** + * Specialized version of `std::variant>`. + */ + using std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ = std::variant>; + inline std::variant> create_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(const std::string& value) { + return value; + } + inline std::variant> create_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(double value) { + return value; + } + inline std::variant> create_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(int64_t value) { + return value; + } + inline std::variant> create_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(bool value) { + return value; + } + inline std::variant> create_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(const std::shared_ptr& value) { + return value; + } + inline std::string get_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___0(const std::variant>& variant) { + return std::get<0>(variant); + } + inline double get_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___1(const std::variant>& variant) { + return std::get<1>(variant); + } + inline int64_t get_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___2(const std::variant>& variant) { + return std::get<2>(variant); + } + inline bool get_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___3(const std::variant>& variant) { + return std::get<3>(variant); + } + inline std::shared_ptr get_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___4(const std::variant>& variant) { + return std::get<4>(variant); + } + + /** + * Specialized version of `std::function(const std::string& / * query * /, const std::variant>& / * params * /)>`. + */ + using Func_std__future_QueryResult__std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ = std::function(const std::string& /* query */, const std::variant>& /* params */)>; + inline Func_std__future_QueryResult__std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ create_Func_std__future_QueryResult__std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, std::string, std::variant>), void(*destroy)(void*)) { + std::shared_ptr sharedClosureHolder(closureHolder, destroy); + return [sharedClosureHolder, call](const std::string& query, const std::variant>& params) -> std::future { + auto result = call(sharedClosureHolder.get(), query, params); + return result.getFuture(); + }; + } + inline std::shared_ptr share_Func_std__future_QueryResult__std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(const Func_std__future_QueryResult__std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__& value) { + return std::make_shared(value); + } + + /** + * Specialized version of `std::function>(const std::string& / * query * /, const std::variant>& / * params * /)>`. + */ + using Func_std__future_std__future_QueryResult___std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ = std::function>(const std::string& /* query */, const std::variant>& /* params */)>; + inline Func_std__future_std__future_QueryResult___std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ create_Func_std__future_std__future_QueryResult___std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, std::string, std::variant>), void(*destroy)(void*)) { + std::shared_ptr sharedClosureHolder(closureHolder, destroy); + return [sharedClosureHolder, call](const std::string& query, const std::variant>& params) -> std::future> { + auto result = call(sharedClosureHolder.get(), query, params); + return result.getFuture(); + }; + } + inline std::shared_ptr share_Func_std__future_std__future_QueryResult___std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(const Func_std__future_std__future_QueryResult___std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__& value) { + return std::make_shared(value); + } + + /** + * Specialized version of `PromiseHolder>`. + */ + using PromiseHolder_std__future_QueryResult__ = PromiseHolder>; + inline PromiseHolder> create_PromiseHolder_std__future_QueryResult__() { + return PromiseHolder>(); + } + + /** + * Specialized version of `std::function>(const Transaction& / * tx * /)>`. + */ + using Func_std__future_std__future_void___Transaction = std::function>(const Transaction& /* tx */)>; + inline Func_std__future_std__future_void___Transaction create_Func_std__future_std__future_void___Transaction(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, Transaction), void(*destroy)(void*)) { + std::shared_ptr sharedClosureHolder(closureHolder, destroy); + return [sharedClosureHolder, call](const Transaction& tx) -> std::future> { + auto result = call(sharedClosureHolder.get(), tx); + return result.getFuture(); + }; + } + inline std::shared_ptr share_Func_std__future_std__future_void___Transaction(const Func_std__future_std__future_void___Transaction& value) { + return std::make_shared(value); + } + + /** + * Specialized version of `PromiseHolder>`. + */ + using PromiseHolder_std__future_void__ = PromiseHolder>; + inline PromiseHolder> create_PromiseHolder_std__future_void__() { + return PromiseHolder>(); + } + + /** + * Specialized version of `std::optional>>`. + */ + using std__optional_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___ = std::optional>>; + inline std::optional>> create_std__optional_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___(const std::variant>& value) { + return std::optional>>(value); + } + + /** + * Specialized version of `std::tuple`. + */ + using std__tuple_std__string_ = std::tuple; + inline std::tuple create_std__tuple_std__string_(const std::string& arg0) { + return std::tuple { arg0 }; + } + + /** + * Specialized version of `std::vector`. + */ + using std__vector_std__nullptr_t_ = std::vector; + inline std::vector create_std__vector_std__nullptr_t_(size_t size) { + std::vector vector; + vector.reserve(size); + return vector; + } + + /** + * Specialized version of `std::vector>`. + */ + using std__vector_std__vector_std__nullptr_t__ = std::vector>; + inline std::vector> create_std__vector_std__vector_std__nullptr_t__(size_t size) { + std::vector> vector; + vector.reserve(size); + return vector; + } + + /** + * Specialized version of `std::variant, std::vector>>`. + */ + using std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t___ = std::variant, std::vector>>; + inline std::variant, std::vector>> create_std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t___(const std::vector& value) { + return value; + } + inline std::variant, std::vector>> create_std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t___(const std::vector>& value) { + return value; + } + inline std::vector get_std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t____0(const std::variant, std::vector>>& variant) { + return std::get<0>(variant); + } + inline std::vector> get_std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t____1(const std::variant, std::vector>>& variant) { + return std::get<1>(variant); + } + + /** + * Specialized version of `std::tuple, std::vector>>>`. + */ + using std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t____ = std::tuple, std::vector>>>; + inline std::tuple, std::vector>>> create_std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t____(const std::string& arg0, const std::variant, std::vector>>& arg1) { + return std::tuple, std::vector>>> { arg0, arg1 }; + } + + /** + * Specialized version of `std::variant, std::tuple, std::vector>>>>`. + */ + using std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t_____ = std::variant, std::tuple, std::vector>>>>; + inline std::variant, std::tuple, std::vector>>>> create_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t_____(const std::tuple& value) { + return value; + } + inline std::variant, std::tuple, std::vector>>>> create_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t_____(const std::tuple, std::vector>>>& value) { + return value; + } + inline std::tuple get_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______0(const std::variant, std::tuple, std::vector>>>>& variant) { + return std::get<0>(variant); + } + inline std::tuple, std::vector>>> get_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______1(const std::variant, std::tuple, std::vector>>>>& variant) { + return std::get<1>(variant); + } + + /** + * Specialized version of `std::vector, std::tuple, std::vector>>>>>`. + */ + using std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______ = std::vector, std::tuple, std::vector>>>>>; + inline std::vector, std::tuple, std::vector>>>>> create_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______(size_t size) { + std::vector, std::tuple, std::vector>>>>> vector; + vector.reserve(size); + return vector; + } + + /** + * Specialized version of `PromiseHolder`. + */ + using PromiseHolder_BatchQueryResult_ = PromiseHolder; + inline PromiseHolder create_PromiseHolder_BatchQueryResult_() { + return PromiseHolder(); + } + + /** + * Specialized version of `PromiseHolder`. + */ + using PromiseHolder_FileLoadResult_ = PromiseHolder; + inline PromiseHolder create_PromiseHolder_FileLoadResult_() { + return PromiseHolder(); + } + /** * Specialized version of `std::vector`. */ diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp index 775444f9..0c56ed1b 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp @@ -11,21 +11,40 @@ // Forward declarations of C++ defined types // Forward declaration of `ArrayBuffer` to properly resolve imports. namespace NitroModules { class ArrayBuffer; } +// Forward declaration of `BatchQueryResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } // Forward declaration of `ColumnMetadata` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } // Forward declaration of `ColumnType` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { enum class ColumnType; } +// Forward declaration of `FileLoadResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } +// Forward declaration of `HybridSelectQueryResultSpec` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } +// Forward declaration of `QueryResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct QueryResult; } // Forward declaration of `QueryType` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { enum class QueryType; } +// Forward declaration of `Transaction` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct Transaction; } // Include C++ defined types +#include "BatchQueryResult.hpp" #include "ColumnMetadata.hpp" #include "ColumnType.hpp" +#include "FileLoadResult.hpp" +#include "HybridSelectQueryResultSpec.hpp" +#include "QueryResult.hpp" #include "QueryType.hpp" +#include "Transaction.hpp" #include +#include #include +#include #include #include +#include +#include #include // C++ helpers for Swift @@ -38,7 +57,8 @@ namespace margelo::nitro::rnquicksqlite { enum class QueryType; } #include // Forward declarations of Swift defined types - +// Forward declaration of `HybridSelectQueryResultSpecCxx` to properly resolve imports. +namespace RNQuickSQLite { class HybridSelectQueryResultSpecCxx; } // Include Swift defined types #if __has_include("RNQuickSQLite-Swift.h") diff --git a/nitrogen/generated/shared/c++/BatchQueryResult.hpp b/nitrogen/generated/shared/c++/BatchQueryResult.hpp new file mode 100644 index 00000000..bdbb2331 --- /dev/null +++ b/nitrogen/generated/shared/c++/BatchQueryResult.hpp @@ -0,0 +1,69 @@ +/// +/// BatchQueryResult.hpp +/// Fri Sep 06 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + + + +#include + +namespace margelo::nitro::rnquicksqlite { + + /** + * A struct which can be represented as a JavaScript object (BatchQueryResult). + */ + struct BatchQueryResult { + public: + std::optional rowsAffected SWIFT_PRIVATE; + + public: + explicit BatchQueryResult(std::optional rowsAffected): rowsAffected(rowsAffected) {} + }; + +} // namespace margelo::nitro::rnquicksqlite + +namespace margelo::nitro { + + using namespace margelo::nitro::rnquicksqlite; + + // C++ BatchQueryResult <> JS BatchQueryResult (object) + template <> + struct JSIConverter { + static inline BatchQueryResult fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return BatchQueryResult( + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "rowsAffected")) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const BatchQueryResult& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, "rowsAffected", JSIConverter>::toJSI(runtime, arg.rowsAffected)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "rowsAffected"))) return false; + return true; + } + }; + +} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/FileLoadResult.hpp b/nitrogen/generated/shared/c++/FileLoadResult.hpp new file mode 100644 index 00000000..221f42f8 --- /dev/null +++ b/nitrogen/generated/shared/c++/FileLoadResult.hpp @@ -0,0 +1,73 @@ +/// +/// FileLoadResult.hpp +/// Fri Sep 06 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + + + +#include + +namespace margelo::nitro::rnquicksqlite { + + /** + * A struct which can be represented as a JavaScript object (FileLoadResult). + */ + struct FileLoadResult { + public: + std::optional commands SWIFT_PRIVATE; + std::optional rowsAffected SWIFT_PRIVATE; + + public: + explicit FileLoadResult(std::optional commands, std::optional rowsAffected): commands(commands), rowsAffected(rowsAffected) {} + }; + +} // namespace margelo::nitro::rnquicksqlite + +namespace margelo::nitro { + + using namespace margelo::nitro::rnquicksqlite; + + // C++ FileLoadResult <> JS FileLoadResult (object) + template <> + struct JSIConverter { + static inline FileLoadResult fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return FileLoadResult( + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "commands")), + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "rowsAffected")) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const FileLoadResult& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, "commands", JSIConverter>::toJSI(runtime, arg.commands)); + obj.setProperty(runtime, "rowsAffected", JSIConverter>::toJSI(runtime, arg.rowsAffected)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "commands"))) return false; + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "rowsAffected"))) return false; + return true; + } + }; + +} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp new file mode 100644 index 00000000..ea61995b --- /dev/null +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp @@ -0,0 +1,33 @@ +/// +/// HybridQuickSQLiteSpec.cpp +/// Fri Sep 06 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#include "HybridQuickSQLiteSpec.hpp" + +namespace margelo::nitro::rnquicksqlite { + + void HybridQuickSQLiteSpec::loadHybridMethods() { + // load base methods/properties + HybridObject::loadHybridMethods(); + // load custom methods/properties + registerHybrids(this, [](Prototype& prototype) { + prototype.registerHybridMethod("open", &HybridQuickSQLiteSpec::open); + prototype.registerHybridMethod("close", &HybridQuickSQLiteSpec::close); + prototype.registerHybridMethod("drop", &HybridQuickSQLiteSpec::drop); + prototype.registerHybridMethod("attach", &HybridQuickSQLiteSpec::attach); + prototype.registerHybridMethod("detach", &HybridQuickSQLiteSpec::detach); + prototype.registerHybridMethod("transaction", &HybridQuickSQLiteSpec::transaction); + prototype.registerHybridMethod("execute", &HybridQuickSQLiteSpec::execute); + prototype.registerHybridMethod("executeAsync", &HybridQuickSQLiteSpec::executeAsync); + prototype.registerHybridMethod("executeBatch", &HybridQuickSQLiteSpec::executeBatch); + prototype.registerHybridMethod("executeBatchAsync", &HybridQuickSQLiteSpec::executeBatchAsync); + prototype.registerHybridMethod("loadFile", &HybridQuickSQLiteSpec::loadFile); + prototype.registerHybridMethod("loadFileAsync", &HybridQuickSQLiteSpec::loadFileAsync); + }); + } + +} // namespace margelo::nitro::rnquicksqlite diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp new file mode 100644 index 00000000..c0698bf2 --- /dev/null +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp @@ -0,0 +1,91 @@ +/// +/// HybridQuickSQLiteSpec.hpp +/// Fri Sep 06 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +// Forward declaration of `Transaction` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct Transaction; } +// Forward declaration of `QueryResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct QueryResult; } +// Forward declaration of `ArrayBuffer` to properly resolve imports. +namespace NitroModules { class ArrayBuffer; } +// Forward declaration of `BatchQueryResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } +// Forward declaration of `FileLoadResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } + +#include +#include +#include +#include +#include "Transaction.hpp" +#include "QueryResult.hpp" +#include +#include +#include "BatchQueryResult.hpp" +#include +#include +#include "FileLoadResult.hpp" + +namespace margelo::nitro::rnquicksqlite { + + using namespace margelo::nitro; + + /** + * An abstract base class for `QuickSQLite` + * Inherit this class to create instances of `HybridQuickSQLiteSpec` in C++. + * @example + * ```cpp + * class HybridQuickSQLite: public HybridQuickSQLiteSpec { + * // ... + * }; + * ``` + */ + class HybridQuickSQLiteSpec: public virtual HybridObject { + public: + // Constructor + explicit HybridQuickSQLiteSpec(): HybridObject(TAG) { } + + // Destructor + virtual ~HybridQuickSQLiteSpec() { } + + public: + // Properties + + + public: + // Methods + virtual void open(const std::string& dbName, const std::optional& location) = 0; + virtual void close(const std::string& dbName) = 0; + virtual void drop(const std::string& dbName, const std::optional& location) = 0; + virtual void attach(const std::string& mainDbName, const std::string& dbNameToAttach, const std::string& alias, const std::optional& location) = 0; + virtual void detach(const std::string& mainDbName, const std::string& alias) = 0; + virtual std::future transaction(const std::string& dbName, const std::function>(const Transaction& /* tx */)>& fn) = 0; + virtual QueryResult execute(const std::string& dbName, const std::string& query, const std::optional>>& params) = 0; + virtual std::future executeAsync(const std::string& dbName, const std::string& query, const std::optional>>& params) = 0; + virtual BatchQueryResult executeBatch(const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) = 0; + virtual std::future executeBatchAsync(const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) = 0; + virtual FileLoadResult loadFile(const std::string& dbName, const std::string& location) = 0; + virtual std::future loadFileAsync(const std::string& dbName, const std::string& location) = 0; + + protected: + // Hybrid Setup + void loadHybridMethods() override; + + protected: + // Tag for logging + static constexpr auto TAG = "QuickSQLite"; + }; + +} // namespace margelo::nitro::rnquicksqlite diff --git a/nitrogen/generated/shared/c++/QueryResult.hpp b/nitrogen/generated/shared/c++/QueryResult.hpp new file mode 100644 index 00000000..445ece5d --- /dev/null +++ b/nitrogen/generated/shared/c++/QueryResult.hpp @@ -0,0 +1,87 @@ +/// +/// QueryResult.hpp +/// Fri Sep 06 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +// Forward declaration of `QueryType` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { enum class QueryType; } +// Forward declaration of `HybridSelectQueryResultSpec` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } + +#include "QueryType.hpp" +#include +#include +#include "HybridSelectQueryResultSpec.hpp" + +namespace margelo::nitro::rnquicksqlite { + + /** + * A struct which can be represented as a JavaScript object (QueryResult). + */ + struct QueryResult { + public: + QueryType queryType SWIFT_PRIVATE; + std::optional insertId SWIFT_PRIVATE; + double rowsAffected SWIFT_PRIVATE; + std::optional> selectQueryResult SWIFT_PRIVATE; + + public: + explicit QueryResult(QueryType queryType, std::optional insertId, double rowsAffected, std::optional> selectQueryResult): queryType(queryType), insertId(insertId), rowsAffected(rowsAffected), selectQueryResult(selectQueryResult) {} + }; + +} // namespace margelo::nitro::rnquicksqlite + +namespace margelo::nitro { + + using namespace margelo::nitro::rnquicksqlite; + + // C++ QueryResult <> JS QueryResult (object) + template <> + struct JSIConverter { + static inline QueryResult fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return QueryResult( + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "queryType")), + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "insertId")), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "rowsAffected")), + JSIConverter>>::fromJSI(runtime, obj.getProperty(runtime, "selectQueryResult")) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const QueryResult& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, "queryType", JSIConverter::toJSI(runtime, arg.queryType)); + obj.setProperty(runtime, "insertId", JSIConverter>::toJSI(runtime, arg.insertId)); + obj.setProperty(runtime, "rowsAffected", JSIConverter::toJSI(runtime, arg.rowsAffected)); + obj.setProperty(runtime, "selectQueryResult", JSIConverter>>::toJSI(runtime, arg.selectQueryResult)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "queryType"))) return false; + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "insertId"))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "rowsAffected"))) return false; + if (!JSIConverter>>::canConvert(runtime, obj.getProperty(runtime, "selectQueryResult"))) return false; + return true; + } + }; + +} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/QueryType.hpp b/nitrogen/generated/shared/c++/QueryType.hpp new file mode 100644 index 00000000..8fe419e4 --- /dev/null +++ b/nitrogen/generated/shared/c++/QueryType.hpp @@ -0,0 +1,91 @@ +/// +/// QueryType.hpp +/// Fri Sep 06 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +namespace margelo::nitro::rnquicksqlite { + + /** + * An enum which can be represented as a JavaScript union (QueryType). + */ + enum class QueryType { + SELECT SWIFT_NAME(select) = 0, + INSERT SWIFT_NAME(insert) = 1, + UPDATE SWIFT_NAME(update) = 2, + DELETE SWIFT_NAME(delete) = 3, + OTHER SWIFT_NAME(other) = 4, + } CLOSED_ENUM; + +} // namespace margelo::nitro::rnquicksqlite + +namespace margelo::nitro { + + using namespace margelo::nitro::rnquicksqlite; + + // C++ QueryType <> JS QueryType (union) + template <> + struct JSIConverter { + static inline QueryType fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + std::string unionValue = JSIConverter::fromJSI(runtime, arg); + switch (hashString(unionValue.c_str(), unionValue.size())) { + case hashString("SELECT"): return QueryType::SELECT; + case hashString("INSERT"): return QueryType::INSERT; + case hashString("UPDATE"): return QueryType::UPDATE; + case hashString("DELETE"): return QueryType::DELETE; + case hashString("OTHER"): return QueryType::OTHER; + default: [[unlikely]] + throw std::runtime_error("Cannot convert \"" + unionValue + "\" to enum QueryType - invalid value!"); + } + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, QueryType arg) { + switch (arg) { + case QueryType::SELECT: return JSIConverter::toJSI(runtime, "SELECT"); + case QueryType::INSERT: return JSIConverter::toJSI(runtime, "INSERT"); + case QueryType::UPDATE: return JSIConverter::toJSI(runtime, "UPDATE"); + case QueryType::DELETE: return JSIConverter::toJSI(runtime, "DELETE"); + case QueryType::OTHER: return JSIConverter::toJSI(runtime, "OTHER"); + default: [[unlikely]] + throw std::runtime_error("Cannot convert QueryType to JS - invalid value: " + + std::to_string(static_cast(arg)) + "!"); + } + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isString()) { + return false; + } + std::string unionValue = JSIConverter::fromJSI(runtime, value); + switch (hashString(unionValue.c_str(), unionValue.size())) { + case hashString("SELECT"): + case hashString("INSERT"): + case hashString("UPDATE"): + case hashString("DELETE"): + case hashString("OTHER"): + return true; + default: + return false; + } + } + }; + +} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/Transaction.hpp b/nitrogen/generated/shared/c++/Transaction.hpp new file mode 100644 index 00000000..7fc08de4 --- /dev/null +++ b/nitrogen/generated/shared/c++/Transaction.hpp @@ -0,0 +1,89 @@ +/// +/// Transaction.hpp +/// Fri Sep 06 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +// Forward declaration of `QueryResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct QueryResult; } +// Forward declaration of `ArrayBuffer` to properly resolve imports. +namespace NitroModules { class ArrayBuffer; } + +#include +#include +#include "QueryResult.hpp" +#include +#include +#include + +namespace margelo::nitro::rnquicksqlite { + + /** + * A struct which can be represented as a JavaScript object (Transaction). + */ + struct Transaction { + public: + std::function()> commit SWIFT_PRIVATE; + std::function()> rollback SWIFT_PRIVATE; + std::function(const std::string& /* query */, const std::variant>& /* params */)> execute SWIFT_PRIVATE; + std::function>(const std::string& /* query */, const std::variant>& /* params */)> executeAsync SWIFT_PRIVATE; + + public: + explicit Transaction(std::function()> commit, std::function()> rollback, std::function(const std::string& /* query */, const std::variant>& /* params */)> execute, std::function>(const std::string& /* query */, const std::variant>& /* params */)> executeAsync): commit(commit), rollback(rollback), execute(execute), executeAsync(executeAsync) {} + }; + +} // namespace margelo::nitro::rnquicksqlite + +namespace margelo::nitro { + + using namespace margelo::nitro::rnquicksqlite; + + // C++ Transaction <> JS Transaction (object) + template <> + struct JSIConverter { + static inline Transaction fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return Transaction( + JSIConverter()>>::fromJSI(runtime, obj.getProperty(runtime, "commit")), + JSIConverter()>>::fromJSI(runtime, obj.getProperty(runtime, "rollback")), + JSIConverter(const std::string& /* query */, const std::variant>& /* params */)>>::fromJSI(runtime, obj.getProperty(runtime, "execute")), + JSIConverter>(const std::string& /* query */, const std::variant>& /* params */)>>::fromJSI(runtime, obj.getProperty(runtime, "executeAsync")) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const Transaction& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, "commit", JSIConverter()>>::toJSI(runtime, arg.commit)); + obj.setProperty(runtime, "rollback", JSIConverter()>>::toJSI(runtime, arg.rollback)); + obj.setProperty(runtime, "execute", JSIConverter(const std::string& /* query */, const std::variant>& /* params */)>>::toJSI(runtime, arg.execute)); + obj.setProperty(runtime, "executeAsync", JSIConverter>(const std::string& /* query */, const std::variant>& /* params */)>>::toJSI(runtime, arg.executeAsync)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!JSIConverter()>>::canConvert(runtime, obj.getProperty(runtime, "commit"))) return false; + if (!JSIConverter()>>::canConvert(runtime, obj.getProperty(runtime, "rollback"))) return false; + if (!JSIConverter(const std::string& /* query */, const std::variant>& /* params */)>>::canConvert(runtime, obj.getProperty(runtime, "execute"))) return false; + if (!JSIConverter>(const std::string& /* query */, const std::variant>& /* params */)>>::canConvert(runtime, obj.getProperty(runtime, "executeAsync"))) return false; + return true; + } + }; + +} // namespace margelo::nitro From 5f732ba305a16fbd264408c8c3a5613856329974 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 6 Sep 2024 10:06:19 +0200 Subject: [PATCH 046/156] udpate specs --- .../ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 42 ++++++++++++------- .../shared/c++/HybridQuickSQLiteSpec.hpp | 6 +-- nitrogen/generated/shared/c++/Transaction.hpp | 19 +++++---- src/types.ts | 4 +- 4 files changed, 41 insertions(+), 30 deletions(-) diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index ed44a7e3..a2a82c9f 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -139,33 +139,43 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { } /** - * Specialized version of `std::function(const std::string& / * query * /, const std::variant>& / * params * /)>`. + * Specialized version of `std::vector>>`. */ - using Func_std__future_QueryResult__std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ = std::function(const std::string& /* query */, const std::variant>& /* params */)>; - inline Func_std__future_QueryResult__std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ create_Func_std__future_QueryResult__std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, std::string, std::variant>), void(*destroy)(void*)) { + using std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___ = std::vector>>; + inline std::vector>> create_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___(size_t size) { + std::vector>> vector; + vector.reserve(size); + return vector; + } + + /** + * Specialized version of `std::function(const std::string& / * query * /, const std::vector>>& / * params * /)>`. + */ + using Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___ = std::function(const std::string& /* query */, const std::vector>>& /* params */)>; + inline Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___ create_Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, std::string, std::vector>>), void(*destroy)(void*)) { std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& query, const std::variant>& params) -> std::future { + return [sharedClosureHolder, call](const std::string& query, const std::vector>>& params) -> std::future { auto result = call(sharedClosureHolder.get(), query, params); return result.getFuture(); }; } - inline std::shared_ptr share_Func_std__future_QueryResult__std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(const Func_std__future_QueryResult__std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__& value) { - return std::make_shared(value); + inline std::shared_ptr share_Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___(const Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___& value) { + return std::make_shared(value); } /** - * Specialized version of `std::function>(const std::string& / * query * /, const std::variant>& / * params * /)>`. + * Specialized version of `std::function>(const std::string& / * query * /, const std::vector>>& / * params * /)>`. */ - using Func_std__future_std__future_QueryResult___std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ = std::function>(const std::string& /* query */, const std::variant>& /* params */)>; - inline Func_std__future_std__future_QueryResult___std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__ create_Func_std__future_std__future_QueryResult___std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, std::string, std::variant>), void(*destroy)(void*)) { + using Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___ = std::function>(const std::string& /* query */, const std::vector>>& /* params */)>; + inline Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___ create_Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, std::string, std::vector>>), void(*destroy)(void*)) { std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& query, const std::variant>& params) -> std::future> { + return [sharedClosureHolder, call](const std::string& query, const std::vector>>& params) -> std::future> { auto result = call(sharedClosureHolder.get(), query, params); return result.getFuture(); }; } - inline std::shared_ptr share_Func_std__future_std__future_QueryResult___std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__(const Func_std__future_std__future_QueryResult___std__string_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer__& value) { - return std::make_shared(value); + inline std::shared_ptr share_Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___(const Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___& value) { + return std::make_shared(value); } /** @@ -200,11 +210,11 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { } /** - * Specialized version of `std::optional>>`. + * Specialized version of `std::optional>>>`. */ - using std__optional_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___ = std::optional>>; - inline std::optional>> create_std__optional_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___(const std::variant>& value) { - return std::optional>>(value); + using std__optional_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____ = std::optional>>>; + inline std::optional>>> create_std__optional_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____(const std::vector>>& value) { + return std::optional>>>(value); } /** diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp index c0698bf2..2aa611db 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp @@ -31,10 +31,10 @@ namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } #include #include "Transaction.hpp" #include "QueryResult.hpp" +#include #include #include #include "BatchQueryResult.hpp" -#include #include #include "FileLoadResult.hpp" @@ -72,8 +72,8 @@ namespace margelo::nitro::rnquicksqlite { virtual void attach(const std::string& mainDbName, const std::string& dbNameToAttach, const std::string& alias, const std::optional& location) = 0; virtual void detach(const std::string& mainDbName, const std::string& alias) = 0; virtual std::future transaction(const std::string& dbName, const std::function>(const Transaction& /* tx */)>& fn) = 0; - virtual QueryResult execute(const std::string& dbName, const std::string& query, const std::optional>>& params) = 0; - virtual std::future executeAsync(const std::string& dbName, const std::string& query, const std::optional>>& params) = 0; + virtual QueryResult execute(const std::string& dbName, const std::string& query, const std::optional>>>& params) = 0; + virtual std::future executeAsync(const std::string& dbName, const std::string& query, const std::optional>>>& params) = 0; virtual BatchQueryResult executeBatch(const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) = 0; virtual std::future executeBatchAsync(const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) = 0; virtual FileLoadResult loadFile(const std::string& dbName, const std::string& location) = 0; diff --git a/nitrogen/generated/shared/c++/Transaction.hpp b/nitrogen/generated/shared/c++/Transaction.hpp index 7fc08de4..48d58afb 100644 --- a/nitrogen/generated/shared/c++/Transaction.hpp +++ b/nitrogen/generated/shared/c++/Transaction.hpp @@ -28,6 +28,7 @@ namespace NitroModules { class ArrayBuffer; } #include #include "QueryResult.hpp" #include +#include #include #include @@ -40,11 +41,11 @@ namespace margelo::nitro::rnquicksqlite { public: std::function()> commit SWIFT_PRIVATE; std::function()> rollback SWIFT_PRIVATE; - std::function(const std::string& /* query */, const std::variant>& /* params */)> execute SWIFT_PRIVATE; - std::function>(const std::string& /* query */, const std::variant>& /* params */)> executeAsync SWIFT_PRIVATE; + std::function(const std::string& /* query */, const std::vector>>& /* params */)> execute SWIFT_PRIVATE; + std::function>(const std::string& /* query */, const std::vector>>& /* params */)> executeAsync SWIFT_PRIVATE; public: - explicit Transaction(std::function()> commit, std::function()> rollback, std::function(const std::string& /* query */, const std::variant>& /* params */)> execute, std::function>(const std::string& /* query */, const std::variant>& /* params */)> executeAsync): commit(commit), rollback(rollback), execute(execute), executeAsync(executeAsync) {} + explicit Transaction(std::function()> commit, std::function()> rollback, std::function(const std::string& /* query */, const std::vector>>& /* params */)> execute, std::function>(const std::string& /* query */, const std::vector>>& /* params */)> executeAsync): commit(commit), rollback(rollback), execute(execute), executeAsync(executeAsync) {} }; } // namespace margelo::nitro::rnquicksqlite @@ -61,16 +62,16 @@ namespace margelo::nitro { return Transaction( JSIConverter()>>::fromJSI(runtime, obj.getProperty(runtime, "commit")), JSIConverter()>>::fromJSI(runtime, obj.getProperty(runtime, "rollback")), - JSIConverter(const std::string& /* query */, const std::variant>& /* params */)>>::fromJSI(runtime, obj.getProperty(runtime, "execute")), - JSIConverter>(const std::string& /* query */, const std::variant>& /* params */)>>::fromJSI(runtime, obj.getProperty(runtime, "executeAsync")) + JSIConverter(const std::string& /* query */, const std::vector>>& /* params */)>>::fromJSI(runtime, obj.getProperty(runtime, "execute")), + JSIConverter>(const std::string& /* query */, const std::vector>>& /* params */)>>::fromJSI(runtime, obj.getProperty(runtime, "executeAsync")) ); } static inline jsi::Value toJSI(jsi::Runtime& runtime, const Transaction& arg) { jsi::Object obj(runtime); obj.setProperty(runtime, "commit", JSIConverter()>>::toJSI(runtime, arg.commit)); obj.setProperty(runtime, "rollback", JSIConverter()>>::toJSI(runtime, arg.rollback)); - obj.setProperty(runtime, "execute", JSIConverter(const std::string& /* query */, const std::variant>& /* params */)>>::toJSI(runtime, arg.execute)); - obj.setProperty(runtime, "executeAsync", JSIConverter>(const std::string& /* query */, const std::variant>& /* params */)>>::toJSI(runtime, arg.executeAsync)); + obj.setProperty(runtime, "execute", JSIConverter(const std::string& /* query */, const std::vector>>& /* params */)>>::toJSI(runtime, arg.execute)); + obj.setProperty(runtime, "executeAsync", JSIConverter>(const std::string& /* query */, const std::vector>>& /* params */)>>::toJSI(runtime, arg.executeAsync)); return obj; } static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { @@ -80,8 +81,8 @@ namespace margelo::nitro { jsi::Object obj = value.getObject(runtime); if (!JSIConverter()>>::canConvert(runtime, obj.getProperty(runtime, "commit"))) return false; if (!JSIConverter()>>::canConvert(runtime, obj.getProperty(runtime, "rollback"))) return false; - if (!JSIConverter(const std::string& /* query */, const std::variant>& /* params */)>>::canConvert(runtime, obj.getProperty(runtime, "execute"))) return false; - if (!JSIConverter>(const std::string& /* query */, const std::variant>& /* params */)>>::canConvert(runtime, obj.getProperty(runtime, "executeAsync"))) return false; + if (!JSIConverter(const std::string& /* query */, const std::vector>>& /* params */)>>::canConvert(runtime, obj.getProperty(runtime, "execute"))) return false; + if (!JSIConverter>(const std::string& /* query */, const std::vector>>& /* params */)>>::canConvert(runtime, obj.getProperty(runtime, "executeAsync"))) return false; return true; } }; diff --git a/src/types.ts b/src/types.ts index 3a3b069e..cca5449f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,4 +1,4 @@ -import { SelectQueryResult } from './specs/QueryResult.nitro' +import { SelectQueryResult } from './specs/SelectQueryResult.nitro' /** * Object returned by SQL Query executions { @@ -20,7 +20,7 @@ export interface QueryResult { export type QueryType = 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE' | 'OTHER' -export type ExecuteParams = number | boolean | bigint | string | ArrayBuffer +export type ExecuteParams = (number | boolean | bigint | string | ArrayBuffer)[] export type ExecuteQuery = ( query: string, From 9ecfa763acc4cc99e9e706386a9c0237f13f1d6b Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 6 Sep 2024 10:15:36 +0200 Subject: [PATCH 047/156] implement nitro functions --- cpp/specs/HybridQuickSQLiteSpec.cpp | 107 ++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/cpp/specs/HybridQuickSQLiteSpec.cpp b/cpp/specs/HybridQuickSQLiteSpec.cpp index 2307267d..7fa16ca6 100644 --- a/cpp/specs/HybridQuickSQLiteSpec.cpp +++ b/cpp/specs/HybridQuickSQLiteSpec.cpp @@ -29,4 +29,111 @@ void HybridQuickSQLiteSpec::open(const std::string& dbName, const std::optional< } } +void HybridQuickSQLiteSpec::close(const std::string& dbName) { + SQLiteOPResult result = sqliteCloseDb(dbName); + + if (result.type == SQLiteError) + { + throw std::runtime_error(result.errorMessage.c_str()); + } +}; + +void HybridQuickSQLiteSpec::drop(const std::string& dbName, const std::optional& location) { + string tempDocPath = string(docPathStr); + if (location) + { + tempDocPath = tempDocPath + "/" + *location; + } + + + SQLiteOPResult result = sqliteRemoveDb(dbName, tempDocPath); + + if (result.type == SQLiteError) + { + throw std::runtime_error(result.errorMessage.c_str()); + } +}; + +void HybridQuickSQLiteSpec::attach(const std::string& mainDbName, const std::string& dbNameToAttach, const std::string& alias, const std::optional& location) { + string tempDocPath = string(docPathStr); + if (location) + { + tempDocPath = tempDocPath + "/" + *location; + } + + SQLiteOPResult result = sqliteAttachDb(mainDbName, tempDocPath, dbNameToAttach, alias); + + if (result.type == SQLiteError) + { + throw std::runtime_error(result.errorMessage.c_str()); + } +}; + +void HybridQuickSQLiteSpec::detach(const std::string& mainDbName, const std::string& alias) { + SQLiteOPResult result = sqliteDetachDb(mainDbName, alias); + + if (result.type == SQLiteError) + { + throw std::runtime_error(result.errorMessage.c_str()); + } +}; + +std::future transaction(const std::string& dbName, const std::function>(const Transaction& /* tx */)>& fn) { + +}; + +QueryResult HybridQuickSQLiteSpec::execute(const std::string& dbName, const std::string& query, const std::optional>>>& params) { + if (params) { + + } + + 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.c_str()); + } + + auto jsiResult = createSequelQueryExecutionResult(rt, status, &results, &metadata); + return jsiResult; + } catch(std::exception &e) { + throw std::runtime_error(e.what()); + } +}; + +std::future HybridQuickSQLiteSpec::executeAsync(const std::string& dbName, const std::string& query, const std::optional>>& params) { + +}; + +BatchQueryResult HybridQuickSQLiteSpec::executeBatch(const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) { + +}; + +std::future HybridQuickSQLiteSpec::executeBatchAsync(const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) { + +}; + +FileLoadResult HybridQuickSQLiteSpec::loadFile(const std::string& dbName, const std::string& location) { + 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 std::move(importResult); + } + else + { + throw std::runtime_error("[react-native-quick-sqlite][loadFile] Could not open file"); + } +}; + +std::future HybridQuickSQLiteSpec::loadFileAsync(const std::string& dbName, const std::string& location) { + +}; + } From 84f824665e6c7209c3948f747c8de8c4fdfd28a6 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 6 Sep 2024 15:25:13 +0200 Subject: [PATCH 048/156] update specs --- .../ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 43 ++++------- .../ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp | 7 +- .../shared/c++/BulkQueryTupleFallback.hpp | 75 +++++++++++++++++++ nitrogen/generated/shared/c++/ColumnType.hpp | 4 + .../shared/c++/HybridQuickSQLiteSpec.hpp | 11 ++- .../shared/c++/SingleQueryTupleFallback.hpp | 69 +++++++++++++++++ 6 files changed, 178 insertions(+), 31 deletions(-) create mode 100644 nitrogen/generated/shared/c++/BulkQueryTupleFallback.hpp create mode 100644 nitrogen/generated/shared/c++/SingleQueryTupleFallback.hpp diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index a2a82c9f..69a9c362 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -13,6 +13,8 @@ namespace NitroModules { class ArrayBuffer; } // Forward declaration of `BatchQueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } +// Forward declaration of `BulkQueryTupleFallback` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct BulkQueryTupleFallback; } // Forward declaration of `ColumnMetadata` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } // Forward declaration of `FileLoadResult` to properly resolve imports. @@ -21,15 +23,19 @@ namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } // Forward declaration of `QueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct QueryResult; } +// Forward declaration of `SingleQueryTupleFallback` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct SingleQueryTupleFallback; } // Forward declaration of `Transaction` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct Transaction; } // Include C++ defined types #include "BatchQueryResult.hpp" +#include "BulkQueryTupleFallback.hpp" #include "ColumnMetadata.hpp" #include "FileLoadResult.hpp" #include "HybridSelectQueryResultSpec.hpp" #include "QueryResult.hpp" +#include "SingleQueryTupleFallback.hpp" #include "Transaction.hpp" #include #include @@ -38,7 +44,6 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction; } #include #include #include -#include #include #include @@ -217,14 +222,6 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { return std::optional>>>(value); } - /** - * Specialized version of `std::tuple`. - */ - using std__tuple_std__string_ = std::tuple; - inline std::tuple create_std__tuple_std__string_(const std::string& arg0) { - return std::tuple { arg0 }; - } - /** * Specialized version of `std::vector`. */ @@ -263,36 +260,28 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { } /** - * Specialized version of `std::tuple, std::vector>>>`. - */ - using std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t____ = std::tuple, std::vector>>>; - inline std::tuple, std::vector>>> create_std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t____(const std::string& arg0, const std::variant, std::vector>>& arg1) { - return std::tuple, std::vector>>> { arg0, arg1 }; - } - - /** - * Specialized version of `std::variant, std::tuple, std::vector>>>>`. + * Specialized version of `std::variant`. */ - using std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t_____ = std::variant, std::tuple, std::vector>>>>; - inline std::variant, std::tuple, std::vector>>>> create_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t_____(const std::tuple& value) { + using std__variant_SingleQueryTupleFallback__BulkQueryTupleFallback_ = std::variant; + inline std::variant create_std__variant_SingleQueryTupleFallback__BulkQueryTupleFallback_(const SingleQueryTupleFallback& value) { return value; } - inline std::variant, std::tuple, std::vector>>>> create_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t_____(const std::tuple, std::vector>>>& value) { + inline std::variant create_std__variant_SingleQueryTupleFallback__BulkQueryTupleFallback_(const BulkQueryTupleFallback& value) { return value; } - inline std::tuple get_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______0(const std::variant, std::tuple, std::vector>>>>& variant) { + inline SingleQueryTupleFallback get_std__variant_SingleQueryTupleFallback__BulkQueryTupleFallback__0(const std::variant& variant) { return std::get<0>(variant); } - inline std::tuple, std::vector>>> get_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______1(const std::variant, std::tuple, std::vector>>>>& variant) { + inline BulkQueryTupleFallback get_std__variant_SingleQueryTupleFallback__BulkQueryTupleFallback__1(const std::variant& variant) { return std::get<1>(variant); } /** - * Specialized version of `std::vector, std::tuple, std::vector>>>>>`. + * Specialized version of `std::vector>`. */ - using std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______ = std::vector, std::tuple, std::vector>>>>>; - inline std::vector, std::tuple, std::vector>>>>> create_std__vector_std__variant_std__tuple_std__string___std__tuple_std__string__std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t______(size_t size) { - std::vector, std::tuple, std::vector>>>>> vector; + using std__vector_std__variant_SingleQueryTupleFallback__BulkQueryTupleFallback__ = std::vector>; + inline std::vector> create_std__vector_std__variant_SingleQueryTupleFallback__BulkQueryTupleFallback__(size_t size) { + std::vector> vector; vector.reserve(size); return vector; } diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp index 0c56ed1b..94af8f09 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp @@ -13,6 +13,8 @@ namespace NitroModules { class ArrayBuffer; } // Forward declaration of `BatchQueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } +// Forward declaration of `BulkQueryTupleFallback` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct BulkQueryTupleFallback; } // Forward declaration of `ColumnMetadata` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } // Forward declaration of `ColumnType` to properly resolve imports. @@ -25,17 +27,21 @@ namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } namespace margelo::nitro::rnquicksqlite { struct QueryResult; } // Forward declaration of `QueryType` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { enum class QueryType; } +// Forward declaration of `SingleQueryTupleFallback` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct SingleQueryTupleFallback; } // Forward declaration of `Transaction` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct Transaction; } // Include C++ defined types #include "BatchQueryResult.hpp" +#include "BulkQueryTupleFallback.hpp" #include "ColumnMetadata.hpp" #include "ColumnType.hpp" #include "FileLoadResult.hpp" #include "HybridSelectQueryResultSpec.hpp" #include "QueryResult.hpp" #include "QueryType.hpp" +#include "SingleQueryTupleFallback.hpp" #include "Transaction.hpp" #include #include @@ -43,7 +49,6 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction; } #include #include #include -#include #include #include diff --git a/nitrogen/generated/shared/c++/BulkQueryTupleFallback.hpp b/nitrogen/generated/shared/c++/BulkQueryTupleFallback.hpp new file mode 100644 index 00000000..8fca51b7 --- /dev/null +++ b/nitrogen/generated/shared/c++/BulkQueryTupleFallback.hpp @@ -0,0 +1,75 @@ +/// +/// BulkQueryTupleFallback.hpp +/// Fri Sep 06 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + + + +#include +#include +#include + +namespace margelo::nitro::rnquicksqlite { + + /** + * A struct which can be represented as a JavaScript object (BulkQueryTupleFallback). + */ + struct BulkQueryTupleFallback { + public: + std::string first SWIFT_PRIVATE; + std::variant, std::vector>> second SWIFT_PRIVATE; + + public: + explicit BulkQueryTupleFallback(std::string first, std::variant, std::vector>> second): first(first), second(second) {} + }; + +} // namespace margelo::nitro::rnquicksqlite + +namespace margelo::nitro { + + using namespace margelo::nitro::rnquicksqlite; + + // C++ BulkQueryTupleFallback <> JS BulkQueryTupleFallback (object) + template <> + struct JSIConverter { + static inline BulkQueryTupleFallback fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return BulkQueryTupleFallback( + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "first")), + JSIConverter, std::vector>>>::fromJSI(runtime, obj.getProperty(runtime, "second")) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const BulkQueryTupleFallback& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, "first", JSIConverter::toJSI(runtime, arg.first)); + obj.setProperty(runtime, "second", JSIConverter, std::vector>>>::toJSI(runtime, arg.second)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "first"))) return false; + if (!JSIConverter, std::vector>>>::canConvert(runtime, obj.getProperty(runtime, "second"))) return false; + return true; + } + }; + +} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/ColumnType.hpp b/nitrogen/generated/shared/c++/ColumnType.hpp index 2c74c484..7d01f08a 100644 --- a/nitrogen/generated/shared/c++/ColumnType.hpp +++ b/nitrogen/generated/shared/c++/ColumnType.hpp @@ -37,6 +37,7 @@ namespace margelo::nitro::rnquicksqlite { DOUBLE SWIFT_NAME(double) = 4, BOOLEAN SWIFT_NAME(boolean) = 5, ARRAY_BUFFER SWIFT_NAME(arrayBuffer) = 6, + UNKNOWN SWIFT_NAME(unknown) = 7, } CLOSED_ENUM; } // namespace margelo::nitro::rnquicksqlite @@ -58,6 +59,7 @@ namespace margelo::nitro { case hashString("DOUBLE"): return ColumnType::DOUBLE; case hashString("BOOLEAN"): return ColumnType::BOOLEAN; case hashString("ARRAY_BUFFER"): return ColumnType::ARRAY_BUFFER; + case hashString("UNKNOWN"): return ColumnType::UNKNOWN; default: [[unlikely]] throw std::runtime_error("Cannot convert \"" + unionValue + "\" to enum ColumnType - invalid value!"); } @@ -71,6 +73,7 @@ namespace margelo::nitro { case ColumnType::DOUBLE: return JSIConverter::toJSI(runtime, "DOUBLE"); case ColumnType::BOOLEAN: return JSIConverter::toJSI(runtime, "BOOLEAN"); case ColumnType::ARRAY_BUFFER: return JSIConverter::toJSI(runtime, "ARRAY_BUFFER"); + case ColumnType::UNKNOWN: return JSIConverter::toJSI(runtime, "UNKNOWN"); default: [[unlikely]] throw std::runtime_error("Cannot convert ColumnType to JS - invalid value: " + std::to_string(static_cast(arg)) + "!"); @@ -89,6 +92,7 @@ namespace margelo::nitro { case hashString("DOUBLE"): case hashString("BOOLEAN"): case hashString("ARRAY_BUFFER"): + case hashString("UNKNOWN"): return true; default: return false; diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp index 2aa611db..b5b19db3 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp @@ -22,6 +22,10 @@ namespace margelo::nitro::rnquicksqlite { struct QueryResult; } namespace NitroModules { class ArrayBuffer; } // Forward declaration of `BatchQueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } +// Forward declaration of `SingleQueryTupleFallback` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct SingleQueryTupleFallback; } +// Forward declaration of `BulkQueryTupleFallback` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct BulkQueryTupleFallback; } // Forward declaration of `FileLoadResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } @@ -35,7 +39,8 @@ namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } #include #include #include "BatchQueryResult.hpp" -#include +#include "SingleQueryTupleFallback.hpp" +#include "BulkQueryTupleFallback.hpp" #include "FileLoadResult.hpp" namespace margelo::nitro::rnquicksqlite { @@ -74,8 +79,8 @@ namespace margelo::nitro::rnquicksqlite { virtual std::future transaction(const std::string& dbName, const std::function>(const Transaction& /* tx */)>& fn) = 0; virtual QueryResult execute(const std::string& dbName, const std::string& query, const std::optional>>>& params) = 0; virtual std::future executeAsync(const std::string& dbName, const std::string& query, const std::optional>>>& params) = 0; - virtual BatchQueryResult executeBatch(const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) = 0; - virtual std::future executeBatchAsync(const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) = 0; + virtual BatchQueryResult executeBatch(const std::string& dbName, const std::vector>& commands) = 0; + virtual std::future executeBatchAsync(const std::string& dbName, const std::vector>& commands) = 0; virtual FileLoadResult loadFile(const std::string& dbName, const std::string& location) = 0; virtual std::future loadFileAsync(const std::string& dbName, const std::string& location) = 0; diff --git a/nitrogen/generated/shared/c++/SingleQueryTupleFallback.hpp b/nitrogen/generated/shared/c++/SingleQueryTupleFallback.hpp new file mode 100644 index 00000000..06f6971c --- /dev/null +++ b/nitrogen/generated/shared/c++/SingleQueryTupleFallback.hpp @@ -0,0 +1,69 @@ +/// +/// SingleQueryTupleFallback.hpp +/// Fri Sep 06 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + + + +#include + +namespace margelo::nitro::rnquicksqlite { + + /** + * A struct which can be represented as a JavaScript object (SingleQueryTupleFallback). + */ + struct SingleQueryTupleFallback { + public: + std::string first SWIFT_PRIVATE; + + public: + explicit SingleQueryTupleFallback(std::string first): first(first) {} + }; + +} // namespace margelo::nitro::rnquicksqlite + +namespace margelo::nitro { + + using namespace margelo::nitro::rnquicksqlite; + + // C++ SingleQueryTupleFallback <> JS SingleQueryTupleFallback (object) + template <> + struct JSIConverter { + static inline SingleQueryTupleFallback fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return SingleQueryTupleFallback( + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "first")) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const SingleQueryTupleFallback& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, "first", JSIConverter::toJSI(runtime, arg.first)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "first"))) return false; + return true; + } + }; + +} // namespace margelo::nitro From 1e8b5395b456dbc73b0de5ad6e02b8b8de8b8302 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 6 Sep 2024 16:42:04 +0200 Subject: [PATCH 049/156] update specs --- src/index.ts | 14 +++++++------- src/specs/QuickSQLite.nitro.ts | 6 +++--- src/specs/SelectQueryResult.nitro.ts | 1 + src/types.ts | 18 ++++++++++++------ 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/index.ts b/src/index.ts index 809e265f..eabd6cfb 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,7 @@ import { NitroModules } from 'react-native-nitro-modules' import { QuickSQLite as QuickSQLiteSpec } from 'src/specs/QuickSQLite.nitro' import { - ExecuteParams, + ExecuteParam, PendingTransaction, QueryResult, QuickSQLiteConnection, @@ -55,7 +55,7 @@ const _execute = QuickSQLite.execute QuickSQLite.execute = ( dbName: string, query: string, - params?: ExecuteParams + params?: ExecuteParam[] ): QueryResult => { const result = _execute(dbName, query, params) // enhanceQueryResult(result); @@ -66,7 +66,7 @@ const _executeAsync = QuickSQLite.executeAsync QuickSQLite.executeAsync = async ( dbName: string, query: string, - params?: ExecuteParams + params?: ExecuteParam[] ): Promise => { const res = await _executeAsync(dbName, query, params) // enhanceQueryResult(res); @@ -84,7 +84,7 @@ QuickSQLite.transaction = async ( let isFinalized = false // Local transaction context object implementation - const execute = (query: string, params?: ExecuteParams): QueryResult => { + const execute = (query: string, params?: ExecuteParam[]): QueryResult => { if (isFinalized) { throw Error( `Quick SQLite Error: Cannot execute query on finalized transaction: ${dbName}` @@ -93,7 +93,7 @@ QuickSQLite.transaction = async ( return QuickSQLite.execute(dbName, query, params) } - const executeAsync = (query: string, params?: ExecuteParams) => { + const executeAsync = (query: string, params?: ExecuteParam[]) => { if (isFinalized) { throw Error( `Quick SQLite Error: Cannot execute query on finalized transaction: ${dbName}` @@ -281,11 +281,11 @@ export const open = (options: { detach: (alias: string) => QuickSQLite.detach(options.name, alias), transaction: (fn: (tx: Transaction) => Promise | void) => QuickSQLite.transaction(options.name, fn), - execute: (query: string, params?: ExecuteParams | undefined): QueryResult => + execute: (query: string, params?: ExecuteParam[]): QueryResult => QuickSQLite.execute(options.name, query, params), executeAsync: ( query: string, - params?: ExecuteParams | undefined + params?: ExecuteParam[] ): Promise => QuickSQLite.executeAsync(options.name, query, params), executeBatch: (commands: SQLBatchTuple[]) => diff --git a/src/specs/QuickSQLite.nitro.ts b/src/specs/QuickSQLite.nitro.ts index 06250924..ce6ccff6 100644 --- a/src/specs/QuickSQLite.nitro.ts +++ b/src/specs/QuickSQLite.nitro.ts @@ -5,7 +5,7 @@ import { FileLoadResult, SQLBatchTuple, Transaction, - ExecuteParams, + ExecuteParam, } from '../types' export interface QuickSQLite @@ -24,11 +24,11 @@ export interface QuickSQLite dbName: string, fn: (tx: Transaction) => Promise | void ): Promise - execute(dbName: string, query: string, params?: ExecuteParams): QueryResult + execute(dbName: string, query: string, params?: ExecuteParam[]): QueryResult executeAsync( dbName: string, query: string, - params?: ExecuteParams + params?: ExecuteParam[] ): Promise executeBatch(dbName: string, commands: SQLBatchTuple[]): BatchQueryResult executeBatchAsync( diff --git a/src/specs/SelectQueryResult.nitro.ts b/src/specs/SelectQueryResult.nitro.ts index 5a9bf023..152318b9 100644 --- a/src/specs/SelectQueryResult.nitro.ts +++ b/src/specs/SelectQueryResult.nitro.ts @@ -21,6 +21,7 @@ type ColumnType = | 'DOUBLE' | 'BOOLEAN' | 'ARRAY_BUFFER' + | 'UNKNOWN' // | 'null' // | 'string' // | 'number' diff --git a/src/types.ts b/src/types.ts index cca5449f..ed76e83a 100644 --- a/src/types.ts +++ b/src/types.ts @@ -20,16 +20,16 @@ export interface QueryResult { export type QueryType = 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE' | 'OTHER' -export type ExecuteParams = (number | boolean | bigint | string | ArrayBuffer)[] +export type ExecuteParam = number | boolean | bigint | string | ArrayBuffer export type ExecuteQuery = ( query: string, - params?: ExecuteParams + params?: ExecuteParam[] ) => QueryResult export type ExecuteAsyncQuery = ( query: string, - params?: ExecuteParams + params?: ExecuteParam[] ) => Promise export interface Transaction { @@ -52,15 +52,21 @@ export interface PendingTransaction { start: () => void } +export interface SingleQueryTupleFallback { + first: string +} +export interface BulkQueryTupleFallback { + first: string + second: Array | Array> +} + /** * Allows the execution of bulk of sql commands * inside a transaction * If a single query must be executed many times with different arguments, its preferred * to declare it a single time, and use an array of array parameters. */ -export type SQLBatchTuple = - | [string] - | [string, Array | Array>] +export type SQLBatchTuple = SingleQueryTupleFallback | BulkQueryTupleFallback /** * status: 0 or undefined for correct execution, 1 for error From 92bbe9208d97a5fa069b5019e1313b2461b69835 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 6 Sep 2024 17:21:46 +0200 Subject: [PATCH 050/156] fix: wrong type --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index eabd6cfb..d19b0886 100644 --- a/src/index.ts +++ b/src/index.ts @@ -212,7 +212,7 @@ export const typeORMDriver = { const connection = { executeSql: async ( sql: string, - params: ExecuteParams | undefined, + params: ExecuteParam[] | undefined, ok: (res: QueryResult) => void, fail: (msg: string) => void ) => { From 9b6fea8aeab03199e51fa2d3c24b1b96ecb8a776 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 6 Sep 2024 17:24:42 +0200 Subject: [PATCH 051/156] updat ecpp --- cpp/JSIHelper.cpp | 342 +++++-------- cpp/JSIHelper.h | 69 +-- cpp/specs/HybridQuickSQLiteSpec.cpp | 53 +- cpp/specs/Types.hpp | 27 + cpp/sqlbatchexecutor.cpp | 154 +++--- cpp/sqlbatchexecutor.h | 13 +- cpp/sqlfileloader.cpp | 76 +-- cpp/sqliteBridge.cpp | 764 ++++++++++++++-------------- cpp/sqliteBridge.h | 33 +- 9 files changed, 714 insertions(+), 817 deletions(-) create mode 100644 cpp/specs/Types.hpp diff --git a/cpp/JSIHelper.cpp b/cpp/JSIHelper.cpp index ac86be40..d42528f2 100644 --- a/cpp/JSIHelper.cpp +++ b/cpp/JSIHelper.cpp @@ -1,207 +1,143 @@ -// -// 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); -} +//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/cpp/JSIHelper.h b/cpp/JSIHelper.h index 9372937f..cdebfe56 100644 --- a/cpp/JSIHelper.h +++ b/cpp/JSIHelper.h @@ -14,46 +14,8 @@ #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 */ @@ -66,7 +28,7 @@ enum ResultType struct SQLiteOPResult { ResultType type; - string errorMessage; + std::string errorMessage; int rowsAffected; double insertId; }; @@ -74,41 +36,16 @@ struct SQLiteOPResult struct SequelLiteralUpdateResult { ResultType type; - string message; + std::string message; int affectedRows; }; struct SequelBatchOperationResult { ResultType type; - string message; + std::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/cpp/specs/HybridQuickSQLiteSpec.cpp b/cpp/specs/HybridQuickSQLiteSpec.cpp index 7fa16ca6..c788d826 100644 --- a/cpp/specs/HybridQuickSQLiteSpec.cpp +++ b/cpp/specs/HybridQuickSQLiteSpec.cpp @@ -8,10 +8,13 @@ #include #include "macros.h" #include -#include "HybridQuickSQLiteSpec.hpp" #include "OnLoad.hpp" +#include "QueryType.hpp" +#include "HybridQuickSQLiteSpec.hpp" +#include "Types.hpp" using namespace margelo::nitro; +using namespace margelo::rnquicksqlite; namespace margelo::nitro::rnquicksqlite { @@ -20,9 +23,9 @@ void HybridQuickSQLiteSpec::open(const std::string& dbName, const std::optional< if (location) { tempDocPath = tempDocPath + "/" + *location; } - + SQLiteOPResult result = sqliteOpenDb(dbName, tempDocPath); - + if (result.type == SQLiteError) { throw std::runtime_error(result.errorMessage.c_str()); @@ -39,7 +42,7 @@ void HybridQuickSQLiteSpec::close(const std::string& dbName) { }; void HybridQuickSQLiteSpec::drop(const std::string& dbName, const std::optional& location) { - string tempDocPath = string(docPathStr); + std::string tempDocPath = std::string(docPathStr); if (location) { tempDocPath = tempDocPath + "/" + *location; @@ -55,7 +58,7 @@ void HybridQuickSQLiteSpec::drop(const std::string& dbName, const std::optional< }; void HybridQuickSQLiteSpec::attach(const std::string& mainDbName, const std::string& dbNameToAttach, const std::string& alias, const std::optional& location) { - string tempDocPath = string(docPathStr); + std::string tempDocPath = std::string(docPathStr); if (location) { tempDocPath = tempDocPath + "/" + *location; @@ -79,52 +82,48 @@ void HybridQuickSQLiteSpec::detach(const std::string& mainDbName, const std::str }; std::future transaction(const std::string& dbName, const std::function>(const Transaction& /* tx */)>& fn) { + return std::async(std::launch::async, []() { + }); }; -QueryResult HybridQuickSQLiteSpec::execute(const std::string& dbName, const std::string& query, const std::optional>>>& params) { - if (params) { - - } - - vector> results; - vector metadata; +QueryResult HybridQuickSQLiteSpec::execute(const std::string& dbName, const std::string& query, const std::optional>& params) { + std::vector> results; + std::vector metadata; // Converting results into a JSI Response try { - auto status = sqliteExecute(dbName, query, ¶ms, &results, &metadata); + auto status = sqliteExecute(dbName, query, params, &results, &metadata); if(status.type == SQLiteError) { throw std::runtime_error(status.errorMessage.c_str()); } - auto jsiResult = createSequelQueryExecutionResult(rt, status, &results, &metadata); - return jsiResult; + QueryResult result(QueryType::SELECT, std::nullopt, 0, std::nullopt); + return result; } catch(std::exception &e) { throw std::runtime_error(e.what()); } }; -std::future HybridQuickSQLiteSpec::executeAsync(const std::string& dbName, const std::string& query, const std::optional>>& params) { - +std::future HybridQuickSQLiteSpec::executeAsync(const std::string& dbName, const std::string& query, const std::optional>& params) { + }; -BatchQueryResult HybridQuickSQLiteSpec::executeBatch(const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) { - +BatchQueryResult executeBatch(const std::string& dbName, const std::vector>& commands) { + }; -std::future HybridQuickSQLiteSpec::executeBatchAsync(const std::string& dbName, const std::vector, std::tuple, std::vector>>>>>& commands) { - +std::future executeBatchAsync(const std::string& dbName, const std::vector>& commands) { + }; FileLoadResult HybridQuickSQLiteSpec::loadFile(const std::string& dbName, const std::string& location) { - const auto importResult = importSQLFile(dbName, sqlFileName); + const auto importResult = importSQLFile(dbName, location); 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 std::move(importResult); + auto result = new FileLoadResult(importResult.commands, importResult.affectedRows); + return *result; } else { @@ -133,7 +132,7 @@ FileLoadResult HybridQuickSQLiteSpec::loadFile(const std::string& dbName, const }; std::future HybridQuickSQLiteSpec::loadFileAsync(const std::string& dbName, const std::string& location) { - + }; } diff --git a/cpp/specs/Types.hpp b/cpp/specs/Types.hpp new file mode 100644 index 00000000..34208a27 --- /dev/null +++ b/cpp/specs/Types.hpp @@ -0,0 +1,27 @@ +#include +#include "ArrayBuffer.hpp" +#include "ColumnType.hpp" + +namespace margelo::nitro::rnquicksqlite { + +using ExecuteParam = std::variant>; +using SQLiteValue = std::variant, std::monostate>; + +// constexpr function that maps SQLiteColumnType to string literals +constexpr ColumnType mapSQLiteTypeToColumnType(std::string type) { + if (type == "INTEGER") { + return ColumnType::INTEGER; + } else if (type == "BOOLEAN") { + return ColumnType::BOOLEAN; + } else if (type == "TEXT") { + return ColumnType::TEXT; + } else if (type == "BLOB") { + return ColumnType::ARRAY_BUFFER; + } else if (type == "REAL") { + return ColumnType::DOUBLE; + } else { + return ColumnType::UNKNOWN; + } +} + +} diff --git a/cpp/sqlbatchexecutor.cpp b/cpp/sqlbatchexecutor.cpp index f80519ae..836289b7 100644 --- a/cpp/sqlbatchexecutor.cpp +++ b/cpp/sqlbatchexecutor.cpp @@ -3,88 +3,92 @@ */ #include "sqlbatchexecutor.h" -void jsiBatchParametersToQuickArguments(jsi::Runtime &rt, jsi::Array const &batchParams, vector *commands) +namespace margelo::rnquicksqlite { + +//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, std::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) + size_t commandCount = commands->size(); + if(commandCount <= 0) { - continue; + return SequelBatchOperationResult { + .type = SQLiteError, + .message = "No SQL commands provided", + }; } - - 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()) + + try { - // 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 + 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, std::make_optional(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) { - 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, + .type = SQLiteError, + .message = exc.what(), }; - } 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/cpp/sqlbatchexecutor.h b/cpp/sqlbatchexecutor.h index 43dccd9c..ea14ce09 100644 --- a/cpp/sqlbatchexecutor.h +++ b/cpp/sqlbatchexecutor.h @@ -4,21 +4,20 @@ #include "JSIHelper.h" #include "sqliteBridge.h" -using namespace std; using namespace facebook; struct QuickQueryArguments { - string sql; - shared_ptr> params; + std::string sql; + std::shared_ptr> params; }; /** - * Local Helper method to translate JSI objects QuickQueryArguments datastructure + * 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); +void jsiBatchParametersToQuickArguments(jsi::Runtime &rt, jsi::Array const &batchParams, std::vector *commands); /** - * Execute a batch of commands in a exclusive transaction + * Execute a batch of commands in a exclusive transaction */ -SequelBatchOperationResult sqliteExecuteBatch(std::string dbName, vector *commands); +SequelBatchOperationResult sqliteExecuteBatch(std::string dbName, std::vector *commands); diff --git a/cpp/sqlfileloader.cpp b/cpp/sqlfileloader.cpp index d84915ed..04652d02 100644 --- a/cpp/sqlfileloader.cpp +++ b/cpp/sqlfileloader.cpp @@ -5,50 +5,52 @@ #include #include -using namespace std; +namespace margelo::rnquicksqlite { -SequelBatchOperationResult importSQLFile(string dbName, string fileLocation) +SequelBatchOperationResult importSQLFile(const string& dbName, const string& fileLocation) { - string line; - ifstream sqFile(fileLocation); - if (sqFile.is_open()) - { - try + string line; + ifstream sqFile(fileLocation); + if (sqFile.is_open()) { - int affectedRows = 0; - int commands = 0; - sqliteExecuteLiteral(dbName, "BEGIN EXCLUSIVE TRANSACTION"); - while (std::getline(sqFile, line, '\n')) - { - if (!line.empty()) + try { - SequelLiteralUpdateResult result = sqliteExecuteLiteral(dbName, line); - if (result.type == SQLiteError) - { - sqliteExecuteLiteral(dbName, "ROLLBACK"); + 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(); - return {SQLiteError, result.message, 0, commands}; - } - else - { - affectedRows += result.affectedRows; - commands++; - } + 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}; } - } - sqFile.close(); - sqliteExecuteLiteral(dbName, "COMMIT"); - return {SQLiteOk, "", affectedRows, commands}; } - catch (...) + else { - sqFile.close(); - sqliteExecuteLiteral(dbName, "ROLLBACK"); - return {SQLiteError, "[react-native-quick-sqlite][loadSQLFile] Unexpected error, transaction was rolledback", 0, 0}; + return {SQLiteError, "[react-native-quick-sqlite][loadSQLFile] Could not open file", 0, 0}; } - } - else - { - return {SQLiteError, "[react-native-quick-sqlite][loadSQLFile] Could not open file", 0, 0}; - } +} + } diff --git a/cpp/sqliteBridge.cpp b/cpp/sqliteBridge.cpp index 9ffe0109..f5c04039 100644 --- a/cpp/sqliteBridge.cpp +++ b/cpp/sqliteBridge.cpp @@ -1,12 +1,3 @@ -/* - * sequel.cpp - * - * Created by Oscar Franco on 2021/03/07 - * Copyright (c) 2021 Oscar Franco - * - * This code is licensed under the MIT license - */ - #include "sqliteBridge.h" #include #include @@ -16,16 +7,20 @@ #include #include #include "logs.h" +#include "ArrayBuffer.hpp" -using namespace std; using namespace facebook; +using namespace margelo::nitro; +using namespace margelo::nitro::rnquicksqlite; -map dbMap = map(); +namespace margelo::rnquicksqlite { -bool folder_exists(const std::string &foldername) +std::map dbMap = std::map(); + +bool folder_exists(const std::string& foldername) { - struct stat buffer; - return (stat(foldername.c_str(), &buffer) == 0); + struct stat buffer; + return (stat(foldername.c_str(), &buffer) == 0); } /** @@ -36,9 +31,9 @@ bool folder_exists(const std::string &foldername) int _mkdir(const char *path) { #if _POSIX_C_SOURCE - return mkdir(path); + return mkdir(path); #else - return mkdir(path, 0755); // not sure if this works on mac + return mkdir(path, 0755); // not sure if this works on mac #endif } @@ -49,437 +44,438 @@ int _mkdir(const char *path) */ int mkdir(const char *path) { - string current_level = "/"; - string level; - stringstream ss(path); - // First line is empty because it starts with /User - getline(ss, level, '/'); - // split path using slash as a separator - while (getline(ss, level, '/')) - { - current_level += level; // append folder to the current level - // create current level - if (!folder_exists(current_level) && _mkdir(current_level.c_str()) != 0) - return -1; - - current_level += "/"; // don't forget to append a slash - } - - return 0; + std::string current_level = "/"; + std::string level; + std::stringstream ss(path); + // First line is empty because it starts with /User + getline(ss, level, '/'); + // split path using slash as a separator + while (getline(ss, level, '/')) + { + current_level += level; // append folder to the current level + // create current level + if (!folder_exists(current_level) && _mkdir(current_level.c_str()) != 0) + return -1; + + current_level += "/"; // don't forget to append a slash + } + + return 0; } -inline bool file_exists(const string &path) +inline bool file_exists(const std::string &path) { - struct stat buffer; - return (stat(path.c_str(), &buffer) == 0); + struct stat buffer; + return (stat(path.c_str(), &buffer) == 0); } -string get_db_path(string const dbName, string const docPath) +std::string get_db_path(const std::string& dbName, const std::string& docPath) { - mkdir(docPath.c_str()); - return docPath + "/" + dbName; + mkdir(docPath.c_str()); + return docPath + "/" + dbName; } -SQLiteOPResult sqliteOpenDb(string const dbName, string const docPath) +SQLiteOPResult sqliteOpenDb(const std::string& dbName, const std::string& docPath) { - 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) - { + 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) + { + return SQLiteOPResult{ + .type = SQLiteError, + .errorMessage = sqlite3_errmsg(db) + }; + } + else + { + dbMap[dbName] = db; + } + return SQLiteOPResult{ - .type = SQLiteError, - .errorMessage = sqlite3_errmsg(db) + .type = SQLiteOk, + .rowsAffected = 0 }; - } - else - { - dbMap[dbName] = db; - } - - return SQLiteOPResult{ - .type = SQLiteOk, - .rowsAffected = 0 - }; } -SQLiteOPResult sqliteCloseDb(string const dbName) +SQLiteOPResult sqliteCloseDb(const std::string& dbName) { - - if (dbMap.count(dbName) == 0) - { + + if (dbMap.count(dbName) == 0) + { + return SQLiteOPResult{ + .type = SQLiteError, + .errorMessage = dbName + " is not open", + }; + } + + sqlite3 *db = dbMap[dbName]; + + sqlite3_close_v2(db); + + dbMap.erase(dbName); + return SQLiteOPResult{ - .type = SQLiteError, - .errorMessage = dbName + " is not open", + .type = SQLiteOk, }; - } - - sqlite3 *db = dbMap[dbName]; - - sqlite3_close_v2(db); - - dbMap.erase(dbName); - - return SQLiteOPResult{ - .type = SQLiteOk, - }; } 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(); + 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(); } -SQLiteOPResult sqliteAttachDb(string const mainDBName, string const docPath, string const databaseToAttach, string const alias) +SQLiteOPResult 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. - * */ - string dbPath = get_db_path(databaseToAttach, docPath); - string statement = "ATTACH DATABASE '" + dbPath + "' AS " + alias; - SequelLiteralUpdateResult result = sqliteExecuteLiteral(mainDBName, statement); - if (result.type == SQLiteError) - { + /** + * 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; + SequelLiteralUpdateResult result = sqliteExecuteLiteral(mainDBName, statement); + if (result.type == SQLiteError) + { + return SQLiteOPResult{ + .type = SQLiteError, + .errorMessage = mainDBName + " was unable to attach another database: " + std::string(result.message), + }; + } return SQLiteOPResult{ - .type = SQLiteError, - .errorMessage = mainDBName + " was unable to attach another database: " + string(result.message), + .type = SQLiteOk, }; - } - return SQLiteOPResult{ - .type = SQLiteOk, - }; } -SQLiteOPResult sqliteDetachDb(string const mainDBName, string const alias) +SQLiteOPResult sqliteDetachDb(const std::string& mainDBName, const std::string& alias) { - /** - * There is no need to check if mainDBName is opened because sqliteExecuteLiteral will do that. - * */ - string statement = "DETACH DATABASE " + alias; - SequelLiteralUpdateResult result = sqliteExecuteLiteral(mainDBName, statement); - if (result.type == SQLiteError) - { + /** + * There is no need to check if mainDBName is opened because sqliteExecuteLiteral will do that. + * */ + std::string statement = "DETACH DATABASE " + alias; + SequelLiteralUpdateResult result = sqliteExecuteLiteral(mainDBName, statement); + if (result.type == SQLiteError) + { + return SQLiteOPResult{ + .type = SQLiteError, + .errorMessage = mainDBName + "was unable to detach database: " + std::string(result.message), + }; + } return SQLiteOPResult{ - .type = SQLiteError, - .errorMessage = mainDBName + "was unable to detach database: " + string(result.message), + .type = SQLiteOk, }; - } - return SQLiteOPResult{ - .type = SQLiteOk, - }; } -SQLiteOPResult sqliteRemoveDb(string const dbName, string const docPath) +SQLiteOPResult sqliteRemoveDb(const std::string& dbName, const std::string& docPath) { - if (dbMap.count(dbName) == 1) - { - SQLiteOPResult closeResult = sqliteCloseDb(dbName); - if (closeResult.type == SQLiteError) + if (dbMap.count(dbName) == 1) { - return closeResult; + SQLiteOPResult closeResult = sqliteCloseDb(dbName); + if (closeResult.type == SQLiteError) + { + return closeResult; + } } - } - - string dbPath = get_db_path(dbName, docPath); - - if (!file_exists(dbPath)) - { + + std::string dbPath = get_db_path(dbName, docPath); + + if (!file_exists(dbPath)) + { + return SQLiteOPResult{ + .type = SQLiteOk, + .errorMessage = "[react-native-quick-sqlite]: Database file not found" + dbPath + }; + } + + remove(dbPath.c_str()); + return SQLiteOPResult{ - .type = SQLiteOk, - .errorMessage = "[react-native-quick-sqlite]: Database file not found" + dbPath + .type = SQLiteOk, }; - } - - remove(dbPath.c_str()); - - return SQLiteOPResult{ - .type = SQLiteOk, - }; } -void bindStatement(sqlite3_stmt *statement, vector *values) +void bindStatement(sqlite3_stmt *statement, std::vector& values) { - size_t size = values->size(); - if (size <= 0) - { - return; - } - - for (int ii = 0; ii < size; ii++) - { - int sqIndex = ii + 1; - QuickValue value = values->at(ii); - QuickDataType dataType = value.dataType; - if (dataType == NULL_VALUE) + size_t size = values.size(); + if (size <= 0) { - sqlite3_bind_null(statement, sqIndex); + return; } - else if (dataType == BOOLEAN) + + for (int ii = 0; ii < size; ii++) { - sqlite3_bind_int(statement, sqIndex, value.booleanValue); + int sqIndex = ii + 1; + ExecuteParam value = values.at(ii); + // if (std::holds_alternative(value)) + // { + // sqlite3_bind_null(statement, sqIndex); + // } + // if (std::holds_alternative(value)) + // { + // sqlite3_bind_int(statement, sqIndex, std::get(value)); + // } + // else if (std::holds_alternative(value)) + // { + // sqlite3_bind_int(statement, sqIndex, std::get(value)); + // } + // else if (std::holds_alternative(value)) + // { + // sqlite3_bind_double(statement, sqIndex, std::get(value)); + // } + // else if (std::holds_alternative(value)) + // { + // sqlite3_bind_int64(statement, sqIndex, std::holds_alternative(value)); + // } + // else if (std::holds_alternative(value)) + // { + // const auto stringValue = std::get(value); + // sqlite3_bind_text(statement, sqIndex, stringValue.c_str(), stringValue.length(), SQLITE_TRANSIENT); + // } + // else if (std::holds_alternative>(value)) + // { + // const auto arrayBufferValue = std::get>(value); + // sqlite3_bind_blob(statement, sqIndex, arrayBufferValue->data(), arrayBufferValue->size(), SQLITE_STATIC); + // } } - else if (dataType == INTEGER) +} + +SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, std::optional>& params, std::vector> *results, std::vector *metadata) +{ + if (dbMap.count(dbName) == 0) { - sqlite3_bind_int(statement, sqIndex, (int)value.doubleOrIntValue); + return SQLiteOPResult{ + .type = SQLiteError, + .errorMessage = "[react-native-quick-sqlite]: Database " + dbName + " is not open", + .rowsAffected = 0 + }; } - else if (dataType == DOUBLE) + + sqlite3 *db = dbMap[dbName]; + + sqlite3_stmt *statement; + + int statementStatus = sqlite3_prepare_v2(db, query.c_str(), -1, &statement, NULL); + + if (statementStatus == SQLITE_OK) // statemnet is correct, bind the passed parameters { - sqlite3_bind_double(statement, sqIndex, value.doubleOrIntValue); + if (params) { + bindStatement(statement, *params); + } } - else if (dataType == INT64) + else { - sqlite3_bind_int64(statement, sqIndex, value.int64Value); + const char *message = sqlite3_errmsg(db); + return SQLiteOPResult{ + .type = SQLiteError, + .errorMessage = "[react-native-quick-sqlite] SQL execution error: " + std::string(message), + .rowsAffected = 0}; } - else if (dataType == TEXT) + + bool isConsuming = true; + bool isFailed = false; + + int result, i, count, column_type; + std::string column_name; + ColumnType column_declared_type; + std::map row; + + while (isConsuming) { - sqlite3_bind_text(statement, sqIndex, value.textValue.c_str(), value.textValue.length(), SQLITE_TRANSIENT); + result = sqlite3_step(statement); + + switch (result) + { + case SQLITE_ROW: + if(results == NULL) + { + break; + } + + i = 0; + row = std::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: + { + /** + * It's not possible to send a int64_t in a jsi::Value because JS cannot represent the whole number range. + * Instead, we're sending a double, which can represent all integers up to 53 bits long, which is more + * than what was there before (a 32-bit int). + * + * See https://github.com/margelo/react-native-quick-sqlite/issues/16 for more context. + */ + double column_value = sqlite3_column_double(statement, i); + row[column_name] = column_value; + break; + } + + case SQLITE_FLOAT: + { + double column_value = sqlite3_column_double(statement, i); + row[column_name] = column_value; + break; + } + + case SQLITE_TEXT: + { + const char *column_value = reinterpret_cast(sqlite3_column_text(statement, i)); + int byteLen = sqlite3_column_bytes(statement, i); + // Specify length too; in case string contains NULL in the middle (which SQLite supports!) + 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: + if(metadata != NULL) + { + 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 meta = ColumnMetadata(column_name,column_declared_type, i); + metadata->push_back(meta); + i++; + } + } + isConsuming = false; + break; + + default: + isFailed = true; + isConsuming = false; + } } - else if (dataType == ARRAY_BUFFER) + + sqlite3_finalize(statement); + + if (isFailed) { - sqlite3_bind_blob(statement, sqIndex, value.arrayBufferValue.get(), value.arrayBufferSize, SQLITE_STATIC); + const char *message = sqlite3_errmsg(db); + return SQLiteOPResult{ + .type = SQLiteError, + .errorMessage = "[react-native-quick-sqlite] SQL execution error: " + std::string(message), + .rowsAffected = 0, + .insertId = 0 + }; } - } + + int changedRowCount = sqlite3_changes(db); + long long latestInsertRowId = sqlite3_last_insert_rowid(db); + return SQLiteOPResult{ + .type = SQLiteOk, + .rowsAffected = changedRowCount, + .insertId = static_cast(latestInsertRowId)}; } -SQLiteOPResult sqliteExecute(string const dbName, string const &query, vector *params, vector> *results, vector *metadata) +SequelLiteralUpdateResult sqliteExecuteLiteral(const std::string& dbName, const std::string& query) { - - if (dbMap.count(dbName) == 0) - { - return SQLiteOPResult{ - .type = SQLiteError, - .errorMessage = "[react-native-quick-sqlite]: Database " + dbName + " is not open", - .rowsAffected = 0 - }; - } - - sqlite3 *db = dbMap[dbName]; - - sqlite3_stmt *statement; - - int statementStatus = sqlite3_prepare_v2(db, query.c_str(), -1, &statement, NULL); - - if (statementStatus == SQLITE_OK) // statemnet is correct, bind the passed parameters - { - bindStatement(statement, params); - } - else - { - const char *message = sqlite3_errmsg(db); - return SQLiteOPResult{ - .type = SQLiteError, - .errorMessage = "[react-native-quick-sqlite] SQL execution error: " + string(message), - .rowsAffected = 0}; - } - - bool isConsuming = true; - bool isFailed = false; - - int result, i, count, column_type; - string column_name, column_declared_type; - map row; - - while (isConsuming) - { - result = sqlite3_step(statement); - - switch (result) + // Check if db connection is opened + if (dbMap.count(dbName) == 0) { - case SQLITE_ROW: - if(results == NULL) - { - break; - } - - i = 0; - row = map(); - count = sqlite3_column_count(statement); - - while (i < count) + return { + SQLiteError, + "[react-native-quick-sqlite] Database not opened: " + dbName, + 0 + }; + } + + 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 + { + const char *message = sqlite3_errmsg(db); + return { + SQLiteError, + "[react-native-quick-sqlite] SQL execution error: " + std::string(message), + 0}; + } + + bool isConsuming = true; + bool isFailed = false; + + int result, i, count, column_type; + std::string column_name; + + while (isConsuming) + { + result = sqlite3_step(statement); + + switch (result) { - column_type = sqlite3_column_type(statement, i); - column_name = sqlite3_column_name(statement, i); - - switch (column_type) - { - - case SQLITE_INTEGER: - { - /** - * It's not possible to send a int64_t in a jsi::Value because JS cannot represent the whole number range. - * Instead, we're sending a double, which can represent all integers up to 53 bits long, which is more - * than what was there before (a 32-bit int). - * - * See https://github.com/margelo/react-native-quick-sqlite/issues/16 for more context. - */ - double column_value = sqlite3_column_double(statement, i); - row[column_name] = createIntegerQuickValue(column_value); - break; - } - - case SQLITE_FLOAT: - { - double column_value = sqlite3_column_double(statement, i); - row[column_name] = createDoubleQuickValue(column_value); - break; - } - - case SQLITE_TEXT: - { - const char *column_value = reinterpret_cast(sqlite3_column_text(statement, i)); - int byteLen = sqlite3_column_bytes(statement, i); - // Specify length too; in case string contains NULL in the middle (which SQLite supports!) - row[column_name] = createTextQuickValue(string(column_value, byteLen)); - 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] = createArrayBufferQuickValue(data, blob_size); - break; - } - - case SQLITE_NULL: - // Intentionally left blank to switch to default case + case SQLITE_ROW: + isConsuming = true; + break; + + case SQLITE_DONE: + isConsuming = false; + break; + default: - row[column_name] = createNullQuickValue(); - break; - } - i++; + isFailed = true; + isConsuming = false; } - results->push_back(move(row)); - break; - case SQLITE_DONE: - if(metadata != NULL) - { - 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 = tp != NULL ? tp : "UNKNOWN"; - QuickColumnMetadata meta = { - .colunmName = column_name, - .columnIndex = i, - .columnDeclaredType = column_declared_type, - }; - metadata->push_back(meta); - i++; - } - } - isConsuming = false; - break; - - default: - isFailed = true; - isConsuming = false; } - } - - sqlite3_finalize(statement); - - if (isFailed) - { - const char *message = sqlite3_errmsg(db); - return SQLiteOPResult{ - .type = SQLiteError, - .errorMessage = "[react-native-quick-sqlite] SQL execution error: " + string(message), - .rowsAffected = 0, - .insertId = 0 - }; - } - - int changedRowCount = sqlite3_changes(db); - long long latestInsertRowId = sqlite3_last_insert_rowid(db); - return SQLiteOPResult{ - .type = SQLiteOk, - .rowsAffected = changedRowCount, - .insertId = static_cast(latestInsertRowId)}; -} - -SequelLiteralUpdateResult sqliteExecuteLiteral(string const dbName, string const &query) -{ - // Check if db connection is opened - if (dbMap.count(dbName) == 0) - { - return { - SQLiteError, - "[react-native-quick-sqlite] Database not opened: " + dbName, - 0 - }; - } - - 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 - { - const char *message = sqlite3_errmsg(db); - return { - SQLiteError, - "[react-native-quick-sqlite] SQL execution error: " + string(message), - 0}; - } - - bool isConsuming = true; - bool isFailed = false; - - int result, i, count, column_type; - string column_name; - - while (isConsuming) - { - result = sqlite3_step(statement); - - switch (result) + + sqlite3_finalize(statement); + + if (isFailed) { - case SQLITE_ROW: - isConsuming = true; - break; - - case SQLITE_DONE: - isConsuming = false; - break; - - default: - isFailed = true; - isConsuming = false; + const char *message = sqlite3_errmsg(db); + return { + SQLiteError, + "[react-native-quick-sqlite] SQL execution error: " + std::string(message), + 0}; } - } - - sqlite3_finalize(statement); - - if (isFailed) - { - const char *message = sqlite3_errmsg(db); + + int changedRowCount = sqlite3_changes(db); return { - SQLiteError, - "[react-native-quick-sqlite] SQL execution error: " + string(message), - 0}; - } + SQLiteOk, + "", + changedRowCount}; +} - int changedRowCount = sqlite3_changes(db); - return { - SQLiteOk, - "", - changedRowCount}; } diff --git a/cpp/sqliteBridge.h b/cpp/sqliteBridge.h index 9696ea95..b6e071f5 100644 --- a/cpp/sqliteBridge.h +++ b/cpp/sqliteBridge.h @@ -1,30 +1,27 @@ -/* - * sequel.h - * - * Created by Oscar Franco on 2021/03/07 - * Copyright (c) 2021 Oscar Franco - * - * This code is licensed under the MIT license - */ - -#include "JSIHelper.h" #include +#include "JSIHelper.h" +#include "ColumnMetadata.hpp" +#include "Types.hpp" -using namespace std; using namespace facebook; +using namespace margelo::nitro::rnquicksqlite; -SQLiteOPResult sqliteOpenDb(string const dbName, string const docPath); +namespace margelo::rnquicksqlite { -SQLiteOPResult sqliteCloseDb(string const dbName); +SQLiteOPResult sqliteOpenDb(const std::string& dbName, const std::string& docPath); -SQLiteOPResult sqliteRemoveDb(string const dbName, string const docPath); +SQLiteOPResult sqliteCloseDb(const std::string& dbName); -SQLiteOPResult sqliteAttachDb(string const mainDBName, string const docPath, string const databaseToAttach, string const alias); +SQLiteOPResult sqliteRemoveDb(const std::string& dbName, const std::string& docPath); -SQLiteOPResult sqliteDetachDb(string const mainDBName, string const alias); +SQLiteOPResult sqliteAttachDb(const std::string& mainDBName, const std::string& docPath, const std::string& databaseToAttach, const std::string& alias); -SQLiteOPResult sqliteExecute(string const dbName, string const &query, vector *values, vector> *result, vector *metadata); +SQLiteOPResult sqliteDetachDb(const std::string& mainDBName, const std::string& alias); -SequelLiteralUpdateResult sqliteExecuteLiteral(string const dbName, string const &query); +SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, std::optional>& params, std::vector> *result, std::vector *metadata); + +SequelLiteralUpdateResult sqliteExecuteLiteral(const std::string& dbName, const std::string& query); void sqliteCloseAll(); + +} From 95e5e2838099d7ae2b96a841a520bbd48ee38e80 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 8 Sep 2024 23:23:22 +0200 Subject: [PATCH 052/156] update specs --- example/src/tests/rawQueries.spec.ts | 6 +- .../android/RNQuickSQLite+autolinking.cmake | 2 +- .../android/RNQuickSQLite+autolinking.gradle | 2 +- .../ios/RNQuickSQLite+autolinking.rb | 2 +- .../ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp | 2 +- .../ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 66 ++++++---------- .../ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp | 11 +-- .../shared/c++/BatchQueryCommand.hpp | 78 +++++++++++++++++++ .../generated/shared/c++/BatchQueryResult.hpp | 2 +- .../shared/c++/BulkQueryTupleFallback.hpp | 75 ------------------ .../generated/shared/c++/ColumnMetadata.hpp | 2 +- nitrogen/generated/shared/c++/ColumnType.hpp | 2 +- .../generated/shared/c++/FileLoadResult.hpp | 2 +- .../shared/c++/HybridQuickSQLiteSpec.cpp | 2 +- .../shared/c++/HybridQuickSQLiteSpec.hpp | 15 ++-- .../c++/HybridSelectQueryResultSpec.cpp | 2 +- .../c++/HybridSelectQueryResultSpec.hpp | 2 +- nitrogen/generated/shared/c++/QueryResult.hpp | 2 +- nitrogen/generated/shared/c++/QueryType.hpp | 2 +- .../shared/c++/SingleQueryTupleFallback.hpp | 69 ---------------- nitrogen/generated/shared/c++/Transaction.hpp | 2 +- src/index.ts | 6 +- src/specs/QuickSQLite.nitro.ts | 6 +- src/types.ts | 17 ++-- 24 files changed, 139 insertions(+), 238 deletions(-) create mode 100644 nitrogen/generated/shared/c++/BatchQueryCommand.hpp delete mode 100644 nitrogen/generated/shared/c++/BulkQueryTupleFallback.hpp delete mode 100644 nitrogen/generated/shared/c++/SingleQueryTupleFallback.hpp diff --git a/example/src/tests/rawQueries.spec.ts b/example/src/tests/rawQueries.spec.ts index 25df604d..5273b214 100644 --- a/example/src/tests/rawQueries.spec.ts +++ b/example/src/tests/rawQueries.spec.ts @@ -2,7 +2,7 @@ import Chance from 'chance' import { open, QuickSQLiteConnection, - SQLBatchTuple, + BatchQueryCommand, } from 'react-native-quick-sqlite' import { beforeEach, describe, it } from './MochaRNAdapter' import chai from 'chai' @@ -576,7 +576,7 @@ export function registerBaseTests() { const age2 = chance.integer() const networth2 = chance.floating() - const commands: SQLBatchTuple[] = [ + const commands: BatchQueryCommand[] = [ [ 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', [id1, name1, age1, networth1], @@ -612,7 +612,7 @@ export function registerBaseTests() { const age2 = chance.integer() const networth2 = chance.floating() - const commands: SQLBatchTuple[] = [ + const commands: BatchQueryCommand[] = [ [ 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', [id1, name1, age1, networth1], diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake index 8a5dc111..50b464c0 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake @@ -1,6 +1,6 @@ # # RNQuickSQLite+autolinking.cmake -# Fri Sep 06 2024 +# Sun Sep 08 2024 # This file was generated by nitrogen. DO NOT MODIFY THIS FILE. # https://github.com/mrousavy/nitro # Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle b/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle index a71c98b5..cd2d188e 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle @@ -1,6 +1,6 @@ /// /// RNQuickSQLite+autolinking.gradle -/// Fri Sep 06 2024 +/// Sun Sep 08 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb b/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb index 303122f5..c2056533 100644 --- a/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb +++ b/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb @@ -1,6 +1,6 @@ # # RNQuickSQLite+autolinking.rb -# Fri Sep 06 2024 +# Sun Sep 08 2024 # This file was generated by nitrogen. DO NOT MODIFY THIS FILE. # https://github.com/mrousavy/nitro # Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp index 34c931e8..e839f27c 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Bridge.cpp -/// Fri Sep 06 2024 +/// Sun Sep 08 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index 69a9c362..9982557c 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Bridge.hpp -/// Fri Sep 06 2024 +/// Sun Sep 08 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo @@ -11,10 +11,10 @@ // Forward declarations of C++ defined types // Forward declaration of `ArrayBuffer` to properly resolve imports. namespace NitroModules { class ArrayBuffer; } +// Forward declaration of `BatchQueryCommand` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct BatchQueryCommand; } // Forward declaration of `BatchQueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } -// Forward declaration of `BulkQueryTupleFallback` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct BulkQueryTupleFallback; } // Forward declaration of `ColumnMetadata` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } // Forward declaration of `FileLoadResult` to properly resolve imports. @@ -23,19 +23,16 @@ namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } // Forward declaration of `QueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct QueryResult; } -// Forward declaration of `SingleQueryTupleFallback` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct SingleQueryTupleFallback; } // Forward declaration of `Transaction` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct Transaction; } // Include C++ defined types +#include "BatchQueryCommand.hpp" #include "BatchQueryResult.hpp" -#include "BulkQueryTupleFallback.hpp" #include "ColumnMetadata.hpp" #include "FileLoadResult.hpp" #include "HybridSelectQueryResultSpec.hpp" #include "QueryResult.hpp" -#include "SingleQueryTupleFallback.hpp" #include "Transaction.hpp" #include #include @@ -223,65 +220,46 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { } /** - * Specialized version of `std::vector`. + * Specialized version of `std::vector>>>`. */ - using std__vector_std__nullptr_t_ = std::vector; - inline std::vector create_std__vector_std__nullptr_t_(size_t size) { - std::vector vector; + using std__vector_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____ = std::vector>>>; + inline std::vector>>> create_std__vector_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____(size_t size) { + std::vector>>> vector; vector.reserve(size); return vector; } /** - * Specialized version of `std::vector>`. + * Specialized version of `std::variant>>, std::vector>>>>`. */ - using std__vector_std__vector_std__nullptr_t__ = std::vector>; - inline std::vector> create_std__vector_std__vector_std__nullptr_t__(size_t size) { - std::vector> vector; - vector.reserve(size); - return vector; - } - - /** - * Specialized version of `std::variant, std::vector>>`. - */ - using std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t___ = std::variant, std::vector>>; - inline std::variant, std::vector>> create_std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t___(const std::vector& value) { + using std__variant_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer_____std__vector_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer_____ = std::variant>>, std::vector>>>>; + inline std::variant>>, std::vector>>>> create_std__variant_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer_____std__vector_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer_____(const std::vector>>& value) { return value; } - inline std::variant, std::vector>> create_std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t___(const std::vector>& value) { + inline std::variant>>, std::vector>>>> create_std__variant_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer_____std__vector_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer_____(const std::vector>>>& value) { return value; } - inline std::vector get_std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t____0(const std::variant, std::vector>>& variant) { + inline std::vector>> get_std__variant_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer_____std__vector_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer______0(const std::variant>>, std::vector>>>>& variant) { return std::get<0>(variant); } - inline std::vector> get_std__variant_std__vector_std__nullptr_t___std__vector_std__vector_std__nullptr_t____1(const std::variant, std::vector>>& variant) { + inline std::vector>>> get_std__variant_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer_____std__vector_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer______1(const std::variant>>, std::vector>>>>& variant) { return std::get<1>(variant); } /** - * Specialized version of `std::variant`. + * Specialized version of `std::optional>>, std::vector>>>>>`. */ - using std__variant_SingleQueryTupleFallback__BulkQueryTupleFallback_ = std::variant; - inline std::variant create_std__variant_SingleQueryTupleFallback__BulkQueryTupleFallback_(const SingleQueryTupleFallback& value) { - return value; - } - inline std::variant create_std__variant_SingleQueryTupleFallback__BulkQueryTupleFallback_(const BulkQueryTupleFallback& value) { - return value; - } - inline SingleQueryTupleFallback get_std__variant_SingleQueryTupleFallback__BulkQueryTupleFallback__0(const std::variant& variant) { - return std::get<0>(variant); - } - inline BulkQueryTupleFallback get_std__variant_SingleQueryTupleFallback__BulkQueryTupleFallback__1(const std::variant& variant) { - return std::get<1>(variant); + using std__optional_std__variant_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer_____std__vector_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer______ = std::optional>>, std::vector>>>>>; + inline std::optional>>, std::vector>>>>> create_std__optional_std__variant_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer_____std__vector_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer______(const std::variant>>, std::vector>>>>& value) { + return std::optional>>, std::vector>>>>>(value); } /** - * Specialized version of `std::vector>`. + * Specialized version of `std::vector`. */ - using std__vector_std__variant_SingleQueryTupleFallback__BulkQueryTupleFallback__ = std::vector>; - inline std::vector> create_std__vector_std__variant_SingleQueryTupleFallback__BulkQueryTupleFallback__(size_t size) { - std::vector> vector; + using std__vector_BatchQueryCommand_ = std::vector; + inline std::vector create_std__vector_BatchQueryCommand_(size_t size) { + std::vector vector; vector.reserve(size); return vector; } diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp index 94af8f09..0238c09e 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Umbrella.hpp -/// Fri Sep 06 2024 +/// Sun Sep 08 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo @@ -11,10 +11,10 @@ // Forward declarations of C++ defined types // Forward declaration of `ArrayBuffer` to properly resolve imports. namespace NitroModules { class ArrayBuffer; } +// Forward declaration of `BatchQueryCommand` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct BatchQueryCommand; } // Forward declaration of `BatchQueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } -// Forward declaration of `BulkQueryTupleFallback` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct BulkQueryTupleFallback; } // Forward declaration of `ColumnMetadata` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } // Forward declaration of `ColumnType` to properly resolve imports. @@ -27,21 +27,18 @@ namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } namespace margelo::nitro::rnquicksqlite { struct QueryResult; } // Forward declaration of `QueryType` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { enum class QueryType; } -// Forward declaration of `SingleQueryTupleFallback` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct SingleQueryTupleFallback; } // Forward declaration of `Transaction` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct Transaction; } // Include C++ defined types +#include "BatchQueryCommand.hpp" #include "BatchQueryResult.hpp" -#include "BulkQueryTupleFallback.hpp" #include "ColumnMetadata.hpp" #include "ColumnType.hpp" #include "FileLoadResult.hpp" #include "HybridSelectQueryResultSpec.hpp" #include "QueryResult.hpp" #include "QueryType.hpp" -#include "SingleQueryTupleFallback.hpp" #include "Transaction.hpp" #include #include diff --git a/nitrogen/generated/shared/c++/BatchQueryCommand.hpp b/nitrogen/generated/shared/c++/BatchQueryCommand.hpp new file mode 100644 index 00000000..36453c03 --- /dev/null +++ b/nitrogen/generated/shared/c++/BatchQueryCommand.hpp @@ -0,0 +1,78 @@ +/// +/// BatchQueryCommand.hpp +/// Sun Sep 08 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +// Forward declaration of `ArrayBuffer` to properly resolve imports. +namespace NitroModules { class ArrayBuffer; } + +#include +#include +#include +#include +#include + +namespace margelo::nitro::rnquicksqlite { + + /** + * A struct which can be represented as a JavaScript object (BatchQueryCommand). + */ + struct BatchQueryCommand { + public: + std::string query SWIFT_PRIVATE; + std::optional>>, std::vector>>>>> params SWIFT_PRIVATE; + + public: + explicit BatchQueryCommand(std::string query, std::optional>>, std::vector>>>>> params): query(query), params(params) {} + }; + +} // namespace margelo::nitro::rnquicksqlite + +namespace margelo::nitro { + + using namespace margelo::nitro::rnquicksqlite; + + // C++ BatchQueryCommand <> JS BatchQueryCommand (object) + template <> + struct JSIConverter { + static inline BatchQueryCommand fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return BatchQueryCommand( + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "query")), + JSIConverter>>, std::vector>>>>>>::fromJSI(runtime, obj.getProperty(runtime, "params")) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const BatchQueryCommand& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, "query", JSIConverter::toJSI(runtime, arg.query)); + obj.setProperty(runtime, "params", JSIConverter>>, std::vector>>>>>>::toJSI(runtime, arg.params)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "query"))) return false; + if (!JSIConverter>>, std::vector>>>>>>::canConvert(runtime, obj.getProperty(runtime, "params"))) return false; + return true; + } + }; + +} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/BatchQueryResult.hpp b/nitrogen/generated/shared/c++/BatchQueryResult.hpp index bdbb2331..ac66ce0a 100644 --- a/nitrogen/generated/shared/c++/BatchQueryResult.hpp +++ b/nitrogen/generated/shared/c++/BatchQueryResult.hpp @@ -1,6 +1,6 @@ /// /// BatchQueryResult.hpp -/// Fri Sep 06 2024 +/// Sun Sep 08 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/BulkQueryTupleFallback.hpp b/nitrogen/generated/shared/c++/BulkQueryTupleFallback.hpp deleted file mode 100644 index 8fca51b7..00000000 --- a/nitrogen/generated/shared/c++/BulkQueryTupleFallback.hpp +++ /dev/null @@ -1,75 +0,0 @@ -/// -/// BulkQueryTupleFallback.hpp -/// Fri Sep 06 2024 -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - - - -#include -#include -#include - -namespace margelo::nitro::rnquicksqlite { - - /** - * A struct which can be represented as a JavaScript object (BulkQueryTupleFallback). - */ - struct BulkQueryTupleFallback { - public: - std::string first SWIFT_PRIVATE; - std::variant, std::vector>> second SWIFT_PRIVATE; - - public: - explicit BulkQueryTupleFallback(std::string first, std::variant, std::vector>> second): first(first), second(second) {} - }; - -} // namespace margelo::nitro::rnquicksqlite - -namespace margelo::nitro { - - using namespace margelo::nitro::rnquicksqlite; - - // C++ BulkQueryTupleFallback <> JS BulkQueryTupleFallback (object) - template <> - struct JSIConverter { - static inline BulkQueryTupleFallback fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { - jsi::Object obj = arg.asObject(runtime); - return BulkQueryTupleFallback( - JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "first")), - JSIConverter, std::vector>>>::fromJSI(runtime, obj.getProperty(runtime, "second")) - ); - } - static inline jsi::Value toJSI(jsi::Runtime& runtime, const BulkQueryTupleFallback& arg) { - jsi::Object obj(runtime); - obj.setProperty(runtime, "first", JSIConverter::toJSI(runtime, arg.first)); - obj.setProperty(runtime, "second", JSIConverter, std::vector>>>::toJSI(runtime, arg.second)); - return obj; - } - static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { - if (!value.isObject()) { - return false; - } - jsi::Object obj = value.getObject(runtime); - if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "first"))) return false; - if (!JSIConverter, std::vector>>>::canConvert(runtime, obj.getProperty(runtime, "second"))) return false; - return true; - } - }; - -} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/ColumnMetadata.hpp b/nitrogen/generated/shared/c++/ColumnMetadata.hpp index d9796b05..947f530d 100644 --- a/nitrogen/generated/shared/c++/ColumnMetadata.hpp +++ b/nitrogen/generated/shared/c++/ColumnMetadata.hpp @@ -1,6 +1,6 @@ /// /// ColumnMetadata.hpp -/// Fri Sep 06 2024 +/// Sun Sep 08 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/ColumnType.hpp b/nitrogen/generated/shared/c++/ColumnType.hpp index 7d01f08a..a8858cbf 100644 --- a/nitrogen/generated/shared/c++/ColumnType.hpp +++ b/nitrogen/generated/shared/c++/ColumnType.hpp @@ -1,6 +1,6 @@ /// /// ColumnType.hpp -/// Fri Sep 06 2024 +/// Sun Sep 08 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/FileLoadResult.hpp b/nitrogen/generated/shared/c++/FileLoadResult.hpp index 221f42f8..af85a8f1 100644 --- a/nitrogen/generated/shared/c++/FileLoadResult.hpp +++ b/nitrogen/generated/shared/c++/FileLoadResult.hpp @@ -1,6 +1,6 @@ /// /// FileLoadResult.hpp -/// Fri Sep 06 2024 +/// Sun Sep 08 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp index ea61995b..2b0ddb12 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp @@ -1,6 +1,6 @@ /// /// HybridQuickSQLiteSpec.cpp -/// Fri Sep 06 2024 +/// Sun Sep 08 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp index b5b19db3..a8cbdfac 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp @@ -1,6 +1,6 @@ /// /// HybridQuickSQLiteSpec.hpp -/// Fri Sep 06 2024 +/// Sun Sep 08 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo @@ -22,10 +22,8 @@ namespace margelo::nitro::rnquicksqlite { struct QueryResult; } namespace NitroModules { class ArrayBuffer; } // Forward declaration of `BatchQueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } -// Forward declaration of `SingleQueryTupleFallback` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct SingleQueryTupleFallback; } -// Forward declaration of `BulkQueryTupleFallback` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct BulkQueryTupleFallback; } +// Forward declaration of `BatchQueryCommand` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct BatchQueryCommand; } // Forward declaration of `FileLoadResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } @@ -39,8 +37,7 @@ namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } #include #include #include "BatchQueryResult.hpp" -#include "SingleQueryTupleFallback.hpp" -#include "BulkQueryTupleFallback.hpp" +#include "BatchQueryCommand.hpp" #include "FileLoadResult.hpp" namespace margelo::nitro::rnquicksqlite { @@ -79,8 +76,8 @@ namespace margelo::nitro::rnquicksqlite { virtual std::future transaction(const std::string& dbName, const std::function>(const Transaction& /* tx */)>& fn) = 0; virtual QueryResult execute(const std::string& dbName, const std::string& query, const std::optional>>>& params) = 0; virtual std::future executeAsync(const std::string& dbName, const std::string& query, const std::optional>>>& params) = 0; - virtual BatchQueryResult executeBatch(const std::string& dbName, const std::vector>& commands) = 0; - virtual std::future executeBatchAsync(const std::string& dbName, const std::vector>& commands) = 0; + virtual BatchQueryResult executeBatch(const std::string& dbName, const std::vector& commands) = 0; + virtual std::future executeBatchAsync(const std::string& dbName, const std::vector& commands) = 0; virtual FileLoadResult loadFile(const std::string& dbName, const std::string& location) = 0; virtual std::future loadFileAsync(const std::string& dbName, const std::string& location) = 0; diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp index 066a52de..7290a6e3 100644 --- a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp @@ -1,6 +1,6 @@ /// /// HybridSelectQueryResultSpec.cpp -/// Fri Sep 06 2024 +/// Sun Sep 08 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp index 96a456c9..6726fad1 100644 --- a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp @@ -1,6 +1,6 @@ /// /// HybridSelectQueryResultSpec.hpp -/// Fri Sep 06 2024 +/// Sun Sep 08 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/QueryResult.hpp b/nitrogen/generated/shared/c++/QueryResult.hpp index 445ece5d..b1fa4f08 100644 --- a/nitrogen/generated/shared/c++/QueryResult.hpp +++ b/nitrogen/generated/shared/c++/QueryResult.hpp @@ -1,6 +1,6 @@ /// /// QueryResult.hpp -/// Fri Sep 06 2024 +/// Sun Sep 08 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/QueryType.hpp b/nitrogen/generated/shared/c++/QueryType.hpp index 8fe419e4..2f92e661 100644 --- a/nitrogen/generated/shared/c++/QueryType.hpp +++ b/nitrogen/generated/shared/c++/QueryType.hpp @@ -1,6 +1,6 @@ /// /// QueryType.hpp -/// Fri Sep 06 2024 +/// Sun Sep 08 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/SingleQueryTupleFallback.hpp b/nitrogen/generated/shared/c++/SingleQueryTupleFallback.hpp deleted file mode 100644 index 06f6971c..00000000 --- a/nitrogen/generated/shared/c++/SingleQueryTupleFallback.hpp +++ /dev/null @@ -1,69 +0,0 @@ -/// -/// SingleQueryTupleFallback.hpp -/// Fri Sep 06 2024 -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - - - -#include - -namespace margelo::nitro::rnquicksqlite { - - /** - * A struct which can be represented as a JavaScript object (SingleQueryTupleFallback). - */ - struct SingleQueryTupleFallback { - public: - std::string first SWIFT_PRIVATE; - - public: - explicit SingleQueryTupleFallback(std::string first): first(first) {} - }; - -} // namespace margelo::nitro::rnquicksqlite - -namespace margelo::nitro { - - using namespace margelo::nitro::rnquicksqlite; - - // C++ SingleQueryTupleFallback <> JS SingleQueryTupleFallback (object) - template <> - struct JSIConverter { - static inline SingleQueryTupleFallback fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { - jsi::Object obj = arg.asObject(runtime); - return SingleQueryTupleFallback( - JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "first")) - ); - } - static inline jsi::Value toJSI(jsi::Runtime& runtime, const SingleQueryTupleFallback& arg) { - jsi::Object obj(runtime); - obj.setProperty(runtime, "first", JSIConverter::toJSI(runtime, arg.first)); - return obj; - } - static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { - if (!value.isObject()) { - return false; - } - jsi::Object obj = value.getObject(runtime); - if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "first"))) return false; - return true; - } - }; - -} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/Transaction.hpp b/nitrogen/generated/shared/c++/Transaction.hpp index 48d58afb..e070b00a 100644 --- a/nitrogen/generated/shared/c++/Transaction.hpp +++ b/nitrogen/generated/shared/c++/Transaction.hpp @@ -1,6 +1,6 @@ /// /// Transaction.hpp -/// Fri Sep 06 2024 +/// Sun Sep 08 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/src/index.ts b/src/index.ts index d19b0886..8614bb8f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,7 +5,7 @@ import { PendingTransaction, QueryResult, QuickSQLiteConnection, - SQLBatchTuple, + BatchQueryCommand, Transaction, } from 'src/types' @@ -288,9 +288,9 @@ export const open = (options: { params?: ExecuteParam[] ): Promise => QuickSQLite.executeAsync(options.name, query, params), - executeBatch: (commands: SQLBatchTuple[]) => + executeBatch: (commands: BatchQueryCommand[]) => QuickSQLite.executeBatch(options.name, commands), - executeBatchAsync: (commands: SQLBatchTuple[]) => + executeBatchAsync: (commands: BatchQueryCommand[]) => QuickSQLite.executeBatchAsync(options.name, commands), loadFile: (location: string) => QuickSQLite.loadFile(options.name, location), diff --git a/src/specs/QuickSQLite.nitro.ts b/src/specs/QuickSQLite.nitro.ts index ce6ccff6..033ff1bf 100644 --- a/src/specs/QuickSQLite.nitro.ts +++ b/src/specs/QuickSQLite.nitro.ts @@ -3,7 +3,7 @@ import { QueryResult, BatchQueryResult, FileLoadResult, - SQLBatchTuple, + BatchQueryCommand, Transaction, ExecuteParam, } from '../types' @@ -30,10 +30,10 @@ export interface QuickSQLite query: string, params?: ExecuteParam[] ): Promise - executeBatch(dbName: string, commands: SQLBatchTuple[]): BatchQueryResult + executeBatch(dbName: string, commands: BatchQueryCommand[]): BatchQueryResult executeBatchAsync( dbName: string, - commands: SQLBatchTuple[] + commands: BatchQueryCommand[] ): Promise loadFile(dbName: string, location: string): FileLoadResult loadFileAsync(dbName: string, location: string): Promise diff --git a/src/types.ts b/src/types.ts index ed76e83a..64f665ed 100644 --- a/src/types.ts +++ b/src/types.ts @@ -52,21 +52,16 @@ export interface PendingTransaction { start: () => void } -export interface SingleQueryTupleFallback { - first: string -} -export interface BulkQueryTupleFallback { - first: string - second: Array | Array> -} - /** * Allows the execution of bulk of sql commands * inside a transaction * If a single query must be executed many times with different arguments, its preferred * to declare it a single time, and use an array of array parameters. */ -export type SQLBatchTuple = SingleQueryTupleFallback | BulkQueryTupleFallback +export interface BatchQueryCommand { + query: string + params?: Array | Array> +} /** * status: 0 or undefined for correct execution, 1 for error @@ -93,8 +88,8 @@ export interface QuickSQLiteConnection { transaction(fn: (tx: Transaction) => Promise | void): Promise execute: ExecuteQuery executeAsync: ExecuteAsyncQuery - executeBatch(commands: SQLBatchTuple[]): BatchQueryResult - executeBatchAsync(commands: SQLBatchTuple[]): Promise + executeBatch(commands: BatchQueryCommand[]): BatchQueryResult + executeBatchAsync(commands: BatchQueryCommand[]): Promise loadFile(location: string): FileLoadResult loadFileAsync(location: string): Promise } From 411c272952b3bdab28d2d5d1818e3e3b51451c35 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 8 Sep 2024 23:26:19 +0200 Subject: [PATCH 053/156] update specs --- .../ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 182 ++++++++++++++---- 1 file changed, 147 insertions(+), 35 deletions(-) diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index 9982557c..e343f90d 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -9,6 +9,8 @@ #pragma once // Forward declarations of C++ defined types +// Forward declaration of `ArrayBufferHolder` to properly resolve imports. +namespace NitroModules { class ArrayBufferHolder; } // Forward declaration of `ArrayBuffer` to properly resolve imports. namespace NitroModules { class ArrayBuffer; } // Forward declaration of `BatchQueryCommand` to properly resolve imports. @@ -17,32 +19,82 @@ namespace margelo::nitro::rnquicksqlite { struct BatchQueryCommand; } namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } // Forward declaration of `ColumnMetadata` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } +// Forward declaration of `ColumnType` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { enum class ColumnType; } // Forward declaration of `FileLoadResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } +// Forward declaration of `HybridSelectQueryResultSpecSwift` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpecSwift; } // Forward declaration of `HybridSelectQueryResultSpec` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } // Forward declaration of `QueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct QueryResult; } +// Forward declaration of `QueryType` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { enum class QueryType; } // Forward declaration of `Transaction` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct Transaction; } // Include C++ defined types -#include "BatchQueryCommand.hpp" -#include "BatchQueryResult.hpp" -#include "ColumnMetadata.hpp" -#include "FileLoadResult.hpp" -#include "HybridSelectQueryResultSpec.hpp" -#include "QueryResult.hpp" -#include "Transaction.hpp" -#include -#include -#include -#include -#include -#include -#include -#include -#include +#if __has_include("BatchQueryCommand.hpp") + #include "BatchQueryCommand.hpp" +#endif +#if __has_include("BatchQueryResult.hpp") + #include "BatchQueryResult.hpp" +#endif +#if __has_include("ColumnMetadata.hpp") + #include "ColumnMetadata.hpp" +#endif +#if __has_include("ColumnType.hpp") + #include "ColumnType.hpp" +#endif +#if __has_include("FileLoadResult.hpp") + #include "FileLoadResult.hpp" +#endif +#if __has_include("HybridSelectQueryResultSpec.hpp") + #include "HybridSelectQueryResultSpec.hpp" +#endif +#if __has_include("HybridSelectQueryResultSpecSwift.hpp") + #include "HybridSelectQueryResultSpecSwift.hpp" +#endif +#if __has_include("QueryResult.hpp") + #include "QueryResult.hpp" +#endif +#if __has_include("QueryType.hpp") + #include "QueryType.hpp" +#endif +#if __has_include("Transaction.hpp") + #include "Transaction.hpp" +#endif +#if __has_include() + #include +#endif +#if __has_include() + #include +#endif +#if __has_include() + #include +#endif +#if __has_include() + #include +#endif +#if __has_include() + #include +#endif +#if __has_include() + #include +#endif +#if __has_include() + #include +#endif +#if __has_include() + #include +#endif +#if __has_include() + #include +#endif +#if __has_include() + #include +#endif /** * Contains specialized versions of C++ templated types so they can be accessed from Swift, @@ -86,15 +138,30 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { * Specialized version of `std::function()>`. */ using Func_std__future_QueryResult_ = std::function()>; + /** + * Wrapper class for a `std::function()>`, this can be used from Swift. + */ + class Func_std__future_QueryResult__Wrapper { + public: + explicit Func_std__future_QueryResult__Wrapper(const std::function()>& func): function(func) {} + explicit Func_std__future_QueryResult__Wrapper(std::function()>&& func): function(std::move(func)) {} + + PromiseHolder call() const { + auto result = function(); + return []() -> PromiseHolder { throw std::runtime_error("Promise<..> cannot be converted to Swift yet!"); }(); + } + + std::function()> function; + }; inline Func_std__future_QueryResult_ create_Func_std__future_QueryResult_(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */), void(*destroy)(void*)) { std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call]() -> std::future { + return Func_std__future_QueryResult_([sharedClosureHolder, call]() -> std::future { auto result = call(sharedClosureHolder.get()); return result.getFuture(); - }; + }); } - inline std::shared_ptr share_Func_std__future_QueryResult_(const Func_std__future_QueryResult_& value) { - return std::make_shared(value); + inline std::shared_ptr share_Func_std__future_QueryResult_(const Func_std__future_QueryResult_& value) { + return std::make_shared(value); } /** @@ -151,33 +218,63 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { } /** - * Specialized version of `std::function(const std::string& / * query * /, const std::vector>>& / * params * /)>`. + * Specialized version of `std::function(const std::string&, const std::vector>>&)>`. */ using Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___ = std::function(const std::string& /* query */, const std::vector>>& /* params */)>; + /** + * Wrapper class for a `std::function(const std::string& / * query * /, const std::vector>>& / * params * /)>`, this can be used from Swift. + */ + class Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____Wrapper { + public: + explicit Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____Wrapper(const std::function(const std::string& /* query */, const std::vector>>& /* params */)>& func): function(func) {} + explicit Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____Wrapper(std::function(const std::string& /* query */, const std::vector>>& /* params */)>&& func): function(std::move(func)) {} + + PromiseHolder call(std::string query, std::vector>> params) const { + auto result = function(query, params); + return []() -> PromiseHolder { throw std::runtime_error("Promise<..> cannot be converted to Swift yet!"); }(); + } + + std::function(const std::string& /* query */, const std::vector>>& /* params */)> function; + }; inline Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___ create_Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, std::string, std::vector>>), void(*destroy)(void*)) { std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& query, const std::vector>>& params) -> std::future { + return Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___([sharedClosureHolder, call](const std::string& query, const std::vector>>& params) -> std::future { auto result = call(sharedClosureHolder.get(), query, params); return result.getFuture(); - }; + }); } - inline std::shared_ptr share_Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___(const Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___& value) { - return std::make_shared(value); + inline std::shared_ptr share_Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___(const Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___& value) { + return std::make_shared(value); } /** - * Specialized version of `std::function>(const std::string& / * query * /, const std::vector>>& / * params * /)>`. + * Specialized version of `std::function>(const std::string&, const std::vector>>&)>`. */ using Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___ = std::function>(const std::string& /* query */, const std::vector>>& /* params */)>; + /** + * Wrapper class for a `std::function>(const std::string& / * query * /, const std::vector>>& / * params * /)>`, this can be used from Swift. + */ + class Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____Wrapper { + public: + explicit Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____Wrapper(const std::function>(const std::string& /* query */, const std::vector>>& /* params */)>& func): function(func) {} + explicit Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____Wrapper(std::function>(const std::string& /* query */, const std::vector>>& /* params */)>&& func): function(std::move(func)) {} + + PromiseHolder> call(std::string query, std::vector>> params) const { + auto result = function(query, params); + return []() -> PromiseHolder> { throw std::runtime_error("Promise<..> cannot be converted to Swift yet!"); }(); + } + + std::function>(const std::string& /* query */, const std::vector>>& /* params */)> function; + }; inline Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___ create_Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, std::string, std::vector>>), void(*destroy)(void*)) { std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const std::string& query, const std::vector>>& params) -> std::future> { + return Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___([sharedClosureHolder, call](const std::string& query, const std::vector>>& params) -> std::future> { auto result = call(sharedClosureHolder.get(), query, params); return result.getFuture(); - }; + }); } - inline std::shared_ptr share_Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___(const Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___& value) { - return std::make_shared(value); + inline std::shared_ptr share_Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___(const Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___& value) { + return std::make_shared(value); } /** @@ -189,18 +286,33 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { } /** - * Specialized version of `std::function>(const Transaction& / * tx * /)>`. + * Specialized version of `std::function>(const Transaction&)>`. */ using Func_std__future_std__future_void___Transaction = std::function>(const Transaction& /* tx */)>; + /** + * Wrapper class for a `std::function>(const Transaction& / * tx * /)>`, this can be used from Swift. + */ + class Func_std__future_std__future_void___Transaction_Wrapper { + public: + explicit Func_std__future_std__future_void___Transaction_Wrapper(const std::function>(const Transaction& /* tx */)>& func): function(func) {} + explicit Func_std__future_std__future_void___Transaction_Wrapper(std::function>(const Transaction& /* tx */)>&& func): function(std::move(func)) {} + + PromiseHolder> call(Transaction tx) const { + auto result = function(tx); + return []() -> PromiseHolder> { throw std::runtime_error("Promise<..> cannot be converted to Swift yet!"); }(); + } + + std::function>(const Transaction& /* tx */)> function; + }; inline Func_std__future_std__future_void___Transaction create_Func_std__future_std__future_void___Transaction(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, Transaction), void(*destroy)(void*)) { std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return [sharedClosureHolder, call](const Transaction& tx) -> std::future> { + return Func_std__future_std__future_void___Transaction([sharedClosureHolder, call](const Transaction& tx) -> std::future> { auto result = call(sharedClosureHolder.get(), tx); return result.getFuture(); - }; + }); } - inline std::shared_ptr share_Func_std__future_std__future_void___Transaction(const Func_std__future_std__future_void___Transaction& value) { - return std::make_shared(value); + inline std::shared_ptr share_Func_std__future_std__future_void___Transaction(const Func_std__future_std__future_void___Transaction& value) { + return std::make_shared(value); } /** From 426eb3c9769920060692782eb796009411efbc0a Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Mon, 9 Sep 2024 00:21:00 +0200 Subject: [PATCH 054/156] new implementation --- cpp/JSIHelper.cpp | 2 + cpp/JSIHelper.h | 12 +-- cpp/OnLoad.cpp | 2 + cpp/OnLoad.hpp | 4 + cpp/ThreadPool.cpp | 128 ++++++++++++++-------------- cpp/ThreadPool.h | 64 +++++++------- cpp/specs/HybridQuickSQLiteSpec.cpp | 56 +++++++++++- cpp/specs/Types.hpp | 2 + cpp/sqlbatchexecutor.cpp | 89 +++++++++---------- cpp/sqlbatchexecutor.h | 22 +++-- cpp/sqlfileloader.cpp | 6 +- cpp/sqliteBridge.cpp | 4 +- cpp/sqliteBridge.h | 4 +- 13 files changed, 229 insertions(+), 166 deletions(-) diff --git a/cpp/JSIHelper.cpp b/cpp/JSIHelper.cpp index d42528f2..0c4caec3 100644 --- a/cpp/JSIHelper.cpp +++ b/cpp/JSIHelper.cpp @@ -1,3 +1,5 @@ +#pragma once + #include "JSIHelper.h" using namespace facebook; diff --git a/cpp/JSIHelper.h b/cpp/JSIHelper.h index cdebfe56..65d3f9f8 100644 --- a/cpp/JSIHelper.h +++ b/cpp/JSIHelper.h @@ -1,12 +1,4 @@ -// -// JSIHelper.hpp -// react-native-quick-sqlite -// -// Created by Oscar on 13.03.22. -// - -#ifndef JSIHelper_h -#define JSIHelper_h +#pragma once #include #include @@ -47,5 +39,3 @@ struct SequelBatchOperationResult int affectedRows; int commands; }; - -#endif /* JSIHelper_h */ diff --git a/cpp/OnLoad.cpp b/cpp/OnLoad.cpp index f2b70157..3aedf0fb 100644 --- a/cpp/OnLoad.cpp +++ b/cpp/OnLoad.cpp @@ -4,6 +4,8 @@ using namespace margelo::nitro; +using namespace margelo::rnquicksqlite; + void clearState() { sqliteCloseAll(); } diff --git a/cpp/OnLoad.hpp b/cpp/OnLoad.hpp index 147d055c..f5280cab 100644 --- a/cpp/OnLoad.hpp +++ b/cpp/OnLoad.hpp @@ -1,9 +1,13 @@ +#pragma once + #include #include "HybridQuickSQLiteSpec.hpp" #include "HybridSelectQueryResultSpec.hpp" #include "sqliteBridge.h" +#include "ThreadPool.h" std::string docPathStr; +auto pool = std::make_shared(); void clearState(); diff --git a/cpp/ThreadPool.cpp b/cpp/ThreadPool.cpp index 85ad07c9..9328682a 100644 --- a/cpp/ThreadPool.cpp +++ b/cpp/ThreadPool.cpp @@ -7,91 +7,95 @@ #include "ThreadPool.h" +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) - { - numberOfThreads = 1; - } - - 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 - threads.push_back(std::thread(&ThreadPool::doWork, this)); - } + // 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) + { + numberOfThreads = 1; + } + + 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 + threads.push_back(std::thread(&ThreadPool::doWork, this)); + } } // 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() { - // 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()) + // 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) { - thread.join(); + if (thread.joinable()) + { + thread.join(); + } } - } } // 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) { - // Grab the mutex - std::lock_guard g(workQueueMutex); - - // Push the request to the queue - workQueue.push(task); - - // Notify one thread that there are requests to process - workQueueConditionVariable.notify_one(); + // Grab the mutex + std::lock_guard g(workQueueMutex); + + // Push the request to the queue + workQueue.push(task); + + // Notify one thread that there are requests to process + workQueueConditionVariable.notify_one(); } // Function used by the threads to grab work from the queue void ThreadPool::doWork() { - // Loop while the queue is not destructing - while (!done) - { - std::function task; - - // Create a scope, so we don't lock the queue for longer than necessary + // Loop while the queue is not destructing + while (!done) { - std::unique_lock g(workQueueMutex); - workQueueConditionVariable.wait(g, [&] - { - // Only wake up if there are elements in the queue or the program is - // shutting down - return !workQueue.empty() || done; }); - - // If we are shutting down exit witout trying to process more work - if (done) - { - break; - } - - task = workQueue.front(); - workQueue.pop(); + 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, [&] + { + // Only wake up if there are elements in the queue or the program is + // shutting down + return !workQueue.empty() || done; }); + + // If we are shutting down exit witout trying to process more work + if (done) + { + break; + } + + task = workQueue.front(); + workQueue.pop(); + } + ++busy; + task(); + --busy; } - ++busy; - task(); - --busy; - } } void ThreadPool::waitFinished() { - std::unique_lock g(workQueueMutex); - workQueueConditionVariable.wait(g, [&]{ return workQueue.empty() && (busy == 0); }); -} \ No newline at end of file + std::unique_lock g(workQueueMutex); + workQueueConditionVariable.wait(g, [&]{ return workQueue.empty() && (busy == 0); }); +} + +} diff --git a/cpp/ThreadPool.h b/cpp/ThreadPool.h index a9534206..b66c29d7 100644 --- a/cpp/ThreadPool.h +++ b/cpp/ThreadPool.h @@ -1,12 +1,4 @@ -// -// ThreadPool.hpp -// react-native-quick-sqlite -// -// Created by Oscar on 13.03.22. -// - -#ifndef ThreadPool_hpp -#define ThreadPool_hpp +#pragma once #include #include @@ -16,34 +8,36 @@ #include #include +namespace margelo::rnquicksqlite { + class ThreadPool { public: - ThreadPool(); - ~ThreadPool(); - void queueWork(std::function task); - void waitFinished(); - + ThreadPool(); + ~ThreadPool(); + void queueWork(std::function task); + void waitFinished(); + private: - unsigned int busy; - // This condition variable is used for the threads to wait until there is work - // to do - std::condition_variable_any workQueueConditionVariable; - - // We store the threads in a vector, so we can later stop them gracefully - std::vector threads; - - // Mutex to protect workQueue - std::mutex workQueueMutex; - - // Queue of requests waiting to be processed - std::queue> workQueue; - - // This will be set to true when the thread pool is shutting down. This tells - // the threads to stop looping and finish - bool done; - - // Function used by the threads to grab work from the queue - void doWork(); + unsigned int busy; + // This condition variable is used for the threads to wait until there is work + // to do + std::condition_variable_any workQueueConditionVariable; + + // We store the threads in a vector, so we can later stop them gracefully + std::vector threads; + + // Mutex to protect workQueue + std::mutex workQueueMutex; + + // Queue of requests waiting to be processed + std::queue> workQueue; + + // This will be set to true when the thread pool is shutting down. This tells + // the threads to stop looping and finish + bool done; + + // Function used by the threads to grab work from the queue + void doWork(); }; -#endif /* ThreadPool_hpp */ +} diff --git a/cpp/specs/HybridQuickSQLiteSpec.cpp b/cpp/specs/HybridQuickSQLiteSpec.cpp index c788d826..e8898c56 100644 --- a/cpp/specs/HybridQuickSQLiteSpec.cpp +++ b/cpp/specs/HybridQuickSQLiteSpec.cpp @@ -107,15 +107,53 @@ QueryResult HybridQuickSQLiteSpec::execute(const std::string& dbName, const std: }; std::future HybridQuickSQLiteSpec::executeAsync(const std::string& dbName, const std::string& query, const std::optional>& params) { + std::promise promise; + auto future = promise.get_future(); + + auto task = [this, prom = std::move(promise), dbName, query, params]() mutable { + try { + auto result = execute(dbName, query, params); + prom.set_value(result); + } catch (...) { + prom.set_exception(std::current_exception()); + } + }; + + pool->queueWork(std::move(task)); + return future; }; -BatchQueryResult executeBatch(const std::string& dbName, const std::vector>& commands) { +BatchQueryResult executeBatch(const std::string& dbName, const std::vector& batchParams) { + const auto commands = batchParamsToCommands(batchParams); + auto batchResult = sqliteExecuteBatch(dbName, commands); + if (batchResult.type == SQLiteOk) + { + return BatchQueryResult(batchResult.rowsAffected); + } + else + { + throw std::runtime_error(batchResult.message); + } }; -std::future executeBatchAsync(const std::string& dbName, const std::vector>& commands) { +std::future HybridQuickSQLiteSpec::executeBatchAsync(const std::string& dbName, const std::vector& batchParams) { + std::promise promise; + auto future = promise.get_future(); + + auto task = [this, prom = std::move(promise), dbName, batchParams]() mutable { + try { + auto result = executeBatch(dbName, batchParams); + prom.set_value(result); + } catch (...) { + prom.set_exception(std::current_exception()); + } + }; + + pool->queueWork(std::move(task)); + return future; }; FileLoadResult HybridQuickSQLiteSpec::loadFile(const std::string& dbName, const std::string& location) { @@ -132,7 +170,21 @@ FileLoadResult HybridQuickSQLiteSpec::loadFile(const std::string& dbName, const }; std::future HybridQuickSQLiteSpec::loadFileAsync(const std::string& dbName, const std::string& location) { + std::promise promise; + auto future = promise.get_future(); + + auto task = [this, prom = std::move(promise), dbName, location]() mutable { + try { + auto result = loadFile(dbName, location); + prom.set_value(result); + } catch (...) { + prom.set_exception(std::current_exception()); + } + }; + + pool->queueWork(std::move(task)); + return future; }; } diff --git a/cpp/specs/Types.hpp b/cpp/specs/Types.hpp index 34208a27..dbb8e0cc 100644 --- a/cpp/specs/Types.hpp +++ b/cpp/specs/Types.hpp @@ -1,3 +1,5 @@ +#pragma once + #include #include "ArrayBuffer.hpp" #include "ColumnType.hpp" diff --git a/cpp/sqlbatchexecutor.cpp b/cpp/sqlbatchexecutor.cpp index 836289b7..47a9d59b 100644 --- a/cpp/sqlbatchexecutor.cpp +++ b/cpp/sqlbatchexecutor.cpp @@ -1,50 +1,52 @@ /** - * Batch execution implementation + * SQL Batch execution implementation using default sqliteBridge implementation */ #include "sqlbatchexecutor.h" +#include "sqliteBridge.h" +#include namespace margelo::rnquicksqlite { -//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) -// }); -// } -// } -//} +std::vector batchParamsToCommands(const std::vector& batchParams) +{ + auto commands = std::vector(); + + for (auto& command : batchParams) + { + if (command.params) + { + using ParamsVec = std::vector>; + if (std::holds_alternative(*command.params)) { + // This arguments is an array of arrays, like a batch update of a single sql command. + for (const auto& params : std::get(*command.params)) + { + commands.push_back(BatchQuery{ + command.query, + std::make_shared(std::move(params)) + }); + } + } + else + { + commands.push_back(BatchQuery{ + command.query, + std::make_shared(std::move(*command.params)) + }); + } + } + else + { + commands.push_back(BatchQuery{ + command.query, + NULL + }); + } + } + + return commands; +} -SequelBatchOperationResult sqliteExecuteBatch(std::string dbName, std::vector *commands) +SequelBatchOperationResult sqliteExecuteBatch(const std::string dbName&, std::vector& commands) { size_t commandCount = commands->size(); if(commandCount <= 0) @@ -54,15 +56,16 @@ SequelBatchOperationResult sqliteExecuteBatch(std::string dbName, std::vectorat(i); + const auto command = commands->at(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, std::make_optional(command.params.get()), NULL, NULL); + auto result = sqliteExecute(dbName, command.sql, *command.params.get(), NULL, NULL); if(result.type == SQLiteError) { sqliteExecuteLiteral(dbName, "ROLLBACK"); diff --git a/cpp/sqlbatchexecutor.h b/cpp/sqlbatchexecutor.h index ea14ce09..16d49945 100644 --- a/cpp/sqlbatchexecutor.h +++ b/cpp/sqlbatchexecutor.h @@ -1,23 +1,31 @@ /** * SQL Batch execution implementation using default sqliteBridge implementation */ +#pragma once + #include "JSIHelper.h" -#include "sqliteBridge.h" +#include "Types.hpp" +#include "BatchQueryCommand.hpp" using namespace facebook; +using namespace margelo::nitro; + +namespace margelo::rnquicksqlite { -struct QuickQueryArguments { +struct BatchQuery { std::string sql; std::shared_ptr> params; }; /** - * Local Helper method to translate JSI objects QuickQueryArguments datastructure + * Local Helper method to translate JSI objects BatchQuery datastructure * MUST be called in the JavaScript Thread -*/ -void jsiBatchParametersToQuickArguments(jsi::Runtime &rt, jsi::Array const &batchParams, std::vector *commands); + */ +std::vector& batchParamsToCommands(const std::vector& batchParams); /** * Execute a batch of commands in a exclusive transaction -*/ -SequelBatchOperationResult sqliteExecuteBatch(std::string dbName, std::vector *commands); + */ +SequelBatchOperationResult sqliteExecuteBatch(const std::string& dbName, std::vector& commands); + +} diff --git a/cpp/sqlfileloader.cpp b/cpp/sqlfileloader.cpp index 04652d02..9778c025 100644 --- a/cpp/sqlfileloader.cpp +++ b/cpp/sqlfileloader.cpp @@ -7,10 +7,10 @@ namespace margelo::rnquicksqlite { -SequelBatchOperationResult importSQLFile(const string& dbName, const string& fileLocation) +SequelBatchOperationResult importSQLFile(const std::string& dbName, const std::string& fileLocation) { - string line; - ifstream sqFile(fileLocation); + std::string line; + std::ifstream sqFile(fileLocation); if (sqFile.is_open()) { try diff --git a/cpp/sqliteBridge.cpp b/cpp/sqliteBridge.cpp index f5c04039..65946e3c 100644 --- a/cpp/sqliteBridge.cpp +++ b/cpp/sqliteBridge.cpp @@ -201,7 +201,7 @@ SQLiteOPResult sqliteRemoveDb(const std::string& dbName, const std::string& docP }; } -void bindStatement(sqlite3_stmt *statement, std::vector& values) +void bindStatement(sqlite3_stmt *statement, const std::vector& values) { size_t size = values.size(); if (size <= 0) @@ -246,7 +246,7 @@ void bindStatement(sqlite3_stmt *statement, std::vector& values) } } -SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, std::optional>& params, std::vector> *results, std::vector *metadata) +SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional>& params, std::vector> *results, std::vector *metadata) { if (dbMap.count(dbName) == 0) { diff --git a/cpp/sqliteBridge.h b/cpp/sqliteBridge.h index b6e071f5..ed05fde2 100644 --- a/cpp/sqliteBridge.h +++ b/cpp/sqliteBridge.h @@ -1,3 +1,5 @@ +#pragma once + #include #include "JSIHelper.h" #include "ColumnMetadata.hpp" @@ -18,7 +20,7 @@ SQLiteOPResult sqliteAttachDb(const std::string& mainDBName, const std::string& SQLiteOPResult sqliteDetachDb(const std::string& mainDBName, const std::string& alias); -SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, std::optional>& params, std::vector> *result, std::vector *metadata); +SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional>& params, std::vector> *result, std::vector *metadata); SequelLiteralUpdateResult sqliteExecuteLiteral(const std::string& dbName, const std::string& query); From 8e7b40708b03ea359ac59bc06827137721fb2653 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Mon, 9 Sep 2024 00:21:10 +0200 Subject: [PATCH 055/156] update Podfile --- example/ios/Podfile.lock | 270 ++++++++++++++++++++------------------- 1 file changed, 140 insertions(+), 130 deletions(-) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 35d39e4b..15fb8faf 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -7,7 +7,7 @@ PODS: - hermes-engine (0.75.2): - hermes-engine/Pre-built (= 0.75.2) - hermes-engine/Pre-built (0.75.2) - - NitroModules (0.6.0): + - NitroModules (0.7.0): - DoubleConversion - glog - hermes-engine @@ -1258,6 +1258,12 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga + - react-native-safe-area-context (4.5.0): + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-Core + - ReactCommon/turbomodule/core - React-nativeconfig (0.75.2) - React-NativeModulesApple (0.75.2): - glog @@ -1544,72 +1550,73 @@ PODS: - Yoga (0.0.0) DEPENDENCIES: - - boost (from `../../node_modules/react-native/third-party-podspecs/boost.podspec`) - - DoubleConversion (from `../../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - - FBLazyVector (from `../../node_modules/react-native/Libraries/FBLazyVector`) - - 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`) - - RCTRequired (from `../../node_modules/react-native/Libraries/Required`) - - RCTTypeSafety (from `../../node_modules/react-native/Libraries/TypeSafety`) - - React (from `../../node_modules/react-native/`) - - React-callinvoker (from `../../node_modules/react-native/ReactCommon/callinvoker`) - - React-Core (from `../../node_modules/react-native/`) - - React-Core/RCTWebSocket (from `../../node_modules/react-native/`) - - React-CoreModules (from `../../node_modules/react-native/React/CoreModules`) - - React-cxxreact (from `../../node_modules/react-native/ReactCommon/cxxreact`) - - React-debug (from `../../node_modules/react-native/ReactCommon/react/debug`) - - React-defaultsnativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/defaults`) - - React-domnativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/dom`) - - React-Fabric (from `../../node_modules/react-native/ReactCommon`) - - React-FabricComponents (from `../../node_modules/react-native/ReactCommon`) - - React-FabricImage (from `../../node_modules/react-native/ReactCommon`) - - React-featureflags (from `../../node_modules/react-native/ReactCommon/react/featureflags`) - - React-featureflagsnativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`) - - React-graphics (from `../../node_modules/react-native/ReactCommon/react/renderer/graphics`) - - React-hermes (from `../../node_modules/react-native/ReactCommon/hermes`) - - React-idlecallbacksnativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`) - - React-ImageManager (from `../../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) - - React-jserrorhandler (from `../../node_modules/react-native/ReactCommon/jserrorhandler`) - - React-jsi (from `../../node_modules/react-native/ReactCommon/jsi`) - - React-jsiexecutor (from `../../node_modules/react-native/ReactCommon/jsiexecutor`) - - React-jsinspector (from `../../node_modules/react-native/ReactCommon/jsinspector-modern`) - - React-jsitracing (from `../../node_modules/react-native/ReactCommon/hermes/executor/`) - - 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-nativeconfig (from `../../node_modules/react-native/ReactCommon`) - - React-NativeModulesApple (from `../../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) - - React-perflogger (from `../../node_modules/react-native/ReactCommon/reactperflogger`) - - React-performancetimeline (from `../../node_modules/react-native/ReactCommon/react/performance/timeline`) - - React-RCTActionSheet (from `../../node_modules/react-native/Libraries/ActionSheetIOS`) - - React-RCTAnimation (from `../../node_modules/react-native/Libraries/NativeAnimation`) - - React-RCTAppDelegate (from `../../node_modules/react-native/Libraries/AppDelegate`) - - React-RCTBlob (from `../../node_modules/react-native/Libraries/Blob`) - - React-RCTFabric (from `../../node_modules/react-native/React`) - - React-RCTImage (from `../../node_modules/react-native/Libraries/Image`) - - React-RCTLinking (from `../../node_modules/react-native/Libraries/LinkingIOS`) - - React-RCTNetwork (from `../../node_modules/react-native/Libraries/Network`) - - React-RCTSettings (from `../../node_modules/react-native/Libraries/Settings`) - - React-RCTText (from `../../node_modules/react-native/Libraries/Text`) - - React-RCTVibration (from `../../node_modules/react-native/Libraries/Vibration`) - - React-rendererconsistency (from `../../node_modules/react-native/ReactCommon/react/renderer/consistency`) - - React-rendererdebug (from `../../node_modules/react-native/ReactCommon/react/renderer/debug`) - - React-rncore (from `../../node_modules/react-native/ReactCommon`) - - React-RuntimeApple (from `../../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) - - React-RuntimeCore (from `../../node_modules/react-native/ReactCommon/react/runtime`) - - React-runtimeexecutor (from `../../node_modules/react-native/ReactCommon/runtimeexecutor`) - - React-RuntimeHermes (from `../../node_modules/react-native/ReactCommon/react/runtime`) - - React-runtimescheduler (from `../../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) - - React-utils (from `../../node_modules/react-native/ReactCommon/react/utils`) + - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) + - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) + - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) + - 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`) + - RCTRequired (from `../node_modules/react-native/Libraries/Required`) + - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) + - React (from `../node_modules/react-native/`) + - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) + - React-Core (from `../node_modules/react-native/`) + - React-Core/RCTWebSocket (from `../node_modules/react-native/`) + - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) + - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - React-debug (from `../node_modules/react-native/ReactCommon/react/debug`) + - React-defaultsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/defaults`) + - React-domnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/dom`) + - React-Fabric (from `../node_modules/react-native/ReactCommon`) + - React-FabricComponents (from `../node_modules/react-native/ReactCommon`) + - React-FabricImage (from `../node_modules/react-native/ReactCommon`) + - React-featureflags (from `../node_modules/react-native/ReactCommon/react/featureflags`) + - React-featureflagsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`) + - React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`) + - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) + - React-idlecallbacksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`) + - React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) + - React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`) + - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) + - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) + - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`) + - React-jsitracing (from `../node_modules/react-native/ReactCommon/hermes/executor/`) + - 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-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`) + - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) + - React-performancetimeline (from `../node_modules/react-native/ReactCommon/react/performance/timeline`) + - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) + - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) + - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`) + - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) + - React-RCTFabric (from `../node_modules/react-native/React`) + - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) + - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) + - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) + - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) + - React-RCTText (from `../node_modules/react-native/Libraries/Text`) + - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) + - React-rendererconsistency (from `../node_modules/react-native/ReactCommon/react/renderer/consistency`) + - React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`) + - React-rncore (from `../node_modules/react-native/ReactCommon`) + - React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) + - React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`) + - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) + - React-RuntimeHermes (from `../node_modules/react-native/ReactCommon/react/runtime`) + - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) + - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) - ReactCodegen (from `build/generated/ios`) - - ReactCommon/turbomodule/core (from `../../node_modules/react-native/ReactCommon`) + - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - RNQuickSQLite (from `../..`) - - Yoga (from `../../node_modules/react-native/ReactCommon/yoga`) + - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: trunk: @@ -1617,134 +1624,136 @@ SPEC REPOS: EXTERNAL SOURCES: boost: - :podspec: "../../node_modules/react-native/third-party-podspecs/boost.podspec" + :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" DoubleConversion: - :podspec: "../../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" FBLazyVector: - :path: "../../node_modules/react-native/Libraries/FBLazyVector" + :path: "../node_modules/react-native/Libraries/FBLazyVector" fmt: - :podspec: "../../node_modules/react-native/third-party-podspecs/fmt.podspec" + :podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec" glog: - :podspec: "../../node_modules/react-native/third-party-podspecs/glog.podspec" + :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" hermes-engine: - :podspec: "../../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" + :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" :tag: hermes-2024-08-15-RNv0.75.1-4b3bf912cc0f705b51b71ce1a5b8bd79b93a451b NitroModules: - :path: "../../node_modules/react-native-nitro-modules" + :path: "../node_modules/react-native-nitro-modules" RCT-Folly: - :podspec: "../../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" + :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTDeprecation: - :path: "../../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" + :path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" RCTRequired: - :path: "../../node_modules/react-native/Libraries/Required" + :path: "../node_modules/react-native/Libraries/Required" RCTTypeSafety: - :path: "../../node_modules/react-native/Libraries/TypeSafety" + :path: "../node_modules/react-native/Libraries/TypeSafety" React: - :path: "../../node_modules/react-native/" + :path: "../node_modules/react-native/" React-callinvoker: - :path: "../../node_modules/react-native/ReactCommon/callinvoker" + :path: "../node_modules/react-native/ReactCommon/callinvoker" React-Core: - :path: "../../node_modules/react-native/" + :path: "../node_modules/react-native/" React-CoreModules: - :path: "../../node_modules/react-native/React/CoreModules" + :path: "../node_modules/react-native/React/CoreModules" React-cxxreact: - :path: "../../node_modules/react-native/ReactCommon/cxxreact" + :path: "../node_modules/react-native/ReactCommon/cxxreact" React-debug: - :path: "../../node_modules/react-native/ReactCommon/react/debug" + :path: "../node_modules/react-native/ReactCommon/react/debug" React-defaultsnativemodule: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/defaults" + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/defaults" React-domnativemodule: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/dom" + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/dom" React-Fabric: - :path: "../../node_modules/react-native/ReactCommon" + :path: "../node_modules/react-native/ReactCommon" React-FabricComponents: - :path: "../../node_modules/react-native/ReactCommon" + :path: "../node_modules/react-native/ReactCommon" React-FabricImage: - :path: "../../node_modules/react-native/ReactCommon" + :path: "../node_modules/react-native/ReactCommon" React-featureflags: - :path: "../../node_modules/react-native/ReactCommon/react/featureflags" + :path: "../node_modules/react-native/ReactCommon/react/featureflags" React-featureflagsnativemodule: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/featureflags" + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/featureflags" React-graphics: - :path: "../../node_modules/react-native/ReactCommon/react/renderer/graphics" + :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics" React-hermes: - :path: "../../node_modules/react-native/ReactCommon/hermes" + :path: "../node_modules/react-native/ReactCommon/hermes" React-idlecallbacksnativemodule: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" React-ImageManager: - :path: "../../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" + :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" React-jserrorhandler: - :path: "../../node_modules/react-native/ReactCommon/jserrorhandler" + :path: "../node_modules/react-native/ReactCommon/jserrorhandler" React-jsi: - :path: "../../node_modules/react-native/ReactCommon/jsi" + :path: "../node_modules/react-native/ReactCommon/jsi" React-jsiexecutor: - :path: "../../node_modules/react-native/ReactCommon/jsiexecutor" + :path: "../node_modules/react-native/ReactCommon/jsiexecutor" React-jsinspector: - :path: "../../node_modules/react-native/ReactCommon/jsinspector-modern" + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern" React-jsitracing: - :path: "../../node_modules/react-native/ReactCommon/hermes/executor/" + :path: "../node_modules/react-native/ReactCommon/hermes/executor/" React-logger: - :path: "../../node_modules/react-native/ReactCommon/logger" + :path: "../node_modules/react-native/ReactCommon/logger" React-Mapbuffer: - :path: "../../node_modules/react-native/ReactCommon" + :path: "../node_modules/react-native/ReactCommon" React-microtasksnativemodule: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" + react-native-safe-area-context: + :path: "../node_modules/react-native-safe-area-context" React-nativeconfig: - :path: "../../node_modules/react-native/ReactCommon" + :path: "../node_modules/react-native/ReactCommon" React-NativeModulesApple: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" React-perflogger: - :path: "../../node_modules/react-native/ReactCommon/reactperflogger" + :path: "../node_modules/react-native/ReactCommon/reactperflogger" React-performancetimeline: - :path: "../../node_modules/react-native/ReactCommon/react/performance/timeline" + :path: "../node_modules/react-native/ReactCommon/react/performance/timeline" React-RCTActionSheet: - :path: "../../node_modules/react-native/Libraries/ActionSheetIOS" + :path: "../node_modules/react-native/Libraries/ActionSheetIOS" React-RCTAnimation: - :path: "../../node_modules/react-native/Libraries/NativeAnimation" + :path: "../node_modules/react-native/Libraries/NativeAnimation" React-RCTAppDelegate: - :path: "../../node_modules/react-native/Libraries/AppDelegate" + :path: "../node_modules/react-native/Libraries/AppDelegate" React-RCTBlob: - :path: "../../node_modules/react-native/Libraries/Blob" + :path: "../node_modules/react-native/Libraries/Blob" React-RCTFabric: - :path: "../../node_modules/react-native/React" + :path: "../node_modules/react-native/React" React-RCTImage: - :path: "../../node_modules/react-native/Libraries/Image" + :path: "../node_modules/react-native/Libraries/Image" React-RCTLinking: - :path: "../../node_modules/react-native/Libraries/LinkingIOS" + :path: "../node_modules/react-native/Libraries/LinkingIOS" React-RCTNetwork: - :path: "../../node_modules/react-native/Libraries/Network" + :path: "../node_modules/react-native/Libraries/Network" React-RCTSettings: - :path: "../../node_modules/react-native/Libraries/Settings" + :path: "../node_modules/react-native/Libraries/Settings" React-RCTText: - :path: "../../node_modules/react-native/Libraries/Text" + :path: "../node_modules/react-native/Libraries/Text" React-RCTVibration: - :path: "../../node_modules/react-native/Libraries/Vibration" + :path: "../node_modules/react-native/Libraries/Vibration" React-rendererconsistency: - :path: "../../node_modules/react-native/ReactCommon/react/renderer/consistency" + :path: "../node_modules/react-native/ReactCommon/react/renderer/consistency" React-rendererdebug: - :path: "../../node_modules/react-native/ReactCommon/react/renderer/debug" + :path: "../node_modules/react-native/ReactCommon/react/renderer/debug" React-rncore: - :path: "../../node_modules/react-native/ReactCommon" + :path: "../node_modules/react-native/ReactCommon" React-RuntimeApple: - :path: "../../node_modules/react-native/ReactCommon/react/runtime/platform/ios" + :path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios" React-RuntimeCore: - :path: "../../node_modules/react-native/ReactCommon/react/runtime" + :path: "../node_modules/react-native/ReactCommon/react/runtime" React-runtimeexecutor: - :path: "../../node_modules/react-native/ReactCommon/runtimeexecutor" + :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" React-RuntimeHermes: - :path: "../../node_modules/react-native/ReactCommon/react/runtime" + :path: "../node_modules/react-native/ReactCommon/react/runtime" React-runtimescheduler: - :path: "../../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" + :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" React-utils: - :path: "../../node_modules/react-native/ReactCommon/react/utils" + :path: "../node_modules/react-native/ReactCommon/react/utils" ReactCodegen: :path: build/generated/ios ReactCommon: - :path: "../../node_modules/react-native/ReactCommon" + :path: "../node_modules/react-native/ReactCommon" RNQuickSQLite: :path: "../.." Yoga: - :path: "../../node_modules/react-native/ReactCommon/yoga" + :path: "../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: boost: 4cb898d0bf20404aab1850c656dcea009429d6c1 @@ -1753,7 +1762,7 @@ SPEC CHECKSUMS: fmt: 4c2741a687cc09f0634a2e2c72a838b99f1ff120 glog: 69ef571f3de08433d766d614c73a9838a06bf7eb hermes-engine: 3b6e0717ca847e2fc90a201e59db36caf04dee88 - NitroModules: 289195c62d66109b106e0da79967606568f95f6e + NitroModules: ef03456236a7a9243a601c6697203066fdd779f8 RCT-Folly: 4464f4d875961fce86008d45f4ecf6cef6de0740 RCTDeprecation: 34cbf122b623037ea9facad2e92e53434c5c7422 RCTRequired: 24c446d7bcd0f517d516b6265d8df04dc3eb1219 @@ -1783,6 +1792,7 @@ SPEC CHECKSUMS: React-logger: 8db32983d75dc2ad54f278f344ccb9b256e694fc React-Mapbuffer: 1c08607305558666fd16678b85ef135e455d5c96 React-microtasksnativemodule: 87b8de96f937faefece8afd2cb3a518321b2ef99 + react-native-safe-area-context: 39c2d8be3328df5d437ac1700f4f3a4f75716acc React-nativeconfig: 57781b79e11d5af7573e6f77cbf1143b71802a6d React-NativeModulesApple: 7ff2e2cfb2e5fa5bdedcecf28ce37e696c6ef1e1 React-perflogger: 8a360ccf603de6ddbe9ff8f54383146d26e6c936 @@ -1807,9 +1817,9 @@ SPEC CHECKSUMS: React-RuntimeHermes: 860cf64708a12a2fa62366fe51fe000121fa031b React-runtimescheduler: fff88d51ad2c8815fc75930dbac224d680593e6b React-utils: 81a715d9c0a2a49047e77a86f3a2247408540deb - ReactCodegen: 4eedb2fdd079174d6fc3c80b1cccafbe4ff1be8d + ReactCodegen: 60973d382704c793c605b9be0fc7f31cb279442f ReactCommon: 6ef348087d250257c44c0204461c03f036650e9b - RNQuickSQLite: c3e822c842d346edb9abbb20f9f57687d0468ca5 + RNQuickSQLite: 5bcf28e025fa7305c90a9e45ac14bfed30cec2f0 SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d Yoga: a1d7895431387402a674fd0d1c04ec85e87909b8 From 855ab34487b71244bb9457d528722f517a1155ae Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Mon, 9 Sep 2024 19:31:47 +0200 Subject: [PATCH 056/156] further implement nitro module --- cpp/specs/HybridQuickSQLiteSpec.cpp | 4 ++-- cpp/sqlbatchexecutor.cpp | 18 ++++++++++-------- cpp/sqlbatchexecutor.h | 4 ++-- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/cpp/specs/HybridQuickSQLiteSpec.cpp b/cpp/specs/HybridQuickSQLiteSpec.cpp index e8898c56..c7f9a870 100644 --- a/cpp/specs/HybridQuickSQLiteSpec.cpp +++ b/cpp/specs/HybridQuickSQLiteSpec.cpp @@ -124,13 +124,13 @@ std::future HybridQuickSQLiteSpec::executeAsync(const std::string& return future; }; -BatchQueryResult executeBatch(const std::string& dbName, const std::vector& batchParams) { +BatchQueryResult HybridQuickSQLiteSpec::executeBatch(const std::string& dbName, const std::vector& batchParams) { const auto commands = batchParamsToCommands(batchParams); auto batchResult = sqliteExecuteBatch(dbName, commands); if (batchResult.type == SQLiteOk) { - return BatchQueryResult(batchResult.rowsAffected); + return BatchQueryResult(batchResult.affectedRows); } else { diff --git a/cpp/sqlbatchexecutor.cpp b/cpp/sqlbatchexecutor.cpp index 47a9d59b..aae3d336 100644 --- a/cpp/sqlbatchexecutor.cpp +++ b/cpp/sqlbatchexecutor.cpp @@ -15,14 +15,16 @@ std::vector batchParamsToCommands(const std::vector>; - if (std::holds_alternative(*command.params)) { + using ParamsVec = std::vector; + using NestedParamsVec = std::vector; + + if (std::holds_alternative(*command.params)) { // This arguments is an array of arrays, like a batch update of a single sql command. - for (const auto& params : std::get(*command.params)) + for (const auto& params : std::get(*command.params)) { commands.push_back(BatchQuery{ command.query, - std::make_shared(std::move(params)) + std::make_shared(params) }); } } @@ -30,7 +32,7 @@ std::vector batchParamsToCommands(const std::vector(std::move(std::get(*command.params))) }); } } @@ -46,9 +48,9 @@ std::vector batchParamsToCommands(const std::vector& commands) +SequelBatchOperationResult sqliteExecuteBatch(const std::string& dbName, std::vector& commands) { - size_t commandCount = commands->size(); + size_t commandCount = commands.size(); if(commandCount <= 0) { return SequelBatchOperationResult { @@ -62,7 +64,7 @@ SequelBatchOperationResult sqliteExecuteBatch(const std::string dbName&, std::ve int affectedRows = 0; sqliteExecuteLiteral(dbName, "BEGIN EXCLUSIVE TRANSACTION"); for(int i = 0; iat(i); + const auto command = commands.at(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); diff --git a/cpp/sqlbatchexecutor.h b/cpp/sqlbatchexecutor.h index 16d49945..e6ae3004 100644 --- a/cpp/sqlbatchexecutor.h +++ b/cpp/sqlbatchexecutor.h @@ -21,11 +21,11 @@ struct BatchQuery { * Local Helper method to translate JSI objects BatchQuery datastructure * MUST be called in the JavaScript Thread */ -std::vector& batchParamsToCommands(const std::vector& batchParams); +std::vector batchParamsToCommands(const std::vector& batchParams); /** * Execute a batch of commands in a exclusive transaction */ -SequelBatchOperationResult sqliteExecuteBatch(const std::string& dbName, std::vector& commands); +SequelBatchOperationResult sqliteExecuteBatch(const std::string& dbName, const std::vector& commands); } From 51d00648646c6ce01079584f5d2690a337f57ea1 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Mon, 9 Sep 2024 19:32:00 +0200 Subject: [PATCH 057/156] update specs --- nitrogen/generated/android/RNQuickSQLite+autolinking.cmake | 6 +++++- nitrogen/generated/android/RNQuickSQLite+autolinking.gradle | 2 +- nitrogen/generated/ios/RNQuickSQLite+autolinking.rb | 2 +- nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp | 2 +- nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 2 +- nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp | 2 +- nitrogen/generated/shared/c++/BatchQueryCommand.hpp | 2 +- nitrogen/generated/shared/c++/BatchQueryResult.hpp | 2 +- nitrogen/generated/shared/c++/ColumnMetadata.hpp | 2 +- nitrogen/generated/shared/c++/ColumnType.hpp | 2 +- nitrogen/generated/shared/c++/FileLoadResult.hpp | 2 +- nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp | 2 +- nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp | 2 +- .../generated/shared/c++/HybridSelectQueryResultSpec.cpp | 2 +- .../generated/shared/c++/HybridSelectQueryResultSpec.hpp | 2 +- nitrogen/generated/shared/c++/QueryResult.hpp | 2 +- nitrogen/generated/shared/c++/QueryType.hpp | 2 +- nitrogen/generated/shared/c++/Transaction.hpp | 2 +- 18 files changed, 22 insertions(+), 18 deletions(-) diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake index 50b464c0..0fc755b5 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake @@ -1,6 +1,6 @@ # # RNQuickSQLite+autolinking.cmake -# Sun Sep 08 2024 +# Mon Sep 09 2024 # This file was generated by nitrogen. DO NOT MODIFY THIS FILE. # https://github.com/mrousavy/nitro # Copyright © 2024 Marc Rousavy @ Margelo @@ -27,6 +27,10 @@ target_sources( # Shared Nitrogen C++ sources ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp ../nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp + ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp + ../nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp + ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp + ../nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp # Android-specific Nitrogen C++ sources ) diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle b/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle index cd2d188e..06c3df75 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle @@ -1,6 +1,6 @@ /// /// RNQuickSQLite+autolinking.gradle -/// Sun Sep 08 2024 +/// Mon Sep 09 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb b/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb index c2056533..a7dc91cc 100644 --- a/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb +++ b/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb @@ -1,6 +1,6 @@ # # RNQuickSQLite+autolinking.rb -# Sun Sep 08 2024 +# Mon Sep 09 2024 # This file was generated by nitrogen. DO NOT MODIFY THIS FILE. # https://github.com/mrousavy/nitro # Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp index e839f27c..765fd727 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Bridge.cpp -/// Sun Sep 08 2024 +/// Mon Sep 09 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index e343f90d..59b2bd88 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Bridge.hpp -/// Sun Sep 08 2024 +/// Mon Sep 09 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp index 0238c09e..fdcad441 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Umbrella.hpp -/// Sun Sep 08 2024 +/// Mon Sep 09 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/BatchQueryCommand.hpp b/nitrogen/generated/shared/c++/BatchQueryCommand.hpp index 36453c03..39ef4cea 100644 --- a/nitrogen/generated/shared/c++/BatchQueryCommand.hpp +++ b/nitrogen/generated/shared/c++/BatchQueryCommand.hpp @@ -1,6 +1,6 @@ /// /// BatchQueryCommand.hpp -/// Sun Sep 08 2024 +/// Mon Sep 09 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/BatchQueryResult.hpp b/nitrogen/generated/shared/c++/BatchQueryResult.hpp index ac66ce0a..a5b19cae 100644 --- a/nitrogen/generated/shared/c++/BatchQueryResult.hpp +++ b/nitrogen/generated/shared/c++/BatchQueryResult.hpp @@ -1,6 +1,6 @@ /// /// BatchQueryResult.hpp -/// Sun Sep 08 2024 +/// Mon Sep 09 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/ColumnMetadata.hpp b/nitrogen/generated/shared/c++/ColumnMetadata.hpp index 947f530d..fe0cb018 100644 --- a/nitrogen/generated/shared/c++/ColumnMetadata.hpp +++ b/nitrogen/generated/shared/c++/ColumnMetadata.hpp @@ -1,6 +1,6 @@ /// /// ColumnMetadata.hpp -/// Sun Sep 08 2024 +/// Mon Sep 09 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/ColumnType.hpp b/nitrogen/generated/shared/c++/ColumnType.hpp index a8858cbf..cb4e9b1e 100644 --- a/nitrogen/generated/shared/c++/ColumnType.hpp +++ b/nitrogen/generated/shared/c++/ColumnType.hpp @@ -1,6 +1,6 @@ /// /// ColumnType.hpp -/// Sun Sep 08 2024 +/// Mon Sep 09 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/FileLoadResult.hpp b/nitrogen/generated/shared/c++/FileLoadResult.hpp index af85a8f1..0d42f808 100644 --- a/nitrogen/generated/shared/c++/FileLoadResult.hpp +++ b/nitrogen/generated/shared/c++/FileLoadResult.hpp @@ -1,6 +1,6 @@ /// /// FileLoadResult.hpp -/// Sun Sep 08 2024 +/// Mon Sep 09 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp index 2b0ddb12..7c3d9be5 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp @@ -1,6 +1,6 @@ /// /// HybridQuickSQLiteSpec.cpp -/// Sun Sep 08 2024 +/// Mon Sep 09 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp index a8cbdfac..ef02e7a7 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp @@ -1,6 +1,6 @@ /// /// HybridQuickSQLiteSpec.hpp -/// Sun Sep 08 2024 +/// Mon Sep 09 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp index 7290a6e3..16141f19 100644 --- a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp @@ -1,6 +1,6 @@ /// /// HybridSelectQueryResultSpec.cpp -/// Sun Sep 08 2024 +/// Mon Sep 09 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp index 6726fad1..e1dcd1b3 100644 --- a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp @@ -1,6 +1,6 @@ /// /// HybridSelectQueryResultSpec.hpp -/// Sun Sep 08 2024 +/// Mon Sep 09 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/QueryResult.hpp b/nitrogen/generated/shared/c++/QueryResult.hpp index b1fa4f08..33431888 100644 --- a/nitrogen/generated/shared/c++/QueryResult.hpp +++ b/nitrogen/generated/shared/c++/QueryResult.hpp @@ -1,6 +1,6 @@ /// /// QueryResult.hpp -/// Sun Sep 08 2024 +/// Mon Sep 09 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/QueryType.hpp b/nitrogen/generated/shared/c++/QueryType.hpp index 2f92e661..99f21801 100644 --- a/nitrogen/generated/shared/c++/QueryType.hpp +++ b/nitrogen/generated/shared/c++/QueryType.hpp @@ -1,6 +1,6 @@ /// /// QueryType.hpp -/// Sun Sep 08 2024 +/// Mon Sep 09 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/Transaction.hpp b/nitrogen/generated/shared/c++/Transaction.hpp index e070b00a..1bf14ce8 100644 --- a/nitrogen/generated/shared/c++/Transaction.hpp +++ b/nitrogen/generated/shared/c++/Transaction.hpp @@ -1,6 +1,6 @@ /// /// Transaction.hpp -/// Sun Sep 08 2024 +/// Mon Sep 09 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo From bcc95f50e6527c6bdd57e5e0334abdcc8cd2ea17 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Mon, 9 Sep 2024 20:15:59 +0200 Subject: [PATCH 058/156] fix: inherit from abstract class --- cpp/JSIHelper.cpp | 4 -- cpp/JSIHelper.h | 40 ------------ cpp/OnLoad.cpp | 9 ++- ...teSpec.cpp => HybridQuickSQLiteObject.cpp} | 34 +++++----- cpp/specs/HybridQuickSQLiteObject.hpp | 26 ++++++++ cpp/specs/HybridSelectQueryResultObject.hpp | 23 +++++++ cpp/specs/Types.hpp | 33 ++++++++++ cpp/sqlbatchexecutor.h | 1 - cpp/sqlfileloader.h | 3 +- cpp/sqliteBridge.cpp | 62 +++++++++---------- cpp/sqliteBridge.h | 3 - 11 files changed, 134 insertions(+), 104 deletions(-) rename cpp/specs/{HybridQuickSQLiteSpec.cpp => HybridQuickSQLiteObject.cpp} (74%) create mode 100644 cpp/specs/HybridQuickSQLiteObject.hpp create mode 100644 cpp/specs/HybridSelectQueryResultObject.hpp diff --git a/cpp/JSIHelper.cpp b/cpp/JSIHelper.cpp index 0c4caec3..042ed634 100644 --- a/cpp/JSIHelper.cpp +++ b/cpp/JSIHelper.cpp @@ -1,9 +1,5 @@ -#pragma once - #include "JSIHelper.h" -using namespace facebook; - //void jsiQueryArgumentsToSequelParam(jsi::Runtime &rt, jsi::Value const ¶ms, vector *target) //{ // if (params.isNull() || params.isUndefined()) diff --git a/cpp/JSIHelper.h b/cpp/JSIHelper.h index 65d3f9f8..6f70f09b 100644 --- a/cpp/JSIHelper.h +++ b/cpp/JSIHelper.h @@ -1,41 +1 @@ #pragma once - -#include -#include -#include -#include -#include - -using namespace facebook; - -/** - * Various structs to help with the results of the SQLite operations - */ -enum ResultType -{ - SQLiteOk, - SQLiteError -}; - -struct SQLiteOPResult -{ - ResultType type; - std::string errorMessage; - int rowsAffected; - double insertId; -}; - -struct SequelLiteralUpdateResult -{ - ResultType type; - std::string message; - int affectedRows; -}; - -struct SequelBatchOperationResult -{ - ResultType type; - std::string message; - int affectedRows; - int commands; -}; diff --git a/cpp/OnLoad.cpp b/cpp/OnLoad.cpp index 3aedf0fb..b74622c3 100644 --- a/cpp/OnLoad.cpp +++ b/cpp/OnLoad.cpp @@ -1,9 +1,8 @@ #include "OnLoad.hpp" -#include "HybridQuickSQLiteSpec.hpp" -#include "HybridSelectQueryResultSpec.hpp" +#include "HybridQuickSQLiteObject.hpp" +#include "HybridSelectQueryResultObject.hpp" using namespace margelo::nitro; - using namespace margelo::rnquicksqlite; void clearState() { @@ -13,10 +12,10 @@ void clearState() { // Call this at app startup to register the HybridObjects void registerHybridObjectConstructors() { HybridObjectRegistry::registerHybridObjectConstructor("QuickSQLite", []() -> std::shared_ptr { - return std::make_shared(); + return std::make_shared(); }); HybridObjectRegistry::registerHybridObjectConstructor("SelectQueryResult", []() -> std::shared_ptr { - return std::make_shared(); + return std::make_shared(); }); } diff --git a/cpp/specs/HybridQuickSQLiteSpec.cpp b/cpp/specs/HybridQuickSQLiteObject.cpp similarity index 74% rename from cpp/specs/HybridQuickSQLiteSpec.cpp rename to cpp/specs/HybridQuickSQLiteObject.cpp index c7f9a870..fb00a708 100644 --- a/cpp/specs/HybridQuickSQLiteSpec.cpp +++ b/cpp/specs/HybridQuickSQLiteObject.cpp @@ -1,24 +1,22 @@ +#include +#include +#include +#include "HybridQuickSQLiteObject.hpp" #include "sqliteBridge.h" #include "logs.h" -#include "JSIHelper.h" #include "ThreadPool.h" #include "sqlfileloader.h" #include "sqlbatchexecutor.h" -#include -#include #include "macros.h" -#include #include "OnLoad.hpp" #include "QueryType.hpp" -#include "HybridQuickSQLiteSpec.hpp" #include "Types.hpp" using namespace margelo::nitro; -using namespace margelo::rnquicksqlite; -namespace margelo::nitro::rnquicksqlite { +namespace margelo::rnquicksqlite { -void HybridQuickSQLiteSpec::open(const std::string& dbName, const std::optional& location) { +void HybridQuickSQLiteObject::open(const std::string& dbName, const std::optional& location) { std::string tempDocPath = std::string(docPathStr); if (location) { tempDocPath = tempDocPath + "/" + *location; @@ -32,7 +30,7 @@ void HybridQuickSQLiteSpec::open(const std::string& dbName, const std::optional< } } -void HybridQuickSQLiteSpec::close(const std::string& dbName) { +void HybridQuickSQLiteObject::close(const std::string& dbName) { SQLiteOPResult result = sqliteCloseDb(dbName); if (result.type == SQLiteError) @@ -41,7 +39,7 @@ void HybridQuickSQLiteSpec::close(const std::string& dbName) { } }; -void HybridQuickSQLiteSpec::drop(const std::string& dbName, const std::optional& location) { +void HybridQuickSQLiteObject::drop(const std::string& dbName, const std::optional& location) { std::string tempDocPath = std::string(docPathStr); if (location) { @@ -57,7 +55,7 @@ void HybridQuickSQLiteSpec::drop(const std::string& dbName, const std::optional< } }; -void HybridQuickSQLiteSpec::attach(const std::string& mainDbName, const std::string& dbNameToAttach, const std::string& alias, const std::optional& location) { +void HybridQuickSQLiteObject::attach(const std::string& mainDbName, const std::string& dbNameToAttach, const std::string& alias, const std::optional& location) { std::string tempDocPath = std::string(docPathStr); if (location) { @@ -72,7 +70,7 @@ void HybridQuickSQLiteSpec::attach(const std::string& mainDbName, const std::str } }; -void HybridQuickSQLiteSpec::detach(const std::string& mainDbName, const std::string& alias) { +void HybridQuickSQLiteObject::detach(const std::string& mainDbName, const std::string& alias) { SQLiteOPResult result = sqliteDetachDb(mainDbName, alias); if (result.type == SQLiteError) @@ -87,7 +85,7 @@ std::future transaction(const std::string& dbName, const std::function>& params) { +QueryResult HybridQuickSQLiteObject::execute(const std::string& dbName, const std::string& query, const std::optional>& params) { std::vector> results; std::vector metadata; @@ -106,7 +104,7 @@ QueryResult HybridQuickSQLiteSpec::execute(const std::string& dbName, const std: } }; -std::future HybridQuickSQLiteSpec::executeAsync(const std::string& dbName, const std::string& query, const std::optional>& params) { +std::future HybridQuickSQLiteObject::executeAsync(const std::string& dbName, const std::string& query, const std::optional>& params) { std::promise promise; auto future = promise.get_future(); @@ -124,7 +122,7 @@ std::future HybridQuickSQLiteSpec::executeAsync(const std::string& return future; }; -BatchQueryResult HybridQuickSQLiteSpec::executeBatch(const std::string& dbName, const std::vector& batchParams) { +BatchQueryResult HybridQuickSQLiteObject::executeBatch(const std::string& dbName, const std::vector& batchParams) { const auto commands = batchParamsToCommands(batchParams); auto batchResult = sqliteExecuteBatch(dbName, commands); @@ -138,7 +136,7 @@ BatchQueryResult HybridQuickSQLiteSpec::executeBatch(const std::string& dbName, } }; -std::future HybridQuickSQLiteSpec::executeBatchAsync(const std::string& dbName, const std::vector& batchParams) { +std::future HybridQuickSQLiteObject::executeBatchAsync(const std::string& dbName, const std::vector& batchParams) { std::promise promise; auto future = promise.get_future(); @@ -156,7 +154,7 @@ std::future HybridQuickSQLiteSpec::executeBatchAsync(const std return future; }; -FileLoadResult HybridQuickSQLiteSpec::loadFile(const std::string& dbName, const std::string& location) { +FileLoadResult HybridQuickSQLiteObject::loadFile(const std::string& dbName, const std::string& location) { const auto importResult = importSQLFile(dbName, location); if (importResult.type == SQLiteOk) { @@ -169,7 +167,7 @@ FileLoadResult HybridQuickSQLiteSpec::loadFile(const std::string& dbName, const } }; -std::future HybridQuickSQLiteSpec::loadFileAsync(const std::string& dbName, const std::string& location) { +std::future HybridQuickSQLiteObject::loadFileAsync(const std::string& dbName, const std::string& location) { std::promise promise; auto future = promise.get_future(); diff --git a/cpp/specs/HybridQuickSQLiteObject.hpp b/cpp/specs/HybridQuickSQLiteObject.hpp new file mode 100644 index 00000000..ec7fe4a7 --- /dev/null +++ b/cpp/specs/HybridQuickSQLiteObject.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include "HybridQuickSQLiteSpec.hpp" + +using namespace margelo::nitro::rnquicksqlite; + +namespace margelo::rnquicksqlite { + +class HybridQuickSQLiteObject: public HybridQuickSQLiteSpec { +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::future transaction(const std::string& dbName, const std::function>(const Transaction& /* tx */)>& fn) override; + QueryResult 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; +}; + +} diff --git a/cpp/specs/HybridSelectQueryResultObject.hpp b/cpp/specs/HybridSelectQueryResultObject.hpp new file mode 100644 index 00000000..3641bf7d --- /dev/null +++ b/cpp/specs/HybridSelectQueryResultObject.hpp @@ -0,0 +1,23 @@ +#pragma once + +#include "HybridSelectQueryResultSpec.hpp" + +using namespace margelo::nitro::rnquicksqlite; + +namespace margelo::rnquicksqlite { + +class HybridSelectQueryResultObject: public HybridSelectQueryResultSpec { +public: + // Properties + std::optional> getMetadata() override; + void setMetadata(const std::optional>& metadata) override; + +public: + // Methods + std::string getString() override; + double getNumber() override; + bool getBoolean() override; + std::shared_ptr getArrayBuffer() override; +}; + +} diff --git a/cpp/specs/Types.hpp b/cpp/specs/Types.hpp index dbb8e0cc..da43dc63 100644 --- a/cpp/specs/Types.hpp +++ b/cpp/specs/Types.hpp @@ -6,6 +6,39 @@ namespace margelo::nitro::rnquicksqlite { +/** + * Various structs to help with the results of the SQLite operations + */ +enum ResultType +{ + SQLiteOk, + SQLiteError +}; + +struct SQLiteOPResult +{ + ResultType type; + std::string errorMessage; + int rowsAffected; + double insertId; +}; + +struct SequelLiteralUpdateResult +{ + ResultType type; + std::string message; + int affectedRows; +}; + +struct SequelBatchOperationResult +{ + ResultType type; + std::string message; + int affectedRows; + int commands; +}; + + using ExecuteParam = std::variant>; using SQLiteValue = std::variant, std::monostate>; diff --git a/cpp/sqlbatchexecutor.h b/cpp/sqlbatchexecutor.h index e6ae3004..2110bbb3 100644 --- a/cpp/sqlbatchexecutor.h +++ b/cpp/sqlbatchexecutor.h @@ -3,7 +3,6 @@ */ #pragma once -#include "JSIHelper.h" #include "Types.hpp" #include "BatchQueryCommand.hpp" diff --git a/cpp/sqlfileloader.h b/cpp/sqlfileloader.h index c301035a..b0c1a9d4 100644 --- a/cpp/sqlfileloader.h +++ b/cpp/sqlfileloader.h @@ -5,6 +5,5 @@ * */ -#include "JSIHelper.h" #include "sqliteBridge.h" -SequelBatchOperationResult importSQLFile(std::string dbName, std::string fileLocation); \ No newline at end of file +SequelBatchOperationResult importSQLFile(std::string dbName, std::string fileLocation); diff --git a/cpp/sqliteBridge.cpp b/cpp/sqliteBridge.cpp index 65946e3c..382d77f7 100644 --- a/cpp/sqliteBridge.cpp +++ b/cpp/sqliteBridge.cpp @@ -1,4 +1,3 @@ -#include "sqliteBridge.h" #include #include #include @@ -6,6 +5,7 @@ #include #include #include +#include "sqliteBridge.h" #include "logs.h" #include "ArrayBuffer.hpp" @@ -213,36 +213,36 @@ void bindStatement(sqlite3_stmt *statement, const std::vector& val { int sqIndex = ii + 1; ExecuteParam value = values.at(ii); - // if (std::holds_alternative(value)) - // { - // sqlite3_bind_null(statement, sqIndex); - // } - // if (std::holds_alternative(value)) - // { - // sqlite3_bind_int(statement, sqIndex, std::get(value)); - // } - // else if (std::holds_alternative(value)) - // { - // sqlite3_bind_int(statement, sqIndex, std::get(value)); - // } - // else if (std::holds_alternative(value)) - // { - // sqlite3_bind_double(statement, sqIndex, std::get(value)); - // } - // else if (std::holds_alternative(value)) - // { - // sqlite3_bind_int64(statement, sqIndex, std::holds_alternative(value)); - // } - // else if (std::holds_alternative(value)) - // { - // const auto stringValue = std::get(value); - // sqlite3_bind_text(statement, sqIndex, stringValue.c_str(), stringValue.length(), SQLITE_TRANSIENT); - // } - // else if (std::holds_alternative>(value)) - // { - // const auto arrayBufferValue = std::get>(value); - // sqlite3_bind_blob(statement, sqIndex, arrayBufferValue->data(), arrayBufferValue->size(), SQLITE_STATIC); - // } + if (std::holds_alternative(value)) + { + sqlite3_bind_null(statement, sqIndex); + } + else if (std::holds_alternative(value)) + { + sqlite3_bind_int(statement, sqIndex, std::get(value)); + } + else if (std::holds_alternative(value)) + { + sqlite3_bind_int(statement, sqIndex, std::get(value)); + } + else if (std::holds_alternative(value)) + { + sqlite3_bind_double(statement, sqIndex, std::get(value)); + } + else if (std::holds_alternative(value)) + { + sqlite3_bind_int64(statement, sqIndex, std::holds_alternative(value)); + } + else if (std::holds_alternative(value)) + { + const auto stringValue = std::get(value); + sqlite3_bind_text(statement, sqIndex, stringValue.c_str(), stringValue.length(), SQLITE_TRANSIENT); + } + else if (std::holds_alternative>(value)) + { + const auto arrayBufferValue = std::get>(value); + sqlite3_bind_blob(statement, sqIndex, arrayBufferValue->data(), arrayBufferValue->size(), SQLITE_STATIC); + } } } diff --git a/cpp/sqliteBridge.h b/cpp/sqliteBridge.h index ed05fde2..1771992d 100644 --- a/cpp/sqliteBridge.h +++ b/cpp/sqliteBridge.h @@ -1,11 +1,8 @@ #pragma once -#include -#include "JSIHelper.h" #include "ColumnMetadata.hpp" #include "Types.hpp" -using namespace facebook; using namespace margelo::nitro::rnquicksqlite; namespace margelo::rnquicksqlite { From 21c845eafb95b731920058276b986656eaecab8e Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Mon, 9 Sep 2024 22:44:39 +0200 Subject: [PATCH 059/156] fix: make iOS build --- cpp/JSIHelper.cpp | 92 +--------- cpp/OnLoad.cpp | 6 +- cpp/specs/HybridQuickSQLiteObject.cpp | 52 +++--- cpp/specs/HybridSelectQueryResult.cpp | 3 - cpp/specs/HybridSelectQueryResultObject.cpp | 34 ++++ cpp/specs/HybridSelectQueryResultObject.hpp | 9 + cpp/sqlbatchexecutor.cpp | 4 +- cpp/sqlfileloader.h | 7 +- cpp/sqliteBridge.cpp | 54 +++--- cpp/sqliteBridge.h | 2 +- ios/Empty.swift | 3 + ios/QuickSQLite.xcodeproj/project.pbxproj | 180 +++++++++++++++++++- ios/RNQuickSQLite-Swift.h | 13 ++ src/specs/SelectQueryResult.nitro.ts | 2 +- src/types.ts | 8 +- 15 files changed, 316 insertions(+), 153 deletions(-) delete mode 100644 cpp/specs/HybridSelectQueryResult.cpp create mode 100644 cpp/specs/HybridSelectQueryResultObject.cpp create mode 100644 ios/Empty.swift create mode 100644 ios/RNQuickSQLite-Swift.h diff --git a/cpp/JSIHelper.cpp b/cpp/JSIHelper.cpp index 042ed634..0a4d2208 100644 --- a/cpp/JSIHelper.cpp +++ b/cpp/JSIHelper.cpp @@ -1,17 +1,17 @@ #include "JSIHelper.h" -//void jsiQueryArgumentsToSequelParam(jsi::Runtime &rt, jsi::Value const ¶ms, vector *target) -//{ +// 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()) // { @@ -58,84 +58,4 @@ // 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/cpp/OnLoad.cpp b/cpp/OnLoad.cpp index b74622c3..f3a83673 100644 --- a/cpp/OnLoad.cpp +++ b/cpp/OnLoad.cpp @@ -14,9 +14,9 @@ void registerHybridObjectConstructors() { HybridObjectRegistry::registerHybridObjectConstructor("QuickSQLite", []() -> std::shared_ptr { return std::make_shared(); }); - HybridObjectRegistry::registerHybridObjectConstructor("SelectQueryResult", []() -> std::shared_ptr { - return std::make_shared(); - }); +// HybridObjectRegistry::registerHybridObjectConstructor("SelectQueryResult", []() -> std::shared_ptr { +// return std::make_shared(); +// }); } // OnLoad::OnLoad() { diff --git a/cpp/specs/HybridQuickSQLiteObject.cpp b/cpp/specs/HybridQuickSQLiteObject.cpp index fb00a708..54973ab9 100644 --- a/cpp/specs/HybridQuickSQLiteObject.cpp +++ b/cpp/specs/HybridQuickSQLiteObject.cpp @@ -1,7 +1,9 @@ #include #include #include +#include #include "HybridQuickSQLiteObject.hpp" +#include "HybridSelectQueryResultObject.hpp" #include "sqliteBridge.h" #include "logs.h" #include "ThreadPool.h" @@ -12,8 +14,6 @@ #include "QueryType.hpp" #include "Types.hpp" -using namespace margelo::nitro; - namespace margelo::rnquicksqlite { void HybridQuickSQLiteObject::open(const std::string& dbName, const std::optional& location) { @@ -79,41 +79,45 @@ void HybridQuickSQLiteObject::detach(const std::string& mainDbName, const std::s } }; -std::future transaction(const std::string& dbName, const std::function>(const Transaction& /* tx */)>& fn) { +std::future HybridQuickSQLiteObject::transaction(const std::string& dbName, const std::function>(const Transaction& /* tx */)>& fn) { return std::async(std::launch::async, []() { }); }; QueryResult HybridQuickSQLiteObject::execute(const std::string& dbName, const std::string& query, const std::optional>& params) { - std::vector> results; - std::vector metadata; + auto results = std::make_shared>>(); + auto metadata = std::make_shared>>(std::nullopt); // Converting results into a JSI Response try { - auto status = sqliteExecute(dbName, query, params, &results, &metadata); + auto status = sqliteExecute(dbName, query, params, results, metadata); if(status.type == SQLiteError) { - throw std::runtime_error(status.errorMessage.c_str()); + throw std::runtime_error(status.errorMessage); + } + + if (metadata) { + const auto selectQueryResult = std::make_shared(*results, *(*metadata)); + return QueryResult(QueryType::SELECT, status.insertId, status.rowsAffected, selectQueryResult); } - QueryResult result(QueryType::SELECT, std::nullopt, 0, std::nullopt); - return result; + return QueryResult(QueryType::SELECT, status.insertId, status.rowsAffected, std::nullopt); } catch(std::exception &e) { throw std::runtime_error(e.what()); } }; std::future HybridQuickSQLiteObject::executeAsync(const std::string& dbName, const std::string& query, const std::optional>& params) { - std::promise promise; - auto future = promise.get_future(); + auto promise = std::make_shared>(); + auto future = promise->get_future(); - auto task = [this, prom = std::move(promise), dbName, query, params]() mutable { + auto task = [this, promise, dbName, query, params]() { try { auto result = execute(dbName, query, params); - prom.set_value(result); + promise->set_value(result); } catch (...) { - prom.set_exception(std::current_exception()); + promise->set_exception(std::current_exception()); } }; @@ -137,15 +141,15 @@ BatchQueryResult HybridQuickSQLiteObject::executeBatch(const std::string& dbName }; std::future HybridQuickSQLiteObject::executeBatchAsync(const std::string& dbName, const std::vector& batchParams) { - std::promise promise; - auto future = promise.get_future(); + auto promise = std::make_shared>(); + auto future = promise->get_future(); - auto task = [this, prom = std::move(promise), dbName, batchParams]() mutable { + auto task = [this, promise, dbName, batchParams]() { try { auto result = executeBatch(dbName, batchParams); - prom.set_value(result); + promise->set_value(result); } catch (...) { - prom.set_exception(std::current_exception()); + promise->set_exception(std::current_exception()); } }; @@ -168,15 +172,15 @@ FileLoadResult HybridQuickSQLiteObject::loadFile(const std::string& dbName, cons }; std::future HybridQuickSQLiteObject::loadFileAsync(const std::string& dbName, const std::string& location) { - std::promise promise; - auto future = promise.get_future(); + auto promise = std::make_shared>(); + auto future = promise->get_future(); - auto task = [this, prom = std::move(promise), dbName, location]() mutable { + auto task = [this, promise, dbName, location]() { try { auto result = loadFile(dbName, location); - prom.set_value(result); + promise->set_value(result); } catch (...) { - prom.set_exception(std::current_exception()); + promise->set_exception(std::current_exception()); } }; diff --git a/cpp/specs/HybridSelectQueryResult.cpp b/cpp/specs/HybridSelectQueryResult.cpp deleted file mode 100644 index 7990d031..00000000 --- a/cpp/specs/HybridSelectQueryResult.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include "HybridSelectQueryResultSpec.hpp" - -using namespace margelo::nitro; diff --git a/cpp/specs/HybridSelectQueryResultObject.cpp b/cpp/specs/HybridSelectQueryResultObject.cpp new file mode 100644 index 00000000..b923bb1c --- /dev/null +++ b/cpp/specs/HybridSelectQueryResultObject.cpp @@ -0,0 +1,34 @@ +#include "HybridSelectQueryResultObject.hpp" + +using namespace margelo::nitro::rnquicksqlite; + +namespace margelo::rnquicksqlite { + +HybridSelectQueryResultObject::HybridSelectQueryResultObject(const std::vector>& results, const std::optional>& metadata) + : HybridSelectQueryResultSpec(), _results(results), _metadata(metadata) {} + +std::optional> HybridSelectQueryResultObject::getMetadata() { + return this->_metadata; +} + +void HybridSelectQueryResultObject::setMetadata(const std::optional>& metadata) { + this->_metadata = metadata; +} + +std::string HybridSelectQueryResultObject::getString() { + return "TODO"; +} + +double HybridSelectQueryResultObject::getNumber() { + return -1.0; +} + +bool HybridSelectQueryResultObject::getBoolean() { + return false; +} + +std::shared_ptr HybridSelectQueryResultObject::getArrayBuffer() { + return nullptr; +} + +} diff --git a/cpp/specs/HybridSelectQueryResultObject.hpp b/cpp/specs/HybridSelectQueryResultObject.hpp index 3641bf7d..6f464e55 100644 --- a/cpp/specs/HybridSelectQueryResultObject.hpp +++ b/cpp/specs/HybridSelectQueryResultObject.hpp @@ -1,12 +1,17 @@ #pragma once +#include #include "HybridSelectQueryResultSpec.hpp" +#include "Types.hpp" using namespace margelo::nitro::rnquicksqlite; namespace margelo::rnquicksqlite { class HybridSelectQueryResultObject: public HybridSelectQueryResultSpec { +public: + HybridSelectQueryResultObject(const std::vector>& results, const std::optional>& metadata); + public: // Properties std::optional> getMetadata() override; @@ -18,6 +23,10 @@ class HybridSelectQueryResultObject: public HybridSelectQueryResultSpec { double getNumber() override; bool getBoolean() override; std::shared_ptr getArrayBuffer() override; + +private: + std::optional> _metadata; + std::vector> _results; }; } diff --git a/cpp/sqlbatchexecutor.cpp b/cpp/sqlbatchexecutor.cpp index aae3d336..3728e318 100644 --- a/cpp/sqlbatchexecutor.cpp +++ b/cpp/sqlbatchexecutor.cpp @@ -48,7 +48,7 @@ std::vector batchParamsToCommands(const std::vector& commands) +SequelBatchOperationResult sqliteExecuteBatch(const std::string& dbName, const std::vector& commands) { size_t commandCount = commands.size(); if(commandCount <= 0) @@ -67,7 +67,7 @@ SequelBatchOperationResult sqliteExecuteBatch(const std::string& dbName, std::ve const auto command = commands.at(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); + auto result = sqliteExecute(dbName, command.sql, *command.params.get(), nullptr, nullptr); if(result.type == SQLiteError) { sqliteExecuteLiteral(dbName, "ROLLBACK"); diff --git a/cpp/sqlfileloader.h b/cpp/sqlfileloader.h index b0c1a9d4..9a2c15f9 100644 --- a/cpp/sqlfileloader.h +++ b/cpp/sqlfileloader.h @@ -6,4 +6,9 @@ */ #include "sqliteBridge.h" -SequelBatchOperationResult importSQLFile(std::string dbName, std::string fileLocation); + +namespace margelo::rnquicksqlite { + +SequelBatchOperationResult importSQLFile(const std::string& dbName, const std::string& fileLocation); + +} diff --git a/cpp/sqliteBridge.cpp b/cpp/sqliteBridge.cpp index 382d77f7..2c043af6 100644 --- a/cpp/sqliteBridge.cpp +++ b/cpp/sqliteBridge.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include "sqliteBridge.h" #include "logs.h" #include "ArrayBuffer.hpp" @@ -213,25 +214,28 @@ void bindStatement(sqlite3_stmt *statement, const std::vector& val { int sqIndex = ii + 1; ExecuteParam value = values.at(ii); - if (std::holds_alternative(value)) +// if (std::holds_alternative(value)) +// { +// sqlite3_bind_null(statement, sqIndex); +// } + if (std::holds_alternative(value)) { - sqlite3_bind_null(statement, sqIndex); - } - else if (std::holds_alternative(value)) - { - sqlite3_bind_int(statement, sqIndex, std::get(value)); - } - else if (std::holds_alternative(value)) - { - sqlite3_bind_int(statement, sqIndex, std::get(value)); + sqlite3_bind_int(statement, sqIndex, std::get(value)); } else if (std::holds_alternative(value)) { - sqlite3_bind_double(statement, sqIndex, std::get(value)); + const auto doubleValue = std::get(value); + const auto isInt = std::floor(doubleValue) == doubleValue; + + if (isInt) { + sqlite3_bind_int(statement, sqIndex, static_cast(doubleValue)); + } else { + sqlite3_bind_double(statement, sqIndex, doubleValue); + } } else if (std::holds_alternative(value)) { - sqlite3_bind_int64(statement, sqIndex, std::holds_alternative(value)); + sqlite3_bind_int64(statement, sqIndex, std::holds_alternative(value)); } else if (std::holds_alternative(value)) { @@ -246,7 +250,7 @@ void bindStatement(sqlite3_stmt *statement, const std::vector& val } } -SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional>& params, std::vector> *results, std::vector *metadata) +SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional>& params, std::shared_ptr>> results, std::shared_ptr>> metadata) { if (dbMap.count(dbName) == 0) { @@ -263,7 +267,7 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query int statementStatus = sqlite3_prepare_v2(db, query.c_str(), -1, &statement, NULL); - if (statementStatus == SQLITE_OK) // statemnet is correct, bind the passed parameters + if (statementStatus == SQLITE_OK) // statement is correct, bind the passed parameters { if (params) { bindStatement(statement, *params); @@ -293,11 +297,6 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query switch (result) { case SQLITE_ROW: - if(results == NULL) - { - break; - } - i = 0; row = std::map(); count = sqlite3_column_count(statement); @@ -334,8 +333,7 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query case SQLITE_TEXT: { const char *column_value = reinterpret_cast(sqlite3_column_text(statement, i)); - int byteLen = sqlite3_column_bytes(statement, i); - // Specify length too; in case string contains NULL in the middle (which SQLite supports!) + sqlite3_column_bytes(statement, i); row[column_name] = column_value; break; } @@ -361,8 +359,11 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query results->push_back(std::move(row)); break; case SQLITE_DONE: - if(metadata != NULL) - { + if (!*metadata) { + *metadata = std::vector(); + } + + if (*metadata) { i = 0; count = sqlite3_column_count(statement); while (i < count) @@ -370,14 +371,13 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query column_name = sqlite3_column_name(statement, i); const char *tp = sqlite3_column_decltype(statement, i); column_declared_type = mapSQLiteTypeToColumnType(tp); - auto meta = ColumnMetadata(column_name,column_declared_type, i); - metadata->push_back(meta); + auto columnData = ColumnMetadata(column_name,column_declared_type, i); + (*metadata)->push_back(std::move(columnData)); i++; } + isConsuming = false; } - isConsuming = false; break; - default: isFailed = true; isConsuming = false; diff --git a/cpp/sqliteBridge.h b/cpp/sqliteBridge.h index 1771992d..2bf916fa 100644 --- a/cpp/sqliteBridge.h +++ b/cpp/sqliteBridge.h @@ -17,7 +17,7 @@ SQLiteOPResult sqliteAttachDb(const std::string& mainDBName, const std::string& SQLiteOPResult sqliteDetachDb(const std::string& mainDBName, const std::string& alias); -SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional>& params, std::vector> *result, std::vector *metadata); +SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional>& params, std::shared_ptr>> result, std::shared_ptr>> metadata); SequelLiteralUpdateResult sqliteExecuteLiteral(const std::string& dbName, const std::string& query); diff --git a/ios/Empty.swift b/ios/Empty.swift new file mode 100644 index 00000000..ae72263c --- /dev/null +++ b/ios/Empty.swift @@ -0,0 +1,3 @@ +// We just need this (empty) file in order for Xcode/Swift to generate a "RNQuickSQLite-Swift.h" header + +import Foundation diff --git a/ios/QuickSQLite.xcodeproj/project.pbxproj b/ios/QuickSQLite.xcodeproj/project.pbxproj index 4a462ba9..22d2fbcd 100644 --- a/ios/QuickSQLite.xcodeproj/project.pbxproj +++ b/ios/QuickSQLite.xcodeproj/project.pbxproj @@ -7,7 +7,20 @@ objects = { /* Begin PBXBuildFile section */ - 5E555C0D2413F4C50049A1A2 /* QuickSQLite.mm in Sources */ = {isa = PBXBuildFile; fileRef = B3E7B5891CC2AC0600A0062D /* QuickSQLite.mm */; }; + 83BC6E412C8F788C00B954D2 /* OnLoad.mm in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E402C8F788C00B954D2 /* OnLoad.mm */; }; + 83BC6E712C8F78A200B954D2 /* RNQuickSQLite-Swift-Cxx-Bridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E452C8F78A200B954D2 /* RNQuickSQLite-Swift-Cxx-Bridge.cpp */; }; + 83BC6E722C8F78A200B954D2 /* HybridQuickSQLiteSpec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E4F2C8F78A200B954D2 /* HybridQuickSQLiteSpec.cpp */; }; + 83BC6E732C8F78A200B954D2 /* HybridSelectQueryResultSpec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E512C8F78A200B954D2 /* HybridSelectQueryResultSpec.cpp */; }; + 83BC6E742C8F78A200B954D2 /* HybridQuickSQLiteObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E5A2C8F78A200B954D2 /* HybridQuickSQLiteObject.cpp */; }; + 83BC6E752C8F78A200B954D2 /* HybridSelectQueryResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E5C2C8F78A200B954D2 /* HybridSelectQueryResult.cpp */; }; + 83BC6E762C8F78A200B954D2 /* JSIHelper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E602C8F78A200B954D2 /* JSIHelper.cpp */; }; + 83BC6E772C8F78A200B954D2 /* OnLoad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E642C8F78A200B954D2 /* OnLoad.cpp */; }; + 83BC6E782C8F78A200B954D2 /* sqlbatchexecutor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E662C8F78A200B954D2 /* sqlbatchexecutor.cpp */; }; + 83BC6E792C8F78A200B954D2 /* sqlfileloader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E682C8F78A200B954D2 /* sqlfileloader.cpp */; }; + 83BC6E7A2C8F78A200B954D2 /* sqlite3.c in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E6A2C8F78A200B954D2 /* sqlite3.c */; }; + 83BC6E7B2C8F78A200B954D2 /* sqliteBridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E6C2C8F78A200B954D2 /* sqliteBridge.cpp */; }; + 83BC6E7C2C8F78A200B954D2 /* ThreadPool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E6E2C8F78A200B954D2 /* ThreadPool.cpp */; }; + 83BC6E7F2C8F7BDD00B954D2 /* Empty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E7E2C8F7BDD00B954D2 /* Empty.swift */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -24,7 +37,47 @@ /* Begin PBXFileReference section */ 134814201AA4EA6300B7C361 /* libQuickSQLite.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libQuickSQLite.a; sourceTree = BUILT_PRODUCTS_DIR; }; - B3E7B5891CC2AC0600A0062D /* QuickSQLite.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = QuickSQLite.mm; sourceTree = ""; }; + 83BC6E402C8F788C00B954D2 /* OnLoad.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OnLoad.mm; sourceTree = ""; }; + 83BC6E422C8F78A200B954D2 /* RNQuickSQLite+autolinking.cmake */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "RNQuickSQLite+autolinking.cmake"; sourceTree = ""; }; + 83BC6E432C8F78A200B954D2 /* RNQuickSQLite+autolinking.gradle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "RNQuickSQLite+autolinking.gradle"; sourceTree = ""; }; + 83BC6E452C8F78A200B954D2 /* RNQuickSQLite-Swift-Cxx-Bridge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "RNQuickSQLite-Swift-Cxx-Bridge.cpp"; sourceTree = ""; }; + 83BC6E462C8F78A200B954D2 /* RNQuickSQLite-Swift-Cxx-Bridge.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = "RNQuickSQLite-Swift-Cxx-Bridge.hpp"; sourceTree = ""; }; + 83BC6E472C8F78A200B954D2 /* RNQuickSQLite-Swift-Cxx-Umbrella.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = "RNQuickSQLite-Swift-Cxx-Umbrella.hpp"; sourceTree = ""; }; + 83BC6E482C8F78A200B954D2 /* RNQuickSQLite+autolinking.rb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.ruby; path = "RNQuickSQLite+autolinking.rb"; sourceTree = ""; }; + 83BC6E4A2C8F78A200B954D2 /* BatchQueryCommand.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = BatchQueryCommand.hpp; sourceTree = ""; }; + 83BC6E4B2C8F78A200B954D2 /* BatchQueryResult.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = BatchQueryResult.hpp; sourceTree = ""; }; + 83BC6E4C2C8F78A200B954D2 /* ColumnMetadata.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ColumnMetadata.hpp; sourceTree = ""; }; + 83BC6E4D2C8F78A200B954D2 /* ColumnType.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ColumnType.hpp; sourceTree = ""; }; + 83BC6E4E2C8F78A200B954D2 /* FileLoadResult.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = FileLoadResult.hpp; sourceTree = ""; }; + 83BC6E4F2C8F78A200B954D2 /* HybridQuickSQLiteSpec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HybridQuickSQLiteSpec.cpp; sourceTree = ""; }; + 83BC6E502C8F78A200B954D2 /* HybridQuickSQLiteSpec.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = HybridQuickSQLiteSpec.hpp; sourceTree = ""; }; + 83BC6E512C8F78A200B954D2 /* HybridSelectQueryResultSpec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HybridSelectQueryResultSpec.cpp; sourceTree = ""; }; + 83BC6E522C8F78A200B954D2 /* HybridSelectQueryResultSpec.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = HybridSelectQueryResultSpec.hpp; sourceTree = ""; }; + 83BC6E532C8F78A200B954D2 /* QueryResult.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = QueryResult.hpp; sourceTree = ""; }; + 83BC6E542C8F78A200B954D2 /* QueryType.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = QueryType.hpp; sourceTree = ""; }; + 83BC6E552C8F78A200B954D2 /* Transaction.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Transaction.hpp; sourceTree = ""; }; + 83BC6E5A2C8F78A200B954D2 /* HybridQuickSQLiteObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HybridQuickSQLiteObject.cpp; sourceTree = ""; }; + 83BC6E5B2C8F78A200B954D2 /* HybridQuickSQLiteObject.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = HybridQuickSQLiteObject.hpp; sourceTree = ""; }; + 83BC6E5C2C8F78A200B954D2 /* HybridSelectQueryResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HybridSelectQueryResult.cpp; sourceTree = ""; }; + 83BC6E5D2C8F78A200B954D2 /* HybridSelectQueryResultObject.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = HybridSelectQueryResultObject.hpp; sourceTree = ""; }; + 83BC6E5E2C8F78A200B954D2 /* Types.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Types.hpp; sourceTree = ""; }; + 83BC6E602C8F78A200B954D2 /* JSIHelper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSIHelper.cpp; sourceTree = ""; }; + 83BC6E612C8F78A200B954D2 /* JSIHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSIHelper.h; sourceTree = ""; }; + 83BC6E622C8F78A200B954D2 /* logs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = logs.h; sourceTree = ""; }; + 83BC6E632C8F78A200B954D2 /* macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macros.h; sourceTree = ""; }; + 83BC6E642C8F78A200B954D2 /* OnLoad.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OnLoad.cpp; sourceTree = ""; }; + 83BC6E652C8F78A200B954D2 /* OnLoad.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = OnLoad.hpp; sourceTree = ""; }; + 83BC6E662C8F78A200B954D2 /* sqlbatchexecutor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sqlbatchexecutor.cpp; sourceTree = ""; }; + 83BC6E672C8F78A200B954D2 /* sqlbatchexecutor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sqlbatchexecutor.h; sourceTree = ""; }; + 83BC6E682C8F78A200B954D2 /* sqlfileloader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sqlfileloader.cpp; sourceTree = ""; }; + 83BC6E692C8F78A200B954D2 /* sqlfileloader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sqlfileloader.h; sourceTree = ""; }; + 83BC6E6A2C8F78A200B954D2 /* sqlite3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sqlite3.c; sourceTree = ""; }; + 83BC6E6B2C8F78A200B954D2 /* sqlite3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sqlite3.h; sourceTree = ""; }; + 83BC6E6C2C8F78A200B954D2 /* sqliteBridge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sqliteBridge.cpp; sourceTree = ""; }; + 83BC6E6D2C8F78A200B954D2 /* sqliteBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sqliteBridge.h; sourceTree = ""; }; + 83BC6E6E2C8F78A200B954D2 /* ThreadPool.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ThreadPool.cpp; sourceTree = ""; }; + 83BC6E6F2C8F78A200B954D2 /* ThreadPool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadPool.h; sourceTree = ""; }; + 83BC6E7E2C8F7BDD00B954D2 /* Empty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Empty.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -49,11 +102,117 @@ 58B511D21A9E6C8500147676 = { isa = PBXGroup; children = ( - B3E7B5891CC2AC0600A0062D /* QuickSQLite.mm */, + 83BC6E702C8F78A200B954D2 /* cpp */, + 83BC6E592C8F78A200B954D2 /* nitrogen */, + 83BC6E402C8F788C00B954D2 /* OnLoad.mm */, + 83BC6E7E2C8F7BDD00B954D2 /* Empty.swift */, 134814211AA4EA7D00B7C361 /* Products */, ); sourceTree = ""; }; + 83BC6E442C8F78A200B954D2 /* android */ = { + isa = PBXGroup; + children = ( + 83BC6E422C8F78A200B954D2 /* RNQuickSQLite+autolinking.cmake */, + 83BC6E432C8F78A200B954D2 /* RNQuickSQLite+autolinking.gradle */, + ); + path = android; + sourceTree = ""; + }; + 83BC6E492C8F78A200B954D2 /* ios */ = { + isa = PBXGroup; + children = ( + 83BC6E452C8F78A200B954D2 /* RNQuickSQLite-Swift-Cxx-Bridge.cpp */, + 83BC6E462C8F78A200B954D2 /* RNQuickSQLite-Swift-Cxx-Bridge.hpp */, + 83BC6E472C8F78A200B954D2 /* RNQuickSQLite-Swift-Cxx-Umbrella.hpp */, + 83BC6E482C8F78A200B954D2 /* RNQuickSQLite+autolinking.rb */, + ); + path = ios; + sourceTree = ""; + }; + 83BC6E562C8F78A200B954D2 /* c++ */ = { + isa = PBXGroup; + children = ( + 83BC6E4A2C8F78A200B954D2 /* BatchQueryCommand.hpp */, + 83BC6E4B2C8F78A200B954D2 /* BatchQueryResult.hpp */, + 83BC6E4C2C8F78A200B954D2 /* ColumnMetadata.hpp */, + 83BC6E4D2C8F78A200B954D2 /* ColumnType.hpp */, + 83BC6E4E2C8F78A200B954D2 /* FileLoadResult.hpp */, + 83BC6E4F2C8F78A200B954D2 /* HybridQuickSQLiteSpec.cpp */, + 83BC6E502C8F78A200B954D2 /* HybridQuickSQLiteSpec.hpp */, + 83BC6E512C8F78A200B954D2 /* HybridSelectQueryResultSpec.cpp */, + 83BC6E522C8F78A200B954D2 /* HybridSelectQueryResultSpec.hpp */, + 83BC6E532C8F78A200B954D2 /* QueryResult.hpp */, + 83BC6E542C8F78A200B954D2 /* QueryType.hpp */, + 83BC6E552C8F78A200B954D2 /* Transaction.hpp */, + ); + path = "c++"; + sourceTree = ""; + }; + 83BC6E572C8F78A200B954D2 /* shared */ = { + isa = PBXGroup; + children = ( + 83BC6E562C8F78A200B954D2 /* c++ */, + ); + path = shared; + sourceTree = ""; + }; + 83BC6E582C8F78A200B954D2 /* generated */ = { + isa = PBXGroup; + children = ( + 83BC6E442C8F78A200B954D2 /* android */, + 83BC6E492C8F78A200B954D2 /* ios */, + 83BC6E572C8F78A200B954D2 /* shared */, + ); + path = generated; + sourceTree = ""; + }; + 83BC6E592C8F78A200B954D2 /* nitrogen */ = { + isa = PBXGroup; + children = ( + 83BC6E582C8F78A200B954D2 /* generated */, + ); + name = nitrogen; + path = ../nitrogen; + sourceTree = ""; + }; + 83BC6E5F2C8F78A200B954D2 /* specs */ = { + isa = PBXGroup; + children = ( + 83BC6E5A2C8F78A200B954D2 /* HybridQuickSQLiteObject.cpp */, + 83BC6E5B2C8F78A200B954D2 /* HybridQuickSQLiteObject.hpp */, + 83BC6E5C2C8F78A200B954D2 /* HybridSelectQueryResult.cpp */, + 83BC6E5D2C8F78A200B954D2 /* HybridSelectQueryResultObject.hpp */, + 83BC6E5E2C8F78A200B954D2 /* Types.hpp */, + ); + path = specs; + sourceTree = ""; + }; + 83BC6E702C8F78A200B954D2 /* cpp */ = { + isa = PBXGroup; + children = ( + 83BC6E5F2C8F78A200B954D2 /* specs */, + 83BC6E602C8F78A200B954D2 /* JSIHelper.cpp */, + 83BC6E612C8F78A200B954D2 /* JSIHelper.h */, + 83BC6E622C8F78A200B954D2 /* logs.h */, + 83BC6E632C8F78A200B954D2 /* macros.h */, + 83BC6E642C8F78A200B954D2 /* OnLoad.cpp */, + 83BC6E652C8F78A200B954D2 /* OnLoad.hpp */, + 83BC6E662C8F78A200B954D2 /* sqlbatchexecutor.cpp */, + 83BC6E672C8F78A200B954D2 /* sqlbatchexecutor.h */, + 83BC6E682C8F78A200B954D2 /* sqlfileloader.cpp */, + 83BC6E692C8F78A200B954D2 /* sqlfileloader.h */, + 83BC6E6A2C8F78A200B954D2 /* sqlite3.c */, + 83BC6E6B2C8F78A200B954D2 /* sqlite3.h */, + 83BC6E6C2C8F78A200B954D2 /* sqliteBridge.cpp */, + 83BC6E6D2C8F78A200B954D2 /* sqliteBridge.h */, + 83BC6E6E2C8F78A200B954D2 /* ThreadPool.cpp */, + 83BC6E6F2C8F78A200B954D2 /* ThreadPool.h */, + ); + name = cpp; + path = ../cpp; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -111,7 +270,20 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5E555C0D2413F4C50049A1A2 /* QuickSQLite.mm in Sources */, + 83BC6E772C8F78A200B954D2 /* OnLoad.cpp in Sources */, + 83BC6E792C8F78A200B954D2 /* sqlfileloader.cpp in Sources */, + 83BC6E7C2C8F78A200B954D2 /* ThreadPool.cpp in Sources */, + 83BC6E712C8F78A200B954D2 /* RNQuickSQLite-Swift-Cxx-Bridge.cpp in Sources */, + 83BC6E762C8F78A200B954D2 /* JSIHelper.cpp in Sources */, + 83BC6E7F2C8F7BDD00B954D2 /* Empty.swift in Sources */, + 83BC6E7B2C8F78A200B954D2 /* sqliteBridge.cpp in Sources */, + 83BC6E722C8F78A200B954D2 /* HybridQuickSQLiteSpec.cpp in Sources */, + 83BC6E732C8F78A200B954D2 /* HybridSelectQueryResultSpec.cpp in Sources */, + 83BC6E782C8F78A200B954D2 /* sqlbatchexecutor.cpp in Sources */, + 83BC6E752C8F78A200B954D2 /* HybridSelectQueryResult.cpp in Sources */, + 83BC6E412C8F788C00B954D2 /* OnLoad.mm in Sources */, + 83BC6E7A2C8F78A200B954D2 /* sqlite3.c in Sources */, + 83BC6E742C8F78A200B954D2 /* HybridQuickSQLiteObject.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ios/RNQuickSQLite-Swift.h b/ios/RNQuickSQLite-Swift.h new file mode 100644 index 00000000..ac1452a9 --- /dev/null +++ b/ios/RNQuickSQLite-Swift.h @@ -0,0 +1,13 @@ +// +// RNQuickSQLite-Swift.h +// QuickSQLite +// +// Created by Christoph Pader on 09.09.24. +// Copyright © 2024 Facebook. All rights reserved. +// + +#ifndef RNQuickSQLite_Swift_h +#define RNQuickSQLite_Swift_h + + +#endif /* RNQuickSQLite_Swift_h */ diff --git a/src/specs/SelectQueryResult.nitro.ts b/src/specs/SelectQueryResult.nitro.ts index 152318b9..131faf86 100644 --- a/src/specs/SelectQueryResult.nitro.ts +++ b/src/specs/SelectQueryResult.nitro.ts @@ -5,7 +5,7 @@ export interface SelectQueryResult /** * Query metadata, avaliable only for select query results */ - metadata?: ColumnMetadata[] + metadata: ColumnMetadata[] getString(): string getNumber(): number diff --git a/src/types.ts b/src/types.ts index 64f665ed..ddcee479 100644 --- a/src/types.ts +++ b/src/types.ts @@ -20,7 +20,13 @@ export interface QueryResult { export type QueryType = 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE' | 'OTHER' -export type ExecuteParam = number | boolean | bigint | string | ArrayBuffer +export type ExecuteParam = + | number + | boolean + | bigint + | string + | ArrayBuffer + | undefined export type ExecuteQuery = ( query: string, From 7a1deddf96ed5aa34a5e4832ae9a9bd4b8a05f34 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Mon, 9 Sep 2024 22:51:43 +0200 Subject: [PATCH 060/156] fix: deps --- example/babel.config.js | 14 +++++++------- example/package.json | 2 +- package.json | 14 +++++++++++--- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/example/babel.config.js b/example/babel.config.js index 44c7137a..c10ed9e6 100644 --- a/example/babel.config.js +++ b/example/babel.config.js @@ -1,8 +1,8 @@ -const path = require('path'); -const pak = require('../package.json'); +const path = require('path') +const pak = require('../package.json') module.exports = { - presets: ['module:metro-react-native-babel-preset'], + presets: ['module:@react-native/babel-preset'], plugins: [ 'nativewind/babel', [ @@ -10,12 +10,12 @@ module.exports = { { alias: { [pak.name]: path.join(__dirname, '..', pak.source), - stream: 'stream-browserify', - "react-native-sqlite-storage": "react-native-quick-sqlite" + 'stream': 'stream-browserify', + 'react-native-sqlite-storage': 'react-native-quick-sqlite', }, }, ], 'babel-plugin-transform-typescript-metadata', - ['@babel/plugin-proposal-decorators', {legacy: true}], + ['@babel/plugin-proposal-decorators', { legacy: true }], ], -}; +} diff --git a/example/package.json b/example/package.json index ccab0e52..94e82f8f 100644 --- a/example/package.json +++ b/example/package.json @@ -35,7 +35,6 @@ "@react-native/metro-config": "0.75.2", "@react-native/typescript-config": "0.75.2", "@tsconfig/react-native": "^2.0.2", - "mocha": "^10.1.0", "@types/chai": "^4.3.4", "@types/chance": "^1.1.3", "@types/mocha": "^10.0.1", @@ -43,6 +42,7 @@ "@types/react-test-renderer": "^18.0.0", "babel-plugin-module-resolver": "^4.1.0", "babel-plugin-transform-typescript-metadata": "^0.3.2", + "mocha": "^10.1.0", "patch-package": "^6.5.0", "postinstall-postinstall": "^2.1.0", "prettier": "^2.8.8", diff --git a/package.json b/package.json index c594e978..7dfb0171 100644 --- a/package.json +++ b/package.json @@ -48,12 +48,20 @@ "publishConfig": { "registry": "https://registry.npmjs.org/" }, - "dependencies": {}, + "dependencies": { + "typeorm": "^0.3.20" + }, "devDependencies": { "@react-native/eslint-config": "0.75.2", "@react-native/typescript-config": "0.75.2", - "nitro-codegen": "^0.6.0", - "react": "18.2.0", + "@types/mocha": "^10.0.7", + "babel-plugin-transform-typescript-metadata": "^0.3.2", + "chai": "^5.1.1", + "chance": "^1.1.12", + "eslint": "8.57.0", + "eslint-plugin-prettier": "^5.2.1", + "mocha": "^10.7.3", + "prettier": "^3.3.3", "react": "18.3.1", "react-native": "0.75.2", "react-native-builder-bob": "^0.18.2", From a99f0200e3d3df69508de2f61c1eebb759d73532 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Tue, 10 Sep 2024 15:30:20 +0200 Subject: [PATCH 061/156] update specs --- .../android/RNQuickSQLite+autolinking.cmake | 2 +- .../android/RNQuickSQLite+autolinking.gradle | 2 +- .../ios/RNQuickSQLite+autolinking.rb | 2 +- .../ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp | 2 +- .../ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 31 ++++++++++++++++++- .../ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp | 3 +- .../shared/c++/BatchQueryCommand.hpp | 2 +- .../generated/shared/c++/BatchQueryResult.hpp | 2 +- .../generated/shared/c++/ColumnMetadata.hpp | 2 +- nitrogen/generated/shared/c++/ColumnType.hpp | 2 +- .../generated/shared/c++/FileLoadResult.hpp | 2 +- .../shared/c++/HybridQuickSQLiteSpec.cpp | 2 +- .../shared/c++/HybridQuickSQLiteSpec.hpp | 2 +- .../c++/HybridSelectQueryResultSpec.cpp | 2 +- .../c++/HybridSelectQueryResultSpec.hpp | 2 +- nitrogen/generated/shared/c++/QueryResult.hpp | 2 +- nitrogen/generated/shared/c++/QueryType.hpp | 2 +- nitrogen/generated/shared/c++/Transaction.hpp | 2 +- src/index.ts | 16 +++++----- src/specs/QuickSQLite.nitro.ts | 6 ++-- src/specs/SelectQueryResult.nitro.ts | 2 ++ src/types.ts | 8 ++--- 22 files changed, 65 insertions(+), 33 deletions(-) diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake index 0fc755b5..616da121 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake @@ -1,6 +1,6 @@ # # RNQuickSQLite+autolinking.cmake -# Mon Sep 09 2024 +# Tue Sep 10 2024 # This file was generated by nitrogen. DO NOT MODIFY THIS FILE. # https://github.com/mrousavy/nitro # Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle b/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle index 06c3df75..7003618b 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle @@ -1,6 +1,6 @@ /// /// RNQuickSQLite+autolinking.gradle -/// Mon Sep 09 2024 +/// Tue Sep 10 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb b/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb index a7dc91cc..1f21e3eb 100644 --- a/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb +++ b/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb @@ -1,6 +1,6 @@ # # RNQuickSQLite+autolinking.rb -# Mon Sep 09 2024 +# Tue Sep 10 2024 # This file was generated by nitrogen. DO NOT MODIFY THIS FILE. # https://github.com/mrousavy/nitro # Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp index 765fd727..1e6eddca 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Bridge.cpp -/// Mon Sep 09 2024 +/// Tue Sep 10 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index 59b2bd88..5c725e17 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Bridge.hpp -/// Mon Sep 09 2024 +/// Tue Sep 10 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo @@ -89,6 +89,9 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction; } #if __has_include() #include #endif +#if __has_include() + #include +#endif #if __has_include() #include #endif @@ -392,6 +395,32 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { return PromiseHolder(); } + /** + * Specialized version of `std::unordered_map>>>`. + */ + using std__unordered_map_std__string__std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____ = std::unordered_map>>>; + inline std::unordered_map>>> create_std__unordered_map_std__string__std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____(size_t size) { + std::unordered_map>>> map; + map.reserve(size); + return map; + } + inline std::vector get_std__unordered_map_std__string__std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer_____keys(const std__unordered_map_std__string__std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____& map) { + std::vector keys; + keys.reserve(map.size()); + for (const auto& entry : map) { + keys.push_back(entry.first); + } + return keys; + } + + /** + * Specialized version of `std::optional>>>>`. + */ + using std__optional_std__unordered_map_std__string__std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer_____ = std::optional>>>>; + inline std::optional>>>> create_std__optional_std__unordered_map_std__string__std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer_____(const std::unordered_map>>>& value) { + return std::optional>>>>(value); + } + /** * Specialized version of `std::vector`. */ diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp index fdcad441..d3254984 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Umbrella.hpp -/// Mon Sep 09 2024 +/// Tue Sep 10 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo @@ -46,6 +46,7 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction; } #include #include #include +#include #include #include diff --git a/nitrogen/generated/shared/c++/BatchQueryCommand.hpp b/nitrogen/generated/shared/c++/BatchQueryCommand.hpp index 39ef4cea..e53827bd 100644 --- a/nitrogen/generated/shared/c++/BatchQueryCommand.hpp +++ b/nitrogen/generated/shared/c++/BatchQueryCommand.hpp @@ -1,6 +1,6 @@ /// /// BatchQueryCommand.hpp -/// Mon Sep 09 2024 +/// Tue Sep 10 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/BatchQueryResult.hpp b/nitrogen/generated/shared/c++/BatchQueryResult.hpp index a5b19cae..c644be3d 100644 --- a/nitrogen/generated/shared/c++/BatchQueryResult.hpp +++ b/nitrogen/generated/shared/c++/BatchQueryResult.hpp @@ -1,6 +1,6 @@ /// /// BatchQueryResult.hpp -/// Mon Sep 09 2024 +/// Tue Sep 10 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/ColumnMetadata.hpp b/nitrogen/generated/shared/c++/ColumnMetadata.hpp index fe0cb018..9897411c 100644 --- a/nitrogen/generated/shared/c++/ColumnMetadata.hpp +++ b/nitrogen/generated/shared/c++/ColumnMetadata.hpp @@ -1,6 +1,6 @@ /// /// ColumnMetadata.hpp -/// Mon Sep 09 2024 +/// Tue Sep 10 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/ColumnType.hpp b/nitrogen/generated/shared/c++/ColumnType.hpp index cb4e9b1e..a6b42dbe 100644 --- a/nitrogen/generated/shared/c++/ColumnType.hpp +++ b/nitrogen/generated/shared/c++/ColumnType.hpp @@ -1,6 +1,6 @@ /// /// ColumnType.hpp -/// Mon Sep 09 2024 +/// Tue Sep 10 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/FileLoadResult.hpp b/nitrogen/generated/shared/c++/FileLoadResult.hpp index 0d42f808..d97b71ea 100644 --- a/nitrogen/generated/shared/c++/FileLoadResult.hpp +++ b/nitrogen/generated/shared/c++/FileLoadResult.hpp @@ -1,6 +1,6 @@ /// /// FileLoadResult.hpp -/// Mon Sep 09 2024 +/// Tue Sep 10 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp index 7c3d9be5..04086be0 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp @@ -1,6 +1,6 @@ /// /// HybridQuickSQLiteSpec.cpp -/// Mon Sep 09 2024 +/// Tue Sep 10 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp index ef02e7a7..7be24b02 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp @@ -1,6 +1,6 @@ /// /// HybridQuickSQLiteSpec.hpp -/// Mon Sep 09 2024 +/// Tue Sep 10 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp index 16141f19..493a6856 100644 --- a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp @@ -1,6 +1,6 @@ /// /// HybridSelectQueryResultSpec.cpp -/// Mon Sep 09 2024 +/// Tue Sep 10 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp index e1dcd1b3..a73d76d4 100644 --- a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp @@ -1,6 +1,6 @@ /// /// HybridSelectQueryResultSpec.hpp -/// Mon Sep 09 2024 +/// Tue Sep 10 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/QueryResult.hpp b/nitrogen/generated/shared/c++/QueryResult.hpp index 33431888..8281f3a0 100644 --- a/nitrogen/generated/shared/c++/QueryResult.hpp +++ b/nitrogen/generated/shared/c++/QueryResult.hpp @@ -1,6 +1,6 @@ /// /// QueryResult.hpp -/// Mon Sep 09 2024 +/// Tue Sep 10 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/QueryType.hpp b/nitrogen/generated/shared/c++/QueryType.hpp index 99f21801..e5e498ed 100644 --- a/nitrogen/generated/shared/c++/QueryType.hpp +++ b/nitrogen/generated/shared/c++/QueryType.hpp @@ -1,6 +1,6 @@ /// /// QueryType.hpp -/// Mon Sep 09 2024 +/// Tue Sep 10 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/Transaction.hpp b/nitrogen/generated/shared/c++/Transaction.hpp index 1bf14ce8..e49e857c 100644 --- a/nitrogen/generated/shared/c++/Transaction.hpp +++ b/nitrogen/generated/shared/c++/Transaction.hpp @@ -1,6 +1,6 @@ /// /// Transaction.hpp -/// Mon Sep 09 2024 +/// Tue Sep 10 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/src/index.ts b/src/index.ts index 8614bb8f..c213b8aa 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,7 @@ import { NitroModules } from 'react-native-nitro-modules' import { QuickSQLite as QuickSQLiteSpec } from 'src/specs/QuickSQLite.nitro' import { - ExecuteParam, + SQLiteValue, PendingTransaction, QueryResult, QuickSQLiteConnection, @@ -55,7 +55,7 @@ const _execute = QuickSQLite.execute QuickSQLite.execute = ( dbName: string, query: string, - params?: ExecuteParam[] + params?: SQLiteValue[] ): QueryResult => { const result = _execute(dbName, query, params) // enhanceQueryResult(result); @@ -66,7 +66,7 @@ const _executeAsync = QuickSQLite.executeAsync QuickSQLite.executeAsync = async ( dbName: string, query: string, - params?: ExecuteParam[] + params?: SQLiteValue[] ): Promise => { const res = await _executeAsync(dbName, query, params) // enhanceQueryResult(res); @@ -84,7 +84,7 @@ QuickSQLite.transaction = async ( let isFinalized = false // Local transaction context object implementation - const execute = (query: string, params?: ExecuteParam[]): QueryResult => { + const execute = (query: string, params?: SQLiteValue[]): QueryResult => { if (isFinalized) { throw Error( `Quick SQLite Error: Cannot execute query on finalized transaction: ${dbName}` @@ -93,7 +93,7 @@ QuickSQLite.transaction = async ( return QuickSQLite.execute(dbName, query, params) } - const executeAsync = (query: string, params?: ExecuteParam[]) => { + const executeAsync = (query: string, params?: SQLiteValue[]) => { if (isFinalized) { throw Error( `Quick SQLite Error: Cannot execute query on finalized transaction: ${dbName}` @@ -212,7 +212,7 @@ export const typeORMDriver = { const connection = { executeSql: async ( sql: string, - params: ExecuteParam[] | undefined, + params: SQLiteValue[] | undefined, ok: (res: QueryResult) => void, fail: (msg: string) => void ) => { @@ -281,11 +281,11 @@ export const open = (options: { detach: (alias: string) => QuickSQLite.detach(options.name, alias), transaction: (fn: (tx: Transaction) => Promise | void) => QuickSQLite.transaction(options.name, fn), - execute: (query: string, params?: ExecuteParam[]): QueryResult => + execute: (query: string, params?: SQLiteValue[]): QueryResult => QuickSQLite.execute(options.name, query, params), executeAsync: ( query: string, - params?: ExecuteParam[] + params?: SQLiteValue[] ): Promise => QuickSQLite.executeAsync(options.name, query, params), executeBatch: (commands: BatchQueryCommand[]) => diff --git a/src/specs/QuickSQLite.nitro.ts b/src/specs/QuickSQLite.nitro.ts index 033ff1bf..4a97f246 100644 --- a/src/specs/QuickSQLite.nitro.ts +++ b/src/specs/QuickSQLite.nitro.ts @@ -5,7 +5,7 @@ import { FileLoadResult, BatchQueryCommand, Transaction, - ExecuteParam, + SQLiteValue, } from '../types' export interface QuickSQLite @@ -24,11 +24,11 @@ export interface QuickSQLite dbName: string, fn: (tx: Transaction) => Promise | void ): Promise - execute(dbName: string, query: string, params?: ExecuteParam[]): QueryResult + execute(dbName: string, query: string, params?: SQLiteValue[]): QueryResult executeAsync( dbName: string, query: string, - params?: ExecuteParam[] + params?: SQLiteValue[] ): Promise executeBatch(dbName: string, commands: BatchQueryCommand[]): BatchQueryResult executeBatchAsync( diff --git a/src/specs/SelectQueryResult.nitro.ts b/src/specs/SelectQueryResult.nitro.ts index 131faf86..c2cf15c3 100644 --- a/src/specs/SelectQueryResult.nitro.ts +++ b/src/specs/SelectQueryResult.nitro.ts @@ -1,7 +1,9 @@ import { HybridObject } from 'react-native-nitro-modules' +import { SQLiteValue } from '../types' export interface SelectQueryResult extends HybridObject<{ ios: 'c++'; android: 'c++' }> { + results?: Record /** * Query metadata, avaliable only for select query results */ diff --git a/src/types.ts b/src/types.ts index ddcee479..4c5782eb 100644 --- a/src/types.ts +++ b/src/types.ts @@ -20,7 +20,7 @@ export interface QueryResult { export type QueryType = 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE' | 'OTHER' -export type ExecuteParam = +export type SQLiteValue = | number | boolean | bigint @@ -30,12 +30,12 @@ export type ExecuteParam = export type ExecuteQuery = ( query: string, - params?: ExecuteParam[] + params?: SQLiteValue[] ) => QueryResult export type ExecuteAsyncQuery = ( query: string, - params?: ExecuteParam[] + params?: SQLiteValue[] ) => Promise export interface Transaction { @@ -66,7 +66,7 @@ export interface PendingTransaction { */ export interface BatchQueryCommand { query: string - params?: Array | Array> + params?: Array | Array> } /** From 5e85ba748494eccfd9ee324f10eecc3a383b1c45 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Tue, 10 Sep 2024 15:40:50 +0200 Subject: [PATCH 062/156] update nitrogen files --- .../android/RNQuickSQLite+autolinking.cmake | 4 ---- .../ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 16 -------------- .../c++/HybridSelectQueryResultSpec.cpp | 6 ++--- .../c++/HybridSelectQueryResultSpec.hpp | 22 +++++++++---------- 4 files changed, 13 insertions(+), 35 deletions(-) diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake index 616da121..80a9ad72 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake @@ -27,10 +27,6 @@ target_sources( # Shared Nitrogen C++ sources ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp ../nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp - ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp - ../nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp - ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp - ../nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp # Android-specific Nitrogen C++ sources ) diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index 5c725e17..ec5c91e0 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -413,14 +413,6 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { return keys; } - /** - * Specialized version of `std::optional>>>>`. - */ - using std__optional_std__unordered_map_std__string__std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer_____ = std::optional>>>>; - inline std::optional>>>> create_std__optional_std__unordered_map_std__string__std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer_____(const std::unordered_map>>>& value) { - return std::optional>>>>(value); - } - /** * Specialized version of `std::vector`. */ @@ -430,13 +422,5 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { vector.reserve(size); return vector; } - - /** - * Specialized version of `std::optional>`. - */ - using std__optional_std__vector_ColumnMetadata__ = std::optional>; - inline std::optional> create_std__optional_std__vector_ColumnMetadata__(const std::vector& value) { - return std::optional>(value); - } } // namespace margelo::nitro::rnquicksqlite::bridge::swift diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp index 493a6856..6a873522 100644 --- a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp @@ -15,12 +15,10 @@ namespace margelo::nitro::rnquicksqlite { HybridObject::loadHybridMethods(); // load custom methods/properties registerHybrids(this, [](Prototype& prototype) { + prototype.registerHybridGetter("results", &HybridSelectQueryResultSpec::getResults); + prototype.registerHybridSetter("results", &HybridSelectQueryResultSpec::setResults); prototype.registerHybridGetter("metadata", &HybridSelectQueryResultSpec::getMetadata); prototype.registerHybridSetter("metadata", &HybridSelectQueryResultSpec::setMetadata); - prototype.registerHybridMethod("getString", &HybridSelectQueryResultSpec::getString); - prototype.registerHybridMethod("getNumber", &HybridSelectQueryResultSpec::getNumber); - prototype.registerHybridMethod("getBoolean", &HybridSelectQueryResultSpec::getBoolean); - prototype.registerHybridMethod("getArrayBuffer", &HybridSelectQueryResultSpec::getArrayBuffer); }); } diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp index a73d76d4..979e53ab 100644 --- a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp @@ -14,16 +14,17 @@ #error NitroModules cannot be found! Are you sure you installed NitroModules properly? #endif -// Forward declaration of `ColumnMetadata` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } // Forward declaration of `ArrayBuffer` to properly resolve imports. namespace NitroModules { class ArrayBuffer; } +// Forward declaration of `ColumnMetadata` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } -#include -#include -#include "ColumnMetadata.hpp" +#include #include +#include +#include #include +#include "ColumnMetadata.hpp" namespace margelo::nitro::rnquicksqlite { @@ -49,15 +50,14 @@ namespace margelo::nitro::rnquicksqlite { public: // Properties - virtual std::optional> getMetadata() = 0; - virtual void setMetadata(const std::optional>& metadata) = 0; + virtual std::unordered_map>>> getResults() = 0; + virtual void setResults(const std::unordered_map>>>& results) = 0; + virtual std::vector getMetadata() = 0; + virtual void setMetadata(const std::vector& metadata) = 0; public: // Methods - virtual std::string getString() = 0; - virtual double getNumber() = 0; - virtual bool getBoolean() = 0; - virtual std::shared_ptr getArrayBuffer() = 0; + protected: // Hybrid Setup From fdf55de0ca0bcb458dd75f06754c693671648fd2 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Tue, 10 Sep 2024 15:41:24 +0200 Subject: [PATCH 063/156] rename type in C++ --- cpp/specs/HybridQuickSQLiteObject.cpp | 4 +- cpp/specs/Types.hpp | 2 - cpp/sqlbatchexecutor.cpp | 6 +- cpp/sqlbatchexecutor.h | 2 +- cpp/sqliteBridge.cpp | 104 +++++++++++++------------- cpp/sqliteBridge.h | 2 +- 6 files changed, 59 insertions(+), 61 deletions(-) diff --git a/cpp/specs/HybridQuickSQLiteObject.cpp b/cpp/specs/HybridQuickSQLiteObject.cpp index 54973ab9..e7438a97 100644 --- a/cpp/specs/HybridQuickSQLiteObject.cpp +++ b/cpp/specs/HybridQuickSQLiteObject.cpp @@ -85,7 +85,7 @@ std::future HybridQuickSQLiteObject::transaction(const std::string& dbName }); }; -QueryResult HybridQuickSQLiteObject::execute(const std::string& dbName, const std::string& query, const std::optional>& params) { +QueryResult HybridQuickSQLiteObject::execute(const std::string& dbName, const std::string& query, const std::optional>& params) { auto results = std::make_shared>>(); auto metadata = std::make_shared>>(std::nullopt); @@ -108,7 +108,7 @@ QueryResult HybridQuickSQLiteObject::execute(const std::string& dbName, const st } }; -std::future HybridQuickSQLiteObject::executeAsync(const std::string& dbName, const std::string& query, const std::optional>& params) { +std::future HybridQuickSQLiteObject::executeAsync(const std::string& dbName, const std::string& query, const std::optional>& params) { auto promise = std::make_shared>(); auto future = promise->get_future(); diff --git a/cpp/specs/Types.hpp b/cpp/specs/Types.hpp index da43dc63..0b33a85d 100644 --- a/cpp/specs/Types.hpp +++ b/cpp/specs/Types.hpp @@ -38,8 +38,6 @@ struct SequelBatchOperationResult int commands; }; - -using ExecuteParam = std::variant>; using SQLiteValue = std::variant, std::monostate>; // constexpr function that maps SQLiteColumnType to string literals diff --git a/cpp/sqlbatchexecutor.cpp b/cpp/sqlbatchexecutor.cpp index 3728e318..197ecde9 100644 --- a/cpp/sqlbatchexecutor.cpp +++ b/cpp/sqlbatchexecutor.cpp @@ -10,14 +10,14 @@ namespace margelo::rnquicksqlite { std::vector batchParamsToCommands(const std::vector& batchParams) { auto commands = std::vector(); - + for (auto& command : batchParams) { if (command.params) { - using ParamsVec = std::vector; + using ParamsVec = std::vector; using NestedParamsVec = std::vector; - + if (std::holds_alternative(*command.params)) { // This arguments is an array of arrays, like a batch update of a single sql command. for (const auto& params : std::get(*command.params)) diff --git a/cpp/sqlbatchexecutor.h b/cpp/sqlbatchexecutor.h index 2110bbb3..f67a69fd 100644 --- a/cpp/sqlbatchexecutor.h +++ b/cpp/sqlbatchexecutor.h @@ -13,7 +13,7 @@ namespace margelo::rnquicksqlite { struct BatchQuery { std::string sql; - std::shared_ptr> params; + std::shared_ptr> params; }; /** diff --git a/cpp/sqliteBridge.cpp b/cpp/sqliteBridge.cpp index 2c043af6..8512cf13 100644 --- a/cpp/sqliteBridge.cpp +++ b/cpp/sqliteBridge.cpp @@ -57,10 +57,10 @@ int mkdir(const char *path) // create current level if (!folder_exists(current_level) && _mkdir(current_level.c_str()) != 0) return -1; - + current_level += "/"; // don't forget to append a slash } - + return 0; } @@ -79,13 +79,13 @@ std::string get_db_path(const std::string& dbName, const std::string& docPath) SQLiteOPResult 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) { return SQLiteOPResult{ @@ -97,7 +97,7 @@ SQLiteOPResult sqliteOpenDb(const std::string& dbName, const std::string& docPat { dbMap[dbName] = db; } - + return SQLiteOPResult{ .type = SQLiteOk, .rowsAffected = 0 @@ -106,7 +106,7 @@ SQLiteOPResult sqliteOpenDb(const std::string& dbName, const std::string& docPat SQLiteOPResult sqliteCloseDb(const std::string& dbName) { - + if (dbMap.count(dbName) == 0) { return SQLiteOPResult{ @@ -114,13 +114,13 @@ SQLiteOPResult sqliteCloseDb(const std::string& dbName) .errorMessage = dbName + " is not open", }; } - + sqlite3 *db = dbMap[dbName]; - + sqlite3_close_v2(db); - + dbMap.erase(dbName); - + return SQLiteOPResult{ .type = SQLiteOk, }; @@ -184,9 +184,9 @@ SQLiteOPResult sqliteRemoveDb(const std::string& dbName, const std::string& docP return closeResult; } } - + std::string dbPath = get_db_path(dbName, docPath); - + if (!file_exists(dbPath)) { return SQLiteOPResult{ @@ -194,26 +194,26 @@ SQLiteOPResult sqliteRemoveDb(const std::string& dbName, const std::string& docP .errorMessage = "[react-native-quick-sqlite]: Database file not found" + dbPath }; } - + remove(dbPath.c_str()); - + return SQLiteOPResult{ .type = SQLiteOk, }; } -void bindStatement(sqlite3_stmt *statement, const std::vector& values) +void bindStatement(sqlite3_stmt *statement, const std::vector& values) { size_t size = values.size(); if (size <= 0) { return; } - + for (int ii = 0; ii < size; ii++) { int sqIndex = ii + 1; - ExecuteParam value = values.at(ii); + SQLiteValue value = values.at(ii); // if (std::holds_alternative(value)) // { // sqlite3_bind_null(statement, sqIndex); @@ -226,7 +226,7 @@ void bindStatement(sqlite3_stmt *statement, const std::vector& val { const auto doubleValue = std::get(value); const auto isInt = std::floor(doubleValue) == doubleValue; - + if (isInt) { sqlite3_bind_int(statement, sqIndex, static_cast(doubleValue)); } else { @@ -250,7 +250,7 @@ void bindStatement(sqlite3_stmt *statement, const std::vector& val } } -SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional>& params, std::shared_ptr>> results, std::shared_ptr>> metadata) +SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional>& params, std::shared_ptr>> results, std::shared_ptr>> metadata) { if (dbMap.count(dbName) == 0) { @@ -260,13 +260,13 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query .rowsAffected = 0 }; } - + sqlite3 *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) { @@ -281,34 +281,34 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query .errorMessage = "[react-native-quick-sqlite] SQL execution error: " + std::string(message), .rowsAffected = 0}; } - + bool isConsuming = true; bool isFailed = false; - + int result, i, count, column_type; std::string column_name; ColumnType column_declared_type; std::map row; - + while (isConsuming) { result = sqlite3_step(statement); - + switch (result) { case SQLITE_ROW: i = 0; row = std::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: { /** @@ -322,14 +322,14 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query row[column_name] = column_value; break; } - + case SQLITE_FLOAT: { double column_value = sqlite3_column_double(statement, i); row[column_name] = column_value; break; } - + case SQLITE_TEXT: { const char *column_value = reinterpret_cast(sqlite3_column_text(statement, i)); @@ -337,7 +337,7 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query row[column_name] = column_value; break; } - + case SQLITE_BLOB: { int blob_size = sqlite3_column_bytes(statement, i); @@ -347,7 +347,7 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query 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: @@ -362,7 +362,7 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query if (!*metadata) { *metadata = std::vector(); } - + if (*metadata) { i = 0; count = sqlite3_column_count(statement); @@ -383,9 +383,9 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query isConsuming = false; } } - + sqlite3_finalize(statement); - + if (isFailed) { const char *message = sqlite3_errmsg(db); @@ -396,7 +396,7 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query .insertId = 0 }; } - + int changedRowCount = sqlite3_changes(db); long long latestInsertRowId = sqlite3_last_insert_rowid(db); return SQLiteOPResult{ @@ -416,15 +416,15 @@ SequelLiteralUpdateResult sqliteExecuteLiteral(const std::string& dbName, const 0 }; } - + 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 { const char *message = sqlite3_errmsg(db); @@ -433,35 +433,35 @@ SequelLiteralUpdateResult sqliteExecuteLiteral(const std::string& dbName, const "[react-native-quick-sqlite] SQL execution error: " + std::string(message), 0}; } - + 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) { const char *message = sqlite3_errmsg(db); @@ -470,7 +470,7 @@ SequelLiteralUpdateResult sqliteExecuteLiteral(const std::string& dbName, const "[react-native-quick-sqlite] SQL execution error: " + std::string(message), 0}; } - + int changedRowCount = sqlite3_changes(db); return { SQLiteOk, diff --git a/cpp/sqliteBridge.h b/cpp/sqliteBridge.h index 2bf916fa..cb95dc23 100644 --- a/cpp/sqliteBridge.h +++ b/cpp/sqliteBridge.h @@ -17,7 +17,7 @@ SQLiteOPResult sqliteAttachDb(const std::string& mainDBName, const std::string& SQLiteOPResult sqliteDetachDb(const std::string& mainDBName, const std::string& alias); -SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional>& params, std::shared_ptr>> result, std::shared_ptr>> metadata); +SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional>& params, std::shared_ptr>> result, std::shared_ptr>> metadata); SequelLiteralUpdateResult sqliteExecuteLiteral(const std::string& dbName, const std::string& query); From d37a717a498aba99105a51f5a85877dd3fdaef7f Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Tue, 10 Sep 2024 16:43:24 +0200 Subject: [PATCH 064/156] disable tests temporarily --- example/src/tests/MochaSetup.ts | 8 +- example/src/tests/rawQueries.spec.ts | 1168 ++++++++--------- .../android/RNQuickSQLite+autolinking.cmake | 2 + 3 files changed, 551 insertions(+), 627 deletions(-) diff --git a/example/src/tests/MochaSetup.ts b/example/src/tests/MochaSetup.ts index 6a376dae..df5dff2d 100644 --- a/example/src/tests/MochaSetup.ts +++ b/example/src/tests/MochaSetup.ts @@ -14,11 +14,15 @@ export async function runTests(...registrators: Array<() => void>) { EVENT_TEST_FAIL, EVENT_TEST_PASS, EVENT_SUITE_BEGIN, - EVENT_SUITE_END, } = Mocha.Runner.constants clearTests() - const results = [] + const results: { + description: string + key: string + type: string + errorMsg?: string + }[] = [] var runner = new Mocha.Runner(rootSuite) as MochaTypes.Runner runner diff --git a/example/src/tests/rawQueries.spec.ts b/example/src/tests/rawQueries.spec.ts index 5273b214..805ba9a3 100644 --- a/example/src/tests/rawQueries.spec.ts +++ b/example/src/tests/rawQueries.spec.ts @@ -12,629 +12,547 @@ const chance = new Chance() let db: QuickSQLiteConnection export function registerBaseTests() { - beforeEach(() => { - try { - if (db) { - db.close() - db.delete() - } - - db = open({ - name: 'test', - }) - - db.execute('DROP TABLE IF EXISTS User;') - db.execute( - 'CREATE TABLE User ( id INT PRIMARY KEY, name TEXT NOT NULL, age INT, networth REAL) STRICT;' - ) - } catch (e) { - console.warn('error on before each', e) - } - }) - - describe('Raw queries', () => { - it('Insert', async () => { - const id = chance.integer() - const name = chance.name() - const age = chance.integer() - const networth = chance.floating() - const res = db.execute( - 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth] - ) - - expect(res.rowsAffected).to.equal(1) - expect(res.insertId).to.equal(1) - expect(res.metadata).to.eql([]) - expect(res.rows?._array).to.eql([]) - expect(res.rows?.length).to.equal(0) - expect(res.rows?.item).to.be.a('function') - }) - - it('Query without params', async () => { - const id = chance.integer() - const name = chance.name() - const age = chance.integer() - const networth = chance.floating() - db.execute( - 'INSERT INTO User (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth] - ) - - const res = db.execute('SELECT * FROM User') - - expect(res.rowsAffected).to.equal(1) - expect(res.insertId).to.equal(1) - expect(res.rows?._array).to.eql([ - { - id, - name, - age, - networth, - }, - ]) - }) - - it('Query with params', async () => { - const id = chance.integer() - const name = chance.name() - const age = chance.integer() - const networth = chance.floating() - db.execute( - 'INSERT INTO User (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth] - ) - - const res = db.execute('SELECT * FROM User WHERE id = ?', [id]) - - expect(res.rowsAffected).to.equal(1) - expect(res.insertId).to.equal(1) - expect(res.rows?._array).to.eql([ - { - id, - name, - age, - networth, - }, - ]) - }) - - it('Failed insert', async () => { - const id = chance.string() - const name = chance.name() - const age = chance.string() - const networth = chance.string() - // expect( - try { - db.execute( - 'INSERT INTO User (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth] - ) - } catch (e: any) { - expect(typeof e).to.equal('object') - - expect(e.message).to.include( - `cannot store TEXT value in INT column User.id` - ) - } - }) - - it('Transaction, auto commit', async () => { - const id = chance.integer() - const name = chance.name() - const age = chance.integer() - const networth = chance.floating() - - await db.transaction((tx) => { - const res = tx.execute( - 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth] - ) - - expect(res.rowsAffected).to.equal(1) - expect(res.insertId).to.equal(1) - expect(res.metadata).to.eql([]) - expect(res.rows?._array).to.eql([]) - expect(res.rows?.length).to.equal(0) - expect(res.rows?.item).to.be.a('function') - }) - - const res = db.execute('SELECT * FROM User') - expect(res.rows?._array).to.eql([ - { - id, - name, - age, - networth, - }, - ]) - }) - - it('Transaction, manual commit', async () => { - const id = chance.integer() - const name = chance.name() - const age = chance.integer() - const networth = chance.floating() - - await db.transaction((tx) => { - const res = tx.execute( - 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth] - ) - - expect(res.rowsAffected).to.equal(1) - expect(res.insertId).to.equal(1) - expect(res.metadata).to.eql([]) - expect(res.rows?._array).to.eql([]) - expect(res.rows?.length).to.equal(0) - expect(res.rows?.item).to.be.a('function') - - tx.commit() - }) - - const res = db.execute('SELECT * FROM User') - expect(res.rows?._array).to.eql([ - { - id, - name, - age, - networth, - }, - ]) - }) - - it('Transaction, executed in order', async () => { - // ARRANGE: Setup for multiple transactions - const iterations = 10 - const actual: unknown[] = [] - - // ARRANGE: Generate expected data - const id = chance.integer() - const name = chance.name() - const age = chance.integer() - - // ACT: Start multiple transactions to upsert and select the same record - const promises = [] - for (let iteration = 1; iteration <= iterations; iteration++) { - const promised = db.transaction((tx) => { - // ACT: Upsert statement to create record / increment the value - tx.execute( - ` - INSERT OR REPLACE INTO [User] ([id], [name], [age], [networth]) - SELECT ?, ?, ?, - IFNULL(( - SELECT [networth] + 1000 - FROM [User] - WHERE [id] = ? - ), 0) - `, - [id, name, age, id] - ) - - // ACT: Select statement to get incremented value and store it for checking later - const results = tx.execute( - 'SELECT [networth] FROM [User] WHERE [id] = ?', - [id] - ) - - actual.push(results.rows?._array[0].networth) - }) - - promises.push(promised) - } - - // ACT: Wait for all transactions to complete - await Promise.all(promises) - - // ASSERT: That the expected values where returned - const expected = Array(iterations) - .fill(0) - .map((_, index) => index * 1000) - expect(actual).to.eql( - expected, - 'Each transaction should read a different value' - ) - }) - - it('Transaction, cannot execute after commit', async () => { - const id = chance.integer() - const name = chance.name() - const age = chance.integer() - const networth = chance.floating() - - await db.transaction((tx) => { - const res = tx.execute( - 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth] - ) - - expect(res.rowsAffected).to.equal(1) - expect(res.insertId).to.equal(1) - expect(res.metadata).to.eql([]) - expect(res.rows?._array).to.eql([]) - expect(res.rows?.length).to.equal(0) - expect(res.rows?.item).to.be.a('function') - - tx.commit() - - try { - tx.execute('SELECT * FROM "User"') - } catch (e) { - expect(!!e).to.equal(true) - } - }) - - const res = db.execute('SELECT * FROM User') - expect(res.rows?._array).to.eql([ - { - id, - name, - age, - networth, - }, - ]) - }) - - it('Incorrect transaction, manual rollback', async () => { - const id = chance.string() - const name = chance.name() - const age = chance.integer() - const networth = chance.floating() - - await db.transaction((tx) => { - try { - tx.execute( - 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth] - ) - } catch (e) { - tx.rollback() - } - }) - - const res = db.execute('SELECT * FROM User') - expect(res.rows?._array).to.eql([]) - }) - - it('Correctly throws', () => { - const id = chance.string() - const name = chance.name() - const age = chance.integer() - const networth = chance.floating() - try { - db.execute( - 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth] - ) - } catch (e: any) { - expect(!!e).to.equal(true) - } - }) - - it('Rollback', async () => { - const id = chance.integer() - const name = chance.name() - const age = chance.integer() - const networth = chance.floating() - - await db.transaction((tx) => { - tx.execute( - 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth] - ) - tx.rollback() - const res = db.execute('SELECT * FROM User') - expect(res.rows?._array).to.eql([]) - }) - }) - - it('Transaction, rejects on callback error', async () => { - const promised = db.transaction((tx) => { - throw new Error('Error from callback') - }) - - // ASSERT: should return a promise that eventually rejects - expect(promised).to.have.property('then').that.is.a('function') - try { - await promised - expect.fail('Should not resolve') - } catch (e) { - expect(e).to.be.a.instanceof(Error) - expect((e as Error)?.message).to.equal('Error from callback') - } - }) - - it('Transaction, rejects on invalid query', async () => { - const promised = db.transaction((tx) => { - console.log('execute bad start') - tx.execute('SELECT * FROM [tableThatDoesNotExist];') - console.log('execute bad done') - }) - - // ASSERT: should return a promise that eventually rejects - expect(promised).to.have.property('then').that.is.a('function') - try { - await promised - expect.fail('Should not resolve') - } catch (e) { - expect(e).to.be.a.instanceof(Error) - expect((e as Error)?.message).to.include( - 'no such table: tableThatDoesNotExist' - ) - } - }) - - it('Transaction, handle async callback', async () => { - let ranCallback = false - const promised = db.transaction(async (tx) => { - await new Promise((done) => { - setTimeout(() => done(), 50) - }) - tx.execute('SELECT * FROM [User];') - ranCallback = true - }) - - // ASSERT: should return a promise that eventually rejects - expect(promised).to.have.property('then').that.is.a('function') - await promised - expect(ranCallback).to.equal(true, 'Should handle async callback') - }) - - it('Async transaction, auto commit', async () => { - const id = chance.integer() - const name = chance.name() - const age = chance.integer() - const networth = chance.floating() - - await db.transaction(async (tx) => { - const res = await tx.executeAsync( - 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth] - ) - - expect(res.rowsAffected).to.equal(1) - expect(res.insertId).to.equal(1) - expect(res.metadata).to.eql([]) - expect(res.rows?._array).to.eql([]) - expect(res.rows?.length).to.equal(0) - expect(res.rows?.item).to.be.a('function') - }) - - const res = db.execute('SELECT * FROM User') - expect(res.rows?._array).to.eql([ - { - id, - name, - age, - networth, - }, - ]) - }) - - it('Async transaction, auto rollback', async () => { - const id = chance.string() // Causes error because it should be an integer - const name = chance.name() - const age = chance.integer() - const networth = chance.floating() - - try { - await db.transaction(async (tx) => { - await tx.executeAsync( - 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth] - ) - }) - } catch (error) { - expect(error).to.be.instanceOf(Error) - expect((error as Error).message) - .to.include('SQL execution error') - .and.to.include('cannot store TEXT value in INT column User.id') - - const res = db.execute('SELECT * FROM User') - expect(res.rows?._array).to.eql([]) - } - }) - - it('Async transaction, manual commit', async () => { - const id = chance.integer() - const name = chance.name() - const age = chance.integer() - const networth = chance.floating() - - await db.transaction(async (tx) => { - await tx.executeAsync( - 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth] - ) - tx.commit() - }) - - const res = db.execute('SELECT * FROM User') - expect(res.rows?._array).to.eql([ - { - id, - name, - age, - networth, - }, - ]) - }) - - it('Async transaction, manual rollback', async () => { - const id = chance.integer() - const name = chance.name() - const age = chance.integer() - const networth = chance.floating() - - await db.transaction(async (tx) => { - await tx.executeAsync( - 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id, name, age, networth] - ) - tx.rollback() - }) - - const res = db.execute('SELECT * FROM User') - expect(res.rows?._array).to.eql([]) - }) - - it('Async transaction, executed in order', async () => { - // ARRANGE: Setup for multiple transactions - const iterations = 10 - const actual: unknown[] = [] - - // ARRANGE: Generate expected data - const id = chance.integer() - const name = chance.name() - const age = chance.integer() - - // ACT: Start multiple async transactions to upsert and select the same record - const promises = [] - for (let iteration = 1; iteration <= iterations; iteration++) { - const promised = db.transaction(async (tx) => { - // ACT: Upsert statement to create record / increment the value - await tx.executeAsync( - ` - INSERT OR REPLACE INTO [User] ([id], [name], [age], [networth]) - SELECT ?, ?, ?, - IFNULL(( - SELECT [networth] + 1000 - FROM [User] - WHERE [id] = ? - ), 0) - `, - [id, name, age, id] - ) - - // ACT: Select statement to get incremented value and store it for checking later - const results = await tx.executeAsync( - 'SELECT [networth] FROM [User] WHERE [id] = ?', - [id] - ) - - actual.push(results.rows?._array[0].networth) - }) - - promises.push(promised) - } - - // ACT: Wait for all transactions to complete - await Promise.all(promises) - - // ASSERT: That the expected values where returned - const expected = Array(iterations) - .fill(0) - .map((_, index) => index * 1000) - expect(actual).to.eql( - expected, - 'Each transaction should read a different value' - ) - }) - - it('Async transaction, rejects on callback error', async () => { - const promised = db.transaction(async (tx) => { - throw new Error('Error from callback') - }) - - // ASSERT: should return a promise that eventually rejects - expect(promised).to.have.property('then').that.is.a('function') - try { - await promised - expect.fail('Should not resolve') - } catch (e) { - expect(e).to.be.a.instanceof(Error) - expect((e as Error)?.message).to.equal('Error from callback') - } - }) - - it('Async transaction, rejects on invalid query', async () => { - const promised = db.transaction(async (tx) => { - await tx.executeAsync('SELECT * FROM [tableThatDoesNotExist];') - }) - - // ASSERT: should return a promise that eventually rejects - expect(promised).to.have.property('then').that.is.a('function') - try { - await promised - expect.fail('Should not resolve') - } catch (e) { - expect(e).to.be.a.instanceof(Error) - expect((e as Error)?.message).to.include( - 'no such table: tableThatDoesNotExist' - ) - } - }) - - it('Batch execute', () => { - const id1 = chance.integer() - const name1 = chance.name() - const age1 = chance.integer() - const networth1 = chance.floating() - - const id2 = chance.integer() - const name2 = chance.name() - const age2 = chance.integer() - const networth2 = chance.floating() - - const commands: BatchQueryCommand[] = [ - [ - 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id1, name1, age1, networth1], - ], - [ - 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id2, name2, age2, networth2], - ], - ] - - db.executeBatch(commands) - - const res = db.execute('SELECT * FROM User') - expect(res.rows?._array).to.eql([ - { id: id1, name: name1, age: age1, networth: networth1 }, - { - id: id2, - name: name2, - age: age2, - networth: networth2, - }, - ]) - }) - - it('Async batch execute', async () => { - const id1 = chance.integer() - const name1 = chance.name() - const age1 = chance.integer() - const networth1 = chance.floating() - - const id2 = chance.integer() - const name2 = chance.name() - const age2 = chance.integer() - const networth2 = chance.floating() - - const commands: BatchQueryCommand[] = [ - [ - 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id1, name1, age1, networth1], - ], - [ - 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - [id2, name2, age2, networth2], - ], - ] - - await db.executeBatchAsync(commands) - - const res = db.execute('SELECT * FROM User') - expect(res.rows?._array).to.eql([ - { id: id1, name: name1, age: age1, networth: networth1 }, - { - id: id2, - name: name2, - age: age2, - networth: networth2, - }, - ]) - }) - }) + // beforeEach(() => { + // try { + // if (db) { + // db.close() + // db.delete() + // } + // db = open({ + // name: 'test', + // }) + // db.execute('DROP TABLE IF EXISTS User;') + // db.execute( + // 'CREATE TABLE User ( id INT PRIMARY KEY, name TEXT NOT NULL, age INT, networth REAL) STRICT;' + // ) + // } catch (e) { + // console.warn('error on before each', e) + // } + // }) + // describe('Raw queries', () => { + // it('Insert', async () => { + // const id = chance.integer() + // const name = chance.name() + // const age = chance.integer() + // const networth = chance.floating() + // const res = db.execute( + // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + // [id, name, age, networth] + // ) + // expect(res.rowsAffected).to.equal(1) + // expect(res.insertId).to.equal(1) + // expect(res.metadata).to.eql([]) + // expect(res.rows?._array).to.eql([]) + // expect(res.rows?.length).to.equal(0) + // expect(res.rows?.item).to.be.a('function') + // }) + // it('Query without params', async () => { + // const id = chance.integer() + // const name = chance.name() + // const age = chance.integer() + // const networth = chance.floating() + // db.execute( + // 'INSERT INTO User (id, name, age, networth) VALUES(?, ?, ?, ?)', + // [id, name, age, networth] + // ) + // const res = db.execute('SELECT * FROM User') + // expect(res.rowsAffected).to.equal(1) + // expect(res.insertId).to.equal(1) + // expect(res.rows?._array).to.eql([ + // { + // id, + // name, + // age, + // networth, + // }, + // ]) + // }) + // it('Query with params', async () => { + // const id = chance.integer() + // const name = chance.name() + // const age = chance.integer() + // const networth = chance.floating() + // db.execute( + // 'INSERT INTO User (id, name, age, networth) VALUES(?, ?, ?, ?)', + // [id, name, age, networth] + // ) + // const res = db.execute('SELECT * FROM User WHERE id = ?', [id]) + // expect(res.rowsAffected).to.equal(1) + // expect(res.insertId).to.equal(1) + // expect(res.rows?._array).to.eql([ + // { + // id, + // name, + // age, + // networth, + // }, + // ]) + // }) + // it('Failed insert', async () => { + // const id = chance.string() + // const name = chance.name() + // const age = chance.string() + // const networth = chance.string() + // // expect( + // try { + // db.execute( + // 'INSERT INTO User (id, name, age, networth) VALUES(?, ?, ?, ?)', + // [id, name, age, networth] + // ) + // } catch (e: any) { + // expect(typeof e).to.equal('object') + // expect(e.message).to.include( + // `cannot store TEXT value in INT column User.id` + // ) + // } + // }) + // it('Transaction, auto commit', async () => { + // const id = chance.integer() + // const name = chance.name() + // const age = chance.integer() + // const networth = chance.floating() + // await db.transaction((tx) => { + // const res = tx.execute( + // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + // [id, name, age, networth] + // ) + // expect(res.rowsAffected).to.equal(1) + // expect(res.insertId).to.equal(1) + // expect(res.metadata).to.eql([]) + // expect(res.rows?._array).to.eql([]) + // expect(res.rows?.length).to.equal(0) + // expect(res.rows?.item).to.be.a('function') + // }) + // const res = db.execute('SELECT * FROM User') + // expect(res.rows?._array).to.eql([ + // { + // id, + // name, + // age, + // networth, + // }, + // ]) + // }) + // it('Transaction, manual commit', async () => { + // const id = chance.integer() + // const name = chance.name() + // const age = chance.integer() + // const networth = chance.floating() + // await db.transaction((tx) => { + // const res = tx.execute( + // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + // [id, name, age, networth] + // ) + // expect(res.rowsAffected).to.equal(1) + // expect(res.insertId).to.equal(1) + // expect(res.metadata).to.eql([]) + // expect(res.rows?._array).to.eql([]) + // expect(res.rows?.length).to.equal(0) + // expect(res.rows?.item).to.be.a('function') + // tx.commit() + // }) + // const res = db.execute('SELECT * FROM User') + // expect(res.rows?._array).to.eql([ + // { + // id, + // name, + // age, + // networth, + // }, + // ]) + // }) + // it('Transaction, executed in order', async () => { + // // ARRANGE: Setup for multiple transactions + // const iterations = 10 + // const actual: unknown[] = [] + // // ARRANGE: Generate expected data + // const id = chance.integer() + // const name = chance.name() + // const age = chance.integer() + // // ACT: Start multiple transactions to upsert and select the same record + // const promises = [] + // for (let iteration = 1; iteration <= iterations; iteration++) { + // const promised = db.transaction((tx) => { + // // ACT: Upsert statement to create record / increment the value + // tx.execute( + // ` + // INSERT OR REPLACE INTO [User] ([id], [name], [age], [networth]) + // SELECT ?, ?, ?, + // IFNULL(( + // SELECT [networth] + 1000 + // FROM [User] + // WHERE [id] = ? + // ), 0) + // `, + // [id, name, age, id] + // ) + // // ACT: Select statement to get incremented value and store it for checking later + // const results = tx.execute( + // 'SELECT [networth] FROM [User] WHERE [id] = ?', + // [id] + // ) + // actual.push(results.rows?._array[0].networth) + // }) + // promises.push(promised) + // } + // // ACT: Wait for all transactions to complete + // await Promise.all(promises) + // // ASSERT: That the expected values where returned + // const expected = Array(iterations) + // .fill(0) + // .map((_, index) => index * 1000) + // expect(actual).to.eql( + // expected, + // 'Each transaction should read a different value' + // ) + // }) + // it('Transaction, cannot execute after commit', async () => { + // const id = chance.integer() + // const name = chance.name() + // const age = chance.integer() + // const networth = chance.floating() + // await db.transaction((tx) => { + // const res = tx.execute( + // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + // [id, name, age, networth] + // ) + // expect(res.rowsAffected).to.equal(1) + // expect(res.insertId).to.equal(1) + // expect(res.metadata).to.eql([]) + // expect(res.rows?._array).to.eql([]) + // expect(res.rows?.length).to.equal(0) + // expect(res.rows?.item).to.be.a('function') + // tx.commit() + // try { + // tx.execute('SELECT * FROM "User"') + // } catch (e) { + // expect(!!e).to.equal(true) + // } + // }) + // const res = db.execute('SELECT * FROM User') + // expect(res.rows?._array).to.eql([ + // { + // id, + // name, + // age, + // networth, + // }, + // ]) + // }) + // it('Incorrect transaction, manual rollback', async () => { + // const id = chance.string() + // const name = chance.name() + // const age = chance.integer() + // const networth = chance.floating() + // await db.transaction((tx) => { + // try { + // tx.execute( + // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + // [id, name, age, networth] + // ) + // } catch (e) { + // tx.rollback() + // } + // }) + // const res = db.execute('SELECT * FROM User') + // expect(res.rows?._array).to.eql([]) + // }) + // it('Correctly throws', () => { + // const id = chance.string() + // const name = chance.name() + // const age = chance.integer() + // const networth = chance.floating() + // try { + // db.execute( + // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + // [id, name, age, networth] + // ) + // } catch (e: any) { + // expect(!!e).to.equal(true) + // } + // }) + // it('Rollback', async () => { + // const id = chance.integer() + // const name = chance.name() + // const age = chance.integer() + // const networth = chance.floating() + // await db.transaction((tx) => { + // tx.execute( + // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + // [id, name, age, networth] + // ) + // tx.rollback() + // const res = db.execute('SELECT * FROM User') + // expect(res.rows?._array).to.eql([]) + // }) + // }) + // it('Transaction, rejects on callback error', async () => { + // const promised = db.transaction((tx) => { + // throw new Error('Error from callback') + // }) + // // ASSERT: should return a promise that eventually rejects + // expect(promised).to.have.property('then').that.is.a('function') + // try { + // await promised + // expect.fail('Should not resolve') + // } catch (e) { + // expect(e).to.be.a.instanceof(Error) + // expect((e as Error)?.message).to.equal('Error from callback') + // } + // }) + // it('Transaction, rejects on invalid query', async () => { + // const promised = db.transaction((tx) => { + // console.log('execute bad start') + // tx.execute('SELECT * FROM [tableThatDoesNotExist];') + // console.log('execute bad done') + // }) + // // ASSERT: should return a promise that eventually rejects + // expect(promised).to.have.property('then').that.is.a('function') + // try { + // await promised + // expect.fail('Should not resolve') + // } catch (e) { + // expect(e).to.be.a.instanceof(Error) + // expect((e as Error)?.message).to.include( + // 'no such table: tableThatDoesNotExist' + // ) + // } + // }) + // it('Transaction, handle async callback', async () => { + // let ranCallback = false + // const promised = db.transaction(async (tx) => { + // await new Promise((done) => { + // setTimeout(() => done(), 50) + // }) + // tx.execute('SELECT * FROM [User];') + // ranCallback = true + // }) + // // ASSERT: should return a promise that eventually rejects + // expect(promised).to.have.property('then').that.is.a('function') + // await promised + // expect(ranCallback).to.equal(true, 'Should handle async callback') + // }) + // it('Async transaction, auto commit', async () => { + // const id = chance.integer() + // const name = chance.name() + // const age = chance.integer() + // const networth = chance.floating() + // await db.transaction(async (tx) => { + // const res = await tx.executeAsync( + // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + // [id, name, age, networth] + // ) + // expect(res.rowsAffected).to.equal(1) + // expect(res.insertId).to.equal(1) + // expect(res.metadata).to.eql([]) + // expect(res.rows?._array).to.eql([]) + // expect(res.rows?.length).to.equal(0) + // expect(res.rows?.item).to.be.a('function') + // }) + // const res = db.execute('SELECT * FROM User') + // expect(res.rows?._array).to.eql([ + // { + // id, + // name, + // age, + // networth, + // }, + // ]) + // }) + // it('Async transaction, auto rollback', async () => { + // const id = chance.string() // Causes error because it should be an integer + // const name = chance.name() + // const age = chance.integer() + // const networth = chance.floating() + // try { + // await db.transaction(async (tx) => { + // await tx.executeAsync( + // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + // [id, name, age, networth] + // ) + // }) + // } catch (error) { + // expect(error).to.be.instanceOf(Error) + // expect((error as Error).message) + // .to.include('SQL execution error') + // .and.to.include('cannot store TEXT value in INT column User.id') + // const res = db.execute('SELECT * FROM User') + // expect(res.rows?._array).to.eql([]) + // } + // }) + // it('Async transaction, manual commit', async () => { + // const id = chance.integer() + // const name = chance.name() + // const age = chance.integer() + // const networth = chance.floating() + // await db.transaction(async (tx) => { + // await tx.executeAsync( + // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + // [id, name, age, networth] + // ) + // tx.commit() + // }) + // const res = db.execute('SELECT * FROM User') + // expect(res.rows?._array).to.eql([ + // { + // id, + // name, + // age, + // networth, + // }, + // ]) + // }) + // it('Async transaction, manual rollback', async () => { + // const id = chance.integer() + // const name = chance.name() + // const age = chance.integer() + // const networth = chance.floating() + // await db.transaction(async (tx) => { + // await tx.executeAsync( + // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + // [id, name, age, networth] + // ) + // tx.rollback() + // }) + // const res = db.execute('SELECT * FROM User') + // expect(res.rows?._array).to.eql([]) + // }) + // it('Async transaction, executed in order', async () => { + // // ARRANGE: Setup for multiple transactions + // const iterations = 10 + // const actual: unknown[] = [] + // // ARRANGE: Generate expected data + // const id = chance.integer() + // const name = chance.name() + // const age = chance.integer() + // // ACT: Start multiple async transactions to upsert and select the same record + // const promises = [] + // for (let iteration = 1; iteration <= iterations; iteration++) { + // const promised = db.transaction(async (tx) => { + // // ACT: Upsert statement to create record / increment the value + // await tx.executeAsync( + // ` + // INSERT OR REPLACE INTO [User] ([id], [name], [age], [networth]) + // SELECT ?, ?, ?, + // IFNULL(( + // SELECT [networth] + 1000 + // FROM [User] + // WHERE [id] = ? + // ), 0) + // `, + // [id, name, age, id] + // ) + // // ACT: Select statement to get incremented value and store it for checking later + // const results = await tx.executeAsync( + // 'SELECT [networth] FROM [User] WHERE [id] = ?', + // [id] + // ) + // actual.push(results.rows?._array[0].networth) + // }) + // promises.push(promised) + // } + // // ACT: Wait for all transactions to complete + // await Promise.all(promises) + // // ASSERT: That the expected values where returned + // const expected = Array(iterations) + // .fill(0) + // .map((_, index) => index * 1000) + // expect(actual).to.eql( + // expected, + // 'Each transaction should read a different value' + // ) + // }) + // it('Async transaction, rejects on callback error', async () => { + // const promised = db.transaction(async (tx) => { + // throw new Error('Error from callback') + // }) + // // ASSERT: should return a promise that eventually rejects + // expect(promised).to.have.property('then').that.is.a('function') + // try { + // await promised + // expect.fail('Should not resolve') + // } catch (e) { + // expect(e).to.be.a.instanceof(Error) + // expect((e as Error)?.message).to.equal('Error from callback') + // } + // }) + // it('Async transaction, rejects on invalid query', async () => { + // const promised = db.transaction(async (tx) => { + // await tx.executeAsync('SELECT * FROM [tableThatDoesNotExist];') + // }) + // // ASSERT: should return a promise that eventually rejects + // expect(promised).to.have.property('then').that.is.a('function') + // try { + // await promised + // expect.fail('Should not resolve') + // } catch (e) { + // expect(e).to.be.a.instanceof(Error) + // expect((e as Error)?.message).to.include( + // 'no such table: tableThatDoesNotExist' + // ) + // } + // }) + // it('Batch execute', () => { + // const id1 = chance.integer() + // const name1 = chance.name() + // const age1 = chance.integer() + // const networth1 = chance.floating() + // const id2 = chance.integer() + // const name2 = chance.name() + // const age2 = chance.integer() + // const networth2 = chance.floating() + // const commands: BatchQueryCommand[] = [ + // [ + // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + // [id1, name1, age1, networth1], + // ], + // [ + // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + // [id2, name2, age2, networth2], + // ], + // ] + // db.executeBatch(commands) + // const res = db.execute('SELECT * FROM User') + // expect(res.rows?._array).to.eql([ + // { id: id1, name: name1, age: age1, networth: networth1 }, + // { + // id: id2, + // name: name2, + // age: age2, + // networth: networth2, + // }, + // ]) + // }) + // it('Async batch execute', async () => { + // const id1 = chance.integer() + // const name1 = chance.name() + // const age1 = chance.integer() + // const networth1 = chance.floating() + // const id2 = chance.integer() + // const name2 = chance.name() + // const age2 = chance.integer() + // const networth2 = chance.floating() + // const commands: BatchQueryCommand[] = [ + // [ + // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + // [id1, name1, age1, networth1], + // ], + // [ + // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + // [id2, name2, age2, networth2], + // ], + // ] + // await db.executeBatchAsync(commands) + // const res = db.execute('SELECT * FROM User') + // expect(res.rows?._array).to.eql([ + // { id: id1, name: name1, age: age1, networth: networth1 }, + // { + // id: id2, + // name: name2, + // age: age2, + // networth: networth2, + // }, + // ]) + // }) + // }) } diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake index 80a9ad72..7796876f 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake @@ -27,6 +27,8 @@ target_sources( # Shared Nitrogen C++ sources ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp ../nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp + ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp + ../nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp # Android-specific Nitrogen C++ sources ) From ff55b4b9187ac1f8bb1dd78378de8af376a28dfa Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Tue, 10 Sep 2024 16:47:15 +0200 Subject: [PATCH 065/156] update specs --- .../android/RNQuickSQLite+autolinking.cmake | 2 -- .../ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 20 ++++++++++++++----- .../c++/HybridSelectQueryResultSpec.hpp | 6 +++--- src/specs/SelectQueryResult.nitro.ts | 7 +------ 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake index 7796876f..80a9ad72 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake @@ -27,8 +27,6 @@ target_sources( # Shared Nitrogen C++ sources ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp ../nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp - ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp - ../nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp # Android-specific Nitrogen C++ sources ) diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index ec5c91e0..d8ab1da6 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -396,15 +396,15 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { } /** - * Specialized version of `std::unordered_map>>>`. + * Specialized version of `std::unordered_map>>`. */ - using std__unordered_map_std__string__std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____ = std::unordered_map>>>; - inline std::unordered_map>>> create_std__unordered_map_std__string__std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____(size_t size) { - std::unordered_map>>> map; + using std__unordered_map_std__string__std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___ = std::unordered_map>>; + inline std::unordered_map>> create_std__unordered_map_std__string__std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___(size_t size) { + std::unordered_map>> map; map.reserve(size); return map; } - inline std::vector get_std__unordered_map_std__string__std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer_____keys(const std__unordered_map_std__string__std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____& map) { + inline std::vector get_std__unordered_map_std__string__std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____keys(const std__unordered_map_std__string__std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___& map) { std::vector keys; keys.reserve(map.size()); for (const auto& entry : map) { @@ -413,6 +413,16 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { return keys; } + /** + * Specialized version of `std::vector>>>`. + */ + using std__vector_std__unordered_map_std__string__std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____ = std::vector>>>; + inline std::vector>>> create_std__vector_std__unordered_map_std__string__std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____(size_t size) { + std::vector>>> vector; + vector.reserve(size); + return vector; + } + /** * Specialized version of `std::vector`. */ diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp index 979e53ab..fb3edeb6 100644 --- a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp @@ -19,9 +19,9 @@ namespace NitroModules { class ArrayBuffer; } // Forward declaration of `ColumnMetadata` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } +#include #include #include -#include #include #include #include "ColumnMetadata.hpp" @@ -50,8 +50,8 @@ namespace margelo::nitro::rnquicksqlite { public: // Properties - virtual std::unordered_map>>> getResults() = 0; - virtual void setResults(const std::unordered_map>>>& results) = 0; + virtual std::vector>>> getResults() = 0; + virtual void setResults(const std::vector>>>& results) = 0; virtual std::vector getMetadata() = 0; virtual void setMetadata(const std::vector& metadata) = 0; diff --git a/src/specs/SelectQueryResult.nitro.ts b/src/specs/SelectQueryResult.nitro.ts index c2cf15c3..79242a21 100644 --- a/src/specs/SelectQueryResult.nitro.ts +++ b/src/specs/SelectQueryResult.nitro.ts @@ -3,16 +3,11 @@ import { SQLiteValue } from '../types' export interface SelectQueryResult extends HybridObject<{ ios: 'c++'; android: 'c++' }> { - results?: Record + results: Record[] /** * Query metadata, avaliable only for select query results */ metadata: ColumnMetadata[] - - getString(): string - getNumber(): number - getBoolean(): boolean - getArrayBuffer(): ArrayBuffer } type ColumnType = From 7fe3b5afef9723e8cadff33185673b6e46b1d7e2 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Tue, 10 Sep 2024 16:59:06 +0200 Subject: [PATCH 066/156] restructure --- cpp/OnLoad.cpp | 8 ++-- cpp/{specs => }/Types.hpp | 3 +- ...SQLiteObject.cpp => HybridQuickSQLite.cpp} | 30 ++++++------- ...SQLiteObject.hpp => HybridQuickSQLite.hpp} | 2 +- cpp/specs/HybridSelectQueryResult.cpp | 42 +++++++++++++++++++ cpp/specs/HybridSelectQueryResult.hpp | 35 ++++++++++++++++ cpp/specs/HybridSelectQueryResultObject.cpp | 34 --------------- cpp/specs/HybridSelectQueryResultObject.hpp | 32 -------------- 8 files changed, 99 insertions(+), 87 deletions(-) rename cpp/{specs => }/Types.hpp (88%) rename cpp/specs/{HybridQuickSQLiteObject.cpp => HybridQuickSQLite.cpp} (72%) rename cpp/specs/{HybridQuickSQLiteObject.hpp => HybridQuickSQLite.hpp} (96%) create mode 100644 cpp/specs/HybridSelectQueryResult.cpp create mode 100644 cpp/specs/HybridSelectQueryResult.hpp delete mode 100644 cpp/specs/HybridSelectQueryResultObject.cpp delete mode 100644 cpp/specs/HybridSelectQueryResultObject.hpp diff --git a/cpp/OnLoad.cpp b/cpp/OnLoad.cpp index f3a83673..3d5f90fa 100644 --- a/cpp/OnLoad.cpp +++ b/cpp/OnLoad.cpp @@ -1,6 +1,6 @@ #include "OnLoad.hpp" -#include "HybridQuickSQLiteObject.hpp" -#include "HybridSelectQueryResultObject.hpp" +#include "HybridQuickSQLite.hpp" +#include "HybridSelectQueryResult.hpp" using namespace margelo::nitro; using namespace margelo::rnquicksqlite; @@ -12,10 +12,10 @@ void clearState() { // Call this at app startup to register the HybridObjects void registerHybridObjectConstructors() { HybridObjectRegistry::registerHybridObjectConstructor("QuickSQLite", []() -> std::shared_ptr { - return std::make_shared(); + return std::make_shared(); }); // HybridObjectRegistry::registerHybridObjectConstructor("SelectQueryResult", []() -> std::shared_ptr { -// return std::make_shared(); +// return std::make_shared(); // }); } diff --git a/cpp/specs/Types.hpp b/cpp/Types.hpp similarity index 88% rename from cpp/specs/Types.hpp rename to cpp/Types.hpp index 0b33a85d..1335cbb1 100644 --- a/cpp/specs/Types.hpp +++ b/cpp/Types.hpp @@ -38,7 +38,8 @@ struct SequelBatchOperationResult int commands; }; -using SQLiteValue = std::variant, std::monostate>; +// using SQLiteValue = std::variant, std::monostate>; +using SQLiteValue = std::variant>; // constexpr function that maps SQLiteColumnType to string literals constexpr ColumnType mapSQLiteTypeToColumnType(std::string type) { diff --git a/cpp/specs/HybridQuickSQLiteObject.cpp b/cpp/specs/HybridQuickSQLite.cpp similarity index 72% rename from cpp/specs/HybridQuickSQLiteObject.cpp rename to cpp/specs/HybridQuickSQLite.cpp index e7438a97..b7064672 100644 --- a/cpp/specs/HybridQuickSQLiteObject.cpp +++ b/cpp/specs/HybridQuickSQLite.cpp @@ -2,8 +2,8 @@ #include #include #include -#include "HybridQuickSQLiteObject.hpp" -#include "HybridSelectQueryResultObject.hpp" +#include "HybridQuickSQLite.hpp" +#include "HybridSelectQueryResult.hpp" #include "sqliteBridge.h" #include "logs.h" #include "ThreadPool.h" @@ -16,7 +16,7 @@ namespace margelo::rnquicksqlite { -void HybridQuickSQLiteObject::open(const std::string& dbName, const std::optional& location) { +void HybridQuickSQLite::open(const std::string& dbName, const std::optional& location) { std::string tempDocPath = std::string(docPathStr); if (location) { tempDocPath = tempDocPath + "/" + *location; @@ -30,7 +30,7 @@ void HybridQuickSQLiteObject::open(const std::string& dbName, const std::optiona } } -void HybridQuickSQLiteObject::close(const std::string& dbName) { +void HybridQuickSQLite::close(const std::string& dbName) { SQLiteOPResult result = sqliteCloseDb(dbName); if (result.type == SQLiteError) @@ -39,7 +39,7 @@ void HybridQuickSQLiteObject::close(const std::string& dbName) { } }; -void HybridQuickSQLiteObject::drop(const std::string& dbName, const std::optional& location) { +void HybridQuickSQLite::drop(const std::string& dbName, const std::optional& location) { std::string tempDocPath = std::string(docPathStr); if (location) { @@ -55,7 +55,7 @@ void HybridQuickSQLiteObject::drop(const std::string& dbName, const std::optiona } }; -void HybridQuickSQLiteObject::attach(const std::string& mainDbName, const std::string& dbNameToAttach, const std::string& alias, const std::optional& location) { +void HybridQuickSQLite::attach(const std::string& mainDbName, const std::string& dbNameToAttach, const std::string& alias, const std::optional& location) { std::string tempDocPath = std::string(docPathStr); if (location) { @@ -70,7 +70,7 @@ void HybridQuickSQLiteObject::attach(const std::string& mainDbName, const std::s } }; -void HybridQuickSQLiteObject::detach(const std::string& mainDbName, const std::string& alias) { +void HybridQuickSQLite::detach(const std::string& mainDbName, const std::string& alias) { SQLiteOPResult result = sqliteDetachDb(mainDbName, alias); if (result.type == SQLiteError) @@ -79,13 +79,13 @@ void HybridQuickSQLiteObject::detach(const std::string& mainDbName, const std::s } }; -std::future HybridQuickSQLiteObject::transaction(const std::string& dbName, const std::function>(const Transaction& /* tx */)>& fn) { +std::future HybridQuickSQLite::transaction(const std::string& dbName, const std::function>(const Transaction& /* tx */)>& fn) { return std::async(std::launch::async, []() { }); }; -QueryResult HybridQuickSQLiteObject::execute(const std::string& dbName, const std::string& query, const std::optional>& params) { +QueryResult HybridQuickSQLite::execute(const std::string& dbName, const std::string& query, const std::optional>& params) { auto results = std::make_shared>>(); auto metadata = std::make_shared>>(std::nullopt); @@ -98,7 +98,7 @@ QueryResult HybridQuickSQLiteObject::execute(const std::string& dbName, const st } if (metadata) { - const auto selectQueryResult = std::make_shared(*results, *(*metadata)); + const auto selectQueryResult = std::make_shared(*results, *(*metadata)); return QueryResult(QueryType::SELECT, status.insertId, status.rowsAffected, selectQueryResult); } @@ -108,7 +108,7 @@ QueryResult HybridQuickSQLiteObject::execute(const std::string& dbName, const st } }; -std::future HybridQuickSQLiteObject::executeAsync(const std::string& dbName, const std::string& query, const std::optional>& params) { +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(); @@ -126,7 +126,7 @@ std::future HybridQuickSQLiteObject::executeAsync(const std::string return future; }; -BatchQueryResult HybridQuickSQLiteObject::executeBatch(const std::string& dbName, const std::vector& batchParams) { +BatchQueryResult HybridQuickSQLite::executeBatch(const std::string& dbName, const std::vector& batchParams) { const auto commands = batchParamsToCommands(batchParams); auto batchResult = sqliteExecuteBatch(dbName, commands); @@ -140,7 +140,7 @@ BatchQueryResult HybridQuickSQLiteObject::executeBatch(const std::string& dbName } }; -std::future HybridQuickSQLiteObject::executeBatchAsync(const std::string& dbName, const std::vector& batchParams) { +std::future HybridQuickSQLite::executeBatchAsync(const std::string& dbName, const std::vector& batchParams) { auto promise = std::make_shared>(); auto future = promise->get_future(); @@ -158,7 +158,7 @@ std::future HybridQuickSQLiteObject::executeBatchAsync(const s return future; }; -FileLoadResult HybridQuickSQLiteObject::loadFile(const std::string& dbName, const std::string& location) { +FileLoadResult HybridQuickSQLite::loadFile(const std::string& dbName, const std::string& location) { const auto importResult = importSQLFile(dbName, location); if (importResult.type == SQLiteOk) { @@ -171,7 +171,7 @@ FileLoadResult HybridQuickSQLiteObject::loadFile(const std::string& dbName, cons } }; -std::future HybridQuickSQLiteObject::loadFileAsync(const std::string& dbName, const std::string& location) { +std::future HybridQuickSQLite::loadFileAsync(const std::string& dbName, const std::string& location) { auto promise = std::make_shared>(); auto future = promise->get_future(); diff --git a/cpp/specs/HybridQuickSQLiteObject.hpp b/cpp/specs/HybridQuickSQLite.hpp similarity index 96% rename from cpp/specs/HybridQuickSQLiteObject.hpp rename to cpp/specs/HybridQuickSQLite.hpp index ec7fe4a7..24fcadd3 100644 --- a/cpp/specs/HybridQuickSQLiteObject.hpp +++ b/cpp/specs/HybridQuickSQLite.hpp @@ -6,7 +6,7 @@ using namespace margelo::nitro::rnquicksqlite; namespace margelo::rnquicksqlite { -class HybridQuickSQLiteObject: public HybridQuickSQLiteSpec { +class HybridQuickSQLite: public HybridQuickSQLiteSpec { public: // Methods void open(const std::string& dbName, const std::optional& location) override; diff --git a/cpp/specs/HybridSelectQueryResult.cpp b/cpp/specs/HybridSelectQueryResult.cpp new file mode 100644 index 00000000..817870eb --- /dev/null +++ b/cpp/specs/HybridSelectQueryResult.cpp @@ -0,0 +1,42 @@ +#include "HybridSelectQueryResult.hpp" + +using namespace margelo::nitro::rnquicksqlite; + +namespace margelo::rnquicksqlite { + +HybridSelectQueryResult::HybridSelectQueryResult(const std::vector>& results, const std::vector& metadata) + : HybridSelectQueryResultSpec(), _results(results), _metadata(metadata) {} + +std::vector> HybridSelectQueryResult::getResults() { + return this->_results; +}; + +void HybridSelectQueryResult::setResults(const std::vector>& results) { + this->_results = results; +}; + +std::vector HybridSelectQueryResult::getMetadata() { + return this->_metadata; +} + +void HybridSelectQueryResult::setMetadata(const std::vector& metadata) { + this->_metadata = metadata; +} + +//std::string HybridSelectQueryResult::getString() { +// return "TODO"; +//} +// +//double HybridSelectQueryResult::getNumber() { +// return -1.0; +//} +// +//bool HybridSelectQueryResult::getBoolean() { +// return false; +//} + +std::shared_ptr HybridSelectQueryResult::getArrayBuffer() { + return nullptr; +} + +} diff --git a/cpp/specs/HybridSelectQueryResult.hpp b/cpp/specs/HybridSelectQueryResult.hpp new file mode 100644 index 00000000..a478937e --- /dev/null +++ b/cpp/specs/HybridSelectQueryResult.hpp @@ -0,0 +1,35 @@ +#pragma once + +#include +#include "HybridSelectQueryResultSpec.hpp" +#include "Types.hpp" + +using namespace margelo::nitro::rnquicksqlite; + +namespace margelo::rnquicksqlite { + +class HybridSelectQueryResult: public HybridSelectQueryResultSpec { +public: + HybridSelectQueryResult(const std::vector>& results, const std::optional>& metadata); + +public: + // Properties + std::vector> getResults() override; + void setResults(const std::vector>& results) override; + std::vector getMetadata() override; + void setMetadata(const std::vector& metadata) override; + +public: + // Methods +// std::string getString() override; +// double getNumber() override; +// bool getBoolean() override; +// std::shared_ptr getArrayBuffer() override; + +private: + std::vector _metadata; + std::vector> _results: + std::vector> _results; +}; + +} diff --git a/cpp/specs/HybridSelectQueryResultObject.cpp b/cpp/specs/HybridSelectQueryResultObject.cpp deleted file mode 100644 index b923bb1c..00000000 --- a/cpp/specs/HybridSelectQueryResultObject.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include "HybridSelectQueryResultObject.hpp" - -using namespace margelo::nitro::rnquicksqlite; - -namespace margelo::rnquicksqlite { - -HybridSelectQueryResultObject::HybridSelectQueryResultObject(const std::vector>& results, const std::optional>& metadata) - : HybridSelectQueryResultSpec(), _results(results), _metadata(metadata) {} - -std::optional> HybridSelectQueryResultObject::getMetadata() { - return this->_metadata; -} - -void HybridSelectQueryResultObject::setMetadata(const std::optional>& metadata) { - this->_metadata = metadata; -} - -std::string HybridSelectQueryResultObject::getString() { - return "TODO"; -} - -double HybridSelectQueryResultObject::getNumber() { - return -1.0; -} - -bool HybridSelectQueryResultObject::getBoolean() { - return false; -} - -std::shared_ptr HybridSelectQueryResultObject::getArrayBuffer() { - return nullptr; -} - -} diff --git a/cpp/specs/HybridSelectQueryResultObject.hpp b/cpp/specs/HybridSelectQueryResultObject.hpp deleted file mode 100644 index 6f464e55..00000000 --- a/cpp/specs/HybridSelectQueryResultObject.hpp +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include -#include "HybridSelectQueryResultSpec.hpp" -#include "Types.hpp" - -using namespace margelo::nitro::rnquicksqlite; - -namespace margelo::rnquicksqlite { - -class HybridSelectQueryResultObject: public HybridSelectQueryResultSpec { -public: - HybridSelectQueryResultObject(const std::vector>& results, const std::optional>& metadata); - -public: - // Properties - std::optional> getMetadata() override; - void setMetadata(const std::optional>& metadata) override; - -public: - // Methods - std::string getString() override; - double getNumber() override; - bool getBoolean() override; - std::shared_ptr getArrayBuffer() override; - -private: - std::optional> _metadata; - std::vector> _results; -}; - -} From 3a563d1baef45fb3fb50e8518941ea8eac8201b9 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Tue, 10 Sep 2024 17:43:40 +0200 Subject: [PATCH 067/156] update spec --- .../ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 168 +----------------- .../ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp | 4 - .../shared/c++/HybridQuickSQLiteSpec.cpp | 1 - .../shared/c++/HybridQuickSQLiteSpec.hpp | 7 +- nitrogen/generated/shared/c++/Transaction.hpp | 90 ---------- src/index.ts | 8 +- src/specs/QuickSQLite.nitro.ts | 5 - 7 files changed, 13 insertions(+), 270 deletions(-) delete mode 100644 nitrogen/generated/shared/c++/Transaction.hpp diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index d8ab1da6..0c1b4d24 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -31,8 +31,6 @@ namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } namespace margelo::nitro::rnquicksqlite { struct QueryResult; } // Forward declaration of `QueryType` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { enum class QueryType; } -// Forward declaration of `Transaction` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct Transaction; } // Include C++ defined types #if __has_include("BatchQueryCommand.hpp") @@ -62,9 +60,6 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction; } #if __has_include("QueryType.hpp") #include "QueryType.hpp" #endif -#if __has_include("Transaction.hpp") - #include "Transaction.hpp" -#endif #if __has_include() #include #endif @@ -74,9 +69,6 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction; } #if __has_include() #include #endif -#if __has_include() - #include -#endif #if __has_include() #include #endif @@ -113,14 +105,6 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { return std::optional(value); } - /** - * Specialized version of `PromiseHolder`. - */ - using PromiseHolder_void_ = PromiseHolder; - inline PromiseHolder create_PromiseHolder_void_() { - return PromiseHolder(); - } - /** * Specialized version of `std::optional`. */ @@ -137,44 +121,6 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { return std::optional>(value); } - /** - * Specialized version of `std::function()>`. - */ - using Func_std__future_QueryResult_ = std::function()>; - /** - * Wrapper class for a `std::function()>`, this can be used from Swift. - */ - class Func_std__future_QueryResult__Wrapper { - public: - explicit Func_std__future_QueryResult__Wrapper(const std::function()>& func): function(func) {} - explicit Func_std__future_QueryResult__Wrapper(std::function()>&& func): function(std::move(func)) {} - - PromiseHolder call() const { - auto result = function(); - return []() -> PromiseHolder { throw std::runtime_error("Promise<..> cannot be converted to Swift yet!"); }(); - } - - std::function()> function; - }; - inline Func_std__future_QueryResult_ create_Func_std__future_QueryResult_(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return Func_std__future_QueryResult_([sharedClosureHolder, call]() -> std::future { - auto result = call(sharedClosureHolder.get()); - return result.getFuture(); - }); - } - inline std::shared_ptr share_Func_std__future_QueryResult_(const Func_std__future_QueryResult_& value) { - return std::make_shared(value); - } - - /** - * Specialized version of `PromiseHolder`. - */ - using PromiseHolder_QueryResult_ = PromiseHolder; - inline PromiseHolder create_PromiseHolder_QueryResult_() { - return PromiseHolder(); - } - /** * Specialized version of `std::variant>`. */ @@ -220,112 +166,6 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { return vector; } - /** - * Specialized version of `std::function(const std::string&, const std::vector>>&)>`. - */ - using Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___ = std::function(const std::string& /* query */, const std::vector>>& /* params */)>; - /** - * Wrapper class for a `std::function(const std::string& / * query * /, const std::vector>>& / * params * /)>`, this can be used from Swift. - */ - class Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____Wrapper { - public: - explicit Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____Wrapper(const std::function(const std::string& /* query */, const std::vector>>& /* params */)>& func): function(func) {} - explicit Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____Wrapper(std::function(const std::string& /* query */, const std::vector>>& /* params */)>&& func): function(std::move(func)) {} - - PromiseHolder call(std::string query, std::vector>> params) const { - auto result = function(query, params); - return []() -> PromiseHolder { throw std::runtime_error("Promise<..> cannot be converted to Swift yet!"); }(); - } - - std::function(const std::string& /* query */, const std::vector>>& /* params */)> function; - }; - inline Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___ create_Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___(void* closureHolder, PromiseHolder(*call)(void* /* closureHolder */, std::string, std::vector>>), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___([sharedClosureHolder, call](const std::string& query, const std::vector>>& params) -> std::future { - auto result = call(sharedClosureHolder.get(), query, params); - return result.getFuture(); - }); - } - inline std::shared_ptr share_Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___(const Func_std__future_QueryResult__std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___& value) { - return std::make_shared(value); - } - - /** - * Specialized version of `std::function>(const std::string&, const std::vector>>&)>`. - */ - using Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___ = std::function>(const std::string& /* query */, const std::vector>>& /* params */)>; - /** - * Wrapper class for a `std::function>(const std::string& / * query * /, const std::vector>>& / * params * /)>`, this can be used from Swift. - */ - class Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____Wrapper { - public: - explicit Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____Wrapper(const std::function>(const std::string& /* query */, const std::vector>>& /* params */)>& func): function(func) {} - explicit Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer____Wrapper(std::function>(const std::string& /* query */, const std::vector>>& /* params */)>&& func): function(std::move(func)) {} - - PromiseHolder> call(std::string query, std::vector>> params) const { - auto result = function(query, params); - return []() -> PromiseHolder> { throw std::runtime_error("Promise<..> cannot be converted to Swift yet!"); }(); - } - - std::function>(const std::string& /* query */, const std::vector>>& /* params */)> function; - }; - inline Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___ create_Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, std::string, std::vector>>), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___([sharedClosureHolder, call](const std::string& query, const std::vector>>& params) -> std::future> { - auto result = call(sharedClosureHolder.get(), query, params); - return result.getFuture(); - }); - } - inline std::shared_ptr share_Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___(const Func_std__future_std__future_QueryResult___std__string_std__vector_std__variant_std__string__double__int64_t__bool__std__shared_ptr_ArrayBuffer___& value) { - return std::make_shared(value); - } - - /** - * Specialized version of `PromiseHolder>`. - */ - using PromiseHolder_std__future_QueryResult__ = PromiseHolder>; - inline PromiseHolder> create_PromiseHolder_std__future_QueryResult__() { - return PromiseHolder>(); - } - - /** - * Specialized version of `std::function>(const Transaction&)>`. - */ - using Func_std__future_std__future_void___Transaction = std::function>(const Transaction& /* tx */)>; - /** - * Wrapper class for a `std::function>(const Transaction& / * tx * /)>`, this can be used from Swift. - */ - class Func_std__future_std__future_void___Transaction_Wrapper { - public: - explicit Func_std__future_std__future_void___Transaction_Wrapper(const std::function>(const Transaction& /* tx */)>& func): function(func) {} - explicit Func_std__future_std__future_void___Transaction_Wrapper(std::function>(const Transaction& /* tx */)>&& func): function(std::move(func)) {} - - PromiseHolder> call(Transaction tx) const { - auto result = function(tx); - return []() -> PromiseHolder> { throw std::runtime_error("Promise<..> cannot be converted to Swift yet!"); }(); - } - - std::function>(const Transaction& /* tx */)> function; - }; - inline Func_std__future_std__future_void___Transaction create_Func_std__future_std__future_void___Transaction(void* closureHolder, PromiseHolder>(*call)(void* /* closureHolder */, Transaction), void(*destroy)(void*)) { - std::shared_ptr sharedClosureHolder(closureHolder, destroy); - return Func_std__future_std__future_void___Transaction([sharedClosureHolder, call](const Transaction& tx) -> std::future> { - auto result = call(sharedClosureHolder.get(), tx); - return result.getFuture(); - }); - } - inline std::shared_ptr share_Func_std__future_std__future_void___Transaction(const Func_std__future_std__future_void___Transaction& value) { - return std::make_shared(value); - } - - /** - * Specialized version of `PromiseHolder>`. - */ - using PromiseHolder_std__future_void__ = PromiseHolder>; - inline PromiseHolder> create_PromiseHolder_std__future_void__() { - return PromiseHolder>(); - } - /** * Specialized version of `std::optional>>>`. */ @@ -334,6 +174,14 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { return std::optional>>>(value); } + /** + * Specialized version of `PromiseHolder`. + */ + using PromiseHolder_QueryResult_ = PromiseHolder; + inline PromiseHolder create_PromiseHolder_QueryResult_() { + return PromiseHolder(); + } + /** * Specialized version of `std::vector>>>`. */ diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp index d3254984..51c5f0b3 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp @@ -27,8 +27,6 @@ namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } namespace margelo::nitro::rnquicksqlite { struct QueryResult; } // Forward declaration of `QueryType` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { enum class QueryType; } -// Forward declaration of `Transaction` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct Transaction; } // Include C++ defined types #include "BatchQueryCommand.hpp" @@ -39,9 +37,7 @@ namespace margelo::nitro::rnquicksqlite { struct Transaction; } #include "HybridSelectQueryResultSpec.hpp" #include "QueryResult.hpp" #include "QueryType.hpp" -#include "Transaction.hpp" #include -#include #include #include #include diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp index 04086be0..b8dfb56e 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp @@ -20,7 +20,6 @@ namespace margelo::nitro::rnquicksqlite { prototype.registerHybridMethod("drop", &HybridQuickSQLiteSpec::drop); prototype.registerHybridMethod("attach", &HybridQuickSQLiteSpec::attach); prototype.registerHybridMethod("detach", &HybridQuickSQLiteSpec::detach); - prototype.registerHybridMethod("transaction", &HybridQuickSQLiteSpec::transaction); prototype.registerHybridMethod("execute", &HybridQuickSQLiteSpec::execute); prototype.registerHybridMethod("executeAsync", &HybridQuickSQLiteSpec::executeAsync); prototype.registerHybridMethod("executeBatch", &HybridQuickSQLiteSpec::executeBatch); diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp index 7be24b02..a97baf22 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp @@ -14,8 +14,6 @@ #error NitroModules cannot be found! Are you sure you installed NitroModules properly? #endif -// Forward declaration of `Transaction` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct Transaction; } // Forward declaration of `QueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct QueryResult; } // Forward declaration of `ArrayBuffer` to properly resolve imports. @@ -29,13 +27,11 @@ namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } #include #include -#include -#include -#include "Transaction.hpp" #include "QueryResult.hpp" #include #include #include +#include #include "BatchQueryResult.hpp" #include "BatchQueryCommand.hpp" #include "FileLoadResult.hpp" @@ -73,7 +69,6 @@ namespace margelo::nitro::rnquicksqlite { virtual void drop(const std::string& dbName, const std::optional& location) = 0; virtual void attach(const std::string& mainDbName, const std::string& dbNameToAttach, const std::string& alias, const std::optional& location) = 0; virtual void detach(const std::string& mainDbName, const std::string& alias) = 0; - virtual std::future transaction(const std::string& dbName, const std::function>(const Transaction& /* tx */)>& fn) = 0; virtual QueryResult execute(const std::string& dbName, const std::string& query, const std::optional>>>& params) = 0; virtual std::future executeAsync(const std::string& dbName, const std::string& query, const std::optional>>>& params) = 0; virtual BatchQueryResult executeBatch(const std::string& dbName, const std::vector& commands) = 0; diff --git a/nitrogen/generated/shared/c++/Transaction.hpp b/nitrogen/generated/shared/c++/Transaction.hpp deleted file mode 100644 index e49e857c..00000000 --- a/nitrogen/generated/shared/c++/Transaction.hpp +++ /dev/null @@ -1,90 +0,0 @@ -/// -/// Transaction.hpp -/// Tue Sep 10 2024 -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - -// Forward declaration of `QueryResult` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct QueryResult; } -// Forward declaration of `ArrayBuffer` to properly resolve imports. -namespace NitroModules { class ArrayBuffer; } - -#include -#include -#include "QueryResult.hpp" -#include -#include -#include -#include - -namespace margelo::nitro::rnquicksqlite { - - /** - * A struct which can be represented as a JavaScript object (Transaction). - */ - struct Transaction { - public: - std::function()> commit SWIFT_PRIVATE; - std::function()> rollback SWIFT_PRIVATE; - std::function(const std::string& /* query */, const std::vector>>& /* params */)> execute SWIFT_PRIVATE; - std::function>(const std::string& /* query */, const std::vector>>& /* params */)> executeAsync SWIFT_PRIVATE; - - public: - explicit Transaction(std::function()> commit, std::function()> rollback, std::function(const std::string& /* query */, const std::vector>>& /* params */)> execute, std::function>(const std::string& /* query */, const std::vector>>& /* params */)> executeAsync): commit(commit), rollback(rollback), execute(execute), executeAsync(executeAsync) {} - }; - -} // namespace margelo::nitro::rnquicksqlite - -namespace margelo::nitro { - - using namespace margelo::nitro::rnquicksqlite; - - // C++ Transaction <> JS Transaction (object) - template <> - struct JSIConverter { - static inline Transaction fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { - jsi::Object obj = arg.asObject(runtime); - return Transaction( - JSIConverter()>>::fromJSI(runtime, obj.getProperty(runtime, "commit")), - JSIConverter()>>::fromJSI(runtime, obj.getProperty(runtime, "rollback")), - JSIConverter(const std::string& /* query */, const std::vector>>& /* params */)>>::fromJSI(runtime, obj.getProperty(runtime, "execute")), - JSIConverter>(const std::string& /* query */, const std::vector>>& /* params */)>>::fromJSI(runtime, obj.getProperty(runtime, "executeAsync")) - ); - } - static inline jsi::Value toJSI(jsi::Runtime& runtime, const Transaction& arg) { - jsi::Object obj(runtime); - obj.setProperty(runtime, "commit", JSIConverter()>>::toJSI(runtime, arg.commit)); - obj.setProperty(runtime, "rollback", JSIConverter()>>::toJSI(runtime, arg.rollback)); - obj.setProperty(runtime, "execute", JSIConverter(const std::string& /* query */, const std::vector>>& /* params */)>>::toJSI(runtime, arg.execute)); - obj.setProperty(runtime, "executeAsync", JSIConverter>(const std::string& /* query */, const std::vector>>& /* params */)>>::toJSI(runtime, arg.executeAsync)); - return obj; - } - static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { - if (!value.isObject()) { - return false; - } - jsi::Object obj = value.getObject(runtime); - if (!JSIConverter()>>::canConvert(runtime, obj.getProperty(runtime, "commit"))) return false; - if (!JSIConverter()>>::canConvert(runtime, obj.getProperty(runtime, "rollback"))) return false; - if (!JSIConverter(const std::string& /* query */, const std::vector>>& /* params */)>>::canConvert(runtime, obj.getProperty(runtime, "execute"))) return false; - if (!JSIConverter>(const std::string& /* query */, const std::vector>>& /* params */)>>::canConvert(runtime, obj.getProperty(runtime, "executeAsync"))) return false; - return true; - } - }; - -} // namespace margelo::nitro diff --git a/src/index.ts b/src/index.ts index c213b8aa..af111660 100644 --- a/src/index.ts +++ b/src/index.ts @@ -73,9 +73,9 @@ QuickSQLite.executeAsync = async ( return res } -QuickSQLite.transaction = async ( +const transaction = async ( dbName: string, - fn: (tx: Transaction) => Promise + fn: (tx: Transaction) => Promise | void ): Promise => { if (!locks[dbName]) { throw Error(`Quick SQLite Error: No lock found on db: ${dbName}`) @@ -231,7 +231,7 @@ export const typeORMDriver = { transaction: ( fn: (tx: Transaction) => Promise ): Promise => { - return QuickSQLite.transaction(options.name, fn) + return transaction(options.name, fn) }, close: (ok: any, fail: any) => { try { @@ -280,7 +280,7 @@ export const open = (options: { QuickSQLite.attach(options.name, dbNameToAttach, alias, location), detach: (alias: string) => QuickSQLite.detach(options.name, alias), transaction: (fn: (tx: Transaction) => Promise | void) => - QuickSQLite.transaction(options.name, fn), + transaction(options.name, fn), execute: (query: string, params?: SQLiteValue[]): QueryResult => QuickSQLite.execute(options.name, query, params), executeAsync: ( diff --git a/src/specs/QuickSQLite.nitro.ts b/src/specs/QuickSQLite.nitro.ts index 4a97f246..5c08a8cf 100644 --- a/src/specs/QuickSQLite.nitro.ts +++ b/src/specs/QuickSQLite.nitro.ts @@ -4,7 +4,6 @@ import { BatchQueryResult, FileLoadResult, BatchQueryCommand, - Transaction, SQLiteValue, } from '../types' @@ -20,10 +19,6 @@ export interface QuickSQLite location?: string ): void detach(mainDbName: string, alias: string): void - transaction( - dbName: string, - fn: (tx: Transaction) => Promise | void - ): Promise execute(dbName: string, query: string, params?: SQLiteValue[]): QueryResult executeAsync( dbName: string, From 18c9fa8be4854000b2bc704f742f0cb340cf4570 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Tue, 10 Sep 2024 18:54:08 +0200 Subject: [PATCH 068/156] fix: ios build --- Gemfile.lock | 3 ++- cpp/specs/HybridQuickSQLite.cpp | 12 +++--------- cpp/specs/HybridQuickSQLite.hpp | 1 - cpp/specs/HybridSelectQueryResult.cpp | 22 ++-------------------- cpp/specs/HybridSelectQueryResult.hpp | 12 ++---------- cpp/sqlbatchexecutor.cpp | 4 +++- cpp/sqliteBridge.cpp | 18 +++++++++--------- cpp/sqliteBridge.h | 2 +- ios/QuickSQLite.xcodeproj/project.pbxproj | 16 ++++++++-------- 9 files changed, 30 insertions(+), 60 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6300cfb9..62424405 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -104,7 +104,8 @@ PLATFORMS ruby DEPENDENCIES - cocoapods (~> 1.15, >= 1.15.2) + activesupport (>= 6.1.7.5, != 7.1.0) + cocoapods (>= 1.13, != 1.15.1, != 1.15.0) RUBY VERSION ruby 3.3.0p0 diff --git a/cpp/specs/HybridQuickSQLite.cpp b/cpp/specs/HybridQuickSQLite.cpp index b7064672..87fc46dd 100644 --- a/cpp/specs/HybridQuickSQLite.cpp +++ b/cpp/specs/HybridQuickSQLite.cpp @@ -79,15 +79,9 @@ void HybridQuickSQLite::detach(const std::string& mainDbName, const std::string& } }; -std::future HybridQuickSQLite::transaction(const std::string& dbName, const std::function>(const Transaction& /* tx */)>& fn) { - return std::async(std::launch::async, []() { - - }); -}; - QueryResult HybridQuickSQLite::execute(const std::string& dbName, const std::string& query, const std::optional>& params) { - auto results = std::make_shared>>(); - auto metadata = std::make_shared>>(std::nullopt); + auto results = std::vector>(); + auto metadata = std::optional>(std::nullopt); // Converting results into a JSI Response try { @@ -98,7 +92,7 @@ QueryResult HybridQuickSQLite::execute(const std::string& dbName, const std::str } if (metadata) { - const auto selectQueryResult = std::make_shared(*results, *(*metadata)); + const auto selectQueryResult = std::make_shared(std::move(results), std::move(*metadata)); return QueryResult(QueryType::SELECT, status.insertId, status.rowsAffected, selectQueryResult); } diff --git a/cpp/specs/HybridQuickSQLite.hpp b/cpp/specs/HybridQuickSQLite.hpp index 24fcadd3..e3da9196 100644 --- a/cpp/specs/HybridQuickSQLite.hpp +++ b/cpp/specs/HybridQuickSQLite.hpp @@ -14,7 +14,6 @@ class HybridQuickSQLite: public HybridQuickSQLiteSpec { 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::future transaction(const std::string& dbName, const std::function>(const Transaction& /* tx */)>& fn) override; QueryResult 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; diff --git a/cpp/specs/HybridSelectQueryResult.cpp b/cpp/specs/HybridSelectQueryResult.cpp index 817870eb..dc541b42 100644 --- a/cpp/specs/HybridSelectQueryResult.cpp +++ b/cpp/specs/HybridSelectQueryResult.cpp @@ -1,11 +1,9 @@ #include "HybridSelectQueryResult.hpp" -using namespace margelo::nitro::rnquicksqlite; - namespace margelo::rnquicksqlite { -HybridSelectQueryResult::HybridSelectQueryResult(const std::vector>& results, const std::vector& metadata) - : HybridSelectQueryResultSpec(), _results(results), _metadata(metadata) {} +HybridSelectQueryResult::HybridSelectQueryResult(std::vector>&& results, std::vector&& metadata) + : HybridSelectQueryResultSpec(), _results(std::move(results)), _metadata(std::move(metadata)) {} std::vector> HybridSelectQueryResult::getResults() { return this->_results; @@ -23,20 +21,4 @@ void HybridSelectQueryResult::setMetadata(const std::vector& met this->_metadata = metadata; } -//std::string HybridSelectQueryResult::getString() { -// return "TODO"; -//} -// -//double HybridSelectQueryResult::getNumber() { -// return -1.0; -//} -// -//bool HybridSelectQueryResult::getBoolean() { -// return false; -//} - -std::shared_ptr HybridSelectQueryResult::getArrayBuffer() { - return nullptr; -} - } diff --git a/cpp/specs/HybridSelectQueryResult.hpp b/cpp/specs/HybridSelectQueryResult.hpp index a478937e..59973293 100644 --- a/cpp/specs/HybridSelectQueryResult.hpp +++ b/cpp/specs/HybridSelectQueryResult.hpp @@ -10,7 +10,7 @@ namespace margelo::rnquicksqlite { class HybridSelectQueryResult: public HybridSelectQueryResultSpec { public: - HybridSelectQueryResult(const std::vector>& results, const std::optional>& metadata); + HybridSelectQueryResult(std::vector>&& results, std::vector&& metadata); public: // Properties @@ -19,17 +19,9 @@ class HybridSelectQueryResult: public HybridSelectQueryResultSpec { std::vector getMetadata() override; void setMetadata(const std::vector& metadata) override; -public: - // Methods -// std::string getString() override; -// double getNumber() override; -// bool getBoolean() override; -// std::shared_ptr getArrayBuffer() override; - private: + std::vector> _results; std::vector _metadata; - std::vector> _results: - std::vector> _results; }; } diff --git a/cpp/sqlbatchexecutor.cpp b/cpp/sqlbatchexecutor.cpp index 197ecde9..35cefef7 100644 --- a/cpp/sqlbatchexecutor.cpp +++ b/cpp/sqlbatchexecutor.cpp @@ -67,7 +67,9 @@ SequelBatchOperationResult sqliteExecuteBatch(const std::string& dbName, const s const auto command = commands.at(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(), nullptr, nullptr); + auto results = std::vector>(); + auto metadata = std::optional>(std::nullopt); + auto result = sqliteExecute(dbName, command.sql, *command.params.get(), results, metadata); if(result.type == SQLiteError) { sqliteExecuteLiteral(dbName, "ROLLBACK"); diff --git a/cpp/sqliteBridge.cpp b/cpp/sqliteBridge.cpp index 8512cf13..6d04a58e 100644 --- a/cpp/sqliteBridge.cpp +++ b/cpp/sqliteBridge.cpp @@ -250,7 +250,7 @@ void bindStatement(sqlite3_stmt *statement, const std::vector& valu } } -SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional>& params, std::shared_ptr>> results, std::shared_ptr>> metadata) +SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional>& params, std::vector>& results, std::optional>& metadata) { if (dbMap.count(dbName) == 0) { @@ -288,7 +288,7 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query int result, i, count, column_type; std::string column_name; ColumnType column_declared_type; - std::map row; + std::unordered_map row; while (isConsuming) { @@ -298,7 +298,7 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query { case SQLITE_ROW: i = 0; - row = std::map(); + row = std::unordered_map(); count = sqlite3_column_count(statement); while (i < count) @@ -351,19 +351,19 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query case SQLITE_NULL: // Intentionally left blank to switch to default case default: - row[column_name] = std::monostate(); +// row[column_name] = std::monostate(); break; } i++; } - results->push_back(std::move(row)); + results.push_back(std::move(row)); break; case SQLITE_DONE: - if (!*metadata) { - *metadata = std::vector(); + if (!metadata) { + metadata = std::vector(); } - if (*metadata) { + if (metadata) { i = 0; count = sqlite3_column_count(statement); while (i < count) @@ -372,7 +372,7 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query const char *tp = sqlite3_column_decltype(statement, i); column_declared_type = mapSQLiteTypeToColumnType(tp); auto columnData = ColumnMetadata(column_name,column_declared_type, i); - (*metadata)->push_back(std::move(columnData)); + metadata->push_back(std::move(columnData)); i++; } isConsuming = false; diff --git a/cpp/sqliteBridge.h b/cpp/sqliteBridge.h index cb95dc23..53f6c159 100644 --- a/cpp/sqliteBridge.h +++ b/cpp/sqliteBridge.h @@ -17,7 +17,7 @@ SQLiteOPResult sqliteAttachDb(const std::string& mainDBName, const std::string& SQLiteOPResult sqliteDetachDb(const std::string& mainDBName, const std::string& alias); -SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional>& params, std::shared_ptr>> result, std::shared_ptr>> metadata); +SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional>& params, std::vector>& results, std::optional>& metadata); SequelLiteralUpdateResult sqliteExecuteLiteral(const std::string& dbName, const std::string& query); diff --git a/ios/QuickSQLite.xcodeproj/project.pbxproj b/ios/QuickSQLite.xcodeproj/project.pbxproj index 22d2fbcd..954964b3 100644 --- a/ios/QuickSQLite.xcodeproj/project.pbxproj +++ b/ios/QuickSQLite.xcodeproj/project.pbxproj @@ -11,7 +11,7 @@ 83BC6E712C8F78A200B954D2 /* RNQuickSQLite-Swift-Cxx-Bridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E452C8F78A200B954D2 /* RNQuickSQLite-Swift-Cxx-Bridge.cpp */; }; 83BC6E722C8F78A200B954D2 /* HybridQuickSQLiteSpec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E4F2C8F78A200B954D2 /* HybridQuickSQLiteSpec.cpp */; }; 83BC6E732C8F78A200B954D2 /* HybridSelectQueryResultSpec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E512C8F78A200B954D2 /* HybridSelectQueryResultSpec.cpp */; }; - 83BC6E742C8F78A200B954D2 /* HybridQuickSQLiteObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E5A2C8F78A200B954D2 /* HybridQuickSQLiteObject.cpp */; }; + 83BC6E742C8F78A200B954D2 /* HybridQuickSQLite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E5A2C8F78A200B954D2 /* HybridQuickSQLite.cpp */; }; 83BC6E752C8F78A200B954D2 /* HybridSelectQueryResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E5C2C8F78A200B954D2 /* HybridSelectQueryResult.cpp */; }; 83BC6E762C8F78A200B954D2 /* JSIHelper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E602C8F78A200B954D2 /* JSIHelper.cpp */; }; 83BC6E772C8F78A200B954D2 /* OnLoad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BC6E642C8F78A200B954D2 /* OnLoad.cpp */; }; @@ -56,10 +56,10 @@ 83BC6E532C8F78A200B954D2 /* QueryResult.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = QueryResult.hpp; sourceTree = ""; }; 83BC6E542C8F78A200B954D2 /* QueryType.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = QueryType.hpp; sourceTree = ""; }; 83BC6E552C8F78A200B954D2 /* Transaction.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Transaction.hpp; sourceTree = ""; }; - 83BC6E5A2C8F78A200B954D2 /* HybridQuickSQLiteObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HybridQuickSQLiteObject.cpp; sourceTree = ""; }; - 83BC6E5B2C8F78A200B954D2 /* HybridQuickSQLiteObject.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = HybridQuickSQLiteObject.hpp; sourceTree = ""; }; + 83BC6E5A2C8F78A200B954D2 /* HybridQuickSQLite.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HybridQuickSQLite.cpp; sourceTree = ""; }; + 83BC6E5B2C8F78A200B954D2 /* HybridQuickSQLite.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = HybridQuickSQLite.hpp; sourceTree = ""; }; 83BC6E5C2C8F78A200B954D2 /* HybridSelectQueryResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HybridSelectQueryResult.cpp; sourceTree = ""; }; - 83BC6E5D2C8F78A200B954D2 /* HybridSelectQueryResultObject.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = HybridSelectQueryResultObject.hpp; sourceTree = ""; }; + 83BC6E5D2C8F78A200B954D2 /* HybridSelectQueryResult.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = HybridSelectQueryResult.hpp; sourceTree = ""; }; 83BC6E5E2C8F78A200B954D2 /* Types.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Types.hpp; sourceTree = ""; }; 83BC6E602C8F78A200B954D2 /* JSIHelper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSIHelper.cpp; sourceTree = ""; }; 83BC6E612C8F78A200B954D2 /* JSIHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSIHelper.h; sourceTree = ""; }; @@ -179,10 +179,10 @@ 83BC6E5F2C8F78A200B954D2 /* specs */ = { isa = PBXGroup; children = ( - 83BC6E5A2C8F78A200B954D2 /* HybridQuickSQLiteObject.cpp */, - 83BC6E5B2C8F78A200B954D2 /* HybridQuickSQLiteObject.hpp */, + 83BC6E5A2C8F78A200B954D2 /* HybridQuickSQLite.cpp */, + 83BC6E5B2C8F78A200B954D2 /* HybridQuickSQLite.hpp */, 83BC6E5C2C8F78A200B954D2 /* HybridSelectQueryResult.cpp */, - 83BC6E5D2C8F78A200B954D2 /* HybridSelectQueryResultObject.hpp */, + 83BC6E5D2C8F78A200B954D2 /* HybridSelectQueryResult.hpp */, 83BC6E5E2C8F78A200B954D2 /* Types.hpp */, ); path = specs; @@ -283,7 +283,7 @@ 83BC6E752C8F78A200B954D2 /* HybridSelectQueryResult.cpp in Sources */, 83BC6E412C8F788C00B954D2 /* OnLoad.mm in Sources */, 83BC6E7A2C8F78A200B954D2 /* sqlite3.c in Sources */, - 83BC6E742C8F78A200B954D2 /* HybridQuickSQLiteObject.cpp in Sources */, + 83BC6E742C8F78A200B954D2 /* HybridQuickSQLite.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From c3b337a9d3645991c2fb7da9e1fad98133c02d99 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 11 Sep 2024 12:39:29 +0200 Subject: [PATCH 069/156] update specs --- cpp/Types.hpp | 14 ++- cpp/specs/HybridQuickSQLite.cpp | 8 +- cpp/specs/HybridQuickSQLite.hpp | 4 +- cpp/sqliteBridge.cpp | 15 +-- nitro.json | 6 +- .../android/RNQuickSQLite+autolinking.cmake | 2 +- .../android/RNQuickSQLite+autolinking.gradle | 2 +- .../ios/RNQuickSQLite+autolinking.rb | 2 +- .../ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp | 2 +- .../ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 38 ++----- .../ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp | 17 ++- .../shared/c++/BatchQueryCommand.hpp | 2 +- .../generated/shared/c++/BatchQueryResult.hpp | 2 +- .../generated/shared/c++/ColumnMetadata.hpp | 79 -------------- nitrogen/generated/shared/c++/ColumnType.hpp | 103 ------------------ .../generated/shared/c++/FileLoadResult.hpp | 2 +- .../shared/c++/HybridQuickSQLiteSpec.cpp | 2 +- .../shared/c++/HybridQuickSQLiteSpec.hpp | 12 +- .../c++/HybridSelectQueryResultSpec.cpp | 2 +- .../c++/HybridSelectQueryResultSpec.hpp | 12 +- ...{QueryResult.hpp => NativeQueryResult.hpp} | 20 ++-- nitrogen/generated/shared/c++/QueryType.hpp | 2 +- .../generated/shared/c++/TableMetadata.hpp | 69 ++++++++++++ src/specs/QuickSQLite.nitro.ts | 2 +- src/specs/SelectQueryResult.nitro.ts | 33 +----- src/types.ts | 69 ++++++++++-- 26 files changed, 202 insertions(+), 319 deletions(-) delete mode 100644 nitrogen/generated/shared/c++/ColumnMetadata.hpp delete mode 100644 nitrogen/generated/shared/c++/ColumnType.hpp rename nitrogen/generated/shared/c++/{QueryResult.hpp => NativeQueryResult.hpp} (82%) create mode 100644 nitrogen/generated/shared/c++/TableMetadata.hpp diff --git a/cpp/Types.hpp b/cpp/Types.hpp index 1335cbb1..ab21d877 100644 --- a/cpp/Types.hpp +++ b/cpp/Types.hpp @@ -43,16 +43,18 @@ using SQLiteValue = std::variant>& params) { +NativeQueryResult HybridQuickSQLite::execute(const std::string& dbName, const std::string& query, const std::optional>& params) { auto results = std::vector>(); auto metadata = std::optional>(std::nullopt); @@ -96,14 +96,14 @@ QueryResult HybridQuickSQLite::execute(const std::string& dbName, const std::str return QueryResult(QueryType::SELECT, status.insertId, status.rowsAffected, selectQueryResult); } - return QueryResult(QueryType::SELECT, status.insertId, status.rowsAffected, std::nullopt); + return NativeQueryResult(QueryType::SELECT, status.insertId, status.rowsAffected, std::nullopt); } catch(std::exception &e) { throw std::runtime_error(e.what()); } }; -std::future HybridQuickSQLite::executeAsync(const std::string& dbName, const std::string& query, const std::optional>& params) { - auto promise = std::make_shared>(); +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]() { diff --git a/cpp/specs/HybridQuickSQLite.hpp b/cpp/specs/HybridQuickSQLite.hpp index e3da9196..06a67b1c 100644 --- a/cpp/specs/HybridQuickSQLite.hpp +++ b/cpp/specs/HybridQuickSQLite.hpp @@ -14,8 +14,8 @@ class HybridQuickSQLite: public HybridQuickSQLiteSpec { 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; - QueryResult 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; + NativeQueryResult 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; diff --git a/cpp/sqliteBridge.cpp b/cpp/sqliteBridge.cpp index 6d04a58e..fcd4af87 100644 --- a/cpp/sqliteBridge.cpp +++ b/cpp/sqliteBridge.cpp @@ -311,25 +311,16 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query case SQLITE_INTEGER: { - /** - * It's not possible to send a int64_t in a jsi::Value because JS cannot represent the whole number range. - * Instead, we're sending a double, which can represent all integers up to 53 bits long, which is more - * than what was there before (a 32-bit int). - * - * See https://github.com/margelo/react-native-quick-sqlite/issues/16 for more context. - */ - double column_value = sqlite3_column_double(statement, i); + int64_t column_value = sqlite3_column_int64(statement, i); row[column_name] = column_value; break; } - case SQLITE_FLOAT: { double column_value = sqlite3_column_double(statement, i); row[column_name] = column_value; break; } - case SQLITE_TEXT: { const char *column_value = reinterpret_cast(sqlite3_column_text(statement, i)); @@ -337,7 +328,6 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query row[column_name] = column_value; break; } - case SQLITE_BLOB: { int blob_size = sqlite3_column_bytes(statement, i); @@ -347,7 +337,6 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query 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: @@ -371,7 +360,7 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query column_name = sqlite3_column_name(statement, i); const char *tp = sqlite3_column_decltype(statement, i); column_declared_type = mapSQLiteTypeToColumnType(tp); - auto columnData = ColumnMetadata(column_name,column_declared_type, i); + auto columnData = ColumnMetadata(column_name, column_declared_type, i); metadata->push_back(std::move(columnData)); i++; } diff --git a/nitro.json b/nitro.json index 83aea8e4..be1b402a 100644 --- a/nitro.json +++ b/nitro.json @@ -10,5 +10,9 @@ "rnquicksqlite" ], "androidCxxLibName": "RNQuickSQLite" - } + }, + "ignorePaths": [ + "example", + "lib" + ] } diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake index 80a9ad72..2d4708e7 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake @@ -1,6 +1,6 @@ # # RNQuickSQLite+autolinking.cmake -# Tue Sep 10 2024 +# Wed Sep 11 2024 # This file was generated by nitrogen. DO NOT MODIFY THIS FILE. # https://github.com/mrousavy/nitro # Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle b/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle index 7003618b..cd85e560 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle @@ -1,6 +1,6 @@ /// /// RNQuickSQLite+autolinking.gradle -/// Tue Sep 10 2024 +/// Wed Sep 11 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb b/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb index 1f21e3eb..c58f4758 100644 --- a/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb +++ b/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb @@ -1,6 +1,6 @@ # # RNQuickSQLite+autolinking.rb -# Tue Sep 10 2024 +# Wed Sep 11 2024 # This file was generated by nitrogen. DO NOT MODIFY THIS FILE. # https://github.com/mrousavy/nitro # Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp index 1e6eddca..a1d5641c 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Bridge.cpp -/// Tue Sep 10 2024 +/// Wed Sep 11 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index 0c1b4d24..3fe3192f 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Bridge.hpp -/// Tue Sep 10 2024 +/// Wed Sep 11 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo @@ -17,18 +17,14 @@ namespace NitroModules { class ArrayBuffer; } namespace margelo::nitro::rnquicksqlite { struct BatchQueryCommand; } // Forward declaration of `BatchQueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } -// Forward declaration of `ColumnMetadata` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } -// Forward declaration of `ColumnType` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { enum class ColumnType; } // Forward declaration of `FileLoadResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } // Forward declaration of `HybridSelectQueryResultSpecSwift` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpecSwift; } // Forward declaration of `HybridSelectQueryResultSpec` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } -// Forward declaration of `QueryResult` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct QueryResult; } +// Forward declaration of `NativeQueryResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct NativeQueryResult; } // Forward declaration of `QueryType` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { enum class QueryType; } @@ -39,12 +35,6 @@ namespace margelo::nitro::rnquicksqlite { enum class QueryType; } #if __has_include("BatchQueryResult.hpp") #include "BatchQueryResult.hpp" #endif -#if __has_include("ColumnMetadata.hpp") - #include "ColumnMetadata.hpp" -#endif -#if __has_include("ColumnType.hpp") - #include "ColumnType.hpp" -#endif #if __has_include("FileLoadResult.hpp") #include "FileLoadResult.hpp" #endif @@ -54,8 +44,8 @@ namespace margelo::nitro::rnquicksqlite { enum class QueryType; } #if __has_include("HybridSelectQueryResultSpecSwift.hpp") #include "HybridSelectQueryResultSpecSwift.hpp" #endif -#if __has_include("QueryResult.hpp") - #include "QueryResult.hpp" +#if __has_include("NativeQueryResult.hpp") + #include "NativeQueryResult.hpp" #endif #if __has_include("QueryType.hpp") #include "QueryType.hpp" @@ -175,11 +165,11 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { } /** - * Specialized version of `PromiseHolder`. + * Specialized version of `PromiseHolder`. */ - using PromiseHolder_QueryResult_ = PromiseHolder; - inline PromiseHolder create_PromiseHolder_QueryResult_() { - return PromiseHolder(); + using PromiseHolder_NativeQueryResult_ = PromiseHolder; + inline PromiseHolder create_PromiseHolder_NativeQueryResult_() { + return PromiseHolder(); } /** @@ -270,15 +260,5 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { vector.reserve(size); return vector; } - - /** - * Specialized version of `std::vector`. - */ - using std__vector_ColumnMetadata_ = std::vector; - inline std::vector create_std__vector_ColumnMetadata_(size_t size) { - std::vector vector; - vector.reserve(size); - return vector; - } } // namespace margelo::nitro::rnquicksqlite::bridge::swift diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp index 51c5f0b3..beb1254f 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Umbrella.hpp -/// Tue Sep 10 2024 +/// Wed Sep 11 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo @@ -15,28 +15,25 @@ namespace NitroModules { class ArrayBuffer; } namespace margelo::nitro::rnquicksqlite { struct BatchQueryCommand; } // Forward declaration of `BatchQueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } -// Forward declaration of `ColumnMetadata` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } -// Forward declaration of `ColumnType` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { enum class ColumnType; } // Forward declaration of `FileLoadResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } // Forward declaration of `HybridSelectQueryResultSpec` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } -// Forward declaration of `QueryResult` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct QueryResult; } +// Forward declaration of `NativeQueryResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct NativeQueryResult; } // Forward declaration of `QueryType` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { enum class QueryType; } +// Forward declaration of `TableMetadata` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct TableMetadata; } // Include C++ defined types #include "BatchQueryCommand.hpp" #include "BatchQueryResult.hpp" -#include "ColumnMetadata.hpp" -#include "ColumnType.hpp" #include "FileLoadResult.hpp" #include "HybridSelectQueryResultSpec.hpp" -#include "QueryResult.hpp" +#include "NativeQueryResult.hpp" #include "QueryType.hpp" +#include "TableMetadata.hpp" #include #include #include diff --git a/nitrogen/generated/shared/c++/BatchQueryCommand.hpp b/nitrogen/generated/shared/c++/BatchQueryCommand.hpp index e53827bd..5db8ce5c 100644 --- a/nitrogen/generated/shared/c++/BatchQueryCommand.hpp +++ b/nitrogen/generated/shared/c++/BatchQueryCommand.hpp @@ -1,6 +1,6 @@ /// /// BatchQueryCommand.hpp -/// Tue Sep 10 2024 +/// Wed Sep 11 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/BatchQueryResult.hpp b/nitrogen/generated/shared/c++/BatchQueryResult.hpp index c644be3d..bc2df573 100644 --- a/nitrogen/generated/shared/c++/BatchQueryResult.hpp +++ b/nitrogen/generated/shared/c++/BatchQueryResult.hpp @@ -1,6 +1,6 @@ /// /// BatchQueryResult.hpp -/// Tue Sep 10 2024 +/// Wed Sep 11 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/ColumnMetadata.hpp b/nitrogen/generated/shared/c++/ColumnMetadata.hpp deleted file mode 100644 index 9897411c..00000000 --- a/nitrogen/generated/shared/c++/ColumnMetadata.hpp +++ /dev/null @@ -1,79 +0,0 @@ -/// -/// ColumnMetadata.hpp -/// Tue Sep 10 2024 -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - -// Forward declaration of `ColumnType` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { enum class ColumnType; } - -#include -#include "ColumnType.hpp" - -namespace margelo::nitro::rnquicksqlite { - - /** - * A struct which can be represented as a JavaScript object (ColumnMetadata). - */ - struct ColumnMetadata { - public: - std::string columnName SWIFT_PRIVATE; - ColumnType columnDeclaredType SWIFT_PRIVATE; - double columnIndex SWIFT_PRIVATE; - - public: - explicit ColumnMetadata(std::string columnName, ColumnType columnDeclaredType, double columnIndex): columnName(columnName), columnDeclaredType(columnDeclaredType), columnIndex(columnIndex) {} - }; - -} // namespace margelo::nitro::rnquicksqlite - -namespace margelo::nitro { - - using namespace margelo::nitro::rnquicksqlite; - - // C++ ColumnMetadata <> JS ColumnMetadata (object) - template <> - struct JSIConverter { - static inline ColumnMetadata fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { - jsi::Object obj = arg.asObject(runtime); - return ColumnMetadata( - JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "columnName")), - JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "columnDeclaredType")), - JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "columnIndex")) - ); - } - static inline jsi::Value toJSI(jsi::Runtime& runtime, const ColumnMetadata& arg) { - jsi::Object obj(runtime); - obj.setProperty(runtime, "columnName", JSIConverter::toJSI(runtime, arg.columnName)); - obj.setProperty(runtime, "columnDeclaredType", JSIConverter::toJSI(runtime, arg.columnDeclaredType)); - obj.setProperty(runtime, "columnIndex", JSIConverter::toJSI(runtime, arg.columnIndex)); - return obj; - } - static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { - if (!value.isObject()) { - return false; - } - jsi::Object obj = value.getObject(runtime); - if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "columnName"))) return false; - if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "columnDeclaredType"))) return false; - if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "columnIndex"))) return false; - return true; - } - }; - -} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/ColumnType.hpp b/nitrogen/generated/shared/c++/ColumnType.hpp deleted file mode 100644 index a6b42dbe..00000000 --- a/nitrogen/generated/shared/c++/ColumnType.hpp +++ /dev/null @@ -1,103 +0,0 @@ -/// -/// ColumnType.hpp -/// Tue Sep 10 2024 -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - -namespace margelo::nitro::rnquicksqlite { - - /** - * An enum which can be represented as a JavaScript union (ColumnType). - */ - enum class ColumnType { - NULL_VALUE SWIFT_NAME(nullValue) = 0, - TEXT SWIFT_NAME(text) = 1, - INTEGER SWIFT_NAME(integer) = 2, - INT64 SWIFT_NAME(int64) = 3, - DOUBLE SWIFT_NAME(double) = 4, - BOOLEAN SWIFT_NAME(boolean) = 5, - ARRAY_BUFFER SWIFT_NAME(arrayBuffer) = 6, - UNKNOWN SWIFT_NAME(unknown) = 7, - } CLOSED_ENUM; - -} // namespace margelo::nitro::rnquicksqlite - -namespace margelo::nitro { - - using namespace margelo::nitro::rnquicksqlite; - - // C++ ColumnType <> JS ColumnType (union) - template <> - struct JSIConverter { - static inline ColumnType fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { - std::string unionValue = JSIConverter::fromJSI(runtime, arg); - switch (hashString(unionValue.c_str(), unionValue.size())) { - case hashString("NULL_VALUE"): return ColumnType::NULL_VALUE; - case hashString("TEXT"): return ColumnType::TEXT; - case hashString("INTEGER"): return ColumnType::INTEGER; - case hashString("INT64"): return ColumnType::INT64; - case hashString("DOUBLE"): return ColumnType::DOUBLE; - case hashString("BOOLEAN"): return ColumnType::BOOLEAN; - case hashString("ARRAY_BUFFER"): return ColumnType::ARRAY_BUFFER; - case hashString("UNKNOWN"): return ColumnType::UNKNOWN; - default: [[unlikely]] - throw std::runtime_error("Cannot convert \"" + unionValue + "\" to enum ColumnType - invalid value!"); - } - } - static inline jsi::Value toJSI(jsi::Runtime& runtime, ColumnType arg) { - switch (arg) { - case ColumnType::NULL_VALUE: return JSIConverter::toJSI(runtime, "NULL_VALUE"); - case ColumnType::TEXT: return JSIConverter::toJSI(runtime, "TEXT"); - case ColumnType::INTEGER: return JSIConverter::toJSI(runtime, "INTEGER"); - case ColumnType::INT64: return JSIConverter::toJSI(runtime, "INT64"); - case ColumnType::DOUBLE: return JSIConverter::toJSI(runtime, "DOUBLE"); - case ColumnType::BOOLEAN: return JSIConverter::toJSI(runtime, "BOOLEAN"); - case ColumnType::ARRAY_BUFFER: return JSIConverter::toJSI(runtime, "ARRAY_BUFFER"); - case ColumnType::UNKNOWN: return JSIConverter::toJSI(runtime, "UNKNOWN"); - default: [[unlikely]] - throw std::runtime_error("Cannot convert ColumnType to JS - invalid value: " - + std::to_string(static_cast(arg)) + "!"); - } - } - static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { - if (!value.isString()) { - return false; - } - std::string unionValue = JSIConverter::fromJSI(runtime, value); - switch (hashString(unionValue.c_str(), unionValue.size())) { - case hashString("NULL_VALUE"): - case hashString("TEXT"): - case hashString("INTEGER"): - case hashString("INT64"): - case hashString("DOUBLE"): - case hashString("BOOLEAN"): - case hashString("ARRAY_BUFFER"): - case hashString("UNKNOWN"): - return true; - default: - return false; - } - } - }; - -} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/FileLoadResult.hpp b/nitrogen/generated/shared/c++/FileLoadResult.hpp index d97b71ea..c548f481 100644 --- a/nitrogen/generated/shared/c++/FileLoadResult.hpp +++ b/nitrogen/generated/shared/c++/FileLoadResult.hpp @@ -1,6 +1,6 @@ /// /// FileLoadResult.hpp -/// Tue Sep 10 2024 +/// Wed Sep 11 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp index b8dfb56e..da64e169 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp @@ -1,6 +1,6 @@ /// /// HybridQuickSQLiteSpec.cpp -/// Tue Sep 10 2024 +/// Wed Sep 11 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp index a97baf22..7231b301 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp @@ -1,6 +1,6 @@ /// /// HybridQuickSQLiteSpec.hpp -/// Tue Sep 10 2024 +/// Wed Sep 11 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo @@ -14,8 +14,8 @@ #error NitroModules cannot be found! Are you sure you installed NitroModules properly? #endif -// Forward declaration of `QueryResult` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct QueryResult; } +// Forward declaration of `NativeQueryResult` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct NativeQueryResult; } // Forward declaration of `ArrayBuffer` to properly resolve imports. namespace NitroModules { class ArrayBuffer; } // Forward declaration of `BatchQueryResult` to properly resolve imports. @@ -27,7 +27,7 @@ namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } #include #include -#include "QueryResult.hpp" +#include "NativeQueryResult.hpp" #include #include #include @@ -69,8 +69,8 @@ namespace margelo::nitro::rnquicksqlite { virtual void drop(const std::string& dbName, const std::optional& location) = 0; virtual void attach(const std::string& mainDbName, const std::string& dbNameToAttach, const std::string& alias, const std::optional& location) = 0; virtual void detach(const std::string& mainDbName, const std::string& alias) = 0; - virtual QueryResult execute(const std::string& dbName, const std::string& query, const std::optional>>>& params) = 0; - virtual std::future executeAsync(const std::string& dbName, const std::string& query, const std::optional>>>& params) = 0; + virtual NativeQueryResult execute(const std::string& dbName, const std::string& query, const std::optional>>>& params) = 0; + virtual std::future executeAsync(const std::string& dbName, const std::string& query, const std::optional>>>& params) = 0; virtual BatchQueryResult executeBatch(const std::string& dbName, const std::vector& commands) = 0; virtual std::future executeBatchAsync(const std::string& dbName, const std::vector& commands) = 0; virtual FileLoadResult loadFile(const std::string& dbName, const std::string& location) = 0; diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp index 6a873522..757ec633 100644 --- a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp @@ -1,6 +1,6 @@ /// /// HybridSelectQueryResultSpec.cpp -/// Tue Sep 10 2024 +/// Wed Sep 11 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp index fb3edeb6..7ad59d50 100644 --- a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp @@ -1,6 +1,6 @@ /// /// HybridSelectQueryResultSpec.hpp -/// Tue Sep 10 2024 +/// Wed Sep 11 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo @@ -16,15 +16,15 @@ // Forward declaration of `ArrayBuffer` to properly resolve imports. namespace NitroModules { class ArrayBuffer; } -// Forward declaration of `ColumnMetadata` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } +// Forward declaration of `TableMetadata` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct TableMetadata; } #include #include #include #include #include -#include "ColumnMetadata.hpp" +#include "TableMetadata.hpp" namespace margelo::nitro::rnquicksqlite { @@ -52,8 +52,8 @@ namespace margelo::nitro::rnquicksqlite { // Properties virtual std::vector>>> getResults() = 0; virtual void setResults(const std::vector>>>& results) = 0; - virtual std::vector getMetadata() = 0; - virtual void setMetadata(const std::vector& metadata) = 0; + virtual TableMetadata getMetadata() = 0; + virtual void setMetadata(const TableMetadata& metadata) = 0; public: // Methods diff --git a/nitrogen/generated/shared/c++/QueryResult.hpp b/nitrogen/generated/shared/c++/NativeQueryResult.hpp similarity index 82% rename from nitrogen/generated/shared/c++/QueryResult.hpp rename to nitrogen/generated/shared/c++/NativeQueryResult.hpp index 8281f3a0..3edf26c7 100644 --- a/nitrogen/generated/shared/c++/QueryResult.hpp +++ b/nitrogen/generated/shared/c++/NativeQueryResult.hpp @@ -1,6 +1,6 @@ /// -/// QueryResult.hpp -/// Tue Sep 10 2024 +/// NativeQueryResult.hpp +/// Wed Sep 11 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo @@ -32,9 +32,9 @@ namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } namespace margelo::nitro::rnquicksqlite { /** - * A struct which can be represented as a JavaScript object (QueryResult). + * A struct which can be represented as a JavaScript object (NativeQueryResult). */ - struct QueryResult { + struct NativeQueryResult { public: QueryType queryType SWIFT_PRIVATE; std::optional insertId SWIFT_PRIVATE; @@ -42,7 +42,7 @@ namespace margelo::nitro::rnquicksqlite { std::optional> selectQueryResult SWIFT_PRIVATE; public: - explicit QueryResult(QueryType queryType, std::optional insertId, double rowsAffected, std::optional> selectQueryResult): queryType(queryType), insertId(insertId), rowsAffected(rowsAffected), selectQueryResult(selectQueryResult) {} + explicit NativeQueryResult(QueryType queryType, std::optional insertId, double rowsAffected, std::optional> selectQueryResult): queryType(queryType), insertId(insertId), rowsAffected(rowsAffected), selectQueryResult(selectQueryResult) {} }; } // namespace margelo::nitro::rnquicksqlite @@ -51,19 +51,19 @@ namespace margelo::nitro { using namespace margelo::nitro::rnquicksqlite; - // C++ QueryResult <> JS QueryResult (object) + // C++ NativeQueryResult <> JS NativeQueryResult (object) template <> - struct JSIConverter { - static inline QueryResult fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + struct JSIConverter { + static inline NativeQueryResult fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { jsi::Object obj = arg.asObject(runtime); - return QueryResult( + return NativeQueryResult( JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "queryType")), JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "insertId")), JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "rowsAffected")), JSIConverter>>::fromJSI(runtime, obj.getProperty(runtime, "selectQueryResult")) ); } - static inline jsi::Value toJSI(jsi::Runtime& runtime, const QueryResult& arg) { + static inline jsi::Value toJSI(jsi::Runtime& runtime, const NativeQueryResult& arg) { jsi::Object obj(runtime); obj.setProperty(runtime, "queryType", JSIConverter::toJSI(runtime, arg.queryType)); obj.setProperty(runtime, "insertId", JSIConverter>::toJSI(runtime, arg.insertId)); diff --git a/nitrogen/generated/shared/c++/QueryType.hpp b/nitrogen/generated/shared/c++/QueryType.hpp index e5e498ed..708c67a4 100644 --- a/nitrogen/generated/shared/c++/QueryType.hpp +++ b/nitrogen/generated/shared/c++/QueryType.hpp @@ -1,6 +1,6 @@ /// /// QueryType.hpp -/// Tue Sep 10 2024 +/// Wed Sep 11 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/TableMetadata.hpp b/nitrogen/generated/shared/c++/TableMetadata.hpp new file mode 100644 index 00000000..d2e02ba1 --- /dev/null +++ b/nitrogen/generated/shared/c++/TableMetadata.hpp @@ -0,0 +1,69 @@ +/// +/// TableMetadata.hpp +/// Wed Sep 11 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + + + + + +namespace margelo::nitro::rnquicksqlite { + + /** + * A struct which can be represented as a JavaScript object (TableMetadata). + */ + struct TableMetadata { + public: + + + public: + explicit TableMetadata(): {} + }; + +} // namespace margelo::nitro::rnquicksqlite + +namespace margelo::nitro { + + using namespace margelo::nitro::rnquicksqlite; + + // C++ TableMetadata <> JS TableMetadata (object) + template <> + struct JSIConverter { + static inline TableMetadata fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return TableMetadata( + + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const TableMetadata& arg) { + jsi::Object obj(runtime); + + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + + return true; + } + }; + +} // namespace margelo::nitro diff --git a/src/specs/QuickSQLite.nitro.ts b/src/specs/QuickSQLite.nitro.ts index 5c08a8cf..bd82b04d 100644 --- a/src/specs/QuickSQLite.nitro.ts +++ b/src/specs/QuickSQLite.nitro.ts @@ -1,6 +1,6 @@ import { HybridObject } from 'react-native-nitro-modules' import { - QueryResult, + NativeQueryResult as QueryResult, BatchQueryResult, FileLoadResult, BatchQueryCommand, diff --git a/src/specs/SelectQueryResult.nitro.ts b/src/specs/SelectQueryResult.nitro.ts index 79242a21..c0405d75 100644 --- a/src/specs/SelectQueryResult.nitro.ts +++ b/src/specs/SelectQueryResult.nitro.ts @@ -1,5 +1,5 @@ import { HybridObject } from 'react-native-nitro-modules' -import { SQLiteValue } from '../types' +import { SQLiteValue, TableMetadata } from '../types' export interface SelectQueryResult extends HybridObject<{ ios: 'c++'; android: 'c++' }> { @@ -7,34 +7,5 @@ export interface SelectQueryResult /** * Query metadata, avaliable only for select query results */ - metadata: ColumnMetadata[] -} - -type ColumnType = - | 'NULL_VALUE' - | 'TEXT' - | 'INTEGER' - | 'INT64' - | 'DOUBLE' - | 'BOOLEAN' - | 'ARRAY_BUFFER' - | 'UNKNOWN' -// | 'null' -// | 'string' -// | 'number' -// | 'boolean' -// | 'ArrayBuffer'; - -/** - * Column metadata - * Describes some information about columns fetched by the query - */ -export interface ColumnMetadata { - /** The name used for this column for this resultset */ - columnName: string - /** The declared column type for this column, when fetched directly from a table or a View resulting from a table column. "UNKNOWN" for dynamic values, like function returned ones. */ - columnDeclaredType: ColumnType - /** - * The index for this column for this resultset*/ - columnIndex: number + metadata: TableMetadata } diff --git a/src/types.ts b/src/types.ts index 4c5782eb..55aed11b 100644 --- a/src/types.ts +++ b/src/types.ts @@ -10,16 +10,69 @@ import { SelectQueryResult } from './specs/SelectQueryResult.nitro' * * @interface QueryResult */ -export interface QueryResult { +export interface NativeQueryResult { readonly queryType: QueryType - insertId?: number - rowsAffected: number + readonly insertId?: number + readonly rowsAffected: number - selectQueryResult?: SelectQueryResult + readonly selectQueryResult?: SelectQueryResult +} + +export type SQLiteItem = Record + +export interface QueryResult { + readonly queryType: QueryType + readonly insertId?: number + readonly rowsAffected: number + + rows?: { + /** Raw array with all dataset */ + data: Data[] + /** The lengh of the dataset */ + length: number + /** A convenience function to acess the index based the row object + * @param idx the row index + * @returns the row structure identified by column names + */ + item: (idx: number) => Data + } + /** + * Query metadata, avaliable only for select query results + */ + metadata?: ColumnMetadata[] } export type QueryType = 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE' | 'OTHER' +type ColumnType = + | 'BOOLEAN' + | 'NUMBER' + | 'INT64' + | 'TEXT' + | 'ARRAY_BUFFER' + | 'NULL' + | 'UNKNOWN' + +export type ColumnMetadata = { + /** The declared column type for this column, when fetched directly from a table or a View resulting from a table column. "UNKNOWN" for dynamic values, like function returned ones. */ + type: ColumnType + /** + * The index for this column for this result set*/ + index: number +} + +/** + * Column metadata + * Describes some information about columns fetched by the query + * The index is the name used for this column for this resultset + */ +export interface TableMetadata { + [key: string]: ColumnMetadata +} + +/** + * Represents a value that can be stored in a SQLite database + */ export type SQLiteValue = | number | boolean @@ -28,15 +81,15 @@ export type SQLiteValue = | ArrayBuffer | undefined -export type ExecuteQuery = ( +export type ExecuteQuery = ( query: string, params?: SQLiteValue[] -) => QueryResult +) => QueryResult -export type ExecuteAsyncQuery = ( +export type ExecuteAsyncQuery = ( query: string, params?: SQLiteValue[] -) => Promise +) => Promise> export interface Transaction { commit(): QueryResult From 26049df79b96f8ae3e6260750e76dc54f9057bd7 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 11 Sep 2024 12:45:00 +0200 Subject: [PATCH 070/156] change ColumnMetadata to TableMetadata --- cpp/specs/HybridQuickSQLite.cpp | 2 +- cpp/specs/HybridSelectQueryResult.cpp | 6 +++--- cpp/specs/HybridSelectQueryResult.hpp | 8 ++++---- cpp/sqlbatchexecutor.cpp | 2 +- cpp/sqliteBridge.cpp | 8 ++++---- cpp/sqliteBridge.h | 4 ++-- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/cpp/specs/HybridQuickSQLite.cpp b/cpp/specs/HybridQuickSQLite.cpp index 73702a96..b62e6cb3 100644 --- a/cpp/specs/HybridQuickSQLite.cpp +++ b/cpp/specs/HybridQuickSQLite.cpp @@ -81,7 +81,7 @@ void HybridQuickSQLite::detach(const std::string& mainDbName, const std::string& NativeQueryResult HybridQuickSQLite::execute(const std::string& dbName, const std::string& query, const std::optional>& params) { auto results = std::vector>(); - auto metadata = std::optional>(std::nullopt); + auto metadata = std::optional>(std::nullopt); // Converting results into a JSI Response try { diff --git a/cpp/specs/HybridSelectQueryResult.cpp b/cpp/specs/HybridSelectQueryResult.cpp index dc541b42..7b7c3008 100644 --- a/cpp/specs/HybridSelectQueryResult.cpp +++ b/cpp/specs/HybridSelectQueryResult.cpp @@ -2,7 +2,7 @@ namespace margelo::rnquicksqlite { -HybridSelectQueryResult::HybridSelectQueryResult(std::vector>&& results, std::vector&& metadata) +HybridSelectQueryResult::HybridSelectQueryResult(std::vector>&& results, std::vector&& metadata) : HybridSelectQueryResultSpec(), _results(std::move(results)), _metadata(std::move(metadata)) {} std::vector> HybridSelectQueryResult::getResults() { @@ -13,11 +13,11 @@ void HybridSelectQueryResult::setResults(const std::vector_results = results; }; -std::vector HybridSelectQueryResult::getMetadata() { +std::vector HybridSelectQueryResult::getMetadata() { return this->_metadata; } -void HybridSelectQueryResult::setMetadata(const std::vector& metadata) { +void HybridSelectQueryResult::setMetadata(const std::vector& metadata) { this->_metadata = metadata; } diff --git a/cpp/specs/HybridSelectQueryResult.hpp b/cpp/specs/HybridSelectQueryResult.hpp index 59973293..c9b8c52a 100644 --- a/cpp/specs/HybridSelectQueryResult.hpp +++ b/cpp/specs/HybridSelectQueryResult.hpp @@ -10,18 +10,18 @@ namespace margelo::rnquicksqlite { class HybridSelectQueryResult: public HybridSelectQueryResultSpec { public: - HybridSelectQueryResult(std::vector>&& results, std::vector&& metadata); + HybridSelectQueryResult(std::vector>&& results, std::vector&& metadata); public: // Properties std::vector> getResults() override; void setResults(const std::vector>& results) override; - std::vector getMetadata() override; - void setMetadata(const std::vector& metadata) override; + std::vector getMetadata() override; + void setMetadata(const std::vector& metadata) override; private: std::vector> _results; - std::vector _metadata; + std::vector _metadata; }; } diff --git a/cpp/sqlbatchexecutor.cpp b/cpp/sqlbatchexecutor.cpp index 35cefef7..df7fd228 100644 --- a/cpp/sqlbatchexecutor.cpp +++ b/cpp/sqlbatchexecutor.cpp @@ -68,7 +68,7 @@ SequelBatchOperationResult sqliteExecuteBatch(const std::string& dbName, const s // 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 results = std::vector>(); - auto metadata = std::optional>(std::nullopt); + auto metadata = std::optional>(std::nullopt); auto result = sqliteExecute(dbName, command.sql, *command.params.get(), results, metadata); if(result.type == SQLiteError) { diff --git a/cpp/sqliteBridge.cpp b/cpp/sqliteBridge.cpp index fcd4af87..5b4ba083 100644 --- a/cpp/sqliteBridge.cpp +++ b/cpp/sqliteBridge.cpp @@ -250,7 +250,7 @@ void bindStatement(sqlite3_stmt *statement, const std::vector& valu } } -SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional>& params, std::vector>& results, std::optional>& metadata) +SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional>& params, std::vector>& results, std::optional>& metadata) { if (dbMap.count(dbName) == 0) { @@ -349,7 +349,7 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query break; case SQLITE_DONE: if (!metadata) { - metadata = std::vector(); + metadata = std::vector(); } if (metadata) { @@ -360,8 +360,8 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query column_name = sqlite3_column_name(statement, i); const char *tp = sqlite3_column_decltype(statement, i); column_declared_type = mapSQLiteTypeToColumnType(tp); - auto columnData = ColumnMetadata(column_name, column_declared_type, i); - metadata->push_back(std::move(columnData)); + auto columnMeta = ColumnMetadata(column_name, column_declared_type, i); + metadata->push_back(std::move(columnMeta)); i++; } isConsuming = false; diff --git a/cpp/sqliteBridge.h b/cpp/sqliteBridge.h index 53f6c159..01ff7e26 100644 --- a/cpp/sqliteBridge.h +++ b/cpp/sqliteBridge.h @@ -1,6 +1,6 @@ #pragma once -#include "ColumnMetadata.hpp" +#include "TableMetadata.hpp" #include "Types.hpp" using namespace margelo::nitro::rnquicksqlite; @@ -17,7 +17,7 @@ SQLiteOPResult sqliteAttachDb(const std::string& mainDBName, const std::string& SQLiteOPResult sqliteDetachDb(const std::string& mainDBName, const std::string& alias); -SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional>& params, std::vector>& results, std::optional>& metadata); +SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional>& params, std::vector>& results, std::optional>& metadata); SequelLiteralUpdateResult sqliteExecuteLiteral(const std::string& dbName, const std::string& query); From 6eca091a4f78f6c703035badcfa207041027acb6 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 11 Sep 2024 12:45:23 +0200 Subject: [PATCH 071/156] add format-cpp script --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 7dfb0171..a3ffd7e7 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "typescript": "tsc --noEmit", "prepare": "bob build", "example": "yarn --cwd example", + "format-cpp": "./scripts/clang-format.sh", "lint": "eslint \"**/*.{js,ts,tsx}\" --fix", "lint-ci": "eslint \"**/*.{js,ts,tsx}\" -f @jamesacarr/github-actions", "pods": "cd example/ios && bundle exec pod install", From f05b96f808ab32c0c8210bb1b6158fd1607f9a61 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 11 Sep 2024 12:45:49 +0200 Subject: [PATCH 072/156] re-structure JS code --- src/index.ts | 310 +++++++++++---------------------------------- src/init.ts | 11 ++ src/transaction.ts | 128 +++++++++++++++++++ src/typeORM.ts | 102 +++++++++++++++ 4 files changed, 318 insertions(+), 233 deletions(-) create mode 100644 src/init.ts create mode 100644 src/transaction.ts create mode 100644 src/typeORM.ts diff --git a/src/index.ts b/src/index.ts index af111660..069becc6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,39 +1,17 @@ -import { NitroModules } from 'react-native-nitro-modules' -import { QuickSQLite as QuickSQLiteSpec } from 'src/specs/QuickSQLite.nitro' +import { transaction } from './transaction' +import { QuickSQLite, locks } from './init' import { SQLiteValue, - PendingTransaction, QueryResult, QuickSQLiteConnection, BatchQueryCommand, Transaction, -} from 'src/types' + SQLiteItem, + NativeQueryResult, +} from './types' export * from './types' - -const QuickSQLite = - NitroModules.createHybridObject('QuickSQLite') - -const locks: Record< - string, - { queue: PendingTransaction[]; inProgress: boolean } -> = {} - -// Enhance some host functions - -// Add 'item' function to result object to allow the sqlite-storage typeorm driver to work -const enhanceQueryResult = (result: QueryResult): void => { - // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work - // if (result.rows == null) { - // result.rows = { - // _array: [], - // length: 0, - // item: (idx: number) => result.rows._array[idx], - // }; - // } else { - // result.rows.item = (idx: number) => result.rows._array[idx]; - // } -} +export { typeORMDriver } from './typeORM' const _open = QuickSQLite.open QuickSQLite.open = (dbName: string, location?: string) => { @@ -51,221 +29,85 @@ QuickSQLite.close = (dbName: string) => { delete locks[dbName] } +const buildJsQueryResult = ( + nativeResult: NativeQueryResult +): QueryResult => { + let result: QueryResult = { + queryType: nativeResult.queryType, + insertId: nativeResult.insertId, + rowsAffected: nativeResult.rowsAffected, + } + + if (nativeResult.selectQueryResult) { + const results = nativeResult.selectQueryResult.results + const metadata = nativeResult.selectQueryResult.metadata + const data = results.map((row) => { + let item = {} + + for (let key in row) { + switch (metadata[key].type) { + case 'BOOLEAN': + item[key] = row[key] as boolean + break + case 'NUMBER': + item[key] = row[key] as number + break + case 'INT64': + item[key] = row[key] as bigint + break + case 'TEXT': + item[key] = row[key] as string + break + case 'ARRAY_BUFFER': + item[key] = row[key] as ArrayBuffer + break + case 'NULL': + item[key] = null + break + case 'UNKNOWN': + default: + item[key] = row[key] as unknown + } + } + + return item as Data + }) + + result.rows = { + data: data, + length: data.length, + item: (idx: number) => result.rows.data[idx], + } + + return result + } +} + const _execute = QuickSQLite.execute -QuickSQLite.execute = ( +export const execute = ( dbName: string, query: string, params?: SQLiteValue[] -): QueryResult => { - const result = _execute(dbName, query, params) +): QueryResult => { + const nativeResult = _execute(dbName, query, params) + const result = buildJsQueryResult(nativeResult) // enhanceQueryResult(result); return result } +QuickSQLite.execute = execute const _executeAsync = QuickSQLite.executeAsync -QuickSQLite.executeAsync = async ( +export const executeAsync = async ( dbName: string, query: string, params?: SQLiteValue[] -): Promise => { - const res = await _executeAsync(dbName, query, params) +): Promise> => { + const nativeResult = await _executeAsync(dbName, query, params) + const result = buildJsQueryResult(nativeResult) // enhanceQueryResult(res); - return res -} - -const transaction = async ( - dbName: string, - fn: (tx: Transaction) => Promise | void -): Promise => { - if (!locks[dbName]) { - throw Error(`Quick SQLite Error: No lock found on db: ${dbName}`) - } - - let isFinalized = false - - // Local transaction context object implementation - const execute = (query: string, params?: SQLiteValue[]): QueryResult => { - if (isFinalized) { - throw Error( - `Quick SQLite Error: Cannot execute query on finalized transaction: ${dbName}` - ) - } - return QuickSQLite.execute(dbName, query, params) - } - - const executeAsync = (query: string, params?: SQLiteValue[]) => { - if (isFinalized) { - throw Error( - `Quick SQLite Error: Cannot execute query on finalized transaction: ${dbName}` - ) - } - return QuickSQLite.executeAsync(dbName, query, params) - } - - const commit = () => { - if (isFinalized) { - throw Error( - `Quick SQLite Error: Cannot execute commit on finalized transaction: ${dbName}` - ) - } - const result = QuickSQLite.execute(dbName, 'COMMIT') - isFinalized = true - return result - } - - const rollback = () => { - if (isFinalized) { - throw Error( - `Quick SQLite Error: Cannot execute rollback on finalized transaction: ${dbName}` - ) - } - const result = QuickSQLite.execute(dbName, 'ROLLBACK') - isFinalized = true - return result - } - - async function run() { - try { - await QuickSQLite.executeAsync(dbName, 'BEGIN TRANSACTION') - - await fn({ - commit, - execute, - executeAsync, - rollback, - }) - - if (!isFinalized) { - commit() - } - } catch (executionError) { - if (!isFinalized) { - try { - rollback() - } catch (rollbackError) { - throw rollbackError - } - } - - throw executionError - } finally { - locks[dbName].inProgress = false - isFinalized = false - startNextTransaction(dbName) - } - } - - return await new Promise((resolve, reject) => { - const tx: PendingTransaction = { - start: () => { - run().then(resolve).catch(reject) - }, - } - - locks[dbName].queue.push(tx) - startNextTransaction(dbName) - }) -} - -const startNextTransaction = (dbName: string) => { - if (!locks[dbName]) { - throw Error(`Lock not found for db: ${dbName}`) - } - - if (locks[dbName].inProgress) { - // Transaction is already in process bail out - return - } - - if (locks[dbName].queue.length) { - locks[dbName].inProgress = true - const tx = locks[dbName].queue.shift() - setImmediate(() => { - tx.start() - }) - } -} - -// _________ _______ ______ ____ _____ __ __ _____ _____ -// |__ __\ \ / / __ \| ____/ __ \| __ \| \/ | /\ | __ \_ _| -// | | \ \_/ /| |__) | |__ | | | | |__) | \ / | / \ | |__) || | -// | | \ / | ___/| __|| | | | _ /| |\/| | / /\ \ | ___/ | | -// | | | | | | | |___| |__| | | \ \| | | | / ____ \| | _| |_ -// |_| |_| |_| |______\____/|_| \_\_| |_| /_/ \_\_| |_____| - -/** - * DO NOT USE THIS! THIS IS MEANT FOR TYPEORM - * If you are looking for a convenience wrapper use `connect` - */ -export const typeORMDriver = { - openDatabase: ( - options: { - name: string - location?: string - }, - ok: (db: any) => void, - fail: (msg: string) => void - ): any => { - try { - QuickSQLite.open(options.name, options.location) - - const connection = { - executeSql: async ( - sql: string, - params: SQLiteValue[] | undefined, - ok: (res: QueryResult) => void, - fail: (msg: string) => void - ) => { - try { - let response = await QuickSQLite.executeAsync( - options.name, - sql, - params - ) - enhanceQueryResult(response) - ok(response) - } catch (e) { - fail(e) - } - }, - transaction: ( - fn: (tx: Transaction) => Promise - ): Promise => { - return transaction(options.name, fn) - }, - close: (ok: any, fail: any) => { - try { - QuickSQLite.close(options.name) - ok() - } catch (e) { - fail(e) - } - }, - attach: ( - dbNameToAttach: string, - alias: string, - location: string | undefined, - callback: () => void - ) => { - QuickSQLite.attach(options.name, dbNameToAttach, alias, location) - - callback() - }, - detach: (alias, callback: () => void) => { - QuickSQLite.detach(options.name, alias) - - callback() - }, - } - - ok(connection) - - return connection - } catch (e) { - fail(e) - } - }, + return result } +QuickSQLite.executeAsync = executeAsync export const open = (options: { name: string @@ -281,12 +123,14 @@ export const open = (options: { detach: (alias: string) => QuickSQLite.detach(options.name, alias), transaction: (fn: (tx: Transaction) => Promise | void) => transaction(options.name, fn), - execute: (query: string, params?: SQLiteValue[]): QueryResult => - QuickSQLite.execute(options.name, query, params), - executeAsync: ( + execute: ( + query: string, + params?: SQLiteValue[] + ): QueryResult => QuickSQLite.execute(options.name, query, params), + executeAsync: ( query: string, params?: SQLiteValue[] - ): Promise => + ): Promise> => QuickSQLite.executeAsync(options.name, query, params), executeBatch: (commands: BatchQueryCommand[]) => QuickSQLite.executeBatch(options.name, commands), diff --git a/src/init.ts b/src/init.ts new file mode 100644 index 00000000..4e73017b --- /dev/null +++ b/src/init.ts @@ -0,0 +1,11 @@ +import { NitroModules } from 'react-native-nitro-modules' +import { QuickSQLite as QuickSQLiteSpec } from './specs/QuickSQLite.nitro' +import { PendingTransaction } from './types' + +export const QuickSQLite = + NitroModules.createHybridObject('QuickSQLite') + +export const locks: Record< + string, + { queue: PendingTransaction[]; inProgress: boolean } +> = {} diff --git a/src/transaction.ts b/src/transaction.ts new file mode 100644 index 00000000..28abd824 --- /dev/null +++ b/src/transaction.ts @@ -0,0 +1,128 @@ +import { execute, executeAsync } from '.' +import { locks, QuickSQLite } from './init' +import { + PendingTransaction, + QueryResult, + SQLiteItem, + SQLiteValue, + Transaction, +} from './types' + +export const transaction = async ( + dbName: string, + fn: (tx: Transaction) => Promise | void +): Promise => { + if (!locks[dbName]) { + throw Error(`Quick SQLite Error: No lock found on db: ${dbName}`) + } + + let isFinalized = false + + // Local transaction context object implementation + const executeOnTransaction = ( + query: string, + params?: SQLiteValue[] + ): QueryResult => { + if (isFinalized) { + throw Error( + `Quick SQLite Error: Cannot execute query on finalized transaction: ${dbName}` + ) + } + return execute(dbName, query, params) + } + + const executeAsyncOnTransaction = ( + query: string, + params?: SQLiteValue[] + ): Promise> => { + if (isFinalized) { + throw Error( + `Quick SQLite Error: Cannot execute query on finalized transaction: ${dbName}` + ) + } + return executeAsync(dbName, query, params) + } + + const commit = () => { + if (isFinalized) { + throw Error( + `Quick SQLite Error: Cannot execute commit on finalized transaction: ${dbName}` + ) + } + const result = QuickSQLite.execute(dbName, 'COMMIT') + isFinalized = true + return result + } + + const rollback = () => { + if (isFinalized) { + throw Error( + `Quick SQLite Error: Cannot execute rollback on finalized transaction: ${dbName}` + ) + } + const result = QuickSQLite.execute(dbName, 'ROLLBACK') + isFinalized = true + return result + } + + async function run() { + try { + await QuickSQLite.executeAsync(dbName, 'BEGIN TRANSACTION') + + await fn({ + commit, + execute: executeOnTransaction, + executeAsync: executeAsyncOnTransaction, + rollback, + }) + + if (!isFinalized) { + commit() + } + } catch (executionError) { + if (!isFinalized) { + try { + rollback() + } catch (rollbackError) { + throw rollbackError + } + } + + throw executionError + } finally { + locks[dbName].inProgress = false + isFinalized = false + startNextTransaction(dbName) + } + } + + return await new Promise((resolve, reject) => { + const tx: PendingTransaction = { + start: () => { + run().then(resolve).catch(reject) + }, + } + + locks[dbName].queue.push(tx) + startNextTransaction(dbName) + }) +} + +function startNextTransaction(dbName: string) { + if (!locks[dbName]) { + throw Error(`Lock not found for db: ${dbName}`) + } + + if (locks[dbName].inProgress) { + // Transaction is already in process bail out + return + } + + if (locks[dbName].queue.length) { + locks[dbName].inProgress = true + const tx = locks[dbName].queue.shift() + setImmediate(() => { + tx.start() + }) + } +} diff --git a/src/typeORM.ts b/src/typeORM.ts new file mode 100644 index 00000000..4264698c --- /dev/null +++ b/src/typeORM.ts @@ -0,0 +1,102 @@ +// _________ _______ ______ ____ _____ __ __ _____ _____ +// |__ __\ \ / / __ \| ____/ __ \| __ \| \/ | /\ | __ \_ _| +// | | \ \_/ /| |__) | |__ | | | | |__) | \ / | / \ | |__) || | +// | | \ / | ___/| __|| | | | _ /| |\/| | / /\ \ | ___/ | | +// | | | | | | | |___| |__| | | \ \| | | | / ____ \| | _| |_ +// |_| |_| |_| |______\____/|_| \_\_| |_| /_/ \_\_| |_____| + +import { transaction } from './transaction' +import { QuickSQLite } from './init' +import { QueryResult, SQLiteItem, SQLiteValue, Transaction } from './types' + +// Enhance some host functions + +// Add 'item' function to result object to allow the sqlite-storage typeorm driver to work +const enhanceQueryResult = ( + result: QueryResult +): void => { + // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work + // if (result.rows == null) { + // result.rows = { + // _array: [], + // length: 0, + // item: (idx: number) => result.rows._array[idx], + // }; + // } else { + // result.rows.item = (idx: number) => result.rows._array[idx]; + // } +} + +/** + * DO NOT USE THIS! THIS IS MEANT FOR TYPEORM + * If you are looking for a convenience wrapper use `connect` + */ +export const typeORMDriver = { + openDatabase: ( + options: { + name: string + location?: string + }, + ok: (db: any) => void, + fail: (msg: string) => void + ): any => { + try { + QuickSQLite.open(options.name, options.location) + + const connection = { + executeSql: async ( + sql: string, + params: SQLiteValue[] | undefined, + ok: (res: QueryResult) => void, + fail: (msg: string) => void + ) => { + try { + let response = await QuickSQLite.executeAsync( + options.name, + sql, + params + ) + enhanceQueryResult(response) + ok(response) + } catch (e) { + fail(e) + } + }, + transaction: ( + fn: (tx: Transaction) => Promise + ): Promise => { + return transaction(options.name, fn) + }, + close: (ok: any, fail: any) => { + try { + QuickSQLite.close(options.name) + ok() + } catch (e) { + fail(e) + } + }, + attach: ( + dbNameToAttach: string, + alias: string, + location: string | undefined, + callback: () => void + ) => { + QuickSQLite.attach(options.name, dbNameToAttach, alias, location) + + callback() + }, + detach: (alias, callback: () => void) => { + QuickSQLite.detach(options.name, alias) + + callback() + }, + } + + ok(connection) + + return connection + } catch (e) { + fail(e) + } + }, +} From f7d17e636bc9c1850e19a231e4b5c0f912330e90 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 11 Sep 2024 12:45:58 +0200 Subject: [PATCH 073/156] fix: tests --- example/src/tests/rawQueries.spec.ts | 1093 +++++++++++++------------- 1 file changed, 550 insertions(+), 543 deletions(-) diff --git a/example/src/tests/rawQueries.spec.ts b/example/src/tests/rawQueries.spec.ts index 805ba9a3..0ec37ab4 100644 --- a/example/src/tests/rawQueries.spec.ts +++ b/example/src/tests/rawQueries.spec.ts @@ -7,552 +7,559 @@ import { import { beforeEach, describe, it } from './MochaRNAdapter' import chai from 'chai' +type User = { id: string; name: string; age: number; networth: number } + let expect = chai.expect const chance = new Chance() let db: QuickSQLiteConnection export function registerBaseTests() { - // beforeEach(() => { - // try { - // if (db) { - // db.close() - // db.delete() - // } - // db = open({ - // name: 'test', - // }) - // db.execute('DROP TABLE IF EXISTS User;') - // db.execute( - // 'CREATE TABLE User ( id INT PRIMARY KEY, name TEXT NOT NULL, age INT, networth REAL) STRICT;' - // ) - // } catch (e) { - // console.warn('error on before each', e) - // } - // }) - // describe('Raw queries', () => { - // it('Insert', async () => { - // const id = chance.integer() - // const name = chance.name() - // const age = chance.integer() - // const networth = chance.floating() - // const res = db.execute( - // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - // [id, name, age, networth] - // ) - // expect(res.rowsAffected).to.equal(1) - // expect(res.insertId).to.equal(1) - // expect(res.metadata).to.eql([]) - // expect(res.rows?._array).to.eql([]) - // expect(res.rows?.length).to.equal(0) - // expect(res.rows?.item).to.be.a('function') - // }) - // it('Query without params', async () => { - // const id = chance.integer() - // const name = chance.name() - // const age = chance.integer() - // const networth = chance.floating() - // db.execute( - // 'INSERT INTO User (id, name, age, networth) VALUES(?, ?, ?, ?)', - // [id, name, age, networth] - // ) - // const res = db.execute('SELECT * FROM User') - // expect(res.rowsAffected).to.equal(1) - // expect(res.insertId).to.equal(1) - // expect(res.rows?._array).to.eql([ - // { - // id, - // name, - // age, - // networth, - // }, - // ]) - // }) - // it('Query with params', async () => { - // const id = chance.integer() - // const name = chance.name() - // const age = chance.integer() - // const networth = chance.floating() - // db.execute( - // 'INSERT INTO User (id, name, age, networth) VALUES(?, ?, ?, ?)', - // [id, name, age, networth] - // ) - // const res = db.execute('SELECT * FROM User WHERE id = ?', [id]) - // expect(res.rowsAffected).to.equal(1) - // expect(res.insertId).to.equal(1) - // expect(res.rows?._array).to.eql([ - // { - // id, - // name, - // age, - // networth, - // }, - // ]) - // }) - // it('Failed insert', async () => { - // const id = chance.string() - // const name = chance.name() - // const age = chance.string() - // const networth = chance.string() - // // expect( - // try { - // db.execute( - // 'INSERT INTO User (id, name, age, networth) VALUES(?, ?, ?, ?)', - // [id, name, age, networth] - // ) - // } catch (e: any) { - // expect(typeof e).to.equal('object') - // expect(e.message).to.include( - // `cannot store TEXT value in INT column User.id` - // ) - // } - // }) - // it('Transaction, auto commit', async () => { - // const id = chance.integer() - // const name = chance.name() - // const age = chance.integer() - // const networth = chance.floating() - // await db.transaction((tx) => { - // const res = tx.execute( - // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - // [id, name, age, networth] - // ) - // expect(res.rowsAffected).to.equal(1) - // expect(res.insertId).to.equal(1) - // expect(res.metadata).to.eql([]) - // expect(res.rows?._array).to.eql([]) - // expect(res.rows?.length).to.equal(0) - // expect(res.rows?.item).to.be.a('function') - // }) - // const res = db.execute('SELECT * FROM User') - // expect(res.rows?._array).to.eql([ - // { - // id, - // name, - // age, - // networth, - // }, - // ]) - // }) - // it('Transaction, manual commit', async () => { - // const id = chance.integer() - // const name = chance.name() - // const age = chance.integer() - // const networth = chance.floating() - // await db.transaction((tx) => { - // const res = tx.execute( - // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - // [id, name, age, networth] - // ) - // expect(res.rowsAffected).to.equal(1) - // expect(res.insertId).to.equal(1) - // expect(res.metadata).to.eql([]) - // expect(res.rows?._array).to.eql([]) - // expect(res.rows?.length).to.equal(0) - // expect(res.rows?.item).to.be.a('function') - // tx.commit() - // }) - // const res = db.execute('SELECT * FROM User') - // expect(res.rows?._array).to.eql([ - // { - // id, - // name, - // age, - // networth, - // }, - // ]) - // }) - // it('Transaction, executed in order', async () => { - // // ARRANGE: Setup for multiple transactions - // const iterations = 10 - // const actual: unknown[] = [] - // // ARRANGE: Generate expected data - // const id = chance.integer() - // const name = chance.name() - // const age = chance.integer() - // // ACT: Start multiple transactions to upsert and select the same record - // const promises = [] - // for (let iteration = 1; iteration <= iterations; iteration++) { - // const promised = db.transaction((tx) => { - // // ACT: Upsert statement to create record / increment the value - // tx.execute( - // ` - // INSERT OR REPLACE INTO [User] ([id], [name], [age], [networth]) - // SELECT ?, ?, ?, - // IFNULL(( - // SELECT [networth] + 1000 - // FROM [User] - // WHERE [id] = ? - // ), 0) - // `, - // [id, name, age, id] - // ) - // // ACT: Select statement to get incremented value and store it for checking later - // const results = tx.execute( - // 'SELECT [networth] FROM [User] WHERE [id] = ?', - // [id] - // ) - // actual.push(results.rows?._array[0].networth) - // }) - // promises.push(promised) - // } - // // ACT: Wait for all transactions to complete - // await Promise.all(promises) - // // ASSERT: That the expected values where returned - // const expected = Array(iterations) - // .fill(0) - // .map((_, index) => index * 1000) - // expect(actual).to.eql( - // expected, - // 'Each transaction should read a different value' - // ) - // }) - // it('Transaction, cannot execute after commit', async () => { - // const id = chance.integer() - // const name = chance.name() - // const age = chance.integer() - // const networth = chance.floating() - // await db.transaction((tx) => { - // const res = tx.execute( - // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - // [id, name, age, networth] - // ) - // expect(res.rowsAffected).to.equal(1) - // expect(res.insertId).to.equal(1) - // expect(res.metadata).to.eql([]) - // expect(res.rows?._array).to.eql([]) - // expect(res.rows?.length).to.equal(0) - // expect(res.rows?.item).to.be.a('function') - // tx.commit() - // try { - // tx.execute('SELECT * FROM "User"') - // } catch (e) { - // expect(!!e).to.equal(true) - // } - // }) - // const res = db.execute('SELECT * FROM User') - // expect(res.rows?._array).to.eql([ - // { - // id, - // name, - // age, - // networth, - // }, - // ]) - // }) - // it('Incorrect transaction, manual rollback', async () => { - // const id = chance.string() - // const name = chance.name() - // const age = chance.integer() - // const networth = chance.floating() - // await db.transaction((tx) => { - // try { - // tx.execute( - // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - // [id, name, age, networth] - // ) - // } catch (e) { - // tx.rollback() - // } - // }) - // const res = db.execute('SELECT * FROM User') - // expect(res.rows?._array).to.eql([]) - // }) - // it('Correctly throws', () => { - // const id = chance.string() - // const name = chance.name() - // const age = chance.integer() - // const networth = chance.floating() - // try { - // db.execute( - // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - // [id, name, age, networth] - // ) - // } catch (e: any) { - // expect(!!e).to.equal(true) - // } - // }) - // it('Rollback', async () => { - // const id = chance.integer() - // const name = chance.name() - // const age = chance.integer() - // const networth = chance.floating() - // await db.transaction((tx) => { - // tx.execute( - // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - // [id, name, age, networth] - // ) - // tx.rollback() - // const res = db.execute('SELECT * FROM User') - // expect(res.rows?._array).to.eql([]) - // }) - // }) - // it('Transaction, rejects on callback error', async () => { - // const promised = db.transaction((tx) => { - // throw new Error('Error from callback') - // }) - // // ASSERT: should return a promise that eventually rejects - // expect(promised).to.have.property('then').that.is.a('function') - // try { - // await promised - // expect.fail('Should not resolve') - // } catch (e) { - // expect(e).to.be.a.instanceof(Error) - // expect((e as Error)?.message).to.equal('Error from callback') - // } - // }) - // it('Transaction, rejects on invalid query', async () => { - // const promised = db.transaction((tx) => { - // console.log('execute bad start') - // tx.execute('SELECT * FROM [tableThatDoesNotExist];') - // console.log('execute bad done') - // }) - // // ASSERT: should return a promise that eventually rejects - // expect(promised).to.have.property('then').that.is.a('function') - // try { - // await promised - // expect.fail('Should not resolve') - // } catch (e) { - // expect(e).to.be.a.instanceof(Error) - // expect((e as Error)?.message).to.include( - // 'no such table: tableThatDoesNotExist' - // ) - // } - // }) - // it('Transaction, handle async callback', async () => { - // let ranCallback = false - // const promised = db.transaction(async (tx) => { - // await new Promise((done) => { - // setTimeout(() => done(), 50) - // }) - // tx.execute('SELECT * FROM [User];') - // ranCallback = true - // }) - // // ASSERT: should return a promise that eventually rejects - // expect(promised).to.have.property('then').that.is.a('function') - // await promised - // expect(ranCallback).to.equal(true, 'Should handle async callback') - // }) - // it('Async transaction, auto commit', async () => { - // const id = chance.integer() - // const name = chance.name() - // const age = chance.integer() - // const networth = chance.floating() - // await db.transaction(async (tx) => { - // const res = await tx.executeAsync( - // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - // [id, name, age, networth] - // ) - // expect(res.rowsAffected).to.equal(1) - // expect(res.insertId).to.equal(1) - // expect(res.metadata).to.eql([]) - // expect(res.rows?._array).to.eql([]) - // expect(res.rows?.length).to.equal(0) - // expect(res.rows?.item).to.be.a('function') - // }) - // const res = db.execute('SELECT * FROM User') - // expect(res.rows?._array).to.eql([ - // { - // id, - // name, - // age, - // networth, - // }, - // ]) - // }) - // it('Async transaction, auto rollback', async () => { - // const id = chance.string() // Causes error because it should be an integer - // const name = chance.name() - // const age = chance.integer() - // const networth = chance.floating() - // try { - // await db.transaction(async (tx) => { - // await tx.executeAsync( - // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - // [id, name, age, networth] - // ) - // }) - // } catch (error) { - // expect(error).to.be.instanceOf(Error) - // expect((error as Error).message) - // .to.include('SQL execution error') - // .and.to.include('cannot store TEXT value in INT column User.id') - // const res = db.execute('SELECT * FROM User') - // expect(res.rows?._array).to.eql([]) - // } - // }) - // it('Async transaction, manual commit', async () => { - // const id = chance.integer() - // const name = chance.name() - // const age = chance.integer() - // const networth = chance.floating() - // await db.transaction(async (tx) => { - // await tx.executeAsync( - // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - // [id, name, age, networth] - // ) - // tx.commit() - // }) - // const res = db.execute('SELECT * FROM User') - // expect(res.rows?._array).to.eql([ - // { - // id, - // name, - // age, - // networth, - // }, - // ]) - // }) - // it('Async transaction, manual rollback', async () => { - // const id = chance.integer() - // const name = chance.name() - // const age = chance.integer() - // const networth = chance.floating() - // await db.transaction(async (tx) => { - // await tx.executeAsync( - // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - // [id, name, age, networth] - // ) - // tx.rollback() - // }) - // const res = db.execute('SELECT * FROM User') - // expect(res.rows?._array).to.eql([]) - // }) - // it('Async transaction, executed in order', async () => { - // // ARRANGE: Setup for multiple transactions - // const iterations = 10 - // const actual: unknown[] = [] - // // ARRANGE: Generate expected data - // const id = chance.integer() - // const name = chance.name() - // const age = chance.integer() - // // ACT: Start multiple async transactions to upsert and select the same record - // const promises = [] - // for (let iteration = 1; iteration <= iterations; iteration++) { - // const promised = db.transaction(async (tx) => { - // // ACT: Upsert statement to create record / increment the value - // await tx.executeAsync( - // ` - // INSERT OR REPLACE INTO [User] ([id], [name], [age], [networth]) - // SELECT ?, ?, ?, - // IFNULL(( - // SELECT [networth] + 1000 - // FROM [User] - // WHERE [id] = ? - // ), 0) - // `, - // [id, name, age, id] - // ) - // // ACT: Select statement to get incremented value and store it for checking later - // const results = await tx.executeAsync( - // 'SELECT [networth] FROM [User] WHERE [id] = ?', - // [id] - // ) - // actual.push(results.rows?._array[0].networth) - // }) - // promises.push(promised) - // } - // // ACT: Wait for all transactions to complete - // await Promise.all(promises) - // // ASSERT: That the expected values where returned - // const expected = Array(iterations) - // .fill(0) - // .map((_, index) => index * 1000) - // expect(actual).to.eql( - // expected, - // 'Each transaction should read a different value' - // ) - // }) - // it('Async transaction, rejects on callback error', async () => { - // const promised = db.transaction(async (tx) => { - // throw new Error('Error from callback') - // }) - // // ASSERT: should return a promise that eventually rejects - // expect(promised).to.have.property('then').that.is.a('function') - // try { - // await promised - // expect.fail('Should not resolve') - // } catch (e) { - // expect(e).to.be.a.instanceof(Error) - // expect((e as Error)?.message).to.equal('Error from callback') - // } - // }) - // it('Async transaction, rejects on invalid query', async () => { - // const promised = db.transaction(async (tx) => { - // await tx.executeAsync('SELECT * FROM [tableThatDoesNotExist];') - // }) - // // ASSERT: should return a promise that eventually rejects - // expect(promised).to.have.property('then').that.is.a('function') - // try { - // await promised - // expect.fail('Should not resolve') - // } catch (e) { - // expect(e).to.be.a.instanceof(Error) - // expect((e as Error)?.message).to.include( - // 'no such table: tableThatDoesNotExist' - // ) - // } - // }) - // it('Batch execute', () => { - // const id1 = chance.integer() - // const name1 = chance.name() - // const age1 = chance.integer() - // const networth1 = chance.floating() - // const id2 = chance.integer() - // const name2 = chance.name() - // const age2 = chance.integer() - // const networth2 = chance.floating() - // const commands: BatchQueryCommand[] = [ - // [ - // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - // [id1, name1, age1, networth1], - // ], - // [ - // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - // [id2, name2, age2, networth2], - // ], - // ] - // db.executeBatch(commands) - // const res = db.execute('SELECT * FROM User') - // expect(res.rows?._array).to.eql([ - // { id: id1, name: name1, age: age1, networth: networth1 }, - // { - // id: id2, - // name: name2, - // age: age2, - // networth: networth2, - // }, - // ]) - // }) - // it('Async batch execute', async () => { - // const id1 = chance.integer() - // const name1 = chance.name() - // const age1 = chance.integer() - // const networth1 = chance.floating() - // const id2 = chance.integer() - // const name2 = chance.name() - // const age2 = chance.integer() - // const networth2 = chance.floating() - // const commands: BatchQueryCommand[] = [ - // [ - // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - // [id1, name1, age1, networth1], - // ], - // [ - // 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', - // [id2, name2, age2, networth2], - // ], - // ] - // await db.executeBatchAsync(commands) - // const res = db.execute('SELECT * FROM User') - // expect(res.rows?._array).to.eql([ - // { id: id1, name: name1, age: age1, networth: networth1 }, - // { - // id: id2, - // name: name2, - // age: age2, - // networth: networth2, - // }, - // ]) - // }) - // }) + beforeEach(() => { + try { + if (db) { + db.close() + db.delete() + } + db = open({ + name: 'test', + }) + db.execute('DROP TABLE IF EXISTS User;') + db.execute( + 'CREATE TABLE User ( id INT PRIMARY KEY, name TEXT NOT NULL, age INT, networth REAL) STRICT;' + ) + } catch (e) { + console.warn('error on before each', e) + } + }) + describe('Raw queries', () => { + it('Insert', async () => { + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() + const res = db.execute( + 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + [id, name, age, networth] + ) + expect(res.rowsAffected).to.equal(1) + expect(res.insertId).to.equal(1) + expect(res.metadata).to.eql([]) + expect(res.rows?.data).to.eql([]) + expect(res.rows?.length).to.equal(0) + expect(res.rows?.item).to.be.a('function') + }) + it('Query without params', async () => { + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() + db.execute( + 'INSERT INTO User (id, name, age, networth) VALUES(?, ?, ?, ?)', + [id, name, age, networth] + ) + const res = db.execute('SELECT * FROM User') + expect(res.rowsAffected).to.equal(1) + expect(res.insertId).to.equal(1) + expect(res.rows?.data).to.eql([ + { + id, + name, + age, + networth, + }, + ]) + }) + it('Query with params', async () => { + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() + db.execute( + 'INSERT INTO User (id, name, age, networth) VALUES(?, ?, ?, ?)', + [id, name, age, networth] + ) + const res = db.execute('SELECT * FROM User WHERE id = ?', [id]) + expect(res.rowsAffected).to.equal(1) + expect(res.insertId).to.equal(1) + expect(res.rows?.data).to.eql([ + { + id, + name, + age, + networth, + }, + ]) + }) + it('Failed insert', async () => { + const id = chance.string() + const name = chance.name() + const age = chance.string() + const networth = chance.string() + // expect( + try { + db.execute( + 'INSERT INTO User (id, name, age, networth) VALUES(?, ?, ?, ?)', + [id, name, age, networth] + ) + } catch (e: any) { + expect(typeof e).to.equal('object') + expect(e.message).to.include( + `cannot store TEXT value in INT column User.id` + ) + } + }) + it('Transaction, auto commit', async () => { + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() + await db.transaction((tx) => { + const res = tx.execute( + 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + [id, name, age, networth] + ) + expect(res.rowsAffected).to.equal(1) + expect(res.insertId).to.equal(1) + expect(res.metadata).to.eql([]) + expect(res.rows?.data).to.eql([]) + expect(res.rows?.length).to.equal(0) + expect(res.rows?.item).to.be.a('function') + }) + const res = db.execute('SELECT * FROM User') + expect(res.rows?.data).to.eql([ + { + id, + name, + age, + networth, + }, + ]) + }) + it('Transaction, manual commit', async () => { + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() + await db.transaction((tx) => { + const res = tx.execute( + 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + [id, name, age, networth] + ) + expect(res.rowsAffected).to.equal(1) + expect(res.insertId).to.equal(1) + expect(res.metadata).to.eql([]) + expect(res.rows?.data).to.eql([]) + expect(res.rows?.length).to.equal(0) + expect(res.rows?.item).to.be.a('function') + tx.commit() + }) + const res = db.execute('SELECT * FROM User') + expect(res.rows?.data).to.eql([ + { + id, + name, + age, + networth, + }, + ]) + }) + it('Transaction, executed in order', async () => { + // ARRANGE: Setup for multiple transactions + const iterations = 10 + const actual: unknown[] = [] + // ARRANGE: Generate expected data + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + // ACT: Start multiple transactions to upsert and select the same record + const promises = [] + for (let iteration = 1; iteration <= iterations; iteration++) { + const promised = db.transaction((tx) => { + // ACT: Upsert statement to create record / increment the value + tx.execute( + ` + INSERT OR REPLACE INTO [User] ([id], [name], [age], [networth]) + SELECT ?, ?, ?, + IFNULL(( + SELECT [networth] + 1000 + FROM [User] + WHERE [id] = ? + ), 0) + `, + [id, name, age, id] + ) + // ACT: Select statement to get incremented value and store it for checking later + const results = tx.execute( + 'SELECT [networth] FROM [User] WHERE [id] = ?', + [id] + ) + + actual.push(results.rows?.data[0].networth) + }) + promises.push(promised) + } + // ACT: Wait for all transactions to complete + await Promise.all(promises) + // ASSERT: That the expected values where returned + const expected = Array(iterations) + .fill(0) + .map((_, index) => index * 1000) + expect(actual).to.eql( + expected, + 'Each transaction should read a different value' + ) + }) + it('Transaction, cannot execute after commit', async () => { + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() + await db.transaction((tx) => { + const res = tx.execute( + 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + [id, name, age, networth] + ) + expect(res.rowsAffected).to.equal(1) + expect(res.insertId).to.equal(1) + expect(res.metadata).to.eql([]) + expect(res.rows?.data).to.eql([]) + expect(res.rows?.length).to.equal(0) + expect(res.rows?.item).to.be.a('function') + tx.commit() + try { + tx.execute('SELECT * FROM "User"') + } catch (e) { + expect(!!e).to.equal(true) + } + }) + const res = db.execute('SELECT * FROM User') + expect(res.rows?.data).to.eql([ + { + id, + name, + age, + networth, + }, + ]) + }) + it('Incorrect transaction, manual rollback', async () => { + const id = chance.string() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() + await db.transaction((tx) => { + try { + tx.execute( + 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + [id, name, age, networth] + ) + } catch (e) { + tx.rollback() + } + }) + const res = db.execute('SELECT * FROM User') + expect(res.rows?.data).to.eql([]) + }) + it('Correctly throws', () => { + const id = chance.string() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() + try { + db.execute( + 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + [id, name, age, networth] + ) + } catch (e: any) { + expect(!!e).to.equal(true) + } + }) + it('Rollback', async () => { + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() + await db.transaction((tx) => { + tx.execute( + 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + [id, name, age, networth] + ) + tx.rollback() + const res = db.execute('SELECT * FROM User') + expect(res.rows?.data).to.eql([]) + }) + }) + it('Transaction, rejects on callback error', async () => { + const promised = db.transaction(() => { + throw new Error('Error from callback') + }) + // ASSERT: should return a promise that eventually rejects + expect(promised).to.have.property('then').that.is.a('function') + try { + await promised + expect.fail('Should not resolve') + } catch (e) { + expect(e).to.be.a.instanceof(Error) + expect((e as Error)?.message).to.equal('Error from callback') + } + }) + it('Transaction, rejects on invalid query', async () => { + const promised = db.transaction((tx) => { + console.log('execute bad start') + tx.execute('SELECT * FROM [tableThatDoesNotExist];') + console.log('execute bad done') + }) + // ASSERT: should return a promise that eventually rejects + expect(promised).to.have.property('then').that.is.a('function') + try { + await promised + expect.fail('Should not resolve') + } catch (e) { + expect(e).to.be.a.instanceof(Error) + expect((e as Error)?.message).to.include( + 'no such table: tableThatDoesNotExist' + ) + } + }) + it('Transaction, handle async callback', async () => { + let ranCallback = false + const promised = db.transaction(async (tx) => { + await new Promise((done) => { + setTimeout(() => done(), 50) + }) + tx.execute('SELECT * FROM [User];') + ranCallback = true + }) + // ASSERT: should return a promise that eventually rejects + expect(promised).to.have.property('then').that.is.a('function') + await promised + expect(ranCallback).to.equal(true, 'Should handle async callback') + }) + it('Async transaction, auto commit', async () => { + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() + await db.transaction(async (tx) => { + const res = await tx.executeAsync( + 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + [id, name, age, networth] + ) + expect(res.rowsAffected).to.equal(1) + expect(res.insertId).to.equal(1) + expect(res.metadata).to.eql([]) + expect(res.rows?.data).to.eql([]) + expect(res.rows?.length).to.equal(0) + expect(res.rows?.item).to.be.a('function') + }) + const res = db.execute('SELECT * FROM User') + expect(res.rows?.data).to.eql([ + { + id, + name, + age, + networth, + }, + ]) + }) + it('Async transaction, auto rollback', async () => { + const id = chance.string() // Causes error because it should be an integer + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() + try { + await db.transaction(async (tx) => { + await tx.executeAsync( + 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + [id, name, age, networth] + ) + }) + } catch (error) { + expect(error).to.be.instanceOf(Error) + expect((error as Error).message) + .to.include('SQL execution error') + .and.to.include('cannot store TEXT value in INT column User.id') + const res = db.execute('SELECT * FROM User') + expect(res.rows?.data).to.eql([]) + } + }) + it('Async transaction, manual commit', async () => { + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() + await db.transaction(async (tx) => { + await tx.executeAsync( + 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + [id, name, age, networth] + ) + tx.commit() + }) + const res = db.execute('SELECT * FROM User') + expect(res.rows?.data).to.eql([ + { + id, + name, + age, + networth, + }, + ]) + }) + it('Async transaction, manual rollback', async () => { + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + const networth = chance.floating() + await db.transaction(async (tx) => { + await tx.executeAsync( + 'INSERT INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + [id, name, age, networth] + ) + tx.rollback() + }) + const res = db.execute('SELECT * FROM User') + expect(res.rows?.data).to.eql([]) + }) + it('Async transaction, executed in order', async () => { + // ARRANGE: Setup for multiple transactions + const iterations = 10 + const actual: unknown[] = [] + // ARRANGE: Generate expected data + const id = chance.integer() + const name = chance.name() + const age = chance.integer() + // ACT: Start multiple async transactions to upsert and select the same record + const promises = [] + for (let iteration = 1; iteration <= iterations; iteration++) { + const promised = db.transaction(async (tx) => { + // ACT: Upsert statement to create record / increment the value + await tx.executeAsync( + ` + INSERT OR REPLACE INTO [User] ([id], [name], [age], [networth]) + SELECT ?, ?, ?, + IFNULL(( + SELECT [networth] + 1000 + FROM [User] + WHERE [id] = ? + ), 0) + `, + [id, name, age, id] + ) + // ACT: Select statement to get incremented value and store it for checking later + const results = await tx.executeAsync( + 'SELECT [networth] FROM [User] WHERE [id] = ?', + [id] + ) + actual.push(results.rows?.data[0].networth) + }) + promises.push(promised) + } + // ACT: Wait for all transactions to complete + await Promise.all(promises) + // ASSERT: That the expected values where returned + const expected = Array(iterations) + .fill(0) + .map((_, index) => index * 1000) + expect(actual).to.eql( + expected, + 'Each transaction should read a different value' + ) + }) + it('Async transaction, rejects on callback error', async () => { + const promised = db.transaction(async () => { + throw new Error('Error from callback') + }) + // ASSERT: should return a promise that eventually rejects + expect(promised).to.have.property('then').that.is.a('function') + try { + await promised + expect.fail('Should not resolve') + } catch (e) { + expect(e).to.be.a.instanceof(Error) + expect((e as Error)?.message).to.equal('Error from callback') + } + }) + it('Async transaction, rejects on invalid query', async () => { + const promised = db.transaction(async (tx) => { + await tx.executeAsync('SELECT * FROM [tableThatDoesNotExist];') + }) + // ASSERT: should return a promise that eventually rejects + expect(promised).to.have.property('then').that.is.a('function') + try { + await promised + expect.fail('Should not resolve') + } catch (e) { + expect(e).to.be.a.instanceof(Error) + expect((e as Error)?.message).to.include( + 'no such table: tableThatDoesNotExist' + ) + } + }) + it('Batch execute', () => { + const id1 = chance.integer() + const name1 = chance.name() + const age1 = chance.integer() + const networth1 = chance.floating() + const id2 = chance.integer() + const name2 = chance.name() + const age2 = chance.integer() + const networth2 = chance.floating() + 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], + }, + ] + db.executeBatch(commands) + const res = db.execute('SELECT * FROM User') + expect(res.rows?.data).to.eql([ + { id: id1, name: name1, age: age1, networth: networth1 }, + { + id: id2, + name: name2, + age: age2, + networth: networth2, + }, + ]) + }) + it('Async batch execute', async () => { + const id1 = chance.integer() + const name1 = chance.name() + const age1 = chance.integer() + const networth1 = chance.floating() + const id2 = chance.integer() + const name2 = chance.name() + const age2 = chance.integer() + const networth2 = chance.floating() + 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 db.executeBatchAsync(commands) + const res = db.execute('SELECT * FROM User') + expect(res.rows?.data).to.eql([ + { id: id1, name: name1, age: age1, networth: networth1 }, + { + id: id2, + name: name2, + age: age2, + networth: networth2, + }, + ]) + }) + }) } From a8533d455655ab6b708e58534001f92758797cde Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 11 Sep 2024 13:07:54 +0200 Subject: [PATCH 074/156] update specs --- .../android/RNQuickSQLite+autolinking.cmake | 1 + .../ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 28 ++++++++ .../ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp | 11 ++- nitrogen/generated/shared/c++/ColumnType.hpp | 70 +++++++++++++++++++ .../shared/c++/HybridColumnMetadataSpec.cpp | 27 +++++++ .../shared/c++/HybridColumnMetadataSpec.hpp | 67 ++++++++++++++++++ .../c++/HybridSelectQueryResultSpec.hpp | 11 +-- .../generated/shared/c++/TableMetadata.hpp | 69 ------------------ src/index.ts | 15 ++-- src/specs/ColumnMetadata.nitro.ts | 16 +++++ src/specs/SelectQueryResult.nitro.ts | 10 ++- src/types.ts | 33 +++------ 12 files changed, 247 insertions(+), 111 deletions(-) create mode 100644 nitrogen/generated/shared/c++/ColumnType.hpp create mode 100644 nitrogen/generated/shared/c++/HybridColumnMetadataSpec.cpp create mode 100644 nitrogen/generated/shared/c++/HybridColumnMetadataSpec.hpp delete mode 100644 nitrogen/generated/shared/c++/TableMetadata.hpp create mode 100644 src/specs/ColumnMetadata.nitro.ts diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake index 2d4708e7..07adcb4a 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake @@ -25,6 +25,7 @@ target_sources( # CMake project name (Android C++ library name) RNQuickSQLite PRIVATE # Shared Nitrogen C++ sources + ../nitrogen/generated/shared/c++/HybridColumnMetadataSpec.cpp ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp ../nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp # Android-specific Nitrogen C++ sources diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index 3fe3192f..f6007c5d 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -19,6 +19,10 @@ namespace margelo::nitro::rnquicksqlite { struct BatchQueryCommand; } namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } // Forward declaration of `FileLoadResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } +// Forward declaration of `HybridColumnMetadataSpecSwift` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { class HybridColumnMetadataSpecSwift; } +// Forward declaration of `HybridColumnMetadataSpec` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { class HybridColumnMetadataSpec; } // Forward declaration of `HybridSelectQueryResultSpecSwift` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpecSwift; } // Forward declaration of `HybridSelectQueryResultSpec` to properly resolve imports. @@ -38,6 +42,12 @@ namespace margelo::nitro::rnquicksqlite { enum class QueryType; } #if __has_include("FileLoadResult.hpp") #include "FileLoadResult.hpp" #endif +#if __has_include("HybridColumnMetadataSpec.hpp") + #include "HybridColumnMetadataSpec.hpp" +#endif +#if __has_include("HybridColumnMetadataSpecSwift.hpp") + #include "HybridColumnMetadataSpecSwift.hpp" +#endif #if __has_include("HybridSelectQueryResultSpec.hpp") #include "HybridSelectQueryResultSpec.hpp" #endif @@ -260,5 +270,23 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { vector.reserve(size); return vector; } + + /** + * Specialized version of `std::unordered_map>`. + */ + using std__unordered_map_std__string__std__shared_ptr_margelo__nitro__rnquicksqlite__HybridColumnMetadataSpec__ = std::unordered_map>; + inline std::unordered_map> create_std__unordered_map_std__string__std__shared_ptr_margelo__nitro__rnquicksqlite__HybridColumnMetadataSpec__(size_t size) { + std::unordered_map> map; + map.reserve(size); + return map; + } + inline std::vector get_std__unordered_map_std__string__std__shared_ptr_margelo__nitro__rnquicksqlite__HybridColumnMetadataSpec___keys(const std__unordered_map_std__string__std__shared_ptr_margelo__nitro__rnquicksqlite__HybridColumnMetadataSpec__& map) { + std::vector keys; + keys.reserve(map.size()); + for (const auto& entry : map) { + keys.push_back(entry.first); + } + return keys; + } } // namespace margelo::nitro::rnquicksqlite::bridge::swift diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp index beb1254f..3850237f 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp @@ -15,25 +15,28 @@ namespace NitroModules { class ArrayBuffer; } namespace margelo::nitro::rnquicksqlite { struct BatchQueryCommand; } // Forward declaration of `BatchQueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } +// Forward declaration of `ColumnType` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { enum class ColumnType; } // Forward declaration of `FileLoadResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } +// Forward declaration of `HybridColumnMetadataSpec` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { class HybridColumnMetadataSpec; } // Forward declaration of `HybridSelectQueryResultSpec` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } // Forward declaration of `NativeQueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct NativeQueryResult; } // Forward declaration of `QueryType` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { enum class QueryType; } -// Forward declaration of `TableMetadata` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct TableMetadata; } // Include C++ defined types #include "BatchQueryCommand.hpp" #include "BatchQueryResult.hpp" +#include "ColumnType.hpp" #include "FileLoadResult.hpp" +#include "HybridColumnMetadataSpec.hpp" #include "HybridSelectQueryResultSpec.hpp" #include "NativeQueryResult.hpp" #include "QueryType.hpp" -#include "TableMetadata.hpp" #include #include #include @@ -53,6 +56,8 @@ namespace margelo::nitro::rnquicksqlite { struct TableMetadata; } #include // Forward declarations of Swift defined types +// Forward declaration of `HybridColumnMetadataSpecCxx` to properly resolve imports. +namespace RNQuickSQLite { class HybridColumnMetadataSpecCxx; } // Forward declaration of `HybridSelectQueryResultSpecCxx` to properly resolve imports. namespace RNQuickSQLite { class HybridSelectQueryResultSpecCxx; } diff --git a/nitrogen/generated/shared/c++/ColumnType.hpp b/nitrogen/generated/shared/c++/ColumnType.hpp new file mode 100644 index 00000000..04ba15a6 --- /dev/null +++ b/nitrogen/generated/shared/c++/ColumnType.hpp @@ -0,0 +1,70 @@ +/// +/// ColumnType.hpp +/// Wed Sep 11 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#include +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +namespace margelo::nitro::rnquicksqlite { + + /** + * An enum which can be represented as a JavaScript enum (ColumnType). + */ + enum class ColumnType { + BOOLEAN SWIFT_NAME(boolean) = 0, + NUMBER SWIFT_NAME(number) = 1, + INT64 SWIFT_NAME(int64) = 2, + TEXT SWIFT_NAME(text) = 3, + ARRAY_BUFFER SWIFT_NAME(arrayBuffer) = 4, + NULL SWIFT_NAME(null) = 5, + UNKNOWN SWIFT_NAME(unknown) = 6, + } CLOSED_ENUM; + +} // namespace margelo::nitro::rnquicksqlite + +namespace margelo::nitro { + + using namespace margelo::nitro::rnquicksqlite; + + // C++ ColumnType <> JS ColumnType (enum) + template <> + struct JSIConverter { + static inline ColumnType fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + int enumValue = JSIConverter::fromJSI(runtime, arg); + return static_cast(enumValue); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, ColumnType arg) { + int enumValue = static_cast(arg); + return JSIConverter::toJSI(runtime, enumValue); + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isNumber()) { + return false; + } + double integer; + double fraction = modf(value.getNumber(), &integer); + if (fraction != 0.0) { + // It is some kind of floating point number - our enums are ints. + return false; + } + // Check if we are within the bounds of the enum. + return integer >= 0 && integer <= 6; + } + }; + +} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/HybridColumnMetadataSpec.cpp b/nitrogen/generated/shared/c++/HybridColumnMetadataSpec.cpp new file mode 100644 index 00000000..7824b9dc --- /dev/null +++ b/nitrogen/generated/shared/c++/HybridColumnMetadataSpec.cpp @@ -0,0 +1,27 @@ +/// +/// HybridColumnMetadataSpec.cpp +/// Wed Sep 11 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#include "HybridColumnMetadataSpec.hpp" + +namespace margelo::nitro::rnquicksqlite { + + void HybridColumnMetadataSpec::loadHybridMethods() { + // load base methods/properties + HybridObject::loadHybridMethods(); + // load custom methods/properties + registerHybrids(this, [](Prototype& prototype) { + prototype.registerHybridGetter("name", &HybridColumnMetadataSpec::getName); + prototype.registerHybridSetter("name", &HybridColumnMetadataSpec::setName); + prototype.registerHybridGetter("type", &HybridColumnMetadataSpec::getType); + prototype.registerHybridSetter("type", &HybridColumnMetadataSpec::setType); + prototype.registerHybridGetter("index", &HybridColumnMetadataSpec::getIndex); + prototype.registerHybridSetter("index", &HybridColumnMetadataSpec::setIndex); + }); + } + +} // namespace margelo::nitro::rnquicksqlite diff --git a/nitrogen/generated/shared/c++/HybridColumnMetadataSpec.hpp b/nitrogen/generated/shared/c++/HybridColumnMetadataSpec.hpp new file mode 100644 index 00000000..a3dc5179 --- /dev/null +++ b/nitrogen/generated/shared/c++/HybridColumnMetadataSpec.hpp @@ -0,0 +1,67 @@ +/// +/// HybridColumnMetadataSpec.hpp +/// Wed Sep 11 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +// Forward declaration of `ColumnType` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { enum class ColumnType; } + +#include +#include "ColumnType.hpp" + +namespace margelo::nitro::rnquicksqlite { + + using namespace margelo::nitro; + + /** + * An abstract base class for `ColumnMetadata` + * Inherit this class to create instances of `HybridColumnMetadataSpec` in C++. + * @example + * ```cpp + * class HybridColumnMetadata: public HybridColumnMetadataSpec { + * // ... + * }; + * ``` + */ + class HybridColumnMetadataSpec: public virtual HybridObject { + public: + // Constructor + explicit HybridColumnMetadataSpec(): HybridObject(TAG) { } + + // Destructor + virtual ~HybridColumnMetadataSpec() { } + + public: + // Properties + virtual std::string getName() = 0; + virtual void setName(const std::string& name) = 0; + virtual ColumnType getType() = 0; + virtual void setType(ColumnType type) = 0; + virtual double getIndex() = 0; + virtual void setIndex(double index) = 0; + + public: + // Methods + + + protected: + // Hybrid Setup + void loadHybridMethods() override; + + protected: + // Tag for logging + static constexpr auto TAG = "ColumnMetadata"; + }; + +} // namespace margelo::nitro::rnquicksqlite diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp index 7ad59d50..e74ee935 100644 --- a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp @@ -16,15 +16,16 @@ // Forward declaration of `ArrayBuffer` to properly resolve imports. namespace NitroModules { class ArrayBuffer; } -// Forward declaration of `TableMetadata` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { struct TableMetadata; } +// Forward declaration of `HybridColumnMetadataSpec` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { class HybridColumnMetadataSpec; } #include #include #include #include #include -#include "TableMetadata.hpp" +#include +#include "HybridColumnMetadataSpec.hpp" namespace margelo::nitro::rnquicksqlite { @@ -52,8 +53,8 @@ namespace margelo::nitro::rnquicksqlite { // Properties virtual std::vector>>> getResults() = 0; virtual void setResults(const std::vector>>>& results) = 0; - virtual TableMetadata getMetadata() = 0; - virtual void setMetadata(const TableMetadata& metadata) = 0; + virtual std::unordered_map> getMetadata() = 0; + virtual void setMetadata(const std::unordered_map>& metadata) = 0; public: // Methods diff --git a/nitrogen/generated/shared/c++/TableMetadata.hpp b/nitrogen/generated/shared/c++/TableMetadata.hpp deleted file mode 100644 index d2e02ba1..00000000 --- a/nitrogen/generated/shared/c++/TableMetadata.hpp +++ /dev/null @@ -1,69 +0,0 @@ -/// -/// TableMetadata.hpp -/// Wed Sep 11 2024 -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - - - - - -namespace margelo::nitro::rnquicksqlite { - - /** - * A struct which can be represented as a JavaScript object (TableMetadata). - */ - struct TableMetadata { - public: - - - public: - explicit TableMetadata(): {} - }; - -} // namespace margelo::nitro::rnquicksqlite - -namespace margelo::nitro { - - using namespace margelo::nitro::rnquicksqlite; - - // C++ TableMetadata <> JS TableMetadata (object) - template <> - struct JSIConverter { - static inline TableMetadata fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { - jsi::Object obj = arg.asObject(runtime); - return TableMetadata( - - ); - } - static inline jsi::Value toJSI(jsi::Runtime& runtime, const TableMetadata& arg) { - jsi::Object obj(runtime); - - return obj; - } - static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { - if (!value.isObject()) { - return false; - } - jsi::Object obj = value.getObject(runtime); - - return true; - } - }; - -} // namespace margelo::nitro diff --git a/src/index.ts b/src/index.ts index 069becc6..f3e2c89d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,6 +8,7 @@ import { Transaction, SQLiteItem, NativeQueryResult, + ColumnType, } from './types' export * from './types' @@ -46,25 +47,25 @@ const buildJsQueryResult = ( for (let key in row) { switch (metadata[key].type) { - case 'BOOLEAN': + case ColumnType.BOOLEAN: item[key] = row[key] as boolean break - case 'NUMBER': + case ColumnType.NUMBER: item[key] = row[key] as number break - case 'INT64': + case ColumnType.INT64: item[key] = row[key] as bigint break - case 'TEXT': + case ColumnType.TEXT: item[key] = row[key] as string break - case 'ARRAY_BUFFER': + case ColumnType.ARRAY_BUFFER: item[key] = row[key] as ArrayBuffer break - case 'NULL': + case ColumnType.NULL: item[key] = null break - case 'UNKNOWN': + case ColumnType.UNKNOWN: default: item[key] = row[key] as unknown } diff --git a/src/specs/ColumnMetadata.nitro.ts b/src/specs/ColumnMetadata.nitro.ts new file mode 100644 index 00000000..11dae3b6 --- /dev/null +++ b/src/specs/ColumnMetadata.nitro.ts @@ -0,0 +1,16 @@ +import { HybridObject } from 'react-native-nitro-modules' +import { ColumnType } from '../types' + +/** + * Column metadata + * Describes a column in table fetched by a select query + */ +export interface ColumnMetadata + extends HybridObject<{ ios: 'c++'; android: 'c++' }> { + /** The name used for this column for this result set */ + name: string + /** The declared column type for this column, when fetched directly from a table or a View resulting from a table column. "UNKNOWN" for dynamic values, like function returned ones. */ + type: ColumnType + /** The index for this column for this result set */ + index: number +} diff --git a/src/specs/SelectQueryResult.nitro.ts b/src/specs/SelectQueryResult.nitro.ts index c0405d75..e47a598b 100644 --- a/src/specs/SelectQueryResult.nitro.ts +++ b/src/specs/SelectQueryResult.nitro.ts @@ -1,11 +1,15 @@ import { HybridObject } from 'react-native-nitro-modules' -import { SQLiteValue, TableMetadata } from '../types' +import { SQLiteValue } from '../types' +import { ColumnMetadata } from './ColumnMetadata.nitro' export interface SelectQueryResult extends HybridObject<{ ios: 'c++'; android: 'c++' }> { + /** Select query results */ results: Record[] /** - * Query metadata, avaliable only for select query results + * Table metadata + * Describes some information about the table and it's columns fetched by the query + * The index is the name of the column */ - metadata: TableMetadata + metadata: Record } diff --git a/src/types.ts b/src/types.ts index 55aed11b..70e7c9e0 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,3 +1,4 @@ +import { ColumnMetadata } from './specs/ColumnMetadata.nitro' import { SelectQueryResult } from './specs/SelectQueryResult.nitro' /** @@ -44,30 +45,14 @@ export interface QueryResult { export type QueryType = 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE' | 'OTHER' -type ColumnType = - | 'BOOLEAN' - | 'NUMBER' - | 'INT64' - | 'TEXT' - | 'ARRAY_BUFFER' - | 'NULL' - | 'UNKNOWN' - -export type ColumnMetadata = { - /** The declared column type for this column, when fetched directly from a table or a View resulting from a table column. "UNKNOWN" for dynamic values, like function returned ones. */ - type: ColumnType - /** - * The index for this column for this result set*/ - index: number -} - -/** - * Column metadata - * Describes some information about columns fetched by the query - * The index is the name used for this column for this resultset - */ -export interface TableMetadata { - [key: string]: ColumnMetadata +export enum ColumnType { + BOOLEAN, + NUMBER, + INT64, + TEXT, + ARRAY_BUFFER, + NULL, + UNKNOWN, } /** From 00fa0afaca8b5d60476cbf7d210c9ad5bff3ed77 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 11 Sep 2024 13:50:27 +0200 Subject: [PATCH 075/156] fix: simplify cpp and add ColumnMetadata hybrid object --- cpp/OnLoad.cpp | 9 ++---- cpp/Types.hpp | 11 +++++-- cpp/specs/HybridColumnMetadata.cpp | 31 ++++++++++++++++++++ cpp/specs/HybridColumnMetadata.hpp | 30 +++++++++++++++++++ cpp/specs/HybridQuickSQLite.cpp | 10 +++---- cpp/specs/HybridSelectQueryResult.cpp | 10 +++---- cpp/specs/HybridSelectQueryResult.hpp | 14 ++++----- cpp/sqlbatchexecutor.cpp | 6 ++-- cpp/sqlbatchexecutor.h | 2 +- cpp/sqliteBridge.cpp | 11 +++---- cpp/sqliteBridge.h | 5 +--- nitrogen/generated/shared/c++/ColumnType.hpp | 2 +- src/index.ts | 2 +- src/types.ts | 2 +- 14 files changed, 104 insertions(+), 41 deletions(-) create mode 100644 cpp/specs/HybridColumnMetadata.cpp create mode 100644 cpp/specs/HybridColumnMetadata.hpp diff --git a/cpp/OnLoad.cpp b/cpp/OnLoad.cpp index 3d5f90fa..4b0b5824 100644 --- a/cpp/OnLoad.cpp +++ b/cpp/OnLoad.cpp @@ -6,17 +6,14 @@ using namespace margelo::nitro; using namespace margelo::rnquicksqlite; void clearState() { - sqliteCloseAll(); + sqliteCloseAll(); } // Call this at app startup to register the HybridObjects void registerHybridObjectConstructors() { - HybridObjectRegistry::registerHybridObjectConstructor("QuickSQLite", []() -> std::shared_ptr { - return std::make_shared(); + HybridObjectRegistry::registerHybridObjectConstructor("QuickSQLite", []() -> std::shared_ptr { + return std::make_shared(); }); -// HybridObjectRegistry::registerHybridObjectConstructor("SelectQueryResult", []() -> std::shared_ptr { -// return std::make_shared(); -// }); } // OnLoad::OnLoad() { diff --git a/cpp/Types.hpp b/cpp/Types.hpp index ab21d877..c4e9d13c 100644 --- a/cpp/Types.hpp +++ b/cpp/Types.hpp @@ -3,8 +3,12 @@ #include #include "ArrayBuffer.hpp" #include "ColumnType.hpp" +#include "HybridColumnMetadata.hpp" -namespace margelo::nitro::rnquicksqlite { +using namespace margelo::nitro; +using namespace margelo::nitro::rnquicksqlite; + +namespace margelo::rnquicksqlite { /** * Various structs to help with the results of the SQLite operations @@ -40,6 +44,9 @@ struct SequelBatchOperationResult // using SQLiteValue = std::variant, std::monostate>; using SQLiteValue = std::variant>; +using SQLiteParams = std::vector; +using TableResults = std::vector>; +using TableMetadata = std::unordered_map>; // constexpr function that maps SQLiteColumnType to string literals constexpr ColumnType mapSQLiteTypeToColumnType(std::string type) { @@ -54,7 +61,7 @@ constexpr ColumnType mapSQLiteTypeToColumnType(std::string type) { } else if (type == "BLOB") { return ColumnType::ARRAY_BUFFER; } else if (type == "NULL") { - return ColumnType::NULL; + return ColumnType::NULL_VALUE; } else { return ColumnType::UNKNOWN; } diff --git a/cpp/specs/HybridColumnMetadata.cpp b/cpp/specs/HybridColumnMetadata.cpp new file mode 100644 index 00000000..d534570c --- /dev/null +++ b/cpp/specs/HybridColumnMetadata.cpp @@ -0,0 +1,31 @@ +#include "HybridColumnMetadata.hpp" + +namespace margelo::rnquicksqlite { + +HybridColumnMetadata::HybridColumnMetadata(std::string&& name, ColumnType&& type, double index) + : HybridColumnMetadataSpec(), _name(std::move(name)), _type(std::move(type)), _index(index) {} + +std::string HybridColumnMetadata::getName() { + return this->_name; +}; + +void HybridColumnMetadata::setName(const std::string& name) { + this->_name = name; +}; +ColumnType HybridColumnMetadata::getType() { + return this->_type; +}; + +void HybridColumnMetadata::setType(ColumnType type) { + this->_type = type; +}; + +double HybridColumnMetadata::getIndex() { + return this->_index; +}; + +void HybridColumnMetadata::setIndex(double index) { + this->_index = index; +}; + +} diff --git a/cpp/specs/HybridColumnMetadata.hpp b/cpp/specs/HybridColumnMetadata.hpp new file mode 100644 index 00000000..841c64bd --- /dev/null +++ b/cpp/specs/HybridColumnMetadata.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include +#include "HybridColumnMetadataSpec.hpp" +#include "Types.hpp" + +using namespace margelo::nitro::rnquicksqlite; + +namespace margelo::rnquicksqlite { + +class HybridColumnMetadata: public HybridColumnMetadataSpec { +public: + HybridColumnMetadata(std::string&& name, ColumnType&& type, double index); + +public: + // Properties + std::string getName() override; + void setName(const std::string& name) override; + ColumnType getType() override; + void setType(ColumnType type) override; + double getIndex() override; + void setIndex(double index) override; + +private: + std::string _name; + ColumnType _type; + double _index; +}; + +} diff --git a/cpp/specs/HybridQuickSQLite.cpp b/cpp/specs/HybridQuickSQLite.cpp index b62e6cb3..d7f2b8b4 100644 --- a/cpp/specs/HybridQuickSQLite.cpp +++ b/cpp/specs/HybridQuickSQLite.cpp @@ -79,9 +79,9 @@ void HybridQuickSQLite::detach(const std::string& mainDbName, const std::string& } }; -NativeQueryResult HybridQuickSQLite::execute(const std::string& dbName, const std::string& query, const std::optional>& params) { - auto results = std::vector>(); - auto metadata = std::optional>(std::nullopt); +NativeQueryResult HybridQuickSQLite::execute(const std::string& dbName, const std::string& query, const std::optional& params) { + auto results = TableResults(); + auto metadata = std::optional(std::nullopt); // Converting results into a JSI Response try { @@ -93,7 +93,7 @@ NativeQueryResult HybridQuickSQLite::execute(const std::string& dbName, const st if (metadata) { const auto selectQueryResult = std::make_shared(std::move(results), std::move(*metadata)); - return QueryResult(QueryType::SELECT, status.insertId, status.rowsAffected, selectQueryResult); + return NativeQueryResult(QueryType::SELECT, status.insertId, status.rowsAffected, selectQueryResult); } return NativeQueryResult(QueryType::SELECT, status.insertId, status.rowsAffected, std::nullopt); @@ -102,7 +102,7 @@ NativeQueryResult HybridQuickSQLite::execute(const std::string& dbName, const st } }; -std::future HybridQuickSQLite::executeAsync(const std::string& dbName, const std::string& query, const std::optional>& params) { +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(); diff --git a/cpp/specs/HybridSelectQueryResult.cpp b/cpp/specs/HybridSelectQueryResult.cpp index 7b7c3008..633046d7 100644 --- a/cpp/specs/HybridSelectQueryResult.cpp +++ b/cpp/specs/HybridSelectQueryResult.cpp @@ -2,22 +2,22 @@ namespace margelo::rnquicksqlite { -HybridSelectQueryResult::HybridSelectQueryResult(std::vector>&& results, std::vector&& metadata) +HybridSelectQueryResult::HybridSelectQueryResult(TableResults&& results, TableMetadata&& metadata) : HybridSelectQueryResultSpec(), _results(std::move(results)), _metadata(std::move(metadata)) {} -std::vector> HybridSelectQueryResult::getResults() { +TableResults HybridSelectQueryResult::getResults() { return this->_results; }; -void HybridSelectQueryResult::setResults(const std::vector>& results) { +void HybridSelectQueryResult::setResults(const TableResults& results) { this->_results = results; }; -std::vector HybridSelectQueryResult::getMetadata() { +TableMetadata HybridSelectQueryResult::getMetadata() { return this->_metadata; } -void HybridSelectQueryResult::setMetadata(const std::vector& metadata) { +void HybridSelectQueryResult::setMetadata(const TableMetadata& metadata) { this->_metadata = metadata; } diff --git a/cpp/specs/HybridSelectQueryResult.hpp b/cpp/specs/HybridSelectQueryResult.hpp index c9b8c52a..513811db 100644 --- a/cpp/specs/HybridSelectQueryResult.hpp +++ b/cpp/specs/HybridSelectQueryResult.hpp @@ -10,18 +10,18 @@ namespace margelo::rnquicksqlite { class HybridSelectQueryResult: public HybridSelectQueryResultSpec { public: - HybridSelectQueryResult(std::vector>&& results, std::vector&& metadata); + HybridSelectQueryResult(TableResults&& results, TableMetadata&& metadata); public: // Properties - std::vector> getResults() override; - void setResults(const std::vector>& results) override; - std::vector getMetadata() override; - void setMetadata(const std::vector& metadata) override; + TableResults getResults() override; + void setResults(const TableResults& results) override; + TableMetadata getMetadata() override; + void setMetadata(const TableMetadata& metadata) override; private: - std::vector> _results; - std::vector _metadata; + TableResults _results; + TableMetadata _metadata; }; } diff --git a/cpp/sqlbatchexecutor.cpp b/cpp/sqlbatchexecutor.cpp index df7fd228..c14415bf 100644 --- a/cpp/sqlbatchexecutor.cpp +++ b/cpp/sqlbatchexecutor.cpp @@ -15,7 +15,7 @@ std::vector batchParamsToCommands(const std::vector; + using ParamsVec = SQLiteParams; using NestedParamsVec = std::vector; if (std::holds_alternative(*command.params)) { @@ -67,8 +67,8 @@ SequelBatchOperationResult sqliteExecuteBatch(const std::string& dbName, const s const auto command = commands.at(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 results = std::vector>(); - auto metadata = std::optional>(std::nullopt); + auto results = TableResults(); + auto metadata = std::optional(std::nullopt); auto result = sqliteExecute(dbName, command.sql, *command.params.get(), results, metadata); if(result.type == SQLiteError) { diff --git a/cpp/sqlbatchexecutor.h b/cpp/sqlbatchexecutor.h index f67a69fd..225c8d11 100644 --- a/cpp/sqlbatchexecutor.h +++ b/cpp/sqlbatchexecutor.h @@ -13,7 +13,7 @@ namespace margelo::rnquicksqlite { struct BatchQuery { std::string sql; - std::shared_ptr> params; + std::shared_ptr params; }; /** diff --git a/cpp/sqliteBridge.cpp b/cpp/sqliteBridge.cpp index 5b4ba083..ddc4d03f 100644 --- a/cpp/sqliteBridge.cpp +++ b/cpp/sqliteBridge.cpp @@ -7,6 +7,7 @@ #include #include #include "sqliteBridge.h" +#include "HybridColumnMetadata.hpp" #include "logs.h" #include "ArrayBuffer.hpp" @@ -202,7 +203,7 @@ SQLiteOPResult sqliteRemoveDb(const std::string& dbName, const std::string& docP }; } -void bindStatement(sqlite3_stmt *statement, const std::vector& values) +void bindStatement(sqlite3_stmt *statement, const SQLiteParams& values) { size_t size = values.size(); if (size <= 0) @@ -250,7 +251,7 @@ void bindStatement(sqlite3_stmt *statement, const std::vector& valu } } -SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional>& params, std::vector>& results, std::optional>& metadata) +SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional& params, TableResults& results, std::optional& metadata) { if (dbMap.count(dbName) == 0) { @@ -349,7 +350,7 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query break; case SQLITE_DONE: if (!metadata) { - metadata = std::vector(); + metadata = TableMetadata(); } if (metadata) { @@ -360,8 +361,8 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query column_name = sqlite3_column_name(statement, i); const char *tp = sqlite3_column_decltype(statement, i); column_declared_type = mapSQLiteTypeToColumnType(tp); - auto columnMeta = ColumnMetadata(column_name, column_declared_type, i); - metadata->push_back(std::move(columnMeta)); + auto columnMeta = std::make_shared(std::move(column_name), std::move(column_declared_type), i); + metadata->insert({column_name, columnMeta}); i++; } isConsuming = false; diff --git a/cpp/sqliteBridge.h b/cpp/sqliteBridge.h index 01ff7e26..c97d6a6d 100644 --- a/cpp/sqliteBridge.h +++ b/cpp/sqliteBridge.h @@ -1,10 +1,7 @@ #pragma once -#include "TableMetadata.hpp" #include "Types.hpp" -using namespace margelo::nitro::rnquicksqlite; - namespace margelo::rnquicksqlite { SQLiteOPResult sqliteOpenDb(const std::string& dbName, const std::string& docPath); @@ -17,7 +14,7 @@ SQLiteOPResult sqliteAttachDb(const std::string& mainDBName, const std::string& SQLiteOPResult sqliteDetachDb(const std::string& mainDBName, const std::string& alias); -SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional>& params, std::vector>& results, std::optional>& metadata); +SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query, const std::optional& params, TableResults& results, std::optional& metadata); SequelLiteralUpdateResult sqliteExecuteLiteral(const std::string& dbName, const std::string& query); diff --git a/nitrogen/generated/shared/c++/ColumnType.hpp b/nitrogen/generated/shared/c++/ColumnType.hpp index 04ba15a6..a48ae0cb 100644 --- a/nitrogen/generated/shared/c++/ColumnType.hpp +++ b/nitrogen/generated/shared/c++/ColumnType.hpp @@ -31,7 +31,7 @@ namespace margelo::nitro::rnquicksqlite { INT64 SWIFT_NAME(int64) = 2, TEXT SWIFT_NAME(text) = 3, ARRAY_BUFFER SWIFT_NAME(arrayBuffer) = 4, - NULL SWIFT_NAME(null) = 5, + NULL_VALUE SWIFT_NAME(nullValue) = 5, UNKNOWN SWIFT_NAME(unknown) = 6, } CLOSED_ENUM; diff --git a/src/index.ts b/src/index.ts index f3e2c89d..c2e92ad0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -62,7 +62,7 @@ const buildJsQueryResult = ( case ColumnType.ARRAY_BUFFER: item[key] = row[key] as ArrayBuffer break - case ColumnType.NULL: + case ColumnType.NULL_VALUE: item[key] = null break case ColumnType.UNKNOWN: diff --git a/src/types.ts b/src/types.ts index 70e7c9e0..2a8697d9 100644 --- a/src/types.ts +++ b/src/types.ts @@ -51,7 +51,7 @@ export enum ColumnType { INT64, TEXT, ARRAY_BUFFER, - NULL, + NULL_VALUE, UNKNOWN, } From c9152a5999e86fc11a03d2963ff21cc7bc81f9f0 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 11 Sep 2024 13:50:34 +0200 Subject: [PATCH 076/156] add clang format script --- scripts/clang-format.sh | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 scripts/clang-format.sh diff --git a/scripts/clang-format.sh b/scripts/clang-format.sh new file mode 100644 index 00000000..b0d3cf7a --- /dev/null +++ b/scripts/clang-format.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +CPP_DIRS=( + "cpp" +) + +if which clang-format >/dev/null; then + DIRS=$(printf "%s " "${CPP_DIRS[@]}") + find $DIRS -type f \( -name "*.h" -o -name "*.hpp" -o -name "*.cpp" -o -name "*.m" -o -name "*.mm" -o -name "*.c" \) -print0 | while read -d $'\0' file; do + clang-format -style=file:./.clang-format -i "$file" + done +else + echo "error: clang-format not installed, install with 'brew install clang-format' (or manually from https://clang.llvm.org/docs/ClangFormat.html)" + exit 1 +fi From 4435d710c4f1ec4bf8f26abb55113cc18d4d6ac0 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 11 Sep 2024 15:20:23 +0200 Subject: [PATCH 077/156] simplify spec --- cpp/Types.hpp | 3 +- cpp/specs/HybridColumnMetadata.cpp | 31 -------- cpp/specs/HybridColumnMetadata.hpp | 30 ------- cpp/sqliteBridge.cpp | 2 +- .../android/RNQuickSQLite+autolinking.cmake | 1 - .../ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 30 +++---- .../ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp | 8 +- .../generated/shared/c++/ColumnMetadata.hpp | 79 +++++++++++++++++++ .../shared/c++/HybridColumnMetadataSpec.cpp | 27 ------- .../shared/c++/HybridColumnMetadataSpec.hpp | 67 ---------------- .../c++/HybridSelectQueryResultSpec.hpp | 11 ++- src/specs/ColumnMetadata.nitro.ts | 16 ---- src/specs/SelectQueryResult.nitro.ts | 25 ++++-- 13 files changed, 123 insertions(+), 207 deletions(-) delete mode 100644 cpp/specs/HybridColumnMetadata.cpp delete mode 100644 cpp/specs/HybridColumnMetadata.hpp create mode 100644 nitrogen/generated/shared/c++/ColumnMetadata.hpp delete mode 100644 nitrogen/generated/shared/c++/HybridColumnMetadataSpec.cpp delete mode 100644 nitrogen/generated/shared/c++/HybridColumnMetadataSpec.hpp delete mode 100644 src/specs/ColumnMetadata.nitro.ts diff --git a/cpp/Types.hpp b/cpp/Types.hpp index c4e9d13c..aa99c121 100644 --- a/cpp/Types.hpp +++ b/cpp/Types.hpp @@ -3,6 +3,7 @@ #include #include "ArrayBuffer.hpp" #include "ColumnType.hpp" +#include "ColumnMetadata.hpp" #include "HybridColumnMetadata.hpp" using namespace margelo::nitro; @@ -46,7 +47,7 @@ struct SequelBatchOperationResult using SQLiteValue = std::variant>; using SQLiteParams = std::vector; using TableResults = std::vector>; -using TableMetadata = std::unordered_map>; +using TableMetadata = std::unordered_map; // constexpr function that maps SQLiteColumnType to string literals constexpr ColumnType mapSQLiteTypeToColumnType(std::string type) { diff --git a/cpp/specs/HybridColumnMetadata.cpp b/cpp/specs/HybridColumnMetadata.cpp deleted file mode 100644 index d534570c..00000000 --- a/cpp/specs/HybridColumnMetadata.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "HybridColumnMetadata.hpp" - -namespace margelo::rnquicksqlite { - -HybridColumnMetadata::HybridColumnMetadata(std::string&& name, ColumnType&& type, double index) - : HybridColumnMetadataSpec(), _name(std::move(name)), _type(std::move(type)), _index(index) {} - -std::string HybridColumnMetadata::getName() { - return this->_name; -}; - -void HybridColumnMetadata::setName(const std::string& name) { - this->_name = name; -}; -ColumnType HybridColumnMetadata::getType() { - return this->_type; -}; - -void HybridColumnMetadata::setType(ColumnType type) { - this->_type = type; -}; - -double HybridColumnMetadata::getIndex() { - return this->_index; -}; - -void HybridColumnMetadata::setIndex(double index) { - this->_index = index; -}; - -} diff --git a/cpp/specs/HybridColumnMetadata.hpp b/cpp/specs/HybridColumnMetadata.hpp deleted file mode 100644 index 841c64bd..00000000 --- a/cpp/specs/HybridColumnMetadata.hpp +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include -#include "HybridColumnMetadataSpec.hpp" -#include "Types.hpp" - -using namespace margelo::nitro::rnquicksqlite; - -namespace margelo::rnquicksqlite { - -class HybridColumnMetadata: public HybridColumnMetadataSpec { -public: - HybridColumnMetadata(std::string&& name, ColumnType&& type, double index); - -public: - // Properties - std::string getName() override; - void setName(const std::string& name) override; - ColumnType getType() override; - void setType(ColumnType type) override; - double getIndex() override; - void setIndex(double index) override; - -private: - std::string _name; - ColumnType _type; - double _index; -}; - -} diff --git a/cpp/sqliteBridge.cpp b/cpp/sqliteBridge.cpp index ddc4d03f..e2fc5f78 100644 --- a/cpp/sqliteBridge.cpp +++ b/cpp/sqliteBridge.cpp @@ -361,7 +361,7 @@ SQLiteOPResult sqliteExecute(const std::string& dbName, const std::string& query column_name = sqlite3_column_name(statement, i); const char *tp = sqlite3_column_decltype(statement, i); column_declared_type = mapSQLiteTypeToColumnType(tp); - auto columnMeta = std::make_shared(std::move(column_name), std::move(column_declared_type), i); + auto columnMeta = ColumnMetadata(std::move(column_name), std::move(column_declared_type), i); metadata->insert({column_name, columnMeta}); i++; } diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake index 07adcb4a..2d4708e7 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake @@ -25,7 +25,6 @@ target_sources( # CMake project name (Android C++ library name) RNQuickSQLite PRIVATE # Shared Nitrogen C++ sources - ../nitrogen/generated/shared/c++/HybridColumnMetadataSpec.cpp ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp ../nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp # Android-specific Nitrogen C++ sources diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index f6007c5d..fb7cd734 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -17,12 +17,12 @@ namespace NitroModules { class ArrayBuffer; } namespace margelo::nitro::rnquicksqlite { struct BatchQueryCommand; } // Forward declaration of `BatchQueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } +// Forward declaration of `ColumnMetadata` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } +// Forward declaration of `ColumnType` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { enum class ColumnType; } // Forward declaration of `FileLoadResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } -// Forward declaration of `HybridColumnMetadataSpecSwift` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { class HybridColumnMetadataSpecSwift; } -// Forward declaration of `HybridColumnMetadataSpec` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { class HybridColumnMetadataSpec; } // Forward declaration of `HybridSelectQueryResultSpecSwift` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpecSwift; } // Forward declaration of `HybridSelectQueryResultSpec` to properly resolve imports. @@ -39,14 +39,14 @@ namespace margelo::nitro::rnquicksqlite { enum class QueryType; } #if __has_include("BatchQueryResult.hpp") #include "BatchQueryResult.hpp" #endif -#if __has_include("FileLoadResult.hpp") - #include "FileLoadResult.hpp" +#if __has_include("ColumnMetadata.hpp") + #include "ColumnMetadata.hpp" #endif -#if __has_include("HybridColumnMetadataSpec.hpp") - #include "HybridColumnMetadataSpec.hpp" +#if __has_include("ColumnType.hpp") + #include "ColumnType.hpp" #endif -#if __has_include("HybridColumnMetadataSpecSwift.hpp") - #include "HybridColumnMetadataSpecSwift.hpp" +#if __has_include("FileLoadResult.hpp") + #include "FileLoadResult.hpp" #endif #if __has_include("HybridSelectQueryResultSpec.hpp") #include "HybridSelectQueryResultSpec.hpp" @@ -272,15 +272,15 @@ namespace margelo::nitro::rnquicksqlite::bridge::swift { } /** - * Specialized version of `std::unordered_map>`. + * Specialized version of `std::unordered_map`. */ - using std__unordered_map_std__string__std__shared_ptr_margelo__nitro__rnquicksqlite__HybridColumnMetadataSpec__ = std::unordered_map>; - inline std::unordered_map> create_std__unordered_map_std__string__std__shared_ptr_margelo__nitro__rnquicksqlite__HybridColumnMetadataSpec__(size_t size) { - std::unordered_map> map; + using std__unordered_map_std__string__ColumnMetadata_ = std::unordered_map; + inline std::unordered_map create_std__unordered_map_std__string__ColumnMetadata_(size_t size) { + std::unordered_map map; map.reserve(size); return map; } - inline std::vector get_std__unordered_map_std__string__std__shared_ptr_margelo__nitro__rnquicksqlite__HybridColumnMetadataSpec___keys(const std__unordered_map_std__string__std__shared_ptr_margelo__nitro__rnquicksqlite__HybridColumnMetadataSpec__& map) { + inline std::vector get_std__unordered_map_std__string__ColumnMetadata__keys(const std__unordered_map_std__string__ColumnMetadata_& map) { std::vector keys; keys.reserve(map.size()); for (const auto& entry : map) { diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp index 3850237f..2d526cc6 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp @@ -15,12 +15,12 @@ namespace NitroModules { class ArrayBuffer; } namespace margelo::nitro::rnquicksqlite { struct BatchQueryCommand; } // Forward declaration of `BatchQueryResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct BatchQueryResult; } +// Forward declaration of `ColumnMetadata` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } // Forward declaration of `ColumnType` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { enum class ColumnType; } // Forward declaration of `FileLoadResult` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { struct FileLoadResult; } -// Forward declaration of `HybridColumnMetadataSpec` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { class HybridColumnMetadataSpec; } // Forward declaration of `HybridSelectQueryResultSpec` to properly resolve imports. namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResultSpec; } // Forward declaration of `NativeQueryResult` to properly resolve imports. @@ -31,9 +31,9 @@ namespace margelo::nitro::rnquicksqlite { enum class QueryType; } // Include C++ defined types #include "BatchQueryCommand.hpp" #include "BatchQueryResult.hpp" +#include "ColumnMetadata.hpp" #include "ColumnType.hpp" #include "FileLoadResult.hpp" -#include "HybridColumnMetadataSpec.hpp" #include "HybridSelectQueryResultSpec.hpp" #include "NativeQueryResult.hpp" #include "QueryType.hpp" @@ -56,8 +56,6 @@ namespace margelo::nitro::rnquicksqlite { enum class QueryType; } #include // Forward declarations of Swift defined types -// Forward declaration of `HybridColumnMetadataSpecCxx` to properly resolve imports. -namespace RNQuickSQLite { class HybridColumnMetadataSpecCxx; } // Forward declaration of `HybridSelectQueryResultSpecCxx` to properly resolve imports. namespace RNQuickSQLite { class HybridSelectQueryResultSpecCxx; } diff --git a/nitrogen/generated/shared/c++/ColumnMetadata.hpp b/nitrogen/generated/shared/c++/ColumnMetadata.hpp new file mode 100644 index 00000000..792a6f53 --- /dev/null +++ b/nitrogen/generated/shared/c++/ColumnMetadata.hpp @@ -0,0 +1,79 @@ +/// +/// ColumnMetadata.hpp +/// Wed Sep 11 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +// Forward declaration of `ColumnType` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { enum class ColumnType; } + +#include +#include "ColumnType.hpp" + +namespace margelo::nitro::rnquicksqlite { + + /** + * A struct which can be represented as a JavaScript object (ColumnMetadata). + */ + struct ColumnMetadata { + public: + std::string name SWIFT_PRIVATE; + ColumnType type SWIFT_PRIVATE; + double index SWIFT_PRIVATE; + + public: + explicit ColumnMetadata(std::string name, ColumnType type, double index): name(name), type(type), index(index) {} + }; + +} // namespace margelo::nitro::rnquicksqlite + +namespace margelo::nitro { + + using namespace margelo::nitro::rnquicksqlite; + + // C++ ColumnMetadata <> JS ColumnMetadata (object) + template <> + struct JSIConverter { + static inline ColumnMetadata fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return ColumnMetadata( + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "name")), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "type")), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, "index")) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const ColumnMetadata& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, "name", JSIConverter::toJSI(runtime, arg.name)); + obj.setProperty(runtime, "type", JSIConverter::toJSI(runtime, arg.type)); + obj.setProperty(runtime, "index", JSIConverter::toJSI(runtime, arg.index)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "name"))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "type"))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, "index"))) return false; + return true; + } + }; + +} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/HybridColumnMetadataSpec.cpp b/nitrogen/generated/shared/c++/HybridColumnMetadataSpec.cpp deleted file mode 100644 index 7824b9dc..00000000 --- a/nitrogen/generated/shared/c++/HybridColumnMetadataSpec.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/// -/// HybridColumnMetadataSpec.cpp -/// Wed Sep 11 2024 -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#include "HybridColumnMetadataSpec.hpp" - -namespace margelo::nitro::rnquicksqlite { - - void HybridColumnMetadataSpec::loadHybridMethods() { - // load base methods/properties - HybridObject::loadHybridMethods(); - // load custom methods/properties - registerHybrids(this, [](Prototype& prototype) { - prototype.registerHybridGetter("name", &HybridColumnMetadataSpec::getName); - prototype.registerHybridSetter("name", &HybridColumnMetadataSpec::setName); - prototype.registerHybridGetter("type", &HybridColumnMetadataSpec::getType); - prototype.registerHybridSetter("type", &HybridColumnMetadataSpec::setType); - prototype.registerHybridGetter("index", &HybridColumnMetadataSpec::getIndex); - prototype.registerHybridSetter("index", &HybridColumnMetadataSpec::setIndex); - }); - } - -} // namespace margelo::nitro::rnquicksqlite diff --git a/nitrogen/generated/shared/c++/HybridColumnMetadataSpec.hpp b/nitrogen/generated/shared/c++/HybridColumnMetadataSpec.hpp deleted file mode 100644 index a3dc5179..00000000 --- a/nitrogen/generated/shared/c++/HybridColumnMetadataSpec.hpp +++ /dev/null @@ -1,67 +0,0 @@ -/// -/// HybridColumnMetadataSpec.hpp -/// Wed Sep 11 2024 -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © 2024 Marc Rousavy @ Margelo -/// - -#pragma once - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - -// Forward declaration of `ColumnType` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { enum class ColumnType; } - -#include -#include "ColumnType.hpp" - -namespace margelo::nitro::rnquicksqlite { - - using namespace margelo::nitro; - - /** - * An abstract base class for `ColumnMetadata` - * Inherit this class to create instances of `HybridColumnMetadataSpec` in C++. - * @example - * ```cpp - * class HybridColumnMetadata: public HybridColumnMetadataSpec { - * // ... - * }; - * ``` - */ - class HybridColumnMetadataSpec: public virtual HybridObject { - public: - // Constructor - explicit HybridColumnMetadataSpec(): HybridObject(TAG) { } - - // Destructor - virtual ~HybridColumnMetadataSpec() { } - - public: - // Properties - virtual std::string getName() = 0; - virtual void setName(const std::string& name) = 0; - virtual ColumnType getType() = 0; - virtual void setType(ColumnType type) = 0; - virtual double getIndex() = 0; - virtual void setIndex(double index) = 0; - - public: - // Methods - - - protected: - // Hybrid Setup - void loadHybridMethods() override; - - protected: - // Tag for logging - static constexpr auto TAG = "ColumnMetadata"; - }; - -} // namespace margelo::nitro::rnquicksqlite diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp index e74ee935..beb2ccac 100644 --- a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp @@ -16,16 +16,15 @@ // Forward declaration of `ArrayBuffer` to properly resolve imports. namespace NitroModules { class ArrayBuffer; } -// Forward declaration of `HybridColumnMetadataSpec` to properly resolve imports. -namespace margelo::nitro::rnquicksqlite { class HybridColumnMetadataSpec; } +// Forward declaration of `ColumnMetadata` to properly resolve imports. +namespace margelo::nitro::rnquicksqlite { struct ColumnMetadata; } #include #include #include #include #include -#include -#include "HybridColumnMetadataSpec.hpp" +#include "ColumnMetadata.hpp" namespace margelo::nitro::rnquicksqlite { @@ -53,8 +52,8 @@ namespace margelo::nitro::rnquicksqlite { // Properties virtual std::vector>>> getResults() = 0; virtual void setResults(const std::vector>>>& results) = 0; - virtual std::unordered_map> getMetadata() = 0; - virtual void setMetadata(const std::unordered_map>& metadata) = 0; + virtual std::unordered_map getMetadata() = 0; + virtual void setMetadata(const std::unordered_map& metadata) = 0; public: // Methods diff --git a/src/specs/ColumnMetadata.nitro.ts b/src/specs/ColumnMetadata.nitro.ts deleted file mode 100644 index 11dae3b6..00000000 --- a/src/specs/ColumnMetadata.nitro.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { HybridObject } from 'react-native-nitro-modules' -import { ColumnType } from '../types' - -/** - * Column metadata - * Describes a column in table fetched by a select query - */ -export interface ColumnMetadata - extends HybridObject<{ ios: 'c++'; android: 'c++' }> { - /** The name used for this column for this result set */ - name: string - /** The declared column type for this column, when fetched directly from a table or a View resulting from a table column. "UNKNOWN" for dynamic values, like function returned ones. */ - type: ColumnType - /** The index for this column for this result set */ - index: number -} diff --git a/src/specs/SelectQueryResult.nitro.ts b/src/specs/SelectQueryResult.nitro.ts index e47a598b..d7addee2 100644 --- a/src/specs/SelectQueryResult.nitro.ts +++ b/src/specs/SelectQueryResult.nitro.ts @@ -1,15 +1,26 @@ import { HybridObject } from 'react-native-nitro-modules' -import { SQLiteValue } from '../types' -import { ColumnMetadata } from './ColumnMetadata.nitro' +import { ColumnType, SQLiteValue } from '../types' export interface SelectQueryResult extends HybridObject<{ ios: 'c++'; android: 'c++' }> { /** Select query results */ results: Record[] - /** - * Table metadata - * Describes some information about the table and it's columns fetched by the query - * The index is the name of the column - */ + /** Table metadata */ metadata: Record } + +export interface ColumnMetadata { + /** The name used for this column for this result set */ + name: string + /** The declared column type for this column, when fetched directly from a table or a View resulting from a table column. "UNKNOWN" for dynamic values, like function returned ones. */ + type: ColumnType + /** The index for this column for this result set */ + index: number +} + +/** + * Table metadata + * Describes some information about the table and it's columns fetched by the query + * The index is the name of the column + */ +export type TableMetadata = Record From f4b03400b909dfe7382406bd7f49c39cef1e4a3c Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 11 Sep 2024 15:30:29 +0200 Subject: [PATCH 078/156] fix: spec update --- cpp/Types.hpp | 1 - cpp/sqliteBridge.cpp | 1 - nitrogen/generated/shared/c++/QueryType.hpp | 53 ++++++--------------- 3 files changed, 15 insertions(+), 40 deletions(-) diff --git a/cpp/Types.hpp b/cpp/Types.hpp index aa99c121..1d2fa426 100644 --- a/cpp/Types.hpp +++ b/cpp/Types.hpp @@ -4,7 +4,6 @@ #include "ArrayBuffer.hpp" #include "ColumnType.hpp" #include "ColumnMetadata.hpp" -#include "HybridColumnMetadata.hpp" using namespace margelo::nitro; using namespace margelo::nitro::rnquicksqlite; diff --git a/cpp/sqliteBridge.cpp b/cpp/sqliteBridge.cpp index e2fc5f78..bea43f1b 100644 --- a/cpp/sqliteBridge.cpp +++ b/cpp/sqliteBridge.cpp @@ -7,7 +7,6 @@ #include #include #include "sqliteBridge.h" -#include "HybridColumnMetadata.hpp" #include "logs.h" #include "ArrayBuffer.hpp" diff --git a/nitrogen/generated/shared/c++/QueryType.hpp b/nitrogen/generated/shared/c++/QueryType.hpp index 708c67a4..b82f9fce 100644 --- a/nitrogen/generated/shared/c++/QueryType.hpp +++ b/nitrogen/generated/shared/c++/QueryType.hpp @@ -8,11 +8,7 @@ #pragma once -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif +#include #if __has_include() #include #else @@ -27,7 +23,7 @@ namespace margelo::nitro::rnquicksqlite { /** - * An enum which can be represented as a JavaScript union (QueryType). + * An enum which can be represented as a JavaScript enum (QueryType). */ enum class QueryType { SELECT SWIFT_NAME(select) = 0, @@ -43,48 +39,29 @@ namespace margelo::nitro { using namespace margelo::nitro::rnquicksqlite; - // C++ QueryType <> JS QueryType (union) + // C++ QueryType <> JS QueryType (enum) template <> struct JSIConverter { static inline QueryType fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { - std::string unionValue = JSIConverter::fromJSI(runtime, arg); - switch (hashString(unionValue.c_str(), unionValue.size())) { - case hashString("SELECT"): return QueryType::SELECT; - case hashString("INSERT"): return QueryType::INSERT; - case hashString("UPDATE"): return QueryType::UPDATE; - case hashString("DELETE"): return QueryType::DELETE; - case hashString("OTHER"): return QueryType::OTHER; - default: [[unlikely]] - throw std::runtime_error("Cannot convert \"" + unionValue + "\" to enum QueryType - invalid value!"); - } + int enumValue = JSIConverter::fromJSI(runtime, arg); + return static_cast(enumValue); } static inline jsi::Value toJSI(jsi::Runtime& runtime, QueryType arg) { - switch (arg) { - case QueryType::SELECT: return JSIConverter::toJSI(runtime, "SELECT"); - case QueryType::INSERT: return JSIConverter::toJSI(runtime, "INSERT"); - case QueryType::UPDATE: return JSIConverter::toJSI(runtime, "UPDATE"); - case QueryType::DELETE: return JSIConverter::toJSI(runtime, "DELETE"); - case QueryType::OTHER: return JSIConverter::toJSI(runtime, "OTHER"); - default: [[unlikely]] - throw std::runtime_error("Cannot convert QueryType to JS - invalid value: " - + std::to_string(static_cast(arg)) + "!"); - } + int enumValue = static_cast(arg); + return JSIConverter::toJSI(runtime, enumValue); } static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { - if (!value.isString()) { + if (!value.isNumber()) { return false; } - std::string unionValue = JSIConverter::fromJSI(runtime, value); - switch (hashString(unionValue.c_str(), unionValue.size())) { - case hashString("SELECT"): - case hashString("INSERT"): - case hashString("UPDATE"): - case hashString("DELETE"): - case hashString("OTHER"): - return true; - default: - return false; + double integer; + double fraction = modf(value.getNumber(), &integer); + if (fraction != 0.0) { + // It is some kind of floating point number - our enums are ints. + return false; } + // Check if we are within the bounds of the enum. + return integer >= 0 && integer <= 4; } }; From d2d7d079bff3451485e0a8c506a0fee5e19a5ff2 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 11 Sep 2024 15:30:37 +0200 Subject: [PATCH 079/156] restructure types --- src/types.ts | 57 ++++++++++++++++++++++++++-------------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/src/types.ts b/src/types.ts index 2a8697d9..f60b6508 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,6 +1,34 @@ -import { ColumnMetadata } from './specs/ColumnMetadata.nitro' import { SelectQueryResult } from './specs/SelectQueryResult.nitro' +export enum QueryType { + SELECT, + INSERT, + UPDATE, + DELETE, + OTHER, +} + +export enum ColumnType { + BOOLEAN, + NUMBER, + INT64, + TEXT, + ARRAY_BUFFER, + NULL_VALUE, + UNKNOWN, +} + +/** + * Represents a value that can be stored in a SQLite database + */ +export type SQLiteValue = + | number + | boolean + | bigint + | string + | ArrayBuffer + | undefined + /** * Object returned by SQL Query executions { * insertId: Represent the auto-generated row id if applicable @@ -37,35 +65,8 @@ export interface QueryResult { */ item: (idx: number) => Data } - /** - * Query metadata, avaliable only for select query results - */ - metadata?: ColumnMetadata[] -} - -export type QueryType = 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE' | 'OTHER' - -export enum ColumnType { - BOOLEAN, - NUMBER, - INT64, - TEXT, - ARRAY_BUFFER, - NULL_VALUE, - UNKNOWN, } -/** - * Represents a value that can be stored in a SQLite database - */ -export type SQLiteValue = - | number - | boolean - | bigint - | string - | ArrayBuffer - | undefined - export type ExecuteQuery = ( query: string, params?: SQLiteValue[] From 464d71f7910468cec5564a5fa5101e34a4630cb1 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 11 Sep 2024 15:31:23 +0200 Subject: [PATCH 080/156] fix: missing return statement --- src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index c2e92ad0..d61b4ea1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -79,9 +79,9 @@ const buildJsQueryResult = ( length: data.length, item: (idx: number) => result.rows.data[idx], } - - return result } + + return result } const _execute = QuickSQLite.execute From 993bcd54df68f44404d01f894bbe363565fa7283 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 11 Sep 2024 16:12:25 +0200 Subject: [PATCH 081/156] enable new arch --- example/android/gradle.properties | 4 ++-- example/ios/Podfile.lock | 40 +++++++++++++++++++++++-------- example/package.json | 1 + package.json | 1 - 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/example/android/gradle.properties b/example/android/gradle.properties index b7b8dfd9..8551687a 100644 --- a/example/android/gradle.properties +++ b/example/android/gradle.properties @@ -8,5 +8,5 @@ FLIPPER_VERSION=0.125.0 reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 -newArchEnabled=false -hermesEnabled=true \ No newline at end of file +newArchEnabled=true +hermesEnabled=true diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 15fb8faf..ed531823 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -64,6 +64,7 @@ PODS: - React-RCTText (= 0.75.2) - React-RCTVibration (= 0.75.2) - React-callinvoker (0.75.2) + - React-Codegen (0.1.0) - React-Core (0.75.2): - glog - hermes-engine @@ -1263,6 +1264,23 @@ PODS: - RCTRequired - RCTTypeSafety - React-Core + - react-native-safe-area-context/common (= 4.5.0) + - react-native-safe-area-context/fabric (= 4.5.0) + - ReactCommon/turbomodule/core + - react-native-safe-area-context/common (4.5.0): + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-Core + - ReactCommon/turbomodule/core + - react-native-safe-area-context/fabric (4.5.0): + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-Codegen + - React-Core + - react-native-safe-area-context/common + - React-RCTFabric - ReactCommon/turbomodule/core - React-nativeconfig (0.75.2) - React-NativeModulesApple (0.75.2): @@ -1620,6 +1638,7 @@ DEPENDENCIES: SPEC REPOS: trunk: + - React-Codegen - SocketRocket EXTERNAL SOURCES: @@ -1762,27 +1781,28 @@ SPEC CHECKSUMS: fmt: 4c2741a687cc09f0634a2e2c72a838b99f1ff120 glog: 69ef571f3de08433d766d614c73a9838a06bf7eb hermes-engine: 3b6e0717ca847e2fc90a201e59db36caf04dee88 - NitroModules: ef03456236a7a9243a601c6697203066fdd779f8 + NitroModules: 47b80650d063f9b8ae7a3e02564cd282ad3d2ac9 RCT-Folly: 4464f4d875961fce86008d45f4ecf6cef6de0740 RCTDeprecation: 34cbf122b623037ea9facad2e92e53434c5c7422 RCTRequired: 24c446d7bcd0f517d516b6265d8df04dc3eb1219 RCTTypeSafety: ef5e91bd791abd3a99b2c75fd565791102a66352 React: 643f06bc294806d2db2526b424fdf759e107f514 React-callinvoker: 34d1fa0c340104f324e2521f546196beb44dfad2 + React-Codegen: 4b8b4817cea7a54b83851d4c1f91f79aa73de30a React-Core: facd883836d8d1cc1949d2053c58eab5fb22eb75 React-CoreModules: f92a2cb11d22f6066823ca547c61e900325dfe44 React-cxxreact: f5595a4cbfe5a4e9d401dffa2c1c78bbbbbe75e4 React-debug: 4a91c177b5b2efcc546fb50bc2f676f3f589efab - React-defaultsnativemodule: bb94c3db425b01c760f41a253de8536b3f5497f0 - React-domnativemodule: 6c581fd39812cafb024171e091c00905b2c3a3e2 + React-defaultsnativemodule: 6b666572abf5fe7fe87836a42776abd6ad5ed173 + React-domnativemodule: 785d767c4edbb9f011b8c976271077759ca5c4aa React-Fabric: a33cc1fdc62a3085774783bb30970531589d2028 React-FabricComponents: 98de5f94cbd35d407f4fc78855298b562d8289cb React-FabricImage: 0ce8fd83844d9edef5825116d38f0e208b9ad786 React-featureflags: 37a78859ad71db758e2efdcbdb7384afefa8701e - React-featureflagsnativemodule: 52b46e161a151b4653cf1762285e8e899d534e3f + React-featureflagsnativemodule: f94aacb52c463e200ee185bff90ae3b392e60263 React-graphics: c16f1bab97a5d473831a79360d84300e93a614e5 React-hermes: 7801f8c0e12f326524b461dc368d3e74f3d2a385 - React-idlecallbacksnativemodule: 58de2ac968ee80947d19dc8fe20def607e5c2de8 + React-idlecallbacksnativemodule: d81bb7b5d26cea9852a8edc6ad1979cd7ed0841f React-ImageManager: 98a1e5b0b05528dde47ebcd953d916ac66d46c09 React-jserrorhandler: 08f1c3465a71a6549c27ad82809ce145ad52d4f1 React-jsi: 161428ab2c706d5fcd9878d260ff1513fdb356ab @@ -1791,17 +1811,17 @@ SPEC CHECKSUMS: React-jsitracing: 52b849a77d02e2dc262a3031454c23be8dabb4d9 React-logger: 8db32983d75dc2ad54f278f344ccb9b256e694fc React-Mapbuffer: 1c08607305558666fd16678b85ef135e455d5c96 - React-microtasksnativemodule: 87b8de96f937faefece8afd2cb3a518321b2ef99 - react-native-safe-area-context: 39c2d8be3328df5d437ac1700f4f3a4f75716acc + React-microtasksnativemodule: f13f03163b6a5ec66665dfe80a0df4468bb766a6 + react-native-safe-area-context: e7e7c502560f89a6a1866af293d1e091f3c7929d React-nativeconfig: 57781b79e11d5af7573e6f77cbf1143b71802a6d React-NativeModulesApple: 7ff2e2cfb2e5fa5bdedcecf28ce37e696c6ef1e1 React-perflogger: 8a360ccf603de6ddbe9ff8f54383146d26e6c936 React-performancetimeline: 3cfec915adcb3653a5a633b41e711903844c35d8 React-RCTActionSheet: 1c0e26a88eec41215089cf4436e38188cfe9f01a React-RCTAnimation: d87207841b1e2ae1389e684262ea8c73c887cb04 - React-RCTAppDelegate: 4ec7824c0cc9cc4b146ca8ee0fd81b10c316a440 + React-RCTAppDelegate: 328e56399c4f1c3d20cfe547ea24ebded2b3a87f React-RCTBlob: 79b42cb7db55f34079297687a480dbcf37f023f6 - React-RCTFabric: 1dd1661db93716f8cb116e451bd9c211a8d15716 + React-RCTFabric: 27636a6a5fa5622159297fce26881945d3658cf6 React-RCTImage: 0c10a75de59f7384a2a55545d5f36fe783e6ecda React-RCTLinking: bf08f4f655bf777af292b8d97449072c8bb196ca React-RCTNetwork: 1b690846b40fc5685af58e088720657db6814637 @@ -1819,7 +1839,7 @@ SPEC CHECKSUMS: React-utils: 81a715d9c0a2a49047e77a86f3a2247408540deb ReactCodegen: 60973d382704c793c605b9be0fc7f31cb279442f ReactCommon: 6ef348087d250257c44c0204461c03f036650e9b - RNQuickSQLite: 5bcf28e025fa7305c90a9e45ac14bfed30cec2f0 + RNQuickSQLite: 1a029062c82cd4016f933e5f2b7d4da78733c0dd SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d Yoga: a1d7895431387402a674fd0d1c04ec85e87909b8 diff --git a/example/package.json b/example/package.json index 94e82f8f..b4acfcb6 100644 --- a/example/package.json +++ b/example/package.json @@ -3,6 +3,7 @@ "version": "0.0.1", "private": true, "scripts": { + "pods": "cd ios && RCT_NEW_ARCH_ENABLED=1 bundle exec pod install", "android": "react-native run-android", "ios": "react-native run-ios", "start": "react-native start", diff --git a/package.json b/package.json index a3ffd7e7..47faefc9 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,6 @@ "format-cpp": "./scripts/clang-format.sh", "lint": "eslint \"**/*.{js,ts,tsx}\" --fix", "lint-ci": "eslint \"**/*.{js,ts,tsx}\" -f @jamesacarr/github-actions", - "pods": "cd example/ios && bundle exec pod install", "specs": "bun run --filter=\"**\" typescript && bun nitro-codegen --logLevel=\"debug\"", "bootstrap": "yarn example && yarn && yarn pods", "bump": "./bump-version.sh" From 2897ba83b5007e891c6e947afb098ac7f68ef07b Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 11 Sep 2024 16:14:01 +0200 Subject: [PATCH 082/156] fix: tests --- example/src/tests/MochaSetup.ts | 11 +++++------ example/src/tests/rawQueries.spec.ts | 5 ----- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/example/src/tests/MochaSetup.ts b/example/src/tests/MochaSetup.ts index df5dff2d..e244d188 100644 --- a/example/src/tests/MochaSetup.ts +++ b/example/src/tests/MochaSetup.ts @@ -1,5 +1,4 @@ -import Mocha from 'mocha' -import type * as MochaTypes from 'mocha' +import 'mocha' // import type { RowItemType } from '../navigators/children/TestingScreen/RowItemType'; import { clearTests, rootSuite } from './MochaRNAdapter' @@ -23,11 +22,11 @@ export async function runTests(...registrators: Array<() => void>) { type: string errorMsg?: string }[] = [] - var runner = new Mocha.Runner(rootSuite) as MochaTypes.Runner + var runner = new Mocha.Runner(rootSuite) runner .once(EVENT_RUN_BEGIN, () => {}) - .on(EVENT_SUITE_BEGIN, (suite: MochaTypes.Suite) => { + .on(EVENT_SUITE_BEGIN, (suite) => { const name = suite.title if (name !== '') { results.push({ @@ -37,7 +36,7 @@ export async function runTests(...registrators: Array<() => void>) { }) } }) - .on(EVENT_TEST_PASS, (test: MochaTypes.Runnable) => { + .on(EVENT_TEST_PASS, (test) => { results.push({ description: test.title, key: Math.random().toString(), @@ -45,7 +44,7 @@ export async function runTests(...registrators: Array<() => void>) { }) // console.log(`${indent()}pass: ${test.fullTitle()}`); }) - .on(EVENT_TEST_FAIL, (test: MochaTypes.Runnable, err: Error) => { + .on(EVENT_TEST_FAIL, (test, err: Error) => { results.push({ description: test.title, key: Math.random().toString(), diff --git a/example/src/tests/rawQueries.spec.ts b/example/src/tests/rawQueries.spec.ts index 0ec37ab4..86b34c39 100644 --- a/example/src/tests/rawQueries.spec.ts +++ b/example/src/tests/rawQueries.spec.ts @@ -43,7 +43,6 @@ export function registerBaseTests() { ) expect(res.rowsAffected).to.equal(1) expect(res.insertId).to.equal(1) - expect(res.metadata).to.eql([]) expect(res.rows?.data).to.eql([]) expect(res.rows?.length).to.equal(0) expect(res.rows?.item).to.be.a('function') @@ -120,7 +119,6 @@ export function registerBaseTests() { ) expect(res.rowsAffected).to.equal(1) expect(res.insertId).to.equal(1) - expect(res.metadata).to.eql([]) expect(res.rows?.data).to.eql([]) expect(res.rows?.length).to.equal(0) expect(res.rows?.item).to.be.a('function') @@ -147,7 +145,6 @@ export function registerBaseTests() { ) expect(res.rowsAffected).to.equal(1) expect(res.insertId).to.equal(1) - expect(res.metadata).to.eql([]) expect(res.rows?.data).to.eql([]) expect(res.rows?.length).to.equal(0) expect(res.rows?.item).to.be.a('function') @@ -221,7 +218,6 @@ export function registerBaseTests() { ) expect(res.rowsAffected).to.equal(1) expect(res.insertId).to.equal(1) - expect(res.metadata).to.eql([]) expect(res.rows?.data).to.eql([]) expect(res.rows?.length).to.equal(0) expect(res.rows?.item).to.be.a('function') @@ -347,7 +343,6 @@ export function registerBaseTests() { ) expect(res.rowsAffected).to.equal(1) expect(res.insertId).to.equal(1) - expect(res.metadata).to.eql([]) expect(res.rows?.data).to.eql([]) expect(res.rows?.length).to.equal(0) expect(res.rows?.item).to.be.a('function') From 761f7a45e37be7334c2fe09ab84983c250d0e885 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 11 Sep 2024 16:37:59 +0200 Subject: [PATCH 083/156] update rn safe area context lib --- example/ios/Podfile.lock | 66 ++++++++++++++++++++++++++++++++-------- example/package.json | 2 +- 2 files changed, 54 insertions(+), 14 deletions(-) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index ed531823..45de4e4b 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -64,7 +64,6 @@ PODS: - React-RCTText (= 0.75.2) - React-RCTVibration (= 0.75.2) - React-callinvoker (0.75.2) - - React-Codegen (0.1.0) - React-Core (0.75.2): - glog - hermes-engine @@ -1259,29 +1258,72 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - react-native-safe-area-context (4.5.0): - - RCT-Folly + - react-native-safe-area-context (4.11.0): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) - RCTRequired - RCTTypeSafety - React-Core - - react-native-safe-area-context/common (= 4.5.0) - - react-native-safe-area-context/fabric (= 4.5.0) + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - react-native-safe-area-context/common (= 4.11.0) + - react-native-safe-area-context/fabric (= 4.11.0) + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - react-native-safe-area-context/common (4.5.0): - - RCT-Folly + - Yoga + - react-native-safe-area-context/common (4.11.0): + - 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 - - react-native-safe-area-context/fabric (4.5.0): - - RCT-Folly + - Yoga + - react-native-safe-area-context/fabric (4.11.0): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) - RCTRequired - RCTTypeSafety - - React-Codegen - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager - react-native-safe-area-context/common + - React-NativeModulesApple - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - Yoga - React-nativeconfig (0.75.2) - React-NativeModulesApple (0.75.2): - glog @@ -1638,7 +1680,6 @@ DEPENDENCIES: SPEC REPOS: trunk: - - React-Codegen - SocketRocket EXTERNAL SOURCES: @@ -1788,7 +1829,6 @@ SPEC CHECKSUMS: RCTTypeSafety: ef5e91bd791abd3a99b2c75fd565791102a66352 React: 643f06bc294806d2db2526b424fdf759e107f514 React-callinvoker: 34d1fa0c340104f324e2521f546196beb44dfad2 - React-Codegen: 4b8b4817cea7a54b83851d4c1f91f79aa73de30a React-Core: facd883836d8d1cc1949d2053c58eab5fb22eb75 React-CoreModules: f92a2cb11d22f6066823ca547c61e900325dfe44 React-cxxreact: f5595a4cbfe5a4e9d401dffa2c1c78bbbbbe75e4 @@ -1812,7 +1852,7 @@ SPEC CHECKSUMS: React-logger: 8db32983d75dc2ad54f278f344ccb9b256e694fc React-Mapbuffer: 1c08607305558666fd16678b85ef135e455d5c96 React-microtasksnativemodule: f13f03163b6a5ec66665dfe80a0df4468bb766a6 - react-native-safe-area-context: e7e7c502560f89a6a1866af293d1e091f3c7929d + react-native-safe-area-context: f1fda705dfe14355f41933debb5932887e234cc5 React-nativeconfig: 57781b79e11d5af7573e6f77cbf1143b71802a6d React-NativeModulesApple: 7ff2e2cfb2e5fa5bdedcecf28ce37e696c6ef1e1 React-perflogger: 8a360ccf603de6ddbe9ff8f54383146d26e6c936 diff --git a/example/package.json b/example/package.json index b4acfcb6..106c4bab 100644 --- a/example/package.json +++ b/example/package.json @@ -19,7 +19,7 @@ "react-native": "0.75.2", "react-native-nitro-modules": "^0.6.0", "react-native-quick-sqlite": "./..", - "react-native-safe-area-context": "^4.5.0", + "react-native-safe-area-context": "^4.11.0", "reflect-metadata": "^0.1.13", "stream-browserify": "^3.0.0", "tailwindcss": "^3.2.4", From 4fd4b04722fccc5baa1651bf28e626864ccf8841 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 11 Sep 2024 16:51:16 +0200 Subject: [PATCH 084/156] update nitro --- example/package.json | 2 +- example/yarn.lock | 4118 +++++++++++++++++++++++------------- package.json | 1 + yarn.lock | 4765 +++++++++++++++++++++++++++++------------- 4 files changed, 6047 insertions(+), 2839 deletions(-) diff --git a/example/package.json b/example/package.json index 106c4bab..c2d9b39f 100644 --- a/example/package.json +++ b/example/package.json @@ -17,7 +17,7 @@ "nativewind": "^2.0.11", "react": "18.2.0", "react-native": "0.75.2", - "react-native-nitro-modules": "^0.6.0", + "react-native-nitro-modules": "^0.7.0", "react-native-quick-sqlite": "./..", "react-native-safe-area-context": "^4.11.0", "reflect-metadata": "^0.1.13", diff --git a/example/yarn.lock b/example/yarn.lock index 766744d8..876a483c 100644 --- a/example/yarn.lock +++ b/example/yarn.lock @@ -17,6 +17,14 @@ dependencies: "@babel/highlight" "^7.18.6" +"@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== + dependencies: + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" + "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.0", "@babel/compat-data@^7.20.1": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.5.tgz#86f172690b093373a933223b4745deeb6049e733" @@ -27,7 +35,12 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec" integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg== -"@babel/core@^7.12.9", "@babel/core@^7.13.16", "@babel/core@^7.14.0": +"@babel/compat-data@^7.25.2": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" + integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== + +"@babel/core@^7.12.9", "@babel/core@^7.13.16": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.5.tgz#45e2114dc6cd4ab167f81daf7820e8fa1250d113" integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ== @@ -69,6 +82,15 @@ json5 "^2.2.2" semver "^6.3.0" +"@babel/eslint-parser@^7.20.0": + version "7.25.1" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.1.tgz#469cee4bd18a88ff3edbdfbd227bd20e82aa9b82" + integrity sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg== + dependencies: + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.1" + "@babel/generator@^7.18.7", "@babel/generator@^7.20.5": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.5.tgz#cb25abee3178adf58d6814b68517c62bdbfdda95" @@ -87,6 +109,16 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" +"@babel/generator@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" + integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== + dependencies: + "@babel/types" "^7.25.6" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" @@ -94,6 +126,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-annotate-as-pure@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" + integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== + dependencies: + "@babel/types" "^7.24.7" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" @@ -123,6 +162,17 @@ lru-cache "^5.1.1" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.24.7": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== + dependencies: + "@babel/compat-data" "^7.25.2" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.2", "@babel/helper-create-class-features-plugin@^7.20.5": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz#327154eedfb12e977baa4ecc72e5806720a85a06" @@ -150,6 +200,19 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/helper-split-export-declaration" "^7.18.6" +"@babel/helper-create-class-features-plugin@^7.24.7", "@babel/helper-create-class-features-plugin@^7.25.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz#57eaf1af38be4224a9d9dd01ddde05b741f50e14" + integrity sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.8" + "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/helper-replace-supers" "^7.25.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/traverse" "^7.25.4" + semver "^6.3.1" + "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" @@ -211,6 +274,14 @@ dependencies: "@babel/types" "^7.20.7" +"@babel/helper-member-expression-to-functions@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6" + integrity sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA== + dependencies: + "@babel/traverse" "^7.24.8" + "@babel/types" "^7.24.8" + "@babel/helper-module-imports@7.18.6", "@babel/helper-module-imports@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" @@ -218,6 +289,14 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11": version "7.20.11" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" @@ -253,12 +332,24 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-optimise-call-expression@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" + integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A== + dependencies: + "@babel/types" "^7.24.7" + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== -"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": +"@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== + +"@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== @@ -268,6 +359,15 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" +"@babel/helper-remap-async-to-generator@^7.24.7", "@babel/helper-remap-async-to-generator@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz#d2f0fbba059a42d68e5e378feaf181ef6055365e" + integrity sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-wrap-function" "^7.25.0" + "@babel/traverse" "^7.25.0" + "@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78" @@ -291,6 +391,15 @@ "@babel/traverse" "^7.20.7" "@babel/types" "^7.20.7" +"@babel/helper-replace-supers@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz#ff44deac1c9f619523fe2ca1fd650773792000a9" + integrity sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.24.8" + "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/traverse" "^7.25.0" + "@babel/helper-simple-access@^7.19.4", "@babel/helper-simple-access@^7.20.2": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" @@ -305,6 +414,14 @@ dependencies: "@babel/types" "^7.20.0" +"@babel/helper-skip-transparent-expression-wrappers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9" + integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" @@ -317,16 +434,31 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + "@babel/helper-validator-option@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== +"@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== + "@babel/helper-wrap-function@^7.18.9": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" @@ -337,6 +469,15 @@ "@babel/traverse" "^7.20.5" "@babel/types" "^7.20.5" +"@babel/helper-wrap-function@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz#dab12f0f593d6ca48c0062c28bcfb14ebe812f81" + integrity sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ== + dependencies: + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.0" + "@babel/types" "^7.25.0" + "@babel/helpers@^7.20.5": version "7.20.6" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.6.tgz#e64778046b70e04779dfbdf924e7ebb45992c763" @@ -364,7 +505,17 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.18.10", "@babel/parser@^7.20.5": +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.13.16", "@babel/parser@^7.18.10", "@babel/parser@^7.20.5": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8" integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== @@ -374,6 +525,13 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg== +"@babel/parser@^7.25.0", "@babel/parser@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== + dependencies: + "@babel/types" "^7.25.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" @@ -390,16 +548,6 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-proposal-optional-chaining" "^7.20.7" -"@babel/plugin-proposal-async-generator-functions@^7.0.0": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz#352f02baa5d69f4e7529bdac39aaa02d41146af9" - integrity sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-proposal-async-generator-functions@^7.20.1": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" @@ -410,7 +558,7 @@ "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.18.6": +"@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== @@ -478,7 +626,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== @@ -494,17 +642,6 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.0.0": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz#a556f59d555f06961df1e572bb5eca864c84022d" - integrity sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ== - dependencies: - "@babel/compat-data" "^7.20.1" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.1" - "@babel/plugin-proposal-object-rest-spread@^7.20.2": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" @@ -516,7 +653,7 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.20.7" -"@babel/plugin-proposal-optional-catch-binding@^7.0.0", "@babel/plugin-proposal-optional-catch-binding@^7.18.6": +"@babel/plugin-proposal-optional-catch-binding@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== @@ -524,7 +661,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.13.12": +"@babel/plugin-proposal-optional-chaining@^7.13.12": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== @@ -575,7 +712,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.12.13": +"@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== @@ -596,7 +733,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.19.0" -"@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": +"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== @@ -617,7 +754,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.18.6", "@babel/plugin-syntax-flow@^7.2.0": +"@babel/plugin-syntax-flow@^7.12.1", "@babel/plugin-syntax-flow@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz#d1759e84dd4b437cf9fae69b4c06c41d7625bfb7" + integrity sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz#774d825256f2379d06139be0c723c4dd444f3ca1" integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== @@ -638,7 +782,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.18.6": +"@babel/plugin-syntax-jsx@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== @@ -666,7 +810,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== @@ -722,14 +866,15 @@ dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-async-to-generator@^7.0.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615" - integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== +"@babel/plugin-transform-async-generator-functions@^7.24.3": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz#2afd4e639e2d055776c9f091b6c0c180ed8cf083" + integrity sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg== dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-remap-async-to-generator" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-remap-async-to-generator" "^7.25.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/traverse" "^7.25.4" "@babel/plugin-transform-async-to-generator@^7.18.6": version "7.20.7" @@ -740,7 +885,16 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-remap-async-to-generator" "^7.18.9" -"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.18.6": +"@babel/plugin-transform-async-to-generator@^7.20.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc" + integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA== + dependencies: + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-remap-async-to-generator" "^7.24.7" + +"@babel/plugin-transform-block-scoped-functions@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== @@ -761,6 +915,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.20.2" +"@babel/plugin-transform-class-properties@^7.24.1": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz#bae7dbfcdcc2e8667355cd1fb5eda298f05189fd" + integrity sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.4" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/plugin-transform-classes@^7.0.0": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz#c0033cf1916ccf78202d04be4281d161f6709bb2" @@ -806,12 +968,12 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/template" "^7.20.7" -"@babel/plugin-transform-destructuring@^7.0.0": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz#c23741cfa44ddd35f5e53896e88c75331b8b2792" - integrity sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw== +"@babel/plugin-transform-destructuring@^7.20.0": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz#c828e814dbe42a2718a838c2a2e16a408e055550" + integrity sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-destructuring@^7.20.2": version "7.20.7" @@ -843,7 +1005,7 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.18.6": +"@babel/plugin-transform-flow-strip-types@^7.18.6": version "7.19.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz#e9e8606633287488216028719638cbbb2f2dde8f" integrity sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg== @@ -851,6 +1013,14 @@ "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-syntax-flow" "^7.18.6" +"@babel/plugin-transform-flow-strip-types@^7.20.0": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.2.tgz#b3aa251db44959b7a7c82abcd6b4225dec7d2258" + integrity sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/plugin-syntax-flow" "^7.24.7" + "@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.18.8": version "7.18.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" @@ -874,7 +1044,15 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.18.6": +"@babel/plugin-transform-logical-assignment-operators@^7.24.1": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0" + integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== @@ -940,7 +1118,33 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.18.6": +"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120" + integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.24.1": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63" + integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.24.5": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6" + integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q== + dependencies: + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.24.7" + +"@babel/plugin-transform-object-super@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== @@ -948,6 +1152,23 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" +"@babel/plugin-transform-optional-catch-binding@^7.24.1": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4" + integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.24.5": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz#bb02a67b60ff0406085c13d104c99a835cdf365d" + integrity sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.1": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz#f8f9186c681d10c3de7620c916156d893c8a019e" @@ -962,7 +1183,32 @@ dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.18.6": +"@babel/plugin-transform-parameters@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68" + integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz#9bbefbe3649f470d681997e0b64a4b254d877242" + integrity sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.4" + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-transform-private-property-in-object@^7.22.11": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061" + integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== @@ -1009,6 +1255,14 @@ "@babel/helper-plugin-utils" "^7.20.2" regenerator-transform "^0.15.1" +"@babel/plugin-transform-regenerator@^7.20.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8" + integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + regenerator-transform "^0.15.2" + "@babel/plugin-transform-reserved-words@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" @@ -1058,7 +1312,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.18.9": +"@babel/plugin-transform-template-literals@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== @@ -1217,13 +1471,20 @@ pirates "^4.0.5" source-map-support "^0.5.16" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.5": +"@babel/runtime@^7.12.5": version "7.20.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== dependencies: regenerator-runtime "^0.13.11" +"@babel/runtime@^7.25.0": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2" + integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/runtime@^7.8.4": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.7.tgz#fcb41a5a70550e04a7b708037c7c32f7f356d8fd" @@ -1249,6 +1510,15 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" +"@babel/template@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" + "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.5.tgz#78eb244bea8270fdda1ef9af22a5d5e5b7e57133" @@ -1281,6 +1551,19 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.4": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" + integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.6" + "@babel/parser" "^7.25.6" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" + debug "^4.3.1" + globals "^11.1.0" + "@babel/types@7.19.0": version "7.19.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.0.tgz#75f21d73d73dc0351f3368d28db73465f4814600" @@ -1308,6 +1591,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== + dependencies: + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + "@craftzdog/react-native-buffer@^6.0.5": version "6.0.5" resolved "https://registry.yarnpkg.com/@craftzdog/react-native-buffer/-/react-native-buffer-6.0.5.tgz#0d4fbe0dd104186d2806655e3c0d25cebdae91d3" @@ -1316,6 +1608,18 @@ ieee754 "^1.2.1" react-native-quick-base64 "^2.0.5" +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.10.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" + integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== + "@hapi/hoek@^9.0.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" @@ -1328,41 +1632,58 @@ dependencies: "@hapi/hoek" "^9.0.0" -"@jest/create-cache-key-function@^29.2.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-29.3.1.tgz#3a0970ea595ab3d9507244edbcef14d6b016cdc9" - integrity sha512-4i+E+E40gK13K78ffD/8cy4lSSqeWwyXeTZoq16tndiCP12hC8uQsPJdIu5C6Kf22fD8UbBk71so7s/6VwpUOQ== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@isaacs/ttlcache@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz#21fb23db34e9b6220c6ba023a0118a2dd3461ea2" + integrity sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA== + +"@jest/create-cache-key-function@^29.6.3": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz#793be38148fab78e65f40ae30c36785f4ad859f0" + integrity sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.6.3" -"@jest/environment@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.3.1.tgz#eb039f726d5fcd14698acd072ac6576d41cfcaa6" - integrity sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag== +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== dependencies: - "@jest/fake-timers" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^29.3.1" + jest-mock "^29.7.0" -"@jest/fake-timers@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.3.1.tgz#b140625095b60a44de820876d4c14da1aa963f67" - integrity sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A== +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== dependencies: - "@jest/types" "^29.3.1" - "@sinonjs/fake-timers" "^9.1.2" + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^29.3.1" - jest-mock "^29.3.1" - jest-util "^29.3.1" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" -"@jest/schemas@^29.0.0": - version "29.0.0" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a" - integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: - "@sinclair/typebox" "^0.24.1" + "@sinclair/typebox" "^0.27.8" "@jest/types@^26.6.2": version "26.6.2" @@ -1375,23 +1696,12 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@jest/types@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" - integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^16.0.0" - chalk "^4.0.0" - -"@jest/types@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.3.1.tgz#7c5a80777cb13e703aeec6788d044150341147e3" - integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: - "@jest/schemas" "^29.0.0" + "@jest/schemas" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" @@ -1415,16 +1725,35 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/resolve-uri@3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + "@jridgewell/source-map@^0.3.2": version "0.3.2" resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" @@ -1438,6 +1767,19 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" @@ -1446,6 +1788,13 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + version "5.1.1-v1" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== + dependencies: + eslint-scope "5.1.1" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -1467,181 +1816,379 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@react-native-community/cli-clean@^10.1.1": - version "10.1.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-10.1.1.tgz#4c73ce93a63a24d70c0089d4025daac8184ff504" - integrity sha512-iNsrjzjIRv9yb5y309SWJ8NDHdwYtnCpmxZouQDyOljUdC9MwdZ4ChbtA4rwQyAwgOVfS9F/j56ML3Cslmvrxg== +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@react-native-community/cli-clean@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-14.0.0.tgz#37b53762e5f3d02f452a44fc32a7f88a7419ccad" + integrity sha512-kvHthZTNur/wLLx8WL5Oh+r04zzzFAX16r8xuaLhu9qGTE6Th1JevbsIuiQb5IJqD8G/uZDKgIZ2a0/lONcbJg== dependencies: - "@react-native-community/cli-tools" "^10.1.1" + "@react-native-community/cli-tools" "14.0.0" chalk "^4.1.2" - execa "^1.0.0" - prompts "^2.4.0" + execa "^5.0.0" + fast-glob "^3.3.2" -"@react-native-community/cli-config@^10.1.1": - version "10.1.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-10.1.1.tgz#08dcc5d7ca1915647dc06507ed853fe0c1488395" - integrity sha512-p4mHrjC+s/ayiNVG6T35GdEGdP6TuyBUg5plVGRJfTl8WT6LBfLYLk+fz/iETrEZ/YkhQIsQcEUQC47MqLNHog== +"@react-native-community/cli-config@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-14.0.0.tgz#641ec08ddb44c90ceb947d8fc8e35de1a4bcf4a4" + integrity sha512-2Nr8KR+dgn1z+HLxT8piguQ1SoEzgKJnOPQKE1uakxWaRFcQ4LOXgzpIAscYwDW6jmQxdNqqbg2cRUoOS7IMtQ== dependencies: - "@react-native-community/cli-tools" "^10.1.1" + "@react-native-community/cli-tools" "14.0.0" chalk "^4.1.2" - cosmiconfig "^5.1.0" - deepmerge "^3.2.0" - glob "^7.1.3" + cosmiconfig "^9.0.0" + deepmerge "^4.3.0" + fast-glob "^3.3.2" joi "^17.2.1" -"@react-native-community/cli-debugger-ui@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-10.0.0.tgz#4bb6d41c7e46449714dc7ba5d9f5b41ef0ea7c57" - integrity sha512-8UKLcvpSNxnUTRy8CkCl27GGLqZunQ9ncGYhSrWyKrU9SWBJJGeZwi2k2KaoJi5FvF2+cD0t8z8cU6lsq2ZZmA== +"@react-native-community/cli-debugger-ui@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-14.0.0.tgz#ef02d531e70b86265d39773abc3b58ab5cb8f4b8" + integrity sha512-JpfzILfU7eKE9+7AMCAwNJv70H4tJGVv3ZGFqSVoK1YHg5QkVEGsHtoNW8AsqZRS6Fj4os+Fmh+r+z1L36sPmg== dependencies: serve-static "^1.13.1" -"@react-native-community/cli-doctor@^10.1.1": - version "10.1.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-10.1.1.tgz#6d60a2df74ea112d1f3b41491b6ee0948daa4fb3" - integrity sha512-9uvUhr6aJu4C7pCTsD9iRS/38tx1mzIrWuEQoh2JffTXg9MOq4jesvobkyKFRD90nOvqunEvfpnWnRdWcZO0Wg== +"@react-native-community/cli-debugger-ui@14.0.0-alpha.11": + version "14.0.0-alpha.11" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-14.0.0-alpha.11.tgz#952bb7c162e136ebff1950e7e80706eb3155fe21" + integrity sha512-0wCNQxhCniyjyMXgR1qXliY180y/2QbvoiYpp2MleGQADr5M1b8lgI4GoyADh5kE+kX3VL0ssjgyxpmbpCD86A== dependencies: - "@react-native-community/cli-config" "^10.1.1" - "@react-native-community/cli-platform-ios" "^10.1.1" - "@react-native-community/cli-tools" "^10.1.1" + serve-static "^1.13.1" + +"@react-native-community/cli-doctor@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-14.0.0.tgz#f6855495d5a53e9a2c206949958a8291ac3e326e" + integrity sha512-in6jylHjaPUaDzV+JtUblh8m9JYIHGjHOf6Xn57hrmE5Zwzwuueoe9rSMHF1P0mtDgRKrWPzAJVejElddfptWA== + dependencies: + "@react-native-community/cli-config" "14.0.0" + "@react-native-community/cli-platform-android" "14.0.0" + "@react-native-community/cli-platform-apple" "14.0.0" + "@react-native-community/cli-platform-ios" "14.0.0" + "@react-native-community/cli-tools" "14.0.0" chalk "^4.1.2" command-exists "^1.2.8" - envinfo "^7.7.2" - execa "^1.0.0" - hermes-profile-transformer "^0.0.6" - ip "^1.1.5" + deepmerge "^4.3.0" + envinfo "^7.13.0" + execa "^5.0.0" node-stream-zip "^1.9.1" ora "^5.4.1" - prompts "^2.4.0" - semver "^6.3.0" + semver "^7.5.2" strip-ansi "^5.2.0" - sudo-prompt "^9.0.0" wcwidth "^1.0.1" + yaml "^2.2.1" -"@react-native-community/cli-hermes@^10.1.3": - version "10.1.3" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-10.1.3.tgz#440e2ff0f2ac9aba0ca1daee6ffaaf9c093437cc" - integrity sha512-uYl8MLBtuu6bj0tDUzVGf30nK5i9haBv7F0u+NCOq31+zVjcwiUplrCuLorb2dMLMF+Fno9wDxi66W9MxoW4nA== - dependencies: - "@react-native-community/cli-platform-android" "^10.1.3" - "@react-native-community/cli-tools" "^10.1.1" - chalk "^4.1.2" - hermes-profile-transformer "^0.0.6" - ip "^1.1.5" - -"@react-native-community/cli-platform-android@10.1.3", "@react-native-community/cli-platform-android@^10.1.3": - version "10.1.3" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-10.1.3.tgz#8380799cd4d3f9a0ca568b0f5b4ae9e462ce3669" - integrity sha512-8YZEpBL6yd9l4CIoFcLOgrV8x2GDujdqrdWrNsNERDAbsiFwqAQvfjyyb57GAZVuEPEJCoqUlGlMCwOh3XQb9A== +"@react-native-community/cli-platform-android@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-14.0.0.tgz#36f47999af9b386aaa8f8286923edd9a65101f28" + integrity sha512-nt7yVz3pGKQXnVa5MAk7zR+1n41kNKD3Hi2OgybH5tVShMBo7JQoL2ZVVH6/y/9wAwI/s7hXJgzf1OIP3sMq+Q== dependencies: - "@react-native-community/cli-tools" "^10.1.1" + "@react-native-community/cli-tools" "14.0.0" chalk "^4.1.2" - execa "^1.0.0" - glob "^7.1.3" + execa "^5.0.0" + fast-glob "^3.3.2" + fast-xml-parser "^4.2.4" logkitty "^0.7.1" -"@react-native-community/cli-platform-ios@10.1.1", "@react-native-community/cli-platform-ios@^10.1.1": - version "10.1.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-10.1.1.tgz#39ed6810117d8e7330d3aa4d85818fb6ae358785" - integrity sha512-EB9/L8j1LqrqyfJtLRixU+d8FIP6Pr83rEgUgXgya/u8wk3h/bvX70w+Ff2skwjdPLr5dLUQ/n5KFX4r3bsNmA== +"@react-native-community/cli-platform-apple@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-apple/-/cli-platform-apple-14.0.0.tgz#7050af6fbc01b4ebe72e1bdcb48d188cbbf1b9ef" + integrity sha512-WniJL8vR4MeIsjqio2hiWWuUYUJEL3/9TDL5aXNwG68hH3tYgK3742+X9C+vRzdjTmf5IKc/a6PwLsdplFeiwQ== dependencies: - "@react-native-community/cli-tools" "^10.1.1" + "@react-native-community/cli-tools" "14.0.0" chalk "^4.1.2" - execa "^1.0.0" - glob "^7.1.3" + execa "^5.0.0" + fast-glob "^3.3.2" + fast-xml-parser "^4.2.4" ora "^5.4.1" -"@react-native-community/cli-plugin-metro@^10.1.1": - version "10.1.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-10.1.1.tgz#8b8689c921f6f0aeafa7ea9aabbde4c482b376b7" - integrity sha512-wEp47le4mzlelDF5sfkaaujUDYcuLep5HZqlcMx7PkL7BA3/fSHdDo1SblqaLgZ1ca6vFU+kfbHueLDct+xwFg== +"@react-native-community/cli-platform-ios@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-14.0.0.tgz#7c7c393a13415bf61aaad82f1a3583c30afb110e" + integrity sha512-8kxGv7mZ5nGMtueQDq+ndu08f0ikf3Zsqm3Ix8FY5KCXpSgP14uZloO2GlOImq/zFESij+oMhCkZJGggpWpfAw== dependencies: - "@react-native-community/cli-server-api" "^10.1.1" - "@react-native-community/cli-tools" "^10.1.1" - chalk "^4.1.2" - execa "^1.0.0" - metro "0.73.7" - metro-config "0.73.7" - metro-core "0.73.7" - metro-react-native-babel-transformer "0.73.7" - metro-resolver "0.73.7" - metro-runtime "0.73.7" - readline "^1.3.0" + "@react-native-community/cli-platform-apple" "14.0.0" -"@react-native-community/cli-server-api@^10.1.1": - version "10.1.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-10.1.1.tgz#e382269de281bb380c2e685431364fbbb8c1cb3a" - integrity sha512-NZDo/wh4zlm8as31UEBno2bui8+ufzsZV+KN7QjEJWEM0levzBtxaD+4je0OpfhRIIkhaRm2gl/vVf7OYAzg4g== +"@react-native-community/cli-server-api@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-14.0.0.tgz#1b62b78e5ea7dead0ae4590465c977bc4af880fc" + integrity sha512-A0FIsj0QCcDl1rswaVlChICoNbfN+mkrKB5e1ab5tOYeZMMyCHqvU+eFvAvXjHUlIvVI+LbqCkf4IEdQ6H/2AQ== dependencies: - "@react-native-community/cli-debugger-ui" "^10.0.0" - "@react-native-community/cli-tools" "^10.1.1" + "@react-native-community/cli-debugger-ui" "14.0.0" + "@react-native-community/cli-tools" "14.0.0" compression "^1.7.1" connect "^3.6.5" - errorhandler "^1.5.0" + errorhandler "^1.5.1" nocache "^3.0.1" pretty-format "^26.6.2" serve-static "^1.13.1" - ws "^7.5.1" + ws "^6.2.3" -"@react-native-community/cli-tools@^10.1.1": - version "10.1.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-10.1.1.tgz#fa66e509c0d3faa31f7bb87ed7d42ad63f368ddd" - integrity sha512-+FlwOnZBV+ailEzXjcD8afY2ogFEBeHOw/8+XXzMgPaquU2Zly9B+8W089tnnohO3yfiQiZqkQlElP423MY74g== +"@react-native-community/cli-server-api@14.0.0-alpha.11": + version "14.0.0-alpha.11" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-14.0.0-alpha.11.tgz#505163e11d3a30ebc874950956f72f5b3b6c5fc1" + integrity sha512-I7YeYI7S5wSxnQAqeG8LNqhT99FojiGIk87DU0vTp6U8hIMLcA90fUuBAyJY38AuQZ12ZJpGa8ObkhIhWzGkvg== + dependencies: + "@react-native-community/cli-debugger-ui" "14.0.0-alpha.11" + "@react-native-community/cli-tools" "14.0.0-alpha.11" + compression "^1.7.1" + connect "^3.6.5" + errorhandler "^1.5.1" + nocache "^3.0.1" + pretty-format "^26.6.2" + serve-static "^1.13.1" + ws "^6.2.3" + +"@react-native-community/cli-tools@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-14.0.0.tgz#07b57a8942a131618c198e3b64fb1ec846cd631d" + integrity sha512-L7GX5hyYYv0ZWbAyIQKzhHuShnwDqlKYB0tqn57wa5riGCaxYuRPTK+u4qy+WRCye7+i8M4Xj6oQtSd4z0T9cA== dependencies: appdirsjs "^1.2.4" chalk "^4.1.2" + execa "^5.0.0" find-up "^5.0.0" mime "^2.4.1" - node-fetch "^2.6.0" open "^6.2.0" ora "^5.4.1" - semver "^6.3.0" + semver "^7.5.2" + shell-quote "^1.7.3" + sudo-prompt "^9.0.0" + +"@react-native-community/cli-tools@14.0.0-alpha.11": + version "14.0.0-alpha.11" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-14.0.0-alpha.11.tgz#95b148a3e65a4c2519af608b27ed7091e7e8b78a" + integrity sha512-HQCfVnX9aqRdKdLxmQy4fUAUo+YhNGlBV7ZjOayPbuEGWJ4RN+vSy0Cawk7epo7hXd6vKzc7P7y3HlU6Kxs7+w== + dependencies: + appdirsjs "^1.2.4" + chalk "^4.1.2" + execa "^5.0.0" + find-up "^5.0.0" + mime "^2.4.1" + open "^6.2.0" + ora "^5.4.1" + semver "^7.5.2" shell-quote "^1.7.3" + sudo-prompt "^9.0.0" -"@react-native-community/cli-types@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-10.0.0.tgz#046470c75ec18f8b3bd906e54e43a6f678e01a45" - integrity sha512-31oUM6/rFBZQfSmDQsT1DX/5fjqfxg7sf2u8kTPJK7rXVya5SRpAMaCXsPAG0omsmJxXt+J9HxUi3Ic+5Ux5Iw== +"@react-native-community/cli-types@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-14.0.0.tgz#6cde2d2a93edd9b13238171edef30352d37e8dd2" + integrity sha512-CMUevd1pOWqvmvutkUiyQT2lNmMHUzSW7NKc1xvHgg39NjbS58Eh2pMzIUP85IwbYNeocfYc3PH19vA/8LnQtg== dependencies: joi "^17.2.1" -"@react-native-community/cli@10.1.3": - version "10.1.3" - resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-10.1.3.tgz#ad610c46da9fc7c717272024ec757dc646726506" - integrity sha512-kzh6bYLGN1q1q0IiczKSP1LTrovFeVzppYRTKohPI9VdyZwp7b5JOgaQMB/Ijtwm3MxBDrZgV9AveH/eUmUcKQ== - dependencies: - "@react-native-community/cli-clean" "^10.1.1" - "@react-native-community/cli-config" "^10.1.1" - "@react-native-community/cli-debugger-ui" "^10.0.0" - "@react-native-community/cli-doctor" "^10.1.1" - "@react-native-community/cli-hermes" "^10.1.3" - "@react-native-community/cli-plugin-metro" "^10.1.1" - "@react-native-community/cli-server-api" "^10.1.1" - "@react-native-community/cli-tools" "^10.1.1" - "@react-native-community/cli-types" "^10.0.0" +"@react-native-community/cli@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-14.0.0.tgz#0c98d75ac55515d07972682c1053f46bfee93863" + integrity sha512-KwMKJB5jsDxqOhT8CGJ55BADDAYxlYDHv5R/ASQlEcdBEZxT0zZmnL0iiq2VqzETUy+Y/Nop+XDFgqyoQm0C2w== + dependencies: + "@react-native-community/cli-clean" "14.0.0" + "@react-native-community/cli-config" "14.0.0" + "@react-native-community/cli-debugger-ui" "14.0.0" + "@react-native-community/cli-doctor" "14.0.0" + "@react-native-community/cli-server-api" "14.0.0" + "@react-native-community/cli-tools" "14.0.0" + "@react-native-community/cli-types" "14.0.0" chalk "^4.1.2" commander "^9.4.1" - execa "^1.0.0" - find-up "^4.1.0" + deepmerge "^4.3.0" + execa "^5.0.0" + find-up "^5.0.0" fs-extra "^8.1.0" graceful-fs "^4.1.3" - prompts "^2.4.0" - semver "^6.3.0" + prompts "^2.4.2" + semver "^7.5.2" -"@react-native/assets@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@react-native/assets/-/assets-1.0.0.tgz#c6f9bf63d274bafc8e970628de24986b30a55c8e" - integrity sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ== +"@react-native/assets-registry@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.75.2.tgz#2c522c537fa86298987b8c877c167ac9b485d3da" + integrity sha512-P1dLHjpUeC0AIkDHRYcx0qLMr+p92IPWL3pmczzo6T76Qa9XzruQOYy0jittxyBK91Csn6HHQ/eit8TeXW8MVw== -"@react-native/normalize-color@*", "@react-native/normalize-color@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@react-native/normalize-color/-/normalize-color-2.1.0.tgz#939b87a9849e81687d3640c5efa2a486ac266f91" - integrity sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA== +"@react-native/babel-plugin-codegen@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.75.2.tgz#1d940df23ac4ca16b4bd3299f4a3c98081158960" + integrity sha512-BIKVh2ZJPkzluUGgCNgpoh6NTHgX8j04FCS0Z/rTmRJ66hir/EUBl8frMFKrOy/6i4VvZEltOWB5eWfHe1AYgw== + dependencies: + "@react-native/codegen" "0.75.2" -"@react-native/polyfills@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@react-native/polyfills/-/polyfills-2.0.0.tgz#4c40b74655c83982c8cf47530ee7dc13d957b6aa" - integrity sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ== +"@react-native/babel-preset@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.75.2.tgz#f66a762fd8e172e547eeebb25f2960a5144ea14f" + integrity sha512-mprpsas+WdCEMjQZnbDiAC4KKRmmLbMB+o/v4mDqKlH4Mcm7RdtP5t80MZGOVCHlceNp1uEIpXywx69DNwgbgg== + dependencies: + "@babel/core" "^7.20.0" + "@babel/plugin-proposal-export-default-from" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-default-from" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.18.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-syntax-optional-chaining" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-generator-functions" "^7.24.3" + "@babel/plugin-transform-async-to-generator" "^7.20.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-class-properties" "^7.24.1" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.20.0" + "@babel/plugin-transform-flow-strip-types" "^7.20.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-logical-assignment-operators" "^7.24.1" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1" + "@babel/plugin-transform-numeric-separator" "^7.24.1" + "@babel/plugin-transform-object-rest-spread" "^7.24.5" + "@babel/plugin-transform-optional-catch-binding" "^7.24.1" + "@babel/plugin-transform-optional-chaining" "^7.24.5" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.11" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/plugin-transform-regenerator" "^7.20.0" + "@babel/plugin-transform-runtime" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.5.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + "@babel/template" "^7.0.0" + "@react-native/babel-plugin-codegen" "0.75.2" + babel-plugin-transform-flow-enums "^0.0.2" + react-refresh "^0.14.0" + +"@react-native/codegen@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.75.2.tgz#15674a9b21cf413eb37657fb045a06640bf54476" + integrity sha512-OkWdbtO2jTkfOXfj3ibIL27rM6LoaEuApOByU2G8X+HS6v9U87uJVJlMIRWBDmnxODzazuHwNVA2/wAmSbucaw== + dependencies: + "@babel/parser" "^7.20.0" + glob "^7.1.1" + hermes-parser "0.22.0" + invariant "^2.2.4" + jscodeshift "^0.14.0" + mkdirp "^0.5.1" + nullthrows "^1.1.1" + yargs "^17.6.2" + +"@react-native/community-cli-plugin@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.75.2.tgz#f5943c22e6dd24fa8fc6151de8ba52b92e3cc61b" + integrity sha512-/tz0bzVja4FU0aAimzzQ7iYR43peaD6pzksArdrrGhlm8OvFYAQPOYSNeIQVMSarwnkNeg1naFKaeYf1o3++yA== + dependencies: + "@react-native-community/cli-server-api" "14.0.0-alpha.11" + "@react-native-community/cli-tools" "14.0.0-alpha.11" + "@react-native/dev-middleware" "0.75.2" + "@react-native/metro-babel-transformer" "0.75.2" + chalk "^4.0.0" + execa "^5.1.1" + metro "^0.80.3" + metro-config "^0.80.3" + metro-core "^0.80.3" + node-fetch "^2.2.0" + querystring "^0.2.1" + readline "^1.3.0" + +"@react-native/debugger-frontend@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.75.2.tgz#ead66eff1b0f8ad3c7a86b5845acc0c2cf69236e" + integrity sha512-qIC6mrlG8RQOPaYLZQiJwqnPchAVGnHWcVDeQxPMPLkM/D5+PC8tuKWYOwgLcEau3RZlgz7QQNk31Qj2/OJG6Q== + +"@react-native/dev-middleware@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.75.2.tgz#feb325a9ec5a0fda640a0897957a43030801b1d3" + integrity sha512-fTC5m2uVjYp1XPaIJBFgscnQjPdGVsl96z/RfLgXDq0HBffyqbg29ttx6yTCx7lIa9Gdvf6nKQom+e+Oa4izSw== + dependencies: + "@isaacs/ttlcache" "^1.4.1" + "@react-native/debugger-frontend" "0.75.2" + chrome-launcher "^0.15.2" + chromium-edge-launcher "^0.2.0" + connect "^3.6.5" + debug "^2.2.0" + node-fetch "^2.2.0" + nullthrows "^1.1.1" + open "^7.0.3" + selfsigned "^2.4.1" + serve-static "^1.13.1" + ws "^6.2.2" + +"@react-native/eslint-config@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/eslint-config/-/eslint-config-0.75.2.tgz#845951e094f34e82ca3fc911ff8013923a81e055" + integrity sha512-lelWQ/mjwCLONrZ0mrCjWYPZWYckjuVCjdADOSMuEe7/tjwUZYW/e/iQdOvy1USqFwGHLLkTjE722EmQ6P+O7A== + dependencies: + "@babel/core" "^7.20.0" + "@babel/eslint-parser" "^7.20.0" + "@react-native/eslint-plugin" "0.75.2" + "@typescript-eslint/eslint-plugin" "^7.1.1" + "@typescript-eslint/parser" "^7.1.1" + eslint-config-prettier "^8.5.0" + eslint-plugin-eslint-comments "^3.2.0" + eslint-plugin-ft-flow "^2.0.1" + eslint-plugin-jest "^27.9.0" + eslint-plugin-react "^7.30.1" + eslint-plugin-react-hooks "^4.6.0" + eslint-plugin-react-native "^4.0.0" + +"@react-native/eslint-plugin@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/eslint-plugin/-/eslint-plugin-0.75.2.tgz#c206c9f869d4435386024855d9d193219a50a5cf" + integrity sha512-cxvSn+io32l+mbyDcpGGGoDXMwFxsVvb1JHSdfbzxi6+94gdD+ce0gqFJY4FCPg/ebJ2gCvQ8j0lt1NoAizUuQ== + +"@react-native/gradle-plugin@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.75.2.tgz#f5627aef8e7f17df089f4f8dae6373ea05c11854" + integrity sha512-AELeAOCZi3B2vE6SeN+mjpZjjqzqa76yfFBB3L3f3NWiu4dm/YClTGOj+5IVRRgbt8LDuRImhDoaj7ukheXr4Q== + +"@react-native/js-polyfills@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.75.2.tgz#0586fa51c043bcf9b99710ecb10982d851a0e358" + integrity sha512-AtLd3mbiE+FXK2Ru3l2NFOXDhUvzdUsCP4qspUw0haVaO/9xzV97RVD2zz0lur2f/LmZqQ2+KXyYzr7048b5iw== + +"@react-native/metro-babel-transformer@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.75.2.tgz#bcb0d135c735b5cd50a7eb1ba4e51669c1f6224d" + integrity sha512-EygglCCuOub2sZ00CSIiEekCXoGL2XbOC6ssOB47M55QKvhdPG/0WBQXvmOmiN42uZgJK99Lj749v4rB0PlPIQ== + dependencies: + "@babel/core" "^7.20.0" + "@react-native/babel-preset" "0.75.2" + hermes-parser "0.22.0" + nullthrows "^1.1.1" + +"@react-native/metro-config@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/metro-config/-/metro-config-0.75.2.tgz#7c3f9209027f057e4f560afd7f43fe134dba1093" + integrity sha512-LBcNF0csApOirPVmRhIAAb4ovAXDhn0Dbli5LMaLCosgQwJuhb05z7s1weavcAylPPUS7DuICUQpMoRU6hZzeQ== + dependencies: + "@react-native/js-polyfills" "0.75.2" + "@react-native/metro-babel-transformer" "0.75.2" + metro-config "^0.80.3" + metro-runtime "^0.80.3" + +"@react-native/normalize-colors@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.75.2.tgz#de095f4b985580748ffa239a70ae63fbaa93724e" + integrity sha512-nPwWJFtsqNFS/qSG9yDOiSJ64mjG7RCP4X/HXFfyWzCM1jq49h/DYBdr+c3e7AvTKGIdy0gGT3vgaRUHZFVdUQ== + +"@react-native/typescript-config@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/typescript-config/-/typescript-config-0.75.2.tgz#ab76a041eb6a019fb10d00f4c266343069757027" + integrity sha512-guqu6REcuDmfjlM/B6YNqTfv4kK35gn6ungzZQdU8zznyWiXlyxR7uSSyNcy1QgEztsvO7B3HU073PBHV8RxXQ== + +"@react-native/virtualized-lists@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.75.2.tgz#6832fb0745a93e42dbda659426cc14a38a493282" + integrity sha512-pD5SVCjxc8k+JdoyQ+IlulBTEqJc3S4KUKsmv5zqbNCyETB0ZUvd4Su7bp+lLF6ALxx6KKmbGk8E3LaWEjUFFQ== + dependencies: + invariant "^2.2.4" + nullthrows "^1.1.1" "@sideway/address@^4.1.3": version "4.1.4" @@ -1660,26 +2207,26 @@ resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== -"@sinclair/typebox@^0.24.1": - version "0.24.51" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" - integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== -"@sinonjs/commons@^1.7.0": - version "1.8.6" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" - integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== dependencies: - "@sinonjs/commons" "^1.7.0" + "@sinonjs/commons" "^3.0.0" -"@sqltools/formatter@^1.2.2": +"@sqltools/formatter@^1.2.2", "@sqltools/formatter@^1.2.5": version "1.2.5" resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.5.tgz#3abc203c79b8c3e90fd6c156a0c62d5403520e12" integrity sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw== @@ -1718,11 +2265,23 @@ dependencies: "@types/istanbul-lib-report" "*" +"@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + "@types/mocha@^10.0.1": version "10.0.1" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.1.tgz#2f4f65bb08bc368ac39c96da7b2f09140b26851b" integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== +"@types/node-forge@^1.3.0": + version "1.3.11" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + dependencies: + "@types/node" "*" + "@types/node@*": version "18.11.10" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.10.tgz#4c64759f3c2343b7e6c4b9caf761c7a3a05cee34" @@ -1733,13 +2292,6 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== -"@types/react-native@^0.70.6": - version "0.70.7" - resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.70.7.tgz#1708e5f746bbce2ea4e0bd5a2627560667804d46" - integrity sha512-hBzeUWwk8sfj3vDfwEXb4hbjWjl0jb5CvWlu2gLrOUJyFHVzJ+x6Y9ilO2eVtJW7l5QmmNLILE1PkVfKRkqYuQ== - dependencies: - "@types/react" "*" - "@types/react-test-renderer@^18.0.0": version "18.0.0" resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-18.0.0.tgz#7b7f69ca98821ea5501b21ba24ea7b6139da2243" @@ -1747,7 +2299,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^18.0.24": +"@types/react@*": version "18.0.26" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.26.tgz#8ad59fc01fef8eaf5c74f4ea392621749f0b7917" integrity sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug== @@ -1756,11 +2308,24 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/react@^18.3.1": + version "18.3.5" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.5.tgz#5f524c2ad2089c0ff372bbdabc77ca2c4dbadf8f" + integrity sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + "@types/scheduler@*": version "0.16.2" resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== +"@types/semver@^7.3.12": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + "@types/stack-utils@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" @@ -1778,13 +2343,6 @@ dependencies: "@types/yargs-parser" "*" -"@types/yargs@^16.0.0": - version "16.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" - integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== - dependencies: - "@types/yargs-parser" "*" - "@types/yargs@^17.0.8": version "17.0.19" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.19.tgz#8dbecdc9ab48bee0cb74f6e3327de3fa0d0c98ae" @@ -1792,6 +2350,135 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@^7.1.1": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz#b16d3cf3ee76bf572fdf511e79c248bdec619ea3" + integrity sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/type-utils" "7.18.0" + "@typescript-eslint/utils" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/parser@^7.1.1": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0" + integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg== + dependencies: + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/scope-manager@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83" + integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== + dependencies: + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + +"@typescript-eslint/type-utils@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz#2165ffaee00b1fbbdd2d40aa85232dab6998f53b" + integrity sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA== + dependencies: + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/utils" "7.18.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/types@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" + integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/typescript-estree@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" + integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== + dependencies: + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/utils@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" + integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" + +"@typescript-eslint/utils@^5.10.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@typescript-eslint/visitor-keys@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" + integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== + dependencies: + "@typescript-eslint/types" "7.18.0" + eslint-visitor-keys "^3.4.3" + "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" @@ -1804,11 +2491,6 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -absolute-path@^0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7" - integrity sha512-HQiug4c+/s3WOvEnDRxXVmNtSG5s2gJM9r19BTcqjp7BWcE48PB+Y2G6jE65kqI0LpsQeMZygt/b60Gi4KxGyA== - accepts@^1.3.7, accepts@~1.3.5, accepts@~1.3.7: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -1870,6 +2552,11 @@ ansi-regex@^5.0.0, ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -1889,6 +2576,11 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + any-promise@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" @@ -1902,7 +2594,7 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -app-root-path@^3.0.0: +app-root-path@^3.0.0, app-root-path@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.1.0.tgz#5971a2fc12ba170369a7a1ef018c71e6e47c2e86" integrity sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA== @@ -1929,25 +2621,87 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== +array-includes@^3.1.6, array-includes@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== +array.prototype.findlast@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" asap@~2.0.6: version "2.0.6" @@ -1959,15 +2713,10 @@ assertion-error@^1.1.0: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== - -ast-types@0.14.2: - version "0.14.2" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.14.2.tgz#600b882df8583e3cd4f2df5fa20fa83759d4bdfd" - integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA== +ast-types@0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.15.2.tgz#39ae4809393c4b16df751ee563411423e85fb49d" + integrity sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg== dependencies: tslib "^2.0.1" @@ -1981,21 +2730,18 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async@^3.2.2: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + babel-core@^7.0.0-bridge.0: version "7.0.0-bridge.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" @@ -2036,10 +2782,12 @@ babel-plugin-polyfill-regenerator@^0.4.1: dependencies: "@babel/helper-define-polyfill-provider" "^0.3.3" -babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: - version "7.0.0-beta.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" - integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== +babel-plugin-transform-flow-enums@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz#d1d0cc9bdc799c850ca110d0ddc9f21b9ec3ef25" + integrity sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ== + dependencies: + "@babel/plugin-syntax-flow" "^7.12.1" babel-plugin-transform-typescript-metadata@^0.3.2: version "0.3.2" @@ -2048,62 +2796,16 @@ babel-plugin-transform-typescript-metadata@^0.3.2: dependencies: "@babel/helper-plugin-utils" "^7.0.0" -babel-preset-fbjs@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" - integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== - dependencies: - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-syntax-class-properties" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-block-scoped-functions" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-for-of" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-member-expression-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-object-super" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-property-literals" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.1.2, base64-js@^1.3.1, base64-js@^1.5.1: +base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -2133,22 +2835,6 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -2171,6 +2857,16 @@ browserslist@^4.21.3, browserslist@^4.21.4: node-releases "^2.0.6" update-browserslist-db "^1.0.9" +browserslist@^4.23.1: + version "4.23.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" + integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== + dependencies: + caniuse-lite "^1.0.30001646" + electron-to-chromium "^1.5.4" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -2204,21 +2900,6 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -2227,6 +2908,17 @@ call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" +call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + caller-callsite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" @@ -2246,6 +2938,11 @@ callsites@^2.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + camelcase-css@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" @@ -2256,7 +2953,7 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0: +camelcase@^6.0.0, camelcase@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== @@ -2271,6 +2968,11 @@ caniuse-lite@^1.0.30001400: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001436.tgz#22d7cbdbbbb60cdc4ca1030ccd6dea9f5de4848b" integrity sha512-ZmWkKsnC2ifEPoWUvSAIGyOYwT+keAaaWPHiQ9DfMqS1t6tfuyFYoWR78TeZtznkEQ64+vGXH9cZrElwR2Mrxg== +caniuse-lite@^1.0.30001646: + version "1.0.30001660" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz#31218de3463fabb44d0b7607b652e56edf2e2355" + integrity sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg== + chai@^4.3.7: version "4.3.7" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" @@ -2284,7 +2986,7 @@ chai@^4.3.7: pathval "^1.1.1" type-detect "^4.0.5" -chalk@^2.0.0: +chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2326,6 +3028,28 @@ chokidar@3.5.3, chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chrome-launcher@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.15.2.tgz#4e6404e32200095fdce7f6a1e1004f9bd36fa5da" + integrity sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ== + dependencies: + "@types/node" "*" + escape-string-regexp "^4.0.0" + is-wsl "^2.2.0" + lighthouse-logger "^1.0.0" + +chromium-edge-launcher@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz#0c378f28c99aefc360705fa155de0113997f62fc" + integrity sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg== + dependencies: + "@types/node" "*" + escape-string-regexp "^4.0.0" + is-wsl "^2.2.0" + lighthouse-logger "^1.0.0" + mkdirp "^1.0.4" + rimraf "^3.0.2" + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -2336,16 +3060,6 @@ ci-info@^3.2.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.0.tgz#6d01b3696c59915b6ce057e4aa4adfc2fa25f5ef" integrity sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog== -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" @@ -2411,14 +3125,6 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -2463,21 +3169,11 @@ commander@^9.4.1: resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== -commander@~2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" - integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== - commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -2518,11 +3214,6 @@ convert-source-map@^1.7.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== - core-js-compat@^3.25.1: version "3.26.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.26.1.tgz#0e710b09ebf689d719545ac36e49041850f943df" @@ -2535,7 +3226,7 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cosmiconfig@^5.0.5, cosmiconfig@^5.1.0: +cosmiconfig@^5.0.5: version "5.2.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== @@ -2545,7 +3236,17 @@ cosmiconfig@^5.0.5, cosmiconfig@^5.1.0: js-yaml "^3.13.1" parse-json "^4.0.0" -cross-spawn@^6.0.0, cross-spawn@^6.0.5: +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + dependencies: + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + +cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -2556,6 +3257,15 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^7.0.0, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + css-color-keywords@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" @@ -2585,17 +3295,49 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + date-fns@^2.28.0: version "2.29.3" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== +dayjs@^1.11.9: + version "1.11.13" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== + dayjs@^1.8.15: version "1.11.6" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.6.tgz#2e79a226314ec3ec904e3ee1dd5a4f5e5b1c7afb" integrity sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: +debug@2.6.9, debug@^2.2.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -2609,6 +3351,13 @@ debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.3: dependencies: ms "2.1.2" +debug@^4.3.1, debug@^4.3.4: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -2619,11 +3368,6 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - deep-eql@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.2.tgz#270ceb902f87724077e6f6449aed81463f42fc1c" @@ -2631,10 +3375,10 @@ deep-eql@^4.1.2: dependencies: type-detect "^4.0.0" -deepmerge@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.3.0.tgz#d3c47fd6f3a93d517b14426b0628a17b0125f5f7" - integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== +deepmerge@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== defaults@^1.0.3: version "1.0.4" @@ -2643,27 +3387,23 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: - is-descriptor "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" defined@^1.0.0: version "1.0.1" @@ -2680,15 +3420,6 @@ depd@2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -deprecated-react-native-prop-types@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-3.0.1.tgz#a275f84cd8519cd1665e8df3c99e9067d57a23ec" - integrity sha512-J0jCJcsk4hMlIb7xwOZKLfMpuJn6l8UtrPEzzQV5ewz5gvKNYakhBuq9h2rWX7YwHHJZFhU5W8ye7dB9oN8VcQ== - dependencies: - "@react-native/normalize-color" "*" - invariant "*" - prop-types "*" - destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -2713,16 +3444,40 @@ diff@5.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + dlv@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + dotenv@^16.0.0: version "16.0.3" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== +dotenv@^16.0.3: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -2733,27 +3488,35 @@ electron-to-chromium@^1.4.251: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +electron-to-chromium@^1.5.4: + version "1.5.19" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.19.tgz#aeaa0a076f3f0f0e8db2c57fd10158508f00725a" + integrity sha512-kpLJJi3zxTR1U828P+LIUDZ5ohixyo68/IcYOHLqnbTPr/wdgn4i1ECvmALN9E16JPA6cvCG5UG79gVwVdEK5w== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" +env-paths@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -envinfo@^7.7.2: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== +envinfo@^7.13.0: + version "7.13.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.13.0.tgz#81fbb81e5da35d74e814941aeab7c325a606fb31" + integrity sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q== error-ex@^1.3.1: version "1.3.2" @@ -2769,7 +3532,7 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" -errorhandler@^1.5.0: +errorhandler@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.5.1.tgz#b9ba5d17cf90744cd1e851357a6e75bf806a9a91" integrity sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A== @@ -2777,17 +3540,138 @@ errorhandler@^1.5.0: accepts "~1.3.7" escape-html "~1.0.3" +es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-iterator-helpers@^1.0.19: + version "1.0.19" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" + integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + iterator.prototype "^1.1.2" + safe-array-concat "^1.1.2" + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@4.0.0: +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== @@ -2802,11 +3686,115 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== +eslint-config-prettier@^8.5.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== + +eslint-plugin-eslint-comments@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz#9e1cd7b4413526abb313933071d7aba05ca12ffa" + integrity sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ== + dependencies: + escape-string-regexp "^1.0.5" + ignore "^5.0.5" + +eslint-plugin-ft-flow@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-2.0.3.tgz#3b3c113c41902bcbacf0e22b536debcfc3c819e8" + integrity sha512-Vbsd/b+LYA99jUbsL6viEUWShFaYQt2YQs3QN3f+aeszOhh2sgdcU0mjzDyD4yyBvMc8qy2uwvBBWfMzEX06tg== + dependencies: + lodash "^4.17.21" + string-natural-compare "^3.0.1" + +eslint-plugin-jest@^27.9.0: + version "27.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz#7c98a33605e1d8b8442ace092b60e9919730000b" + integrity sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug== + dependencies: + "@typescript-eslint/utils" "^5.10.0" + +eslint-plugin-react-hooks@^4.6.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== + +eslint-plugin-react-native-globals@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz#ee1348bc2ceb912303ce6bdbd22e2f045ea86ea2" + integrity sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g== + +eslint-plugin-react-native@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-native/-/eslint-plugin-react-native-4.1.0.tgz#5343acd3b2246bc1b857ac38be708f070d18809f" + integrity sha512-QLo7rzTBOl43FvVqDdq5Ql9IoElIuTdjrz9SKAXCvULvBoRZ44JGSkx9z4999ZusCsb4rK3gjS8gOGyeYqZv2Q== + dependencies: + eslint-plugin-react-native-globals "^0.1.1" + +eslint-plugin-react@^7.30.1: + version "7.35.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.35.2.tgz#d32500d3ec268656d5071918bfec78cfd8b070ed" + integrity sha512-Rbj2R9zwP2GYNcIak4xoAMV57hrBh3hTaR0k7hVjwCQgryE/pw5px4b13EYjduOI0hfXyZhwBxaGpOTbWSGzKQ== + dependencies: + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" + array.prototype.flatmap "^1.3.2" + array.prototype.tosorted "^1.1.4" + doctrine "^2.1.0" + es-iterator-helpers "^1.0.19" + estraverse "^5.3.0" + hasown "^2.0.2" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.8" + object.fromentries "^2.0.8" + object.values "^1.2.0" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.11" + string.prototype.repeat "^1.0.0" + +eslint-scope@5.1.1, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-visitor-keys@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + esprima@^4.0.0, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -2827,66 +3815,31 @@ events@^3.3.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== +execa@^5.0.0, execa@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: - is-extendable "^0.1.0" + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" +exponential-backoff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== extend@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - fast-glob@^3.2.12: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" @@ -2898,6 +3851,24 @@ fast-glob@^3.2.12: merge2 "^1.3.0" micromatch "^4.0.4" +fast-glob@^3.2.9, fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-xml-parser@^4.2.4: + version "4.5.0" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz#2882b7d01a6825dfdf909638f2de0256351def37" + integrity sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg== + dependencies: + strnum "^1.0.5" + fastq@^1.6.0: version "1.14.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.14.0.tgz#107f69d7295b11e0fccc264e1fc6389f623731ce" @@ -2912,16 +3883,6 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -2994,16 +3955,16 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== +flow-enums-runtime@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz#5bb0cd1b0a3e471330f4d109039b7eba5cb3e787" + integrity sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw== + flow-parser@0.*: version "0.194.0" resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.194.0.tgz#3d226aca8473593ad90167ae1e14dbb3cbcb6a8b" integrity sha512-3dipGWKnXmE4LEE5yCPHJrSlMYOPAYU7wMBecfKiWPQSZp1CvkpJ59dfuuUIeM2TSttKGSatep77vGG9cjkeqg== -flow-parser@^0.185.0: - version "0.185.2" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.185.2.tgz#cb7ee57f77377d6c5d69a469e980f6332a15e492" - integrity sha512-2hJ5ACYeJCzNtiVULov6pljKOLygy0zddoqSI1fFetM+XRPpRshFdGEijtqlamA1XwyZ+7rhryI6FQFzvtLWUQ== - for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -3011,17 +3972,13 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== +foreground-child@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== dependencies: - map-cache "^0.2.2" + cross-spawn "^7.0.0" + signal-exit "^4.0.1" fresh@0.5.2: version "0.5.2" @@ -3061,6 +4018,26 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -3085,17 +4062,30 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.3: has "^1.0.3" has-symbols "^1.0.3" -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== +get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: - pump "^3.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" @@ -3123,7 +4113,19 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.3, glob@^7.1.6, glob@^7.2.0: +glob@^10.3.10: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +glob@^7.1.1, glob@^7.1.3, glob@^7.1.6, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -3140,6 +4142,26 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globalthis@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + gopd@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" @@ -3152,6 +4174,16 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -3162,6 +4194,18 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" @@ -3174,36 +4218,12 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" + has-symbols "^1.0.3" has@^1.0.3: version "1.0.3" @@ -3212,29 +4232,41 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -hermes-estree@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.8.0.tgz#530be27243ca49f008381c1f3e8b18fb26bf9ec0" - integrity sha512-W6JDAOLZ5pMPMjEiQGLCXSSV7pIBEgRR5zGkxgmzGSXHOxqV5dC/M1Zevqpbm9TZDE5tu358qZf8Vkzmsc+u7Q== +hermes-estree@0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.22.0.tgz#38559502b119f728901d2cfe2ef422f277802a1d" + integrity sha512-FLBt5X9OfA8BERUdc6aZS36Xz3rRuB0Y/mfocSADWEJfomc1xfene33GdyAmtTkKTBXTN/EgAy+rjTKkkZJHlw== + +hermes-estree@0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.23.1.tgz#d0bac369a030188120ee7024926aabe5a9f84fdb" + integrity sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg== -hermes-parser@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.8.0.tgz#116dceaba32e45b16d6aefb5c4c830eaeba2d257" - integrity sha512-yZKalg1fTYG5eOiToLUaw69rQfZq/fi+/NtEXRU7N87K/XobNRhRWorh80oSge2lWUiZfTgUvRJH+XgZWrhoqA== +hermes-parser@0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.22.0.tgz#fc8e0e6c7bfa8db85b04c9f9544a102c4fcb4040" + integrity sha512-gn5RfZiEXCsIWsFGsKiykekktUoh0PdFWYocXsUdZIyWSckT6UIyPcyyUIPSR3kpnELWeK3n3ztAse7Mat6PSA== dependencies: - hermes-estree "0.8.0" + hermes-estree "0.22.0" -hermes-profile-transformer@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz#bd0f5ecceda80dd0ddaae443469ab26fb38fc27b" - integrity sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ== +hermes-parser@0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.23.1.tgz#e5de648e664f3b3d84d01b48fc7ab164f4b68205" + integrity sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA== dependencies: - source-map "^0.7.3" + hermes-estree "0.23.1" highlight.js@^10.7.1: version "10.7.3" @@ -3252,15 +4284,27 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -image-size@^0.6.0: - version "0.6.3" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" - integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== +ignore@^5.0.5, ignore@^5.2.0, ignore@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +image-size@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.1.1.tgz#ddd67d4dc340e52ac29ce5f546a09f4e29e840ac" + integrity sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ== + dependencies: + queue "6.0.2" import-fresh@^2.0.0: version "2.0.0" @@ -3270,6 +4314,14 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" +import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -3288,32 +4340,22 @@ inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, i resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -invariant@*, invariant@^2.2.4: +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + +invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" -ip@^1.1.5: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" - integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - is-arguments@^1.0.4: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" @@ -3322,11 +4364,33 @@ is-arguments@^1.0.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -3334,12 +4398,15 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" -is-callable@^1.1.3: +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== @@ -3351,6 +4418,13 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-core-module@^2.13.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== + dependencies: + hasown "^2.0.2" + is-core-module@^2.9.0: version "2.11.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" @@ -3358,37 +4432,19 @@ is-core-module@^2.9.0: dependencies: has "^1.0.3" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" + is-typed-array "^1.1.13" -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" + has-tostringtag "^1.0.0" is-directory@^0.3.1: version "0.3.1" @@ -3400,23 +4456,18 @@ is-docker@^2.0.0: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -3427,7 +4478,7 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-generator-function@^1.0.7: +is-generator-function@^1.0.10, is-generator-function@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== @@ -3446,12 +4497,22 @@ is-interactive@^1.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: - kind-of "^3.0.2" + has-tostringtag "^1.0.0" is-number@^7.0.0: version "7.0.0" @@ -3463,17 +4524,51 @@ is-plain-obj@^2.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" is-typed-array@^1.1.10, is-typed-array@^1.1.3: version "1.1.10" @@ -3486,29 +4581,56 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.3: gopd "^1.0.1" has-tostringtag "^1.0.0" +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-windows@^1.0.2: +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== -is-wsl@^2.1.1: +is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: is-docker "^2.0.0" -isarray@1.0.0, isarray@~1.0.0: +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== @@ -3518,114 +4640,103 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: +isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -jest-environment-node@^29.2.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.3.1.tgz#5023b32472b3fba91db5c799a0d5624ad4803e74" - integrity sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag== +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jest-environment-node@^29.6.3: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== dependencies: - "@jest/environment" "^29.3.1" - "@jest/fake-timers" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^29.3.1" - jest-util "^29.3.1" + jest-mock "^29.7.0" + jest-util "^29.7.0" -jest-get-type@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" - integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== -jest-message-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.3.1.tgz#37bc5c468dfe5120712053dd03faf0f053bd6adb" - integrity sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA== +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.3.1" + "@jest/types" "^29.6.3" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.3.1" + pretty-format "^29.7.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.3.1.tgz#60287d92e5010979d01f218c6b215b688e0f313e" - integrity sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA== +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-util "^29.3.1" + jest-util "^29.7.0" -jest-regex-util@^27.0.6: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" - integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== - -jest-serializer@^27.0.6: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" - integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.9" - -jest-util@^27.2.0: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" - integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: - "@jest/types" "^27.5.1" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.3.1.tgz#1dda51e378bbcb7e3bc9d8ab651445591ed373e1" - integrity sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ== +jest-validate@^29.6.3: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== dependencies: - "@jest/types" "^29.3.1" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^26.5.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" - integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== - dependencies: - "@jest/types" "^26.6.2" - camelcase "^6.0.0" + "@jest/types" "^29.6.3" + camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^26.3.0" + jest-get-type "^29.6.3" leven "^3.1.0" - pretty-format "^26.6.2" + pretty-format "^29.7.0" -jest-worker@^27.2.0: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== +jest-worker@^29.6.3: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" + jest-util "^29.7.0" merge-stream "^2.0.0" supports-color "^8.0.0" @@ -3660,15 +4771,20 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -jsc-android@^250230.2.1: - version "250230.2.1" - resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-250230.2.1.tgz#3790313a970586a03ab0ad47defbc84df54f1b83" - integrity sha512-KmxeBlRjwoqCnBBKGsihFtvsBHyUFlBxJPK4FzeYcIuBfdjv6jFys44JITAgSTbQD+vIdwMEfyZklsuQX0yI1Q== +jsc-android@^250231.0.0: + version "250231.0.0" + resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-250231.0.0.tgz#91720f8df382a108872fa4b3f558f33ba5e95262" + integrity sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw== + +jsc-safe-url@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz#141c14fbb43791e88d5dc64e85a374575a83477a" + integrity sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q== -jscodeshift@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.13.1.tgz#69bfe51e54c831296380585c6d9e733512aecdef" - integrity sha512-lGyiEbGOvmMRKgWk4vf+lUrCWO/8YR8sUR3FKF1Cq5fovjZDlIcw3Hu5ppLHAnEXshVffvaM0eyuY/AbOeYpnQ== +jscodeshift@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.14.0.tgz#7542e6715d6d2e8bde0b4e883f0ccea358b46881" + integrity sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA== dependencies: "@babel/core" "^7.13.16" "@babel/parser" "^7.13.16" @@ -3683,10 +4799,10 @@ jscodeshift@^0.13.1: chalk "^4.1.2" flow-parser "0.*" graceful-fs "^4.2.4" - micromatch "^3.1.10" + micromatch "^4.0.4" neo-async "^2.5.0" node-dir "^0.1.17" - recast "^0.20.4" + recast "^0.21.0" temp "^0.8.4" write-file-atomic "^2.3.0" @@ -3705,6 +4821,11 @@ json-parse-better-errors@^1.0.1: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -3727,26 +4848,17 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: - is-buffer "^1.1.5" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -3768,11 +4880,24 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +lighthouse-logger@^1.0.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz#aef90f9e97cd81db367c7634292ee22079280aaa" + integrity sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g== + dependencies: + debug "^2.6.9" + marky "^1.2.2" + lilconfig@^2.0.5, lilconfig@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -3805,6 +4930,11 @@ lodash.throttle@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + log-symbols@4.1.0, log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" @@ -3836,6 +4966,11 @@ loupe@^2.3.1: dependencies: get-func-name "^2.0.0" +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -3858,17 +4993,10 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" +marky@^1.2.2: + version "1.2.5" + resolved "https://registry.yarnpkg.com/marky/-/marky-1.2.5.tgz#55796b688cbd72390d2d399eaaf1832c9413e3c0" + integrity sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q== memoize-one@^5.0.0: version "5.2.1" @@ -3880,280 +5008,165 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0: +merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -metro-babel-transformer@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.73.7.tgz#561ffa0336eb6d7d112e7128e957114c729fdb71" - integrity sha512-s7UVkwovGTEXYEQrv5hcmSBbFJ9s9lhCRNMScn4Itgj3UMdqRr9lU8DXKEFlJ7osgRxN6n5+eXqcvhE4B1H1VQ== +metro-babel-transformer@0.80.12: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.80.12.tgz#ad02ade921dd4ced27b26b18ff31eb60608e3f56" + integrity sha512-YZziRs0MgA3pzCkkvOoQRXjIoVjvrpi/yRlJnObyIvMP6lFdtyG4nUGIwGY9VXnBvxmXD6mPY2e+NSw6JAyiRg== dependencies: "@babel/core" "^7.20.0" - hermes-parser "0.8.0" - metro-source-map "0.73.7" + flow-enums-runtime "^0.0.6" + hermes-parser "0.23.1" nullthrows "^1.1.1" -metro-cache-key@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.73.7.tgz#fa3b4ece5f3191ce238a623051a0d03bada2a153" - integrity sha512-GngYzrHwZU9U0Xl81H4aq9Tn5cjQyU12v9/flB0hzpeiYO5A89TIeilb4Kg8jtfC6JcmmsdK9nxYIGEq7odHhQ== - -metro-cache@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.73.7.tgz#dd2b6a791b2754eae9c0a86dcf714b98e025fd95" - integrity sha512-CPPgI+i9yVzOEDCdmEEZ67JgOvZyNDs8kStmGUFgDuLSjj3//HhkqT5XyfWjGeH6KmyGiS8ip3cgLOVn3IsOSA== +metro-cache-key@0.80.12: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.80.12.tgz#52f5de698b85866503ace45d0ad76f75aaec92a4" + integrity sha512-o4BspKnugg/pE45ei0LGHVuBJXwRgruW7oSFAeSZvBKA/sGr0UhOGY3uycOgWInnS3v5yTTfiBA9lHlNRhsvGA== dependencies: - metro-core "0.73.7" - rimraf "^3.0.2" + flow-enums-runtime "^0.0.6" -metro-config@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.73.7.tgz#8935054ece6155d214420c263272cd3a690a82e2" - integrity sha512-pD/F+vK3u37cbj1skYmI6cUsEEscqNRtW2KlDKu1m+n8nooDB2oGTOZatlS5WQa7Ga6jYQRydftlq4CLDexAfA== +metro-cache@0.80.12: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.80.12.tgz#bd81af02c4f17b5aeab19bb030566b14147cee8b" + integrity sha512-p5kNHh2KJ0pbQI/H7ZBPCEwkyNcSz7OUkslzsiIWBMPQGFJ/xArMwkV7I+GJcWh+b4m6zbLxE5fk6fqbVK1xGA== dependencies: - cosmiconfig "^5.0.5" - jest-validate "^26.5.2" - metro "0.73.7" - metro-cache "0.73.7" - metro-core "0.73.7" - metro-runtime "0.73.7" + exponential-backoff "^3.1.1" + flow-enums-runtime "^0.0.6" + metro-core "0.80.12" -metro-core@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.73.7.tgz#f5abe2448ea72a65f54db9bc90068f3308de1df2" - integrity sha512-H7j1Egj1VnNnsSYf9ZKv0SRwijgtRKIcaGNQq/T+er73vqqb4kR9H+2VIJYPXi6R8lT+QLIMfs6CWSUHAJUgtg== +metro-config@0.80.12, metro-config@^0.80.3: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.80.12.tgz#1543009f37f7ad26352ffc493fc6305d38bdf1c0" + integrity sha512-4rwOWwrhm62LjB12ytiuR5NgK1ZBNr24/He8mqCsC+HXZ+ATbrewLNztzbAZHtFsrxP4D4GLTGgh96pCpYLSAQ== dependencies: + connect "^3.6.5" + cosmiconfig "^5.0.5" + flow-enums-runtime "^0.0.6" + jest-validate "^29.6.3" + metro "0.80.12" + metro-cache "0.80.12" + metro-core "0.80.12" + metro-runtime "0.80.12" + +metro-core@0.80.12, metro-core@^0.80.3: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.80.12.tgz#5ae337923ab19ff524077efa1aeacdf4480cfa28" + integrity sha512-QqdJ/yAK+IpPs2HU/h5v2pKEdANBagSsc6DRSjnwSyJsCoHlmyJKCaCJ7KhWGx+N4OHxh37hoA8fc2CuZbx0Fw== + dependencies: + flow-enums-runtime "^0.0.6" lodash.throttle "^4.1.1" - metro-resolver "0.73.7" + metro-resolver "0.80.12" -metro-file-map@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.73.7.tgz#709f33ac5ea6f87668d454c77973ab296b7a064b" - integrity sha512-BYaCo2e/4FMN4nOajeN+Za5cPfecfikzUYuFWWMyLAmHU6dj7B+PFkaJ4OEJO3vmRoeq5vMOmhpKXgysYbNXJg== +metro-file-map@0.80.12: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.80.12.tgz#b03240166a68aa16c5a168c26e190d9da547eefb" + integrity sha512-sYdemWSlk66bWzW2wp79kcPMzwuG32x1ZF3otI0QZTmrnTaaTiGyhE66P1z6KR4n2Eu5QXiABa6EWbAQv0r8bw== dependencies: - abort-controller "^3.0.0" anymatch "^3.0.3" debug "^2.2.0" fb-watchman "^2.0.0" + flow-enums-runtime "^0.0.6" graceful-fs "^4.2.4" invariant "^2.2.4" - jest-regex-util "^27.0.6" - jest-serializer "^27.0.6" - jest-util "^27.2.0" - jest-worker "^27.2.0" + jest-worker "^29.6.3" micromatch "^4.0.4" + node-abort-controller "^3.1.1" nullthrows "^1.1.1" walker "^1.0.7" optionalDependencies: fsevents "^2.3.2" -metro-hermes-compiler@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-hermes-compiler/-/metro-hermes-compiler-0.73.7.tgz#d1b519c4040423240d89e7816340ca9635deeae8" - integrity sha512-F8PlJ8mWEEumGNH3eMRA3gjgP70ZvH4Ex5F1KY6ofD/gpn7w5HJHSPTeVw8gtUb1pYLN4nevptpyXGg04Jfcog== - -metro-inspector-proxy@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.73.7.tgz#edb966c1581a41a3302860d264f3228e1f57a220" - integrity sha512-TsAtQeKr9X7NaQHlpshu+ZkGWlPi5fFKNqieLkfqvT1oXN4PQF/4q38INyiZtWLPvoUzTR6PRnm4pcUbJ7+Nzg== - dependencies: - connect "^3.6.5" - debug "^2.2.0" - ws "^7.5.1" - yargs "^17.5.1" - -metro-minify-terser@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.73.7.tgz#e45fc05eb2e3bc76c9b4fe4abccee0fffeedcf75" - integrity sha512-gbv1fmMOZm6gJ6dQoD+QktlCi2wk6nlTR8j8lQCjeeXGbs6O9e5XLWNPOexHqo7S69bdbohEnfZnLJFcxgHeNw== +metro-minify-terser@0.80.12: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.80.12.tgz#9951030e3bc52d7f3ac8664ce5862401c673e3c6" + integrity sha512-muWzUw3y5k+9083ZoX9VaJLWEV2Jcgi+Oan0Mmb/fBNMPqP9xVDuy4pOMn/HOiGndgfh/MK7s4bsjkyLJKMnXQ== dependencies: + flow-enums-runtime "^0.0.6" terser "^5.15.0" -metro-minify-uglify@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.73.7.tgz#3dfd397e8202905731e4a519a58fc334d9232a15" - integrity sha512-DmDCzfdbaPExQuQ7NQozCNOSOAgp5Ux9kWzmKAT8seQ38/3NtUepW+PTgxXIHmwNjJV4oHsHwlBlTwJmYihKXg== +metro-resolver@0.80.12: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.80.12.tgz#e3815914c21315b04db200032c3243a4cc22dfb6" + integrity sha512-PR24gYRZnYHM3xT9pg6BdbrGbM/Cu1TcyIFBVlAk7qDAuHkUNQ1nMzWumWs+kwSvtd9eZGzHoucGJpTUEeLZAw== dependencies: - uglify-es "^3.1.9" + flow-enums-runtime "^0.0.6" -metro-react-native-babel-preset@0.73.5: - version "0.73.5" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.73.5.tgz#9b92f1ebc2b3d96f511c45a03f8e35e0fc46cc19" - integrity sha512-Ej6J8ozWSs6nrh0nwX7hgX4oPXUai40ckah37cSLu8qeED2XiEtfLV1YksTLafFE8fX0EieiP97U97dkOGHP4w== +metro-runtime@0.80.12, metro-runtime@^0.80.3: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.80.12.tgz#a68af3a2a013f5372d3b8cee234fdd467455550b" + integrity sha512-LIx7+92p5rpI0i6iB4S4GBvvLxStNt6fF0oPMaUd1Weku7jZdfkCZzmrtDD9CSQ6EPb0T9NUZoyXIxlBa3wOCw== dependencies: - "@babel/core" "^7.14.0" - "@babel/plugin-proposal-async-generator-functions" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-export-default-from" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.0.0" - "@babel/plugin-syntax-export-default-from" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.2.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-syntax-optional-chaining" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-async-to-generator" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-self" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-sticky-regex" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.5.0" - "@babel/plugin-transform-unicode-regex" "^7.0.0" - "@babel/template" "^7.0.0" - react-refresh "^0.4.0" + "@babel/runtime" "^7.25.0" + flow-enums-runtime "^0.0.6" -metro-react-native-babel-preset@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.73.7.tgz#78e1ce448aa9a5cf3651c0ebe73cb225465211b4" - integrity sha512-RKcmRZREjJCzHKP+JhC9QTCohkeb3xa/DtqHU14U5KWzJHdC0mMrkTZYNXhV0cryxsaVKVEw5873KhbZyZHMVw== - dependencies: - "@babel/core" "^7.20.0" - "@babel/plugin-proposal-async-generator-functions" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-export-default-from" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.0.0" - "@babel/plugin-syntax-export-default-from" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.18.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-syntax-optional-chaining" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-async-to-generator" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-self" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-sticky-regex" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.5.0" - "@babel/plugin-transform-unicode-regex" "^7.0.0" - "@babel/template" "^7.0.0" - react-refresh "^0.4.0" - -metro-react-native-babel-transformer@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.73.7.tgz#a92055fd564cd403255cc34f925c5e99ce457565" - integrity sha512-73HW8betjX+VPm3iqsMBe8F/F2Tt+hONO6YJwcF7FonTqQYW1oTz0dOp0dClZGfHUXxpJBz6Vuo7J6TpdzDD+w== - dependencies: - "@babel/core" "^7.20.0" - babel-preset-fbjs "^3.4.0" - hermes-parser "0.8.0" - metro-babel-transformer "0.73.7" - metro-react-native-babel-preset "0.73.7" - metro-source-map "0.73.7" - nullthrows "^1.1.1" - -metro-resolver@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.73.7.tgz#1e174cf59eac84c0869172764316042b466daaa5" - integrity sha512-mGW3XPeKBCwZnkHcKo1dhFa9olcx7SyNzG1vb5kjzJYe4Qs3yx04r/qFXIJLcIgLItB69TIGvosznUhpeOOXzg== - dependencies: - absolute-path "^0.0.0" - -metro-runtime@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.73.7.tgz#9f3a7f3ff668c1a87370650e32b47d8f6329fd1e" - integrity sha512-2fxRGrF8FyrwwHY0TCitdUljzutfW6CWEpdvPilfrs8p0PI5X8xOWg8ficeYtw+DldHtHIAL2phT59PqzHTyVA== - dependencies: - "@babel/runtime" "^7.0.0" - react-refresh "^0.4.0" - -metro-source-map@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.73.7.tgz#8e9f850a72d60ea7ace05b984f981c8ec843e7a0" - integrity sha512-gbC/lfUN52TtQhEsTTA+987MaFUpQlufuCI05blLGLosDcFCsARikHsxa65Gtslm/rG2MqvFLiPA5hviONNv9g== +metro-source-map@0.80.12, metro-source-map@^0.80.3: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.80.12.tgz#36a2768c880f8c459d6d758e2d0975e36479f49c" + integrity sha512-o+AXmE7hpvM8r8MKsx7TI21/eerYYy2DCDkWfoBkv+jNkl61khvDHlQn0cXZa6lrcNZiZkl9oHSMcwLLIrFmpw== dependencies: "@babel/traverse" "^7.20.0" "@babel/types" "^7.20.0" + flow-enums-runtime "^0.0.6" invariant "^2.2.4" - metro-symbolicate "0.73.7" + metro-symbolicate "0.80.12" nullthrows "^1.1.1" - ob1 "0.73.7" + ob1 "0.80.12" source-map "^0.5.6" vlq "^1.0.0" -metro-symbolicate@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.73.7.tgz#40e4cda81f8030b86afe391b5e686a0b06822b0a" - integrity sha512-571ThWmX5o8yGNzoXjlcdhmXqpByHU/bSZtWKhtgV2TyIAzYCYt4hawJAS5+/qDazUvjHdm8BbdqFUheM0EKNQ== +metro-symbolicate@0.80.12: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.80.12.tgz#3a6aa783c6e494e2879342d88d5379fab69d1ed2" + integrity sha512-/dIpNdHksXkGHZXARZpL7doUzHqSNxgQ8+kQGxwpJuHnDhGkENxB5PS2QBaTDdEcmyTMjS53CN1rl9n1gR6fmw== dependencies: + flow-enums-runtime "^0.0.6" invariant "^2.2.4" - metro-source-map "0.73.7" + metro-source-map "0.80.12" nullthrows "^1.1.1" source-map "^0.5.6" through2 "^2.0.1" vlq "^1.0.0" -metro-transform-plugins@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.73.7.tgz#49ff2571742d557f20301880f55b00054e468e52" - integrity sha512-M5isiWEau0jMudb5ezaNBZnYqXxcATMqnAYc+Cu25IahT1NHi5aWwLok9EBmBpN5641IZUZXScf+KnS7fPxPCQ== +metro-transform-plugins@0.80.12: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.80.12.tgz#4a3853630ad0f36cc2bffd53bae659ee171a389c" + integrity sha512-WQWp00AcZvXuQdbjQbx1LzFR31IInlkCDYJNRs6gtEtAyhwpMMlL2KcHmdY+wjDO9RPcliZ+Xl1riOuBecVlPA== dependencies: "@babel/core" "^7.20.0" "@babel/generator" "^7.20.0" "@babel/template" "^7.0.0" "@babel/traverse" "^7.20.0" + flow-enums-runtime "^0.0.6" nullthrows "^1.1.1" -metro-transform-worker@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.73.7.tgz#be111805e92ea48b7c76dd75830798f318e252e0" - integrity sha512-gZYIu9JAqEI9Rxi0xGMuMW6QsHGbMSptozlTOwOd7T7yXX3WwYS/I3yLPbLhbZTjOhwMHkTt8Nhm2qBo8nh14g== +metro-transform-worker@0.80.12: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.80.12.tgz#80be8a185b7deb93402b682f58a1dd6724317ad1" + integrity sha512-KAPFN1y3eVqEbKLx1I8WOarHPqDMUa8WelWxaJCNKO/yHCP26zELeqTJvhsQup+8uwB6EYi/sp0b6TGoh6lOEA== dependencies: "@babel/core" "^7.20.0" "@babel/generator" "^7.20.0" "@babel/parser" "^7.20.0" "@babel/types" "^7.20.0" - babel-preset-fbjs "^3.4.0" - metro "0.73.7" - metro-babel-transformer "0.73.7" - metro-cache "0.73.7" - metro-cache-key "0.73.7" - metro-hermes-compiler "0.73.7" - metro-source-map "0.73.7" - metro-transform-plugins "0.73.7" + flow-enums-runtime "^0.0.6" + metro "0.80.12" + metro-babel-transformer "0.80.12" + metro-cache "0.80.12" + metro-cache-key "0.80.12" + metro-minify-terser "0.80.12" + metro-source-map "0.80.12" + metro-transform-plugins "0.80.12" nullthrows "^1.1.1" -metro@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.73.7.tgz#435081339ac209e4d8802c57ac522638140c802b" - integrity sha512-pkRqFhuGUvkiu8HxKPUQelbCuyy6te6okMssTyLzQwsKilNLK4YMI2uD6PHnypg5SiMJ58lwfqkp/t5w72jEvw== +metro@0.80.12, metro@^0.80.3: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.80.12.tgz#29a61fb83581a71e50c4d8d5d8458270edfe34cc" + integrity sha512-1UsH5FzJd9quUsD1qY+zUG4JY3jo3YEMxbMYH9jT6NK3j4iORhlwTK8fYTfAUBhDKjgLfKjAh7aoazNE23oIRA== dependencies: "@babel/code-frame" "^7.0.0" "@babel/core" "^7.20.0" @@ -4162,68 +5175,41 @@ metro@0.73.7: "@babel/template" "^7.0.0" "@babel/traverse" "^7.20.0" "@babel/types" "^7.20.0" - absolute-path "^0.0.0" accepts "^1.3.7" - async "^3.2.2" chalk "^4.0.0" ci-info "^2.0.0" connect "^3.6.5" debug "^2.2.0" denodeify "^1.2.1" error-stack-parser "^2.0.6" + flow-enums-runtime "^0.0.6" graceful-fs "^4.2.4" - hermes-parser "0.8.0" - image-size "^0.6.0" + hermes-parser "0.23.1" + image-size "^1.0.2" invariant "^2.2.4" - jest-worker "^27.2.0" + jest-worker "^29.6.3" + jsc-safe-url "^0.2.2" lodash.throttle "^4.1.1" - metro-babel-transformer "0.73.7" - metro-cache "0.73.7" - metro-cache-key "0.73.7" - metro-config "0.73.7" - metro-core "0.73.7" - metro-file-map "0.73.7" - metro-hermes-compiler "0.73.7" - metro-inspector-proxy "0.73.7" - metro-minify-terser "0.73.7" - metro-minify-uglify "0.73.7" - metro-react-native-babel-preset "0.73.7" - metro-resolver "0.73.7" - metro-runtime "0.73.7" - metro-source-map "0.73.7" - metro-symbolicate "0.73.7" - metro-transform-plugins "0.73.7" - metro-transform-worker "0.73.7" + metro-babel-transformer "0.80.12" + metro-cache "0.80.12" + metro-cache-key "0.80.12" + metro-config "0.80.12" + metro-core "0.80.12" + metro-file-map "0.80.12" + metro-resolver "0.80.12" + metro-runtime "0.80.12" + metro-source-map "0.80.12" + metro-symbolicate "0.80.12" + metro-transform-plugins "0.80.12" + metro-transform-worker "0.80.12" mime-types "^2.1.27" - node-fetch "^2.2.0" nullthrows "^1.1.1" - rimraf "^3.0.2" serialize-error "^2.1.0" source-map "^0.5.6" strip-ansi "^6.0.0" - temp "0.8.3" throat "^5.0.0" - ws "^7.5.1" - yargs "^17.5.1" - -micromatch@^3.1.10: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" + ws "^7.5.10" + yargs "^17.6.2" micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" @@ -4267,25 +5253,29 @@ minimatch@5.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1: +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.6: version "1.2.7" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== mkdirp@^0.5.1: version "0.5.6" @@ -4299,6 +5289,11 @@ mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mkdirp@^2.1.3: + version "2.1.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-2.1.6.tgz#964fbcb12b2d8c5d6fbc62a963ac95a273e2cc19" + integrity sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A== + mocha@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.1.0.tgz#dbf1114b7c3f9d0ca5de3133906aea3dfc89ef7a" @@ -4336,7 +5331,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3: +ms@2.1.3, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -4360,23 +5355,6 @@ nanoid@^3.3.4: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - nativewind@^2.0.11: version "2.0.11" resolved "https://registry.yarnpkg.com/nativewind/-/nativewind-2.0.11.tgz#aaa80a65b663a49856b26bd4f3153161f70299d7" @@ -4396,6 +5374,11 @@ nativewind@^2.0.11: react-is "^18.1.0" use-sync-external-store "^1.1.0" +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -4416,6 +5399,11 @@ nocache@^3.0.1: resolved "https://registry.yarnpkg.com/nocache/-/nocache-3.0.4.tgz#5b37a56ec6e09fc7d401dceaed2eab40c8bfdf79" integrity sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw== +node-abort-controller@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" + integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== + node-dir@^0.1.17: version "0.1.17" resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" @@ -4423,18 +5411,28 @@ node-dir@^0.1.17: dependencies: minimatch "^3.0.2" -node-fetch@^2.2.0, node-fetch@^2.6.0: +node-fetch@^2.2.0: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" +node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + node-releases@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" @@ -4450,55 +5448,82 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: - path-key "^2.0.0" + path-key "^3.0.0" nullthrows@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== -ob1@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.73.7.tgz#14c9b6ddc26cf99144f59eb542d7ae956e6b3192" - integrity sha512-DfelfvR843KADhSUATGGhuepVMRcf5VQX+6MQLy5AW0BKDLlO7Usj6YZeAAZP7P86QwsoTxB0RXCFiA7t6S1IQ== +ob1@0.80.12: + version "0.80.12" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.80.12.tgz#0451944ba6e5be225cc9751d8cd0d7309d2d1537" + integrity sha512-VMArClVT6LkhUGpnuEoBuyjG9rzUyEzg4PDkav6wK1cLhOK02gPCYFxoiB4mqVnrMhDpIzJcrGNAMVi9P+hXrw== + dependencies: + flow-enums-runtime "^0.0.6" object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - object-hash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: - isobject "^3.0.0" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== +object.values@^1.1.6, object.values@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== dependencies: - isobject "^3.0.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" on-finished@2.4.1: version "2.4.1" @@ -4519,14 +5544,14 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" -onetime@^5.1.0: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -4540,7 +5565,7 @@ open@^6.2.0: dependencies: is-wsl "^1.1.0" -open@^7.4.2: +open@^7.0.3, open@^7.4.2: version "7.4.2" resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== @@ -4563,16 +5588,11 @@ ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: +os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -4613,6 +5633,18 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -4621,6 +5653,16 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + parse5-htmlparser2-tree-adapter@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" @@ -4643,11 +5685,6 @@ parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== - patch-package@^6.5.0: version "6.5.0" resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.5.0.tgz#feb058db56f0005da59cfa316488321de585e88a" @@ -4683,16 +5720,34 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^2.0.0, path-key@^2.0.1: +path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + pathval@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" @@ -4703,6 +5758,11 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -4737,10 +5797,10 @@ pkg-up@^3.1.0: dependencies: find-up "^3.0.0" -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== postcss-calc@^8.2.4: version "8.2.4" @@ -4831,10 +5891,10 @@ postinstall-postinstall@^2.1.0: resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== -prettier@^2.4.1: - version "2.8.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.3.tgz#ab697b1d3dd46fb4626fbe2f543afe0cc98d8632" - integrity sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw== +prettier@^2.8.8: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== pretty-format@^26.5.2, pretty-format@^26.6.2: version "26.6.2" @@ -4846,12 +5906,12 @@ pretty-format@^26.5.2, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" -pretty-format@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.3.1.tgz#1841cac822b02b4da8971dacb03e8a871b4722da" - integrity sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg== +pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: - "@jest/schemas" "^29.0.0" + "@jest/schemas" "^29.6.3" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -4867,7 +5927,7 @@ promise@^8.3.0: dependencies: asap "~2.0.6" -prompts@^2.4.0: +prompts@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -4875,7 +5935,7 @@ prompts@^2.4.0: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@*: +prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -4884,19 +5944,23 @@ prop-types@*: object-assign "^4.1.1" react-is "^16.13.1" -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" +querystring@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" + integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +queue@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" + integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== + dependencies: + inherits "~2.0.3" + quick-lru@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" @@ -4914,10 +5978,10 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -react-devtools-core@^4.26.1: - version "4.27.1" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.27.1.tgz#167aa174383c65786cbb7e965a5b39c702f0a2d3" - integrity sha512-qXhcxxDWiFmFAOq48jts9YQYe1+wVoUXzJTlY4jbaATzyio6dd6CUGu3dXBhREeVgpZ+y4kg6vFJzIOZh6vY2w== +react-devtools-core@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-5.3.1.tgz#d57f5b8f74f16e622bd6a7bc270161e4ba162666" + integrity sha512-7FSb9meX0btdBQLwdFOwt6bGqvRPabmVMMslv8fgoSPqXyuGpgQe36kx8gR86XPw7aV1yVouTp6fyZ0EH+NfUw== dependencies: shell-quote "^1.6.1" ws "^7" @@ -4937,23 +6001,15 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react-native-codegen@^0.71.3: - version "0.71.3" - resolved "https://registry.yarnpkg.com/react-native-codegen/-/react-native-codegen-0.71.3.tgz#75fbc591819050791319ebdb9fe341ee4df5c288" - integrity sha512-5AvdHVU1sAaXg05i0dG664ZTaCaIFaY1znV5vNsj+wUu6MGxNEUNbDKk9dxKUkkxOyk2KZOK5uhzWL0p5H5yZQ== - dependencies: - "@babel/parser" "^7.14.0" - flow-parser "^0.185.0" - jscodeshift "^0.13.1" - nullthrows "^1.1.1" - -react-native-gradle-plugin@^0.71.13: - version "0.71.13" - resolved "https://registry.yarnpkg.com/react-native-gradle-plugin/-/react-native-gradle-plugin-0.71.13.tgz#6f60ff24ac712554903dfc0ae98475cb280c57a6" - integrity sha512-C66LNZAXbU0YDRkWx8d/8kjesdu7fsUAc/3QPJNftSXKEvEtnFZK2aH/rIgu1s5dbTcE0fjhdVPNJMRIfKo61w== +react-is@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== -react-native-nitro-modules@./../../react-native-nitro/packages/react-native-nitro-modules: - version "0.6.0" +react-native-nitro-modules@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/react-native-nitro-modules/-/react-native-nitro-modules-0.7.0.tgz#cbc1a4262f8e1abd6803b6bf0e8fadcae7f601ab" + integrity sha512-bzNIlEuRE5t+c5pxVXUy7JCA5Mtl3MCb5IK3/yJHn+SNJLFdbgdcKqiAQ3OTs/Je6ZpYI69frEl9RcXTKirmPA== react-native-quick-base64@^2.0.5: version "2.0.5" @@ -4964,56 +6020,62 @@ react-native-quick-base64@^2.0.5: react-native-quick-sqlite@./..: version "8.1.0" - -react-native-safe-area-context@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-4.5.0.tgz#9208313236e8f49e1920ac1e2a2c975f03aed284" - integrity sha512-0WORnk9SkREGUg2V7jHZbuN5x4vcxj/1B0QOcXJjdYWrzZHgLcUzYWWIUecUPJh747Mwjt/42RZDOaFn3L8kPQ== - -react-native@0.71.1: - version "0.71.1" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.71.1.tgz#72b45af2b29e3d5a660c63425ab5003bf2112f99" - integrity sha512-bLP5+IBj2IX6tgF9WnC/UL2ZPYkVUPsU4xqZV1jntTC2TH4xyLrvfKACjGlz5nQ3Mx4BmOFqsnMxithm53+6Aw== - dependencies: - "@jest/create-cache-key-function" "^29.2.1" - "@react-native-community/cli" "10.1.3" - "@react-native-community/cli-platform-android" "10.1.3" - "@react-native-community/cli-platform-ios" "10.1.1" - "@react-native/assets" "1.0.0" - "@react-native/normalize-color" "2.1.0" - "@react-native/polyfills" "2.0.0" + dependencies: + typeorm "^0.3.20" + +react-native-safe-area-context@^4.11.0: + version "4.11.0" + resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-4.11.0.tgz#d45271363672dc1923ddb0ce5a6ad588e210c85d" + integrity sha512-Bg7bozxEB+ZS+H3tVYs5yY1cvxNXgR6nRQwpSMkYR9IN5CbxohLnSprrOPG/ostTCd4F6iCk0c51pExEhifSKQ== + +react-native@0.75.2: + version "0.75.2" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.75.2.tgz#12d7e3e63c8ab93dcab7a6d4c4c9f4ad199141d4" + integrity sha512-pP+Yswd/EurzAlKizytRrid9LJaPJzuNldc+o5t01md2VLHym8V7FWH2z9omFKtFTer8ERg0fAhG1fpd0Qq6bQ== + dependencies: + "@jest/create-cache-key-function" "^29.6.3" + "@react-native-community/cli" "14.0.0" + "@react-native-community/cli-platform-android" "14.0.0" + "@react-native-community/cli-platform-ios" "14.0.0" + "@react-native/assets-registry" "0.75.2" + "@react-native/codegen" "0.75.2" + "@react-native/community-cli-plugin" "0.75.2" + "@react-native/gradle-plugin" "0.75.2" + "@react-native/js-polyfills" "0.75.2" + "@react-native/normalize-colors" "0.75.2" + "@react-native/virtualized-lists" "0.75.2" abort-controller "^3.0.0" anser "^1.4.9" - base64-js "^1.1.2" - deprecated-react-native-prop-types "^3.0.1" + ansi-regex "^5.0.0" + base64-js "^1.5.1" + chalk "^4.0.0" event-target-shim "^5.0.1" + flow-enums-runtime "^0.0.6" + glob "^7.1.1" invariant "^2.2.4" - jest-environment-node "^29.2.1" - jsc-android "^250230.2.1" + jest-environment-node "^29.6.3" + jsc-android "^250231.0.0" memoize-one "^5.0.0" - metro-react-native-babel-transformer "0.73.7" - metro-runtime "0.73.7" - metro-source-map "0.73.7" + metro-runtime "^0.80.3" + metro-source-map "^0.80.3" mkdirp "^0.5.1" nullthrows "^1.1.1" pretty-format "^26.5.2" promise "^8.3.0" - react-devtools-core "^4.26.1" - react-native-codegen "^0.71.3" - react-native-gradle-plugin "^0.71.13" - react-refresh "^0.4.0" - react-shallow-renderer "^16.15.0" + react-devtools-core "^5.3.1" + react-refresh "^0.14.0" regenerator-runtime "^0.13.2" - scheduler "^0.23.0" - stacktrace-parser "^0.1.3" - use-sync-external-store "^1.0.0" + scheduler "0.24.0-canary-efb381bbf-20230505" + semver "^7.1.3" + stacktrace-parser "^0.1.10" whatwg-fetch "^3.0.0" ws "^6.2.2" + yargs "^17.6.2" -react-refresh@^0.4.0: - version "0.4.3" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.3.tgz#966f1750c191672e76e16c2efa569150cc73ab53" - integrity sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA== +react-refresh@^0.14.0: + version "0.14.2" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" + integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== react-shallow-renderer@^16.15.0: version "16.15.0" @@ -5023,14 +6085,14 @@ react-shallow-renderer@^16.15.0: object-assign "^4.1.1" react-is "^16.12.0 || ^17.0.0 || ^18.0.0" -react-test-renderer@18.1.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-18.1.0.tgz#35b75754834cf9ab517b6813db94aee0a6b545c3" - integrity sha512-OfuueprJFW7h69GN+kr4Ywin7stcuqaYAt1g7airM5cUgP0BoF5G5CXsPGmXeDeEkncb2fqYNECO4y18sSqphg== +react-test-renderer@18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-18.3.1.tgz#e693608a1f96283400d4a3afead6893f958b80b4" + integrity sha512-KkAgygexHUkQqtvvx/otwxtuFu5cVjfzTCtjXLH9boS19/Nbtg84zS7wIQn39G8IlrhThBpQsMKkq5ZHZIYFXA== dependencies: - react-is "^18.1.0" + react-is "^18.3.1" react-shallow-renderer "^16.15.0" - scheduler "^0.22.0" + scheduler "^0.23.2" react@18.2.0: version "18.2.0" @@ -5080,12 +6142,12 @@ readline@^1.3.0: resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" integrity sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg== -recast@^0.20.4: - version "0.20.5" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.20.5.tgz#8e2c6c96827a1b339c634dd232957d230553ceae" - integrity sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ== +recast@^0.21.0: + version "0.21.5" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.21.5.tgz#e8cd22bb51bcd6130e54f87955d33a2b2e57b495" + integrity sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg== dependencies: - ast-types "0.14.2" + ast-types "0.15.2" esprima "~4.0.0" source-map "~0.6.1" tslib "^2.0.1" @@ -5095,6 +6157,24 @@ reflect-metadata@^0.1.13: resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== +reflect-metadata@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" + integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== + +reflect.getprototypeof@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + regenerate-unicode-properties@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" @@ -5112,6 +6192,11 @@ regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.2: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + regenerator-transform@^0.15.1: version "0.15.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" @@ -5119,13 +6204,22 @@ regenerator-transform@^0.15.1: dependencies: "@babel/runtime" "^7.8.4" -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" regexpu-core@^5.2.1: version "5.2.2" @@ -5151,16 +6245,6 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -5181,10 +6265,10 @@ resolve-from@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve@^1.1.7, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.22.1: version "1.22.1" @@ -5195,6 +6279,15 @@ resolve@^1.1.7, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.22.1: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -5203,11 +6296,6 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -5227,11 +6315,6 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -rimraf@~2.2.6: - version "2.2.8" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" - integrity sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg== - rimraf@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -5246,6 +6329,16 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -5256,32 +6349,42 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== dependencies: - ret "~0.1.10" + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" sax@>=0.6.0: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scheduler@^0.22.0: - version "0.22.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.22.0.tgz#83a5d63594edf074add9a7198b1bae76c3db01b8" - integrity sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ== +scheduler@0.24.0-canary-efb381bbf-20230505: + version "0.24.0-canary-efb381bbf-20230505" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz#5dddc60e29f91cd7f8b983d7ce4a99c2202d178f" + integrity sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA== dependencies: loose-envify "^1.1.0" -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" +selfsigned@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== + dependencies: + "@types/node-forge" "^1.3.0" + node-forge "^1" + semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -5292,6 +6395,16 @@ semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.1.3, semver@^7.3.7, semver@^7.5.2, semver@^7.6.0: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -5338,15 +6451,27 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1, set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" setprototypeof@1.2.0: version "1.2.0" @@ -5375,21 +6500,48 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + shell-quote@^1.6.1, shell-quote@^1.7.3: version "1.7.4" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== -signal-exit@^3.0.0, signal-exit@^3.0.2: +side-channel@^1.0.4, side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -5414,52 +6566,11 @@ slice-ansi@^2.0.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - source-map-support@^0.5.16, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -5468,11 +6579,6 @@ source-map-support@^0.5.16, source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -5483,18 +6589,6 @@ source-map@^0.6.0, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.7.3: - version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -5512,21 +6606,13 @@ stackframe@^1.3.4: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== -stacktrace-parser@^0.1.3: +stacktrace-parser@^0.1.10: version "0.1.10" resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== dependencies: type-fest "^0.7.1" -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -5545,6 +6631,20 @@ stream-browserify@^3.0.0: inherits "~2.0.4" readable-stream "^3.5.0" +string-natural-compare@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" + integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== + +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -5554,6 +6654,69 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.matchall@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + regexp.prototype.flags "^1.5.2" + set-function-name "^2.0.2" + side-channel "^1.0.6" + +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -5568,6 +6731,13 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^5.0.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" @@ -5582,16 +6752,28 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-json-comments@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + sudo-prompt@^9.0.0: version "9.2.1" resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd" @@ -5652,14 +6834,6 @@ tailwindcss@^3.2.4: quick-lru "^5.1.1" resolve "^1.22.1" -temp@0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" - integrity sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw== - dependencies: - os-tmpdir "^1.0.0" - rimraf "~2.2.6" - temp@^0.8.4: version "0.8.4" resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" @@ -5721,21 +6895,6 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -5743,16 +6902,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" @@ -5763,11 +6912,33 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +ts-api-utils@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + tslib@^2.0.1, tslib@^2.3.1: version "2.4.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== +tslib@^2.5.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -5778,6 +6949,50 @@ type-fest@^0.7.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + typeorm@^0.3.11: version "0.3.11" resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.11.tgz#09b6ab0b0574bf33c1faf7344bab6c363cf28921" @@ -5801,18 +7016,41 @@ typeorm@^0.3.11: xml2js "^0.4.23" yargs "^17.3.1" -typescript@^4.8.4: - version "4.9.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" - integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== +typeorm@^0.3.20: + version "0.3.20" + resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.20.tgz#4b61d737c6fed4e9f63006f88d58a5e54816b7ab" + integrity sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q== + dependencies: + "@sqltools/formatter" "^1.2.5" + app-root-path "^3.1.0" + buffer "^6.0.3" + chalk "^4.1.2" + cli-highlight "^2.1.11" + dayjs "^1.11.9" + debug "^4.3.4" + dotenv "^16.0.3" + glob "^10.3.10" + mkdirp "^2.1.3" + reflect-metadata "^0.2.1" + sha.js "^2.4.11" + tslib "^2.5.0" + uuid "^9.0.0" + yargs "^17.6.2" + +typescript@^5.0.4: + version "5.6.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0" + integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== -uglify-es@^3.1.9: - version "3.3.9" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: - commander "~2.13.0" - source-map "~0.6.1" + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" @@ -5837,16 +7075,6 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -5857,14 +7085,6 @@ unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - update-browserslist-db@^1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" @@ -5873,21 +7093,19 @@ update-browserslist-db@^1.0.9: escalade "^3.1.1" picocolors "^1.0.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.1" -use-sync-external-store@^1.0.0, use-sync-external-store@^1.1.0: +use-sync-external-store@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -5914,6 +7132,11 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -5956,11 +7179,61 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-builtin-type@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.4.tgz#592796260602fc3514a1b5ee7fa29319b72380c3" + integrity sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w== + dependencies: + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.2" + which-typed-array "^1.1.15" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== +which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + which-typed-array@^1.1.2: version "1.1.9" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" @@ -5980,11 +7253,27 @@ which@^1.2.9: dependencies: isexe "^2.0.0" +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + workerpool@6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -6003,6 +7292,15 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -6024,11 +7322,23 @@ ws@^6.2.2: dependencies: async-limiter "~1.0.0" -ws@^7, ws@^7.5.1: +ws@^6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.3.tgz#ccc96e4add5fd6fedbc491903075c85c5a11d9ee" + integrity sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA== + dependencies: + async-limiter "~1.0.0" + +ws@^7: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +ws@^7.5.10: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + xml2js@^0.4.23: version "0.4.23" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" @@ -6067,6 +7377,11 @@ yaml@^1.10.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yaml@^2.2.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130" + integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q== + yargs-parser@20.2.4: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" @@ -6130,7 +7445,7 @@ yargs@^15.1.0: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^17.3.1, yargs@^17.5.1: +yargs@^17.3.1: version "17.6.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== @@ -6143,6 +7458,19 @@ yargs@^17.3.1, yargs@^17.5.1: y18n "^5.0.5" yargs-parser "^21.1.1" +yargs@^17.6.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" diff --git a/package.json b/package.json index 47faefc9..8477c2e7 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "eslint": "8.57.0", "eslint-plugin-prettier": "^5.2.1", "mocha": "^10.7.3", + "nitro-codegen": "^0.7.0", "prettier": "^3.3.3", "react": "18.3.1", "react-native": "0.75.2", diff --git a/yarn.lock b/yarn.lock index 791b0795..a6846857 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17,12 +17,25 @@ dependencies: "@babel/highlight" "^7.18.6" +"@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== + dependencies: + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" + "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": version "7.20.10" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec" integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg== -"@babel/core@^7.13.16", "@babel/core@^7.14.0", "@babel/core@^7.18.5", "@babel/core@^7.20.0": +"@babel/compat-data@^7.25.2": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" + integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== + +"@babel/core@^7.13.16", "@babel/core@^7.18.5", "@babel/core@^7.20.0": version "7.20.12" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== @@ -43,6 +56,15 @@ json5 "^2.2.2" semver "^6.3.0" +"@babel/eslint-parser@^7.20.0": + version "7.25.1" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.1.tgz#469cee4bd18a88ff3edbdfbd227bd20e82aa9b82" + integrity sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg== + dependencies: + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.1" + "@babel/generator@^7.20.0", "@babel/generator@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" @@ -52,6 +74,16 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" +"@babel/generator@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" + integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== + dependencies: + "@babel/types" "^7.25.6" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" @@ -59,6 +91,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-annotate-as-pure@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" + integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== + dependencies: + "@babel/types" "^7.24.7" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" @@ -78,6 +117,17 @@ lru-cache "^5.1.1" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.24.7": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== + dependencies: + "@babel/compat-data" "^7.25.2" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": version "7.20.12" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz#4349b928e79be05ed2d1643b20b99bb87c503819" @@ -92,6 +142,19 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/helper-split-export-declaration" "^7.18.6" +"@babel/helper-create-class-features-plugin@^7.24.7", "@babel/helper-create-class-features-plugin@^7.25.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz#57eaf1af38be4224a9d9dd01ddde05b741f50e14" + integrity sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.8" + "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/helper-replace-supers" "^7.25.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/traverse" "^7.25.4" + semver "^6.3.1" + "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" @@ -146,6 +209,14 @@ dependencies: "@babel/types" "^7.20.7" +"@babel/helper-member-expression-to-functions@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6" + integrity sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA== + dependencies: + "@babel/traverse" "^7.24.8" + "@babel/types" "^7.24.8" + "@babel/helper-module-imports@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" @@ -153,6 +224,14 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11": version "7.20.11" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" @@ -174,11 +253,23 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-optimise-call-expression@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" + integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A== + dependencies: + "@babel/types" "^7.24.7" + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== +"@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== + "@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" @@ -189,6 +280,15 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" +"@babel/helper-remap-async-to-generator@^7.24.7", "@babel/helper-remap-async-to-generator@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz#d2f0fbba059a42d68e5e378feaf181ef6055365e" + integrity sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-wrap-function" "^7.25.0" + "@babel/traverse" "^7.25.0" + "@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" @@ -201,6 +301,15 @@ "@babel/traverse" "^7.20.7" "@babel/types" "^7.20.7" +"@babel/helper-replace-supers@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz#ff44deac1c9f619523fe2ca1fd650773792000a9" + integrity sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.24.8" + "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/traverse" "^7.25.0" + "@babel/helper-simple-access@^7.20.2": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" @@ -215,6 +324,14 @@ dependencies: "@babel/types" "^7.20.0" +"@babel/helper-skip-transparent-expression-wrappers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9" + integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" @@ -227,16 +344,31 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + "@babel/helper-validator-option@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== +"@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== + "@babel/helper-wrap-function@^7.18.9": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" @@ -247,6 +379,15 @@ "@babel/traverse" "^7.20.5" "@babel/types" "^7.20.5" +"@babel/helper-wrap-function@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz#dab12f0f593d6ca48c0062c28bcfb14ebe812f81" + integrity sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ== + dependencies: + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.0" + "@babel/types" "^7.25.0" + "@babel/helpers@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.7.tgz#04502ff0feecc9f20ecfaad120a18f011a8e6dce" @@ -265,11 +406,28 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.20.0", "@babel/parser@^7.20.7": +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.13.16", "@babel/parser@^7.20.0", "@babel/parser@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg== +"@babel/parser@^7.25.0", "@babel/parser@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== + dependencies: + "@babel/types" "^7.25.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" @@ -286,7 +444,7 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-proposal-optional-chaining" "^7.20.7" -"@babel/plugin-proposal-async-generator-functions@^7.0.0", "@babel/plugin-proposal-async-generator-functions@^7.20.1": +"@babel/plugin-proposal-async-generator-functions@^7.20.1": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== @@ -296,7 +454,7 @@ "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.17.12", "@babel/plugin-proposal-class-properties@^7.18.6": +"@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.17.12", "@babel/plugin-proposal-class-properties@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== @@ -353,7 +511,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== @@ -369,7 +527,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.20.2": +"@babel/plugin-proposal-object-rest-spread@^7.20.2": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== @@ -380,7 +538,7 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.20.7" -"@babel/plugin-proposal-optional-catch-binding@^7.0.0", "@babel/plugin-proposal-optional-catch-binding@^7.18.6": +"@babel/plugin-proposal-optional-catch-binding@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== @@ -388,7 +546,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": +"@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz#49f2b372519ab31728cc14115bb0998b15bfda55" integrity sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ== @@ -430,7 +588,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.12.13": +"@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== @@ -444,7 +602,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": +"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== @@ -465,7 +623,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.18.6", "@babel/plugin-syntax-flow@^7.2.0": +"@babel/plugin-syntax-flow@^7.12.1", "@babel/plugin-syntax-flow@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz#d1759e84dd4b437cf9fae69b4c06c41d7625bfb7" + integrity sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz#774d825256f2379d06139be0c723c4dd444f3ca1" integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== @@ -486,7 +651,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.18.6": +"@babel/plugin-syntax-jsx@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== @@ -514,7 +679,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== @@ -563,7 +728,17 @@ dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-async-to-generator@^7.0.0", "@babel/plugin-transform-async-to-generator@^7.18.6": +"@babel/plugin-transform-async-generator-functions@^7.24.3": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz#2afd4e639e2d055776c9f091b6c0c180ed8cf083" + integrity sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-remap-async-to-generator" "^7.25.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/traverse" "^7.25.4" + +"@babel/plugin-transform-async-to-generator@^7.18.6": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== @@ -572,7 +747,16 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-remap-async-to-generator" "^7.18.9" -"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.18.6": +"@babel/plugin-transform-async-to-generator@^7.20.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc" + integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA== + dependencies: + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-remap-async-to-generator" "^7.24.7" + +"@babel/plugin-transform-block-scoped-functions@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== @@ -586,6 +770,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.20.2" +"@babel/plugin-transform-class-properties@^7.24.1": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz#bae7dbfcdcc2e8667355cd1fb5eda298f05189fd" + integrity sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.4" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.20.2": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz#f438216f094f6bb31dc266ebfab8ff05aecad073" @@ -609,7 +801,14 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/template" "^7.20.7" -"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.20.2": +"@babel/plugin-transform-destructuring@^7.20.0": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz#c828e814dbe42a2718a838c2a2e16a408e055550" + integrity sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-transform-destructuring@^7.20.2": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz#8bda578f71620c7de7c93af590154ba331415454" integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== @@ -639,7 +838,7 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.18.6": +"@babel/plugin-transform-flow-strip-types@^7.18.6": version "7.19.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz#e9e8606633287488216028719638cbbb2f2dde8f" integrity sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg== @@ -647,6 +846,14 @@ "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-syntax-flow" "^7.18.6" +"@babel/plugin-transform-flow-strip-types@^7.20.0": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.2.tgz#b3aa251db44959b7a7c82abcd6b4225dec7d2258" + integrity sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/plugin-syntax-flow" "^7.24.7" + "@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.18.8": version "7.18.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" @@ -670,7 +877,15 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.18.6": +"@babel/plugin-transform-logical-assignment-operators@^7.24.1": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0" + integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== @@ -727,7 +942,33 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.18.6": +"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120" + integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.24.1": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63" + integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.24.5": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6" + integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q== + dependencies: + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.24.7" + +"@babel/plugin-transform-object-super@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== @@ -735,6 +976,23 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" +"@babel/plugin-transform-optional-catch-binding@^7.24.1": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4" + integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.24.5": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz#bb02a67b60ff0406085c13d104c99a835cdf365d" + integrity sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz#0ee349e9d1bc96e78e3b37a7af423a4078a7083f" @@ -742,7 +1000,32 @@ dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.18.6": +"@babel/plugin-transform-parameters@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68" + integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz#9bbefbe3649f470d681997e0b64a4b254d877242" + integrity sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.4" + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-transform-private-property-in-object@^7.22.11": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061" + integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== @@ -804,6 +1087,14 @@ "@babel/helper-plugin-utils" "^7.20.2" regenerator-transform "^0.15.1" +"@babel/plugin-transform-regenerator@^7.20.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8" + integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + regenerator-transform "^0.15.2" + "@babel/plugin-transform-reserved-words@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" @@ -845,7 +1136,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.18.9": +"@babel/plugin-transform-template-literals@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== @@ -1016,7 +1307,14 @@ pirates "^4.0.5" source-map-support "^0.5.16" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.25.0": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2" + integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/runtime@^7.8.4": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.7.tgz#fcb41a5a70550e04a7b708037c7c32f7f356d8fd" integrity sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ== @@ -1032,7 +1330,16 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.14.0", "@babel/traverse@^7.20.0", "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7": +"@babel/template@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" + +"@babel/traverse@^7.20.0", "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7": version "7.20.12" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.12.tgz#7f0f787b3a67ca4475adef1f56cb94f6abd4a4b5" integrity sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ== @@ -1048,6 +1355,19 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.4": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" + integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.6" + "@babel/parser" "^7.25.6" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" + debug "^4.3.1" + globals "^11.1.0" + "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.4.4": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" @@ -1057,6 +1377,47 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== + dependencies: + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" + integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + "@hapi/hoek@^9.0.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" @@ -1069,41 +1430,77 @@ dependencies: "@hapi/hoek" "^9.0.0" -"@jest/create-cache-key-function@^29.2.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-29.3.1.tgz#3a0970ea595ab3d9507244edbcef14d6b016cdc9" - integrity sha512-4i+E+E40gK13K78ffD/8cy4lSSqeWwyXeTZoq16tndiCP12hC8uQsPJdIu5C6Kf22fD8UbBk71so7s/6VwpUOQ== +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@isaacs/ttlcache@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz#21fb23db34e9b6220c6ba023a0118a2dd3461ea2" + integrity sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA== + +"@jest/create-cache-key-function@^29.6.3": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz#793be38148fab78e65f40ae30c36785f4ad859f0" + integrity sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.6.3" -"@jest/environment@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.3.1.tgz#eb039f726d5fcd14698acd072ac6576d41cfcaa6" - integrity sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag== +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== dependencies: - "@jest/fake-timers" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^29.3.1" + jest-mock "^29.7.0" -"@jest/fake-timers@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.3.1.tgz#b140625095b60a44de820876d4c14da1aa963f67" - integrity sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A== +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== dependencies: - "@jest/types" "^29.3.1" - "@sinonjs/fake-timers" "^9.1.2" + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^29.3.1" - jest-mock "^29.3.1" - jest-util "^29.3.1" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" -"@jest/schemas@^29.0.0": - version "29.0.0" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a" - integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: - "@sinclair/typebox" "^0.24.1" + "@sinclair/typebox" "^0.27.8" "@jest/types@^26.6.2": version "26.6.2" @@ -1116,23 +1513,12 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@jest/types@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" - integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^16.0.0" - chalk "^4.0.0" - -"@jest/types@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.3.1.tgz#7c5a80777cb13e703aeec6788d044150341147e3" - integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: - "@jest/schemas" "^29.0.0" + "@jest/schemas" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" @@ -1156,16 +1542,35 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/resolve-uri@3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + "@jridgewell/source-map@^0.3.2": version "0.3.2" resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" @@ -1179,6 +1584,19 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" @@ -1187,6 +1605,13 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + version "5.1.1-v1" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== + dependencies: + eslint-scope "5.1.1" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -1200,7 +1625,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -1208,203 +1633,374 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@react-native-community/cli-clean@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-10.0.0.tgz#09cc4c63116e81d3765ffedecc38387bcc7b4483" - integrity sha512-9uHRicQXycqu55rSplQh2/o/nDdA5qDXiU09/s7/fJbUlCNUySy5rXw5FtbQv+Bj+bD9tXFoDRKN1ZnNHtT4QQ== +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@pkgr/core@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" + integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== + +"@react-native-community/cli-clean@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-14.0.0.tgz#37b53762e5f3d02f452a44fc32a7f88a7419ccad" + integrity sha512-kvHthZTNur/wLLx8WL5Oh+r04zzzFAX16r8xuaLhu9qGTE6Th1JevbsIuiQb5IJqD8G/uZDKgIZ2a0/lONcbJg== dependencies: - "@react-native-community/cli-tools" "^10.0.0" + "@react-native-community/cli-tools" "14.0.0" chalk "^4.1.2" - execa "^1.0.0" - prompts "^2.4.0" + execa "^5.0.0" + fast-glob "^3.3.2" -"@react-native-community/cli-config@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-10.0.0.tgz#25b87760153ffc3b5bad3018c485f17ce982fc74" - integrity sha512-cbJfncqFtONfPPFnfL4bgdYYZU+Muo6jQMgTnR+rbp6gNxTPUYioctHgXcvyJAubl886mr3lirfU31V+a96AqA== +"@react-native-community/cli-config@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-14.0.0.tgz#641ec08ddb44c90ceb947d8fc8e35de1a4bcf4a4" + integrity sha512-2Nr8KR+dgn1z+HLxT8piguQ1SoEzgKJnOPQKE1uakxWaRFcQ4LOXgzpIAscYwDW6jmQxdNqqbg2cRUoOS7IMtQ== dependencies: - "@react-native-community/cli-tools" "^10.0.0" + "@react-native-community/cli-tools" "14.0.0" chalk "^4.1.2" - cosmiconfig "^5.1.0" - deepmerge "^3.2.0" - glob "^7.1.3" + cosmiconfig "^9.0.0" + deepmerge "^4.3.0" + fast-glob "^3.3.2" joi "^17.2.1" -"@react-native-community/cli-debugger-ui@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-10.0.0.tgz#4bb6d41c7e46449714dc7ba5d9f5b41ef0ea7c57" - integrity sha512-8UKLcvpSNxnUTRy8CkCl27GGLqZunQ9ncGYhSrWyKrU9SWBJJGeZwi2k2KaoJi5FvF2+cD0t8z8cU6lsq2ZZmA== +"@react-native-community/cli-debugger-ui@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-14.0.0.tgz#ef02d531e70b86265d39773abc3b58ab5cb8f4b8" + integrity sha512-JpfzILfU7eKE9+7AMCAwNJv70H4tJGVv3ZGFqSVoK1YHg5QkVEGsHtoNW8AsqZRS6Fj4os+Fmh+r+z1L36sPmg== dependencies: serve-static "^1.13.1" -"@react-native-community/cli-doctor@^10.0.0": - version "10.1.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-10.1.0.tgz#582f33fb149c515820605ee1cecf148b96d34080" - integrity sha512-3TMZX44QJ7njaimtmbHY2Q5Hb/R2YAYjx2ICi0TiHMLvofBlyXlxkJDs4nl7KDxLmZV9NpRw8fpkpCiHqimAhQ== +"@react-native-community/cli-debugger-ui@14.0.0-alpha.11": + version "14.0.0-alpha.11" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-14.0.0-alpha.11.tgz#952bb7c162e136ebff1950e7e80706eb3155fe21" + integrity sha512-0wCNQxhCniyjyMXgR1qXliY180y/2QbvoiYpp2MleGQADr5M1b8lgI4GoyADh5kE+kX3VL0ssjgyxpmbpCD86A== + dependencies: + serve-static "^1.13.1" + +"@react-native-community/cli-doctor@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-14.0.0.tgz#f6855495d5a53e9a2c206949958a8291ac3e326e" + integrity sha512-in6jylHjaPUaDzV+JtUblh8m9JYIHGjHOf6Xn57hrmE5Zwzwuueoe9rSMHF1P0mtDgRKrWPzAJVejElddfptWA== dependencies: - "@react-native-community/cli-config" "^10.0.0" - "@react-native-community/cli-platform-ios" "^10.1.0" - "@react-native-community/cli-tools" "^10.0.0" + "@react-native-community/cli-config" "14.0.0" + "@react-native-community/cli-platform-android" "14.0.0" + "@react-native-community/cli-platform-apple" "14.0.0" + "@react-native-community/cli-platform-ios" "14.0.0" + "@react-native-community/cli-tools" "14.0.0" chalk "^4.1.2" command-exists "^1.2.8" - envinfo "^7.7.2" - execa "^1.0.0" - hermes-profile-transformer "^0.0.6" - ip "^1.1.5" + deepmerge "^4.3.0" + envinfo "^7.13.0" + execa "^5.0.0" node-stream-zip "^1.9.1" ora "^5.4.1" - prompts "^2.4.0" - semver "^6.3.0" + semver "^7.5.2" strip-ansi "^5.2.0" - sudo-prompt "^9.0.0" wcwidth "^1.0.1" + yaml "^2.2.1" -"@react-native-community/cli-hermes@^10.0.0": - version "10.1.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-10.1.0.tgz#c28ad9452657f8dea5ffc514bbbb019809e1e0fc" - integrity sha512-A79Z5lm44xRbF0JDyT4i1Cq06hXskl5l/iAWZFxCkpbgMqTyghTG1gFeoCZudIv7Ez+nwQbX5edcSerotbzcxg== - dependencies: - "@react-native-community/cli-platform-android" "^10.1.0" - "@react-native-community/cli-tools" "^10.0.0" - chalk "^4.1.2" - hermes-profile-transformer "^0.0.6" - ip "^1.1.5" - -"@react-native-community/cli-platform-android@10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-10.0.0.tgz#9894a0b54de94da4d01f3b9db4e6b51ba112fa72" - integrity sha512-wUXq+//PagXVjG6ZedO+zIbNPkCsAiP+uiE45llFTsCtI6vFBwa6oJFHH6fhfeib4mOd7DvIh2Kktrpgyb6nBg== - dependencies: - "@react-native-community/cli-tools" "^10.0.0" - chalk "^4.1.2" - execa "^1.0.0" - glob "^7.1.3" - logkitty "^0.7.1" - -"@react-native-community/cli-platform-android@^10.1.0": - version "10.1.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-10.1.0.tgz#0c80b4ef4253990cc49e4cccf2344716f1316c16" - integrity sha512-Mr5eBuhHDdib1hUeh+s3N/eztPVtUOiuh/soZd8QT9fEufayqOnpm++gP8D993DaI0R3knzfAisz8jTMZSRMow== +"@react-native-community/cli-platform-android@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-14.0.0.tgz#36f47999af9b386aaa8f8286923edd9a65101f28" + integrity sha512-nt7yVz3pGKQXnVa5MAk7zR+1n41kNKD3Hi2OgybH5tVShMBo7JQoL2ZVVH6/y/9wAwI/s7hXJgzf1OIP3sMq+Q== dependencies: - "@react-native-community/cli-tools" "^10.0.0" + "@react-native-community/cli-tools" "14.0.0" chalk "^4.1.2" - execa "^1.0.0" - glob "^7.1.3" + execa "^5.0.0" + fast-glob "^3.3.2" + fast-xml-parser "^4.2.4" logkitty "^0.7.1" -"@react-native-community/cli-platform-ios@10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-10.0.0.tgz#91ee301620e509b44db5fd7c93eaf7ee992d097a" - integrity sha512-WLpXzZQ53zb1RhkpSDNHyBR3SIN3WObDRTEaR0TMXsXDeTj8/Eu2DPFpT+uEnD10ly/Y6/DqJsAt4Ku2X76klA== +"@react-native-community/cli-platform-apple@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-apple/-/cli-platform-apple-14.0.0.tgz#7050af6fbc01b4ebe72e1bdcb48d188cbbf1b9ef" + integrity sha512-WniJL8vR4MeIsjqio2hiWWuUYUJEL3/9TDL5aXNwG68hH3tYgK3742+X9C+vRzdjTmf5IKc/a6PwLsdplFeiwQ== dependencies: - "@react-native-community/cli-tools" "^10.0.0" + "@react-native-community/cli-tools" "14.0.0" chalk "^4.1.2" - execa "^1.0.0" - glob "^7.1.3" + execa "^5.0.0" + fast-glob "^3.3.2" + fast-xml-parser "^4.2.4" ora "^5.4.1" -"@react-native-community/cli-platform-ios@^10.1.0": - version "10.1.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-10.1.0.tgz#503932e0655b95973c393dedbda1190501564d95" - integrity sha512-w5bhqwxvW9RmZQfLWNr3eLB2cjV0mrwLfWVN2XUFAlXS5B8H0ee9sydkBSEApcKYaHjA3EUvq3sewM+/m7u6Hw== +"@react-native-community/cli-platform-ios@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-14.0.0.tgz#7c7c393a13415bf61aaad82f1a3583c30afb110e" + integrity sha512-8kxGv7mZ5nGMtueQDq+ndu08f0ikf3Zsqm3Ix8FY5KCXpSgP14uZloO2GlOImq/zFESij+oMhCkZJGggpWpfAw== dependencies: - "@react-native-community/cli-tools" "^10.0.0" - chalk "^4.1.2" - execa "^1.0.0" - glob "^7.1.3" - ora "^5.4.1" + "@react-native-community/cli-platform-apple" "14.0.0" -"@react-native-community/cli-plugin-metro@^10.0.0": - version "10.1.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-10.1.0.tgz#11dff6a83fa0441a44eae0ce3ff6f57cc742960a" - integrity sha512-dRlUjD6F2EsR5lqfb3O9dMY26E/OLIXpastWJgdqLtoCYDlk38aGtiRM365CYFpO77vvn38OhE0TujygkeLpLg== +"@react-native-community/cli-server-api@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-14.0.0.tgz#1b62b78e5ea7dead0ae4590465c977bc4af880fc" + integrity sha512-A0FIsj0QCcDl1rswaVlChICoNbfN+mkrKB5e1ab5tOYeZMMyCHqvU+eFvAvXjHUlIvVI+LbqCkf4IEdQ6H/2AQ== dependencies: - "@react-native-community/cli-server-api" "^10.0.0" - "@react-native-community/cli-tools" "^10.0.0" - chalk "^4.1.2" - execa "^1.0.0" - metro "0.73.7" - metro-config "0.73.7" - metro-core "0.73.7" - metro-react-native-babel-transformer "0.73.7" - metro-resolver "0.73.7" - metro-runtime "0.73.7" - readline "^1.3.0" + "@react-native-community/cli-debugger-ui" "14.0.0" + "@react-native-community/cli-tools" "14.0.0" + compression "^1.7.1" + connect "^3.6.5" + errorhandler "^1.5.1" + nocache "^3.0.1" + pretty-format "^26.6.2" + serve-static "^1.13.1" + ws "^6.2.3" -"@react-native-community/cli-server-api@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-10.0.0.tgz#b3f69f30285bed2019d4ee22879abb6b5c85b609" - integrity sha512-UXOYno0NMisMm8F61q1bG/HzVWkgvJvfuL5C9W036vo83y6oQGjjZBpIRWi/QF94BULz0hrdiPXFNXworLmAcQ== +"@react-native-community/cli-server-api@14.0.0-alpha.11": + version "14.0.0-alpha.11" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-14.0.0-alpha.11.tgz#505163e11d3a30ebc874950956f72f5b3b6c5fc1" + integrity sha512-I7YeYI7S5wSxnQAqeG8LNqhT99FojiGIk87DU0vTp6U8hIMLcA90fUuBAyJY38AuQZ12ZJpGa8ObkhIhWzGkvg== dependencies: - "@react-native-community/cli-debugger-ui" "^10.0.0" - "@react-native-community/cli-tools" "^10.0.0" + "@react-native-community/cli-debugger-ui" "14.0.0-alpha.11" + "@react-native-community/cli-tools" "14.0.0-alpha.11" compression "^1.7.1" connect "^3.6.5" - errorhandler "^1.5.0" + errorhandler "^1.5.1" nocache "^3.0.1" pretty-format "^26.6.2" serve-static "^1.13.1" - ws "^7.5.1" + ws "^6.2.3" -"@react-native-community/cli-tools@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-10.0.0.tgz#51ec1775f699951837091cf84dc765e290377a53" - integrity sha512-cPUaOrahRcMJvJpBaoc/zpYPHoPqj91qV5KmvA9cJvKktY4rl/PFfUi1A0gTqqFhdH7qW1zkeyKo80lWq7NvxA== +"@react-native-community/cli-tools@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-14.0.0.tgz#07b57a8942a131618c198e3b64fb1ec846cd631d" + integrity sha512-L7GX5hyYYv0ZWbAyIQKzhHuShnwDqlKYB0tqn57wa5riGCaxYuRPTK+u4qy+WRCye7+i8M4Xj6oQtSd4z0T9cA== dependencies: appdirsjs "^1.2.4" chalk "^4.1.2" + execa "^5.0.0" find-up "^5.0.0" mime "^2.4.1" - node-fetch "^2.6.0" open "^6.2.0" ora "^5.4.1" - semver "^6.3.0" + semver "^7.5.2" + shell-quote "^1.7.3" + sudo-prompt "^9.0.0" + +"@react-native-community/cli-tools@14.0.0-alpha.11": + version "14.0.0-alpha.11" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-14.0.0-alpha.11.tgz#95b148a3e65a4c2519af608b27ed7091e7e8b78a" + integrity sha512-HQCfVnX9aqRdKdLxmQy4fUAUo+YhNGlBV7ZjOayPbuEGWJ4RN+vSy0Cawk7epo7hXd6vKzc7P7y3HlU6Kxs7+w== + dependencies: + appdirsjs "^1.2.4" + chalk "^4.1.2" + execa "^5.0.0" + find-up "^5.0.0" + mime "^2.4.1" + open "^6.2.0" + ora "^5.4.1" + semver "^7.5.2" shell-quote "^1.7.3" + sudo-prompt "^9.0.0" -"@react-native-community/cli-types@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-10.0.0.tgz#046470c75ec18f8b3bd906e54e43a6f678e01a45" - integrity sha512-31oUM6/rFBZQfSmDQsT1DX/5fjqfxg7sf2u8kTPJK7rXVya5SRpAMaCXsPAG0omsmJxXt+J9HxUi3Ic+5Ux5Iw== +"@react-native-community/cli-types@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-14.0.0.tgz#6cde2d2a93edd9b13238171edef30352d37e8dd2" + integrity sha512-CMUevd1pOWqvmvutkUiyQT2lNmMHUzSW7NKc1xvHgg39NjbS58Eh2pMzIUP85IwbYNeocfYc3PH19vA/8LnQtg== dependencies: joi "^17.2.1" -"@react-native-community/cli@10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-10.0.0.tgz#46f68a1184014956dc237e12e6c2ca9b318a04db" - integrity sha512-KHV9/AbPeIK87jHP7iY07/HQG00J5AYF/dHz2rzqAZGB2WYFAbc5uoLRw90u/U2AcSeO7ep+4kawm+/B9LJreg== - dependencies: - "@react-native-community/cli-clean" "^10.0.0" - "@react-native-community/cli-config" "^10.0.0" - "@react-native-community/cli-debugger-ui" "^10.0.0" - "@react-native-community/cli-doctor" "^10.0.0" - "@react-native-community/cli-hermes" "^10.0.0" - "@react-native-community/cli-plugin-metro" "^10.0.0" - "@react-native-community/cli-server-api" "^10.0.0" - "@react-native-community/cli-tools" "^10.0.0" - "@react-native-community/cli-types" "^10.0.0" +"@react-native-community/cli@14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-14.0.0.tgz#0c98d75ac55515d07972682c1053f46bfee93863" + integrity sha512-KwMKJB5jsDxqOhT8CGJ55BADDAYxlYDHv5R/ASQlEcdBEZxT0zZmnL0iiq2VqzETUy+Y/Nop+XDFgqyoQm0C2w== + dependencies: + "@react-native-community/cli-clean" "14.0.0" + "@react-native-community/cli-config" "14.0.0" + "@react-native-community/cli-debugger-ui" "14.0.0" + "@react-native-community/cli-doctor" "14.0.0" + "@react-native-community/cli-server-api" "14.0.0" + "@react-native-community/cli-tools" "14.0.0" + "@react-native-community/cli-types" "14.0.0" chalk "^4.1.2" commander "^9.4.1" - execa "^1.0.0" - find-up "^4.1.0" + deepmerge "^4.3.0" + execa "^5.0.0" + find-up "^5.0.0" fs-extra "^8.1.0" graceful-fs "^4.1.3" - prompts "^2.4.0" - semver "^6.3.0" + prompts "^2.4.2" + semver "^7.5.2" -"@react-native/assets@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@react-native/assets/-/assets-1.0.0.tgz#c6f9bf63d274bafc8e970628de24986b30a55c8e" - integrity sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ== +"@react-native/assets-registry@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.75.2.tgz#2c522c537fa86298987b8c877c167ac9b485d3da" + integrity sha512-P1dLHjpUeC0AIkDHRYcx0qLMr+p92IPWL3pmczzo6T76Qa9XzruQOYy0jittxyBK91Csn6HHQ/eit8TeXW8MVw== -"@react-native/normalize-color@*", "@react-native/normalize-color@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@react-native/normalize-color/-/normalize-color-2.1.0.tgz#939b87a9849e81687d3640c5efa2a486ac266f91" - integrity sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA== +"@react-native/babel-plugin-codegen@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.75.2.tgz#1d940df23ac4ca16b4bd3299f4a3c98081158960" + integrity sha512-BIKVh2ZJPkzluUGgCNgpoh6NTHgX8j04FCS0Z/rTmRJ66hir/EUBl8frMFKrOy/6i4VvZEltOWB5eWfHe1AYgw== + dependencies: + "@react-native/codegen" "0.75.2" -"@react-native/polyfills@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@react-native/polyfills/-/polyfills-2.0.0.tgz#4c40b74655c83982c8cf47530ee7dc13d957b6aa" - integrity sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ== +"@react-native/babel-preset@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.75.2.tgz#f66a762fd8e172e547eeebb25f2960a5144ea14f" + integrity sha512-mprpsas+WdCEMjQZnbDiAC4KKRmmLbMB+o/v4mDqKlH4Mcm7RdtP5t80MZGOVCHlceNp1uEIpXywx69DNwgbgg== + dependencies: + "@babel/core" "^7.20.0" + "@babel/plugin-proposal-export-default-from" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-default-from" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.18.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-syntax-optional-chaining" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-generator-functions" "^7.24.3" + "@babel/plugin-transform-async-to-generator" "^7.20.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-class-properties" "^7.24.1" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.20.0" + "@babel/plugin-transform-flow-strip-types" "^7.20.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-logical-assignment-operators" "^7.24.1" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1" + "@babel/plugin-transform-numeric-separator" "^7.24.1" + "@babel/plugin-transform-object-rest-spread" "^7.24.5" + "@babel/plugin-transform-optional-catch-binding" "^7.24.1" + "@babel/plugin-transform-optional-chaining" "^7.24.5" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.11" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/plugin-transform-regenerator" "^7.20.0" + "@babel/plugin-transform-runtime" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.5.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + "@babel/template" "^7.0.0" + "@react-native/babel-plugin-codegen" "0.75.2" + babel-plugin-transform-flow-enums "^0.0.2" + react-refresh "^0.14.0" + +"@react-native/codegen@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.75.2.tgz#15674a9b21cf413eb37657fb045a06640bf54476" + integrity sha512-OkWdbtO2jTkfOXfj3ibIL27rM6LoaEuApOByU2G8X+HS6v9U87uJVJlMIRWBDmnxODzazuHwNVA2/wAmSbucaw== + dependencies: + "@babel/parser" "^7.20.0" + glob "^7.1.1" + hermes-parser "0.22.0" + invariant "^2.2.4" + jscodeshift "^0.14.0" + mkdirp "^0.5.1" + nullthrows "^1.1.1" + yargs "^17.6.2" + +"@react-native/community-cli-plugin@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.75.2.tgz#f5943c22e6dd24fa8fc6151de8ba52b92e3cc61b" + integrity sha512-/tz0bzVja4FU0aAimzzQ7iYR43peaD6pzksArdrrGhlm8OvFYAQPOYSNeIQVMSarwnkNeg1naFKaeYf1o3++yA== + dependencies: + "@react-native-community/cli-server-api" "14.0.0-alpha.11" + "@react-native-community/cli-tools" "14.0.0-alpha.11" + "@react-native/dev-middleware" "0.75.2" + "@react-native/metro-babel-transformer" "0.75.2" + chalk "^4.0.0" + execa "^5.1.1" + metro "^0.80.3" + metro-config "^0.80.3" + metro-core "^0.80.3" + node-fetch "^2.2.0" + querystring "^0.2.1" + readline "^1.3.0" + +"@react-native/debugger-frontend@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.75.2.tgz#ead66eff1b0f8ad3c7a86b5845acc0c2cf69236e" + integrity sha512-qIC6mrlG8RQOPaYLZQiJwqnPchAVGnHWcVDeQxPMPLkM/D5+PC8tuKWYOwgLcEau3RZlgz7QQNk31Qj2/OJG6Q== + +"@react-native/dev-middleware@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.75.2.tgz#feb325a9ec5a0fda640a0897957a43030801b1d3" + integrity sha512-fTC5m2uVjYp1XPaIJBFgscnQjPdGVsl96z/RfLgXDq0HBffyqbg29ttx6yTCx7lIa9Gdvf6nKQom+e+Oa4izSw== + dependencies: + "@isaacs/ttlcache" "^1.4.1" + "@react-native/debugger-frontend" "0.75.2" + chrome-launcher "^0.15.2" + chromium-edge-launcher "^0.2.0" + connect "^3.6.5" + debug "^2.2.0" + node-fetch "^2.2.0" + nullthrows "^1.1.1" + open "^7.0.3" + selfsigned "^2.4.1" + serve-static "^1.13.1" + ws "^6.2.2" + +"@react-native/eslint-config@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/eslint-config/-/eslint-config-0.75.2.tgz#845951e094f34e82ca3fc911ff8013923a81e055" + integrity sha512-lelWQ/mjwCLONrZ0mrCjWYPZWYckjuVCjdADOSMuEe7/tjwUZYW/e/iQdOvy1USqFwGHLLkTjE722EmQ6P+O7A== + dependencies: + "@babel/core" "^7.20.0" + "@babel/eslint-parser" "^7.20.0" + "@react-native/eslint-plugin" "0.75.2" + "@typescript-eslint/eslint-plugin" "^7.1.1" + "@typescript-eslint/parser" "^7.1.1" + eslint-config-prettier "^8.5.0" + eslint-plugin-eslint-comments "^3.2.0" + eslint-plugin-ft-flow "^2.0.1" + eslint-plugin-jest "^27.9.0" + eslint-plugin-react "^7.30.1" + eslint-plugin-react-hooks "^4.6.0" + eslint-plugin-react-native "^4.0.0" + +"@react-native/eslint-plugin@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/eslint-plugin/-/eslint-plugin-0.75.2.tgz#c206c9f869d4435386024855d9d193219a50a5cf" + integrity sha512-cxvSn+io32l+mbyDcpGGGoDXMwFxsVvb1JHSdfbzxi6+94gdD+ce0gqFJY4FCPg/ebJ2gCvQ8j0lt1NoAizUuQ== + +"@react-native/gradle-plugin@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.75.2.tgz#f5627aef8e7f17df089f4f8dae6373ea05c11854" + integrity sha512-AELeAOCZi3B2vE6SeN+mjpZjjqzqa76yfFBB3L3f3NWiu4dm/YClTGOj+5IVRRgbt8LDuRImhDoaj7ukheXr4Q== + +"@react-native/js-polyfills@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.75.2.tgz#0586fa51c043bcf9b99710ecb10982d851a0e358" + integrity sha512-AtLd3mbiE+FXK2Ru3l2NFOXDhUvzdUsCP4qspUw0haVaO/9xzV97RVD2zz0lur2f/LmZqQ2+KXyYzr7048b5iw== + +"@react-native/metro-babel-transformer@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.75.2.tgz#bcb0d135c735b5cd50a7eb1ba4e51669c1f6224d" + integrity sha512-EygglCCuOub2sZ00CSIiEekCXoGL2XbOC6ssOB47M55QKvhdPG/0WBQXvmOmiN42uZgJK99Lj749v4rB0PlPIQ== + dependencies: + "@babel/core" "^7.20.0" + "@react-native/babel-preset" "0.75.2" + hermes-parser "0.22.0" + nullthrows "^1.1.1" + +"@react-native/normalize-colors@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.75.2.tgz#de095f4b985580748ffa239a70ae63fbaa93724e" + integrity sha512-nPwWJFtsqNFS/qSG9yDOiSJ64mjG7RCP4X/HXFfyWzCM1jq49h/DYBdr+c3e7AvTKGIdy0gGT3vgaRUHZFVdUQ== + +"@react-native/typescript-config@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/typescript-config/-/typescript-config-0.75.2.tgz#ab76a041eb6a019fb10d00f4c266343069757027" + integrity sha512-guqu6REcuDmfjlM/B6YNqTfv4kK35gn6ungzZQdU8zznyWiXlyxR7uSSyNcy1QgEztsvO7B3HU073PBHV8RxXQ== + +"@react-native/virtualized-lists@0.75.2": + version "0.75.2" + resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.75.2.tgz#6832fb0745a93e42dbda659426cc14a38a493282" + integrity sha512-pD5SVCjxc8k+JdoyQ+IlulBTEqJc3S4KUKsmv5zqbNCyETB0ZUvd4Su7bp+lLF6ALxx6KKmbGk8E3LaWEjUFFQ== + dependencies: + invariant "^2.2.4" + nullthrows "^1.1.1" "@sideway/address@^4.1.3": version "4.1.4" @@ -1423,24 +2019,39 @@ resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== -"@sinclair/typebox@^0.24.1": - version "0.24.51" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" - integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== -"@sinonjs/commons@^1.7.0": - version "1.8.6" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" - integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@sqltools/formatter@^1.2.5": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.5.tgz#3abc203c79b8c3e90fd6c156a0c62d5403520e12" + integrity sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw== + +"@ts-morph/common@~0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@ts-morph/common/-/common-0.24.0.tgz#9125b3d5ef9e2633cd6a54296b420b89366599c1" + integrity sha512-c1xMmNHWpNselmpIqursHeOHHBTIsJLbB+NuovbTTRCNiTLEr/U9dbJ8qy0jd/O2x5pc3seWuOUN5R2IoOTp8A== dependencies: - "@sinonjs/commons" "^1.7.0" + fast-glob "^3.3.2" + minimatch "^9.0.4" + mkdirp "^3.0.1" + path-browserify "^1.0.1" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.4" @@ -1461,6 +2072,23 @@ dependencies: "@types/istanbul-lib-report" "*" +"@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/mocha@^10.0.7": + version "10.0.7" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.7.tgz#4c620090f28ca7f905a94b706f74dc5b57b44f2f" + integrity sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw== + +"@types/node-forge@^1.3.0": + version "1.3.11" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + dependencies: + "@types/node" "*" + "@types/node@*": version "18.11.18" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f" @@ -1471,6 +2099,11 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/semver@^7.3.12": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + "@types/stack-utils@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" @@ -1488,13 +2121,6 @@ dependencies: "@types/yargs-parser" "*" -"@types/yargs@^16.0.0": - version "16.0.5" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.5.tgz#12cc86393985735a283e387936398c2f9e5f88e3" - integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== - dependencies: - "@types/yargs-parser" "*" - "@types/yargs@^17.0.8": version "17.0.19" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.19.tgz#8dbecdc9ab48bee0cb74f6e3327de3fa0d0c98ae" @@ -1502,6 +2128,140 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@^7.1.1": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz#b16d3cf3ee76bf572fdf511e79c248bdec619ea3" + integrity sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/type-utils" "7.18.0" + "@typescript-eslint/utils" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/parser@^7.1.1": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0" + integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg== + dependencies: + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/scope-manager@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83" + integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== + dependencies: + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + +"@typescript-eslint/type-utils@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz#2165ffaee00b1fbbdd2d40aa85232dab6998f53b" + integrity sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA== + dependencies: + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/utils" "7.18.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/types@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" + integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/typescript-estree@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" + integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== + dependencies: + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/utils@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" + integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" + +"@typescript-eslint/utils@^5.10.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@typescript-eslint/visitor-keys@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" + integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== + dependencies: + "@typescript-eslint/types" "7.18.0" + eslint-visitor-keys "^3.4.3" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -1509,11 +2269,6 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -absolute-path@^0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7" - integrity sha512-HQiug4c+/s3WOvEnDRxXVmNtSG5s2gJM9r19BTcqjp7BWcE48PB+Y2G6jE65kqI0LpsQeMZygt/b60Gi4KxGyA== - accepts@^1.3.7, accepts@~1.3.5, accepts@~1.3.7: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -1522,11 +2277,21 @@ accepts@^1.3.7, accepts@~1.3.5, accepts@~1.3.7: mime-types "~2.1.34" negotiator "0.6.3" +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + acorn@^8.5.0: version "8.8.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== +acorn@^8.9.0: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -1535,11 +2300,26 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + anser@^1.4.9: version "1.4.10" resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.10.tgz#befa3eddf282684bd03b63dcda3927aef8c2e35b" integrity sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww== +ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + ansi-fragments@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansi-fragments/-/ansi-fragments-0.2.1.tgz#24409c56c4cc37817c3d7caa99d8969e2de5a05e" @@ -1559,6 +2339,11 @@ ansi-regex@^5.0.0, ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -1578,7 +2363,17 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -anymatch@^3.0.3: +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -1586,6 +2381,11 @@ anymatch@^3.0.3: normalize-path "^3.0.0" picomatch "^2.0.4" +app-root-path@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.1.0.tgz#5971a2fc12ba170369a7a1ef018c71e6e47c2e86" + integrity sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA== + appdirsjs@^1.2.4: version "1.2.7" resolved "https://registry.yarnpkg.com/appdirsjs/-/appdirsjs-1.2.7.tgz#50b4b7948a26ba6090d4aede2ae2dc2b051be3b3" @@ -1598,45 +2398,107 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== +array-includes@^3.1.6, array-includes@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== +array.prototype.findlast@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== -ast-types@0.14.2: - version "0.14.2" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.14.2.tgz#600b882df8583e3cd4f2df5fa20fa83759d4bdfd" - integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA== +ast-types@0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.15.2.tgz#39ae4809393c4b16df751ee563411423e85fb49d" + integrity sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg== dependencies: tslib "^2.0.1" @@ -1650,15 +2512,12 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async@^3.2.2: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" babel-core@^7.0.0-bridge.0: version "7.0.0-bridge.0" @@ -1689,66 +2548,34 @@ babel-plugin-polyfill-regenerator@^0.4.1: dependencies: "@babel/helper-define-polyfill-provider" "^0.3.3" -babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: - version "7.0.0-beta.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" - integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== - -babel-preset-fbjs@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" - integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== - dependencies: - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-syntax-class-properties" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-block-scoped-functions" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-for-of" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-member-expression-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-object-super" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-property-literals" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" +babel-plugin-transform-flow-enums@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz#d1d0cc9bdc799c850ca110d0ddc9f21b9ec3ef25" + integrity sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ== + dependencies: + "@babel/plugin-syntax-flow" "^7.12.1" + +babel-plugin-transform-typescript-metadata@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-typescript-metadata/-/babel-plugin-transform-typescript-metadata-0.3.2.tgz#7a327842d8c36ffe07ee1b5276434e56c297c9b7" + integrity sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.1.2, base64-js@^1.3.1: +base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== bl@^4.1.0: version "4.1.0" @@ -1774,22 +2601,6 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - braces@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -1797,6 +2608,18 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" +braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browser-stdout@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + browserslist@^4.20.4, browserslist@^4.21.3, browserslist@^4.21.4: version "4.21.4" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" @@ -1807,6 +2630,16 @@ browserslist@^4.20.4, browserslist@^4.21.3, browserslist@^4.21.4: node-releases "^2.0.6" update-browserslist-db "^1.0.9" +browserslist@^4.23.1: + version "4.23.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" + integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== + dependencies: + caniuse-lite "^1.0.30001646" + electron-to-chromium "^1.5.4" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -1827,25 +2660,29 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" caller-callsite@^2.0.0: version "2.0.0" @@ -1876,7 +2713,7 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0: +camelcase@^6.0.0, camelcase@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== @@ -1886,7 +2723,23 @@ caniuse-lite@^1.0.30001400: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001445.tgz#cf2d4eb93f2bcdf0310de9dd6d18be271bc0b447" integrity sha512-8sdQIdMztYmzfTMO6KfLny878Ln9c2M0fc7EH60IjlP4Dc4PiCy7K2Vl3ITmWgOyPgVQKa5x+UP/KqFsxj4mBg== -chalk@^2.0.0: +caniuse-lite@^1.0.30001646: + version "1.0.30001660" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz#31218de3463fabb44d0b7607b652e56edf2e2355" + integrity sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg== + +chai@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.1.tgz#f035d9792a22b481ead1c65908d14bb62ec1c82c" + integrity sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA== + dependencies: + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" + +chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1903,6 +2756,58 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + +chance@^1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/chance/-/chance-1.1.12.tgz#6a263cf241674af50a1b903357f9d328a6f252fb" + integrity sha512-vVBIGQVnwtUG+SYe0ge+3MvF78cvSpuCOEUJr7sVEk2vSBuMW6OXNJjSzdtzrlxNUEaoqH2GBd5Y/+18BEB01Q== + +check-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" + integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== + +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-launcher@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.15.2.tgz#4e6404e32200095fdce7f6a1e1004f9bd36fa5da" + integrity sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ== + dependencies: + "@types/node" "*" + escape-string-regexp "^4.0.0" + is-wsl "^2.2.0" + lighthouse-logger "^1.0.0" + +chromium-edge-launcher@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz#0c378f28c99aefc360705fa155de0113997f62fc" + integrity sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg== + dependencies: + "@types/node" "*" + escape-string-regexp "^4.0.0" + is-wsl "^2.2.0" + lighthouse-logger "^1.0.0" + mkdirp "^1.0.4" + rimraf "^3.0.2" + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -1913,16 +2818,6 @@ ci-info@^3.2.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.1.tgz#708a6cdae38915d597afdf3b145f2f8e1ff55f3f" integrity sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w== -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -1935,6 +2830,18 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" +cli-highlight@^2.1.11: + version "2.1.11" + resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" + integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== + dependencies: + chalk "^4.0.0" + highlight.js "^10.7.1" + mz "^2.4.0" + parse5 "^5.1.1" + parse5-htmlparser2-tree-adapter "^6.0.0" + yargs "^16.0.0" + cli-spinners@^2.5.0: version "2.7.0" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" @@ -1949,6 +2856,15 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -1972,13 +2888,10 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" +code-block-writer@^13.0.1: + version "13.0.2" + resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-13.0.2.tgz#e1c6c3dbe5d38b4ac76fb62c4d4b2fc4bf04c9c1" + integrity sha512-XfXzAGiStXSmCIwrkdfvc7FS5Dtj8yelCtyOf2p2skCAfvLd6zu0rGzuS9NSCO3bq1JKpFZ7tbKdKlcd5occQA== color-convert@^1.9.0: version "1.9.3" @@ -2024,21 +2937,11 @@ commander@^9.4.1: resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== -commander@~2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" - integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== - commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -2079,11 +2982,6 @@ convert-source-map@^1.7.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== - core-js-compat@^3.25.1: version "3.27.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.27.1.tgz#b5695eb25c602d72b1d30cbfba3cb7e5e4cf0a67" @@ -2096,7 +2994,7 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cosmiconfig@^5.0.5, cosmiconfig@^5.1.0: +cosmiconfig@^5.0.5: version "5.2.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== @@ -2117,18 +3015,17 @@ cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" -cross-spawn@^7.0.0, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -2137,12 +3034,44 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +dayjs@^1.11.9: + version "1.11.13" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== + dayjs@^1.8.15: version "1.11.7" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: +debug@2.6.9, debug@^2.2.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -2156,25 +3085,42 @@ debug@^4.1.0, debug@^4.1.1: dependencies: ms "2.1.2" +debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== -deepmerge@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.3.0.tgz#d3c47fd6f3a93d517b14426b0628a17b0125f5f7" - integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== +deep-eql@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== defaults@^1.0.3: version "1.0.4" @@ -2183,27 +3129,23 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: - is-descriptor "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" del@^6.1.1: version "6.1.1" @@ -2229,20 +3171,16 @@ depd@2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -deprecated-react-native-prop-types@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-3.0.1.tgz#a275f84cd8519cd1665e8df3c99e9067d57a23ec" - integrity sha512-J0jCJcsk4hMlIb7xwOZKLfMpuJn6l8UtrPEzzQV5ewz5gvKNYakhBuq9h2rWX7YwHHJZFhU5W8ye7dB9oN8VcQ== - dependencies: - "@react-native/normalize-color" "*" - invariant "*" - prop-types "*" - destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +diff@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -2250,6 +3188,30 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dotenv@^16.0.3: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -2260,11 +3222,21 @@ electron-to-chromium@^1.4.251: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +electron-to-chromium@^1.5.4: + version "1.5.19" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.19.tgz#aeaa0a076f3f0f0e8db2c57fd10158508f00725a" + integrity sha512-kpLJJi3zxTR1U828P+LIUDZ5ohixyo68/IcYOHLqnbTPr/wdgn4i1ECvmALN9E16JPA6cvCG5UG79gVwVdEK5w== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -2277,10 +3249,15 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -envinfo@^7.7.2: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== +env-paths@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +envinfo@^7.13.0: + version "7.13.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.13.0.tgz#81fbb81e5da35d74e814941aeab7c325a606fb31" + integrity sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q== error-ex@^1.3.1: version "1.3.2" @@ -2296,7 +3273,7 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" -errorhandler@^1.5.0: +errorhandler@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.5.1.tgz#b9ba5d17cf90744cd1e851357a6e75bf806a9a91" integrity sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A== @@ -2304,11 +3281,132 @@ errorhandler@^1.5.0: accepts "~1.3.7" escape-html "~1.0.3" +es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-iterator-helpers@^1.0.19: + version "1.0.19" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" + integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + iterator.prototype "^1.1.2" + safe-array-concat "^1.1.2" + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -2324,11 +3422,196 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^8.5.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== + +eslint-plugin-eslint-comments@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz#9e1cd7b4413526abb313933071d7aba05ca12ffa" + integrity sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ== + dependencies: + escape-string-regexp "^1.0.5" + ignore "^5.0.5" + +eslint-plugin-ft-flow@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-2.0.3.tgz#3b3c113c41902bcbacf0e22b536debcfc3c819e8" + integrity sha512-Vbsd/b+LYA99jUbsL6viEUWShFaYQt2YQs3QN3f+aeszOhh2sgdcU0mjzDyD4yyBvMc8qy2uwvBBWfMzEX06tg== + dependencies: + lodash "^4.17.21" + string-natural-compare "^3.0.1" + +eslint-plugin-jest@^27.9.0: + version "27.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz#7c98a33605e1d8b8442ace092b60e9919730000b" + integrity sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug== + dependencies: + "@typescript-eslint/utils" "^5.10.0" + +eslint-plugin-prettier@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz#d1c8f972d8f60e414c25465c163d16f209411f95" + integrity sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw== + dependencies: + prettier-linter-helpers "^1.0.0" + synckit "^0.9.1" + +eslint-plugin-react-hooks@^4.6.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== + +eslint-plugin-react-native-globals@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz#ee1348bc2ceb912303ce6bdbd22e2f045ea86ea2" + integrity sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g== + +eslint-plugin-react-native@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-native/-/eslint-plugin-react-native-4.1.0.tgz#5343acd3b2246bc1b857ac38be708f070d18809f" + integrity sha512-QLo7rzTBOl43FvVqDdq5Ql9IoElIuTdjrz9SKAXCvULvBoRZ44JGSkx9z4999ZusCsb4rK3gjS8gOGyeYqZv2Q== + dependencies: + eslint-plugin-react-native-globals "^0.1.1" + +eslint-plugin-react@^7.30.1: + version "7.35.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.35.2.tgz#d32500d3ec268656d5071918bfec78cfd8b070ed" + integrity sha512-Rbj2R9zwP2GYNcIak4xoAMV57hrBh3hTaR0k7hVjwCQgryE/pw5px4b13EYjduOI0hfXyZhwBxaGpOTbWSGzKQ== + dependencies: + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" + array.prototype.flatmap "^1.3.2" + array.prototype.tosorted "^1.1.4" + doctrine "^2.1.0" + es-iterator-helpers "^1.0.19" + estraverse "^5.3.0" + hasown "^2.0.2" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.8" + object.fromentries "^2.0.8" + object.values "^1.2.0" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.11" + string.prototype.repeat "^1.0.0" + +eslint-scope@5.1.1, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@8.57.0: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + esprima@^4.0.0, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +esquery@^1.4.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -2344,19 +3627,6 @@ event-target-shim@^5.0.0, event-target-shim@^5.0.1: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - execa@^4.0.3: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" @@ -2372,47 +3642,35 @@ execa@^4.0.3: signal-exit "^3.0.2" strip-final-newline "^2.0.0" -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== +execa@^5.0.0, execa@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: - is-extendable "^0.1.0" + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" +exponential-backoff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.2.9: version "3.2.12" @@ -2425,6 +3683,34 @@ fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" +fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-xml-parser@^4.2.4: + version "4.5.0" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz#2882b7d01a6825dfdf909638f2de0256351def37" + integrity sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg== + dependencies: + strnum "^1.0.5" + fastq@^1.6.0: version "1.15.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" @@ -2439,15 +3725,12 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" + flat-cache "^3.0.4" fill-range@^7.0.1: version "7.0.1" @@ -2456,6 +3739,13 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + finalhandler@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -2501,27 +3791,49 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +flow-enums-runtime@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz#5bb0cd1b0a3e471330f4d109039b7eba5cb3e787" + integrity sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw== + flow-parser@0.*: version "0.197.0" resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.197.0.tgz#9a581ef7c0b1c3377b195cec0bbad794b88be67b" integrity sha512-yhwkJPxH1JBg0aJunk/jVRy5p3UhVZBGkzL1hq/GK+GaBh6bKr2YKkv6gDuiufaw+i3pKWQgOLtD++1cvrgXLA== -flow-parser@^0.185.0: - version "0.185.2" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.185.2.tgz#cb7ee57f77377d6c5d69a469e980f6332a15e492" - integrity sha512-2hJ5ACYeJCzNtiVULov6pljKOLygy0zddoqSI1fFetM+XRPpRshFdGEijtqlamA1XwyZ+7rhryI6FQFzvtLWUQ== - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== +foreground-child@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== dependencies: - map-cache "^0.2.2" + cross-spawn "^7.0.0" + signal-exit "^4.0.1" fresh@0.5.2: version "0.5.2" @@ -2556,11 +3868,36 @@ fsevents@^2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -2571,12 +3908,21 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== +get-func-name@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: - pump "^3.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" get-stream@^5.0.0: version "5.2.0" @@ -2585,19 +3931,47 @@ get-stream@^5.0.0: dependencies: pump "^3.0.0" -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" -glob-parent@^5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@^7.1.3: +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^10.3.10: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +glob@^7.1.1, glob@^7.1.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -2609,7 +3983,7 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.3: +glob@^8.0.3, glob@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== @@ -2625,7 +3999,22 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globby@^11.0.1: +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +globby@^11.0.1, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -2637,11 +4026,28 @@ globby@^11.0.1: merge2 "^1.4.1" slash "^3.0.0" +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + graceful-fs@^4.1.11, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -2652,36 +4058,29 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" + es-define-property "^1.0.0" -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" + has-symbols "^1.0.3" has@^1.0.3: version "1.0.3" @@ -2690,24 +4089,46 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hermes-estree@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.8.0.tgz#530be27243ca49f008381c1f3e8b18fb26bf9ec0" - integrity sha512-W6JDAOLZ5pMPMjEiQGLCXSSV7pIBEgRR5zGkxgmzGSXHOxqV5dC/M1Zevqpbm9TZDE5tu358qZf8Vkzmsc+u7Q== +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hermes-estree@0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.22.0.tgz#38559502b119f728901d2cfe2ef422f277802a1d" + integrity sha512-FLBt5X9OfA8BERUdc6aZS36Xz3rRuB0Y/mfocSADWEJfomc1xfene33GdyAmtTkKTBXTN/EgAy+rjTKkkZJHlw== + +hermes-estree@0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.23.1.tgz#d0bac369a030188120ee7024926aabe5a9f84fdb" + integrity sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg== -hermes-parser@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.8.0.tgz#116dceaba32e45b16d6aefb5c4c830eaeba2d257" - integrity sha512-yZKalg1fTYG5eOiToLUaw69rQfZq/fi+/NtEXRU7N87K/XobNRhRWorh80oSge2lWUiZfTgUvRJH+XgZWrhoqA== +hermes-parser@0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.22.0.tgz#fc8e0e6c7bfa8db85b04c9f9544a102c4fcb4040" + integrity sha512-gn5RfZiEXCsIWsFGsKiykekktUoh0PdFWYocXsUdZIyWSckT6UIyPcyyUIPSR3kpnELWeK3n3ztAse7Mat6PSA== dependencies: - hermes-estree "0.8.0" + hermes-estree "0.22.0" -hermes-profile-transformer@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz#bd0f5ecceda80dd0ddaae443469ab26fb38fc27b" - integrity sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ== +hermes-parser@0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.23.1.tgz#e5de648e664f3b3d84d01b48fc7ab164f4b68205" + integrity sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA== dependencies: - source-map "^0.7.3" + hermes-estree "0.23.1" + +highlight.js@^10.7.1: + version "10.7.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== http-errors@2.0.0: version "2.0.0" @@ -2725,20 +4146,32 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== -ieee754@^1.1.13: +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== +ignore@^5.0.5, ignore@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + ignore@^5.2.0: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== -image-size@^0.6.0: - version "0.6.3" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" - integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== +image-size@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.1.1.tgz#ddd67d4dc340e52ac29ce5f546a09f4e29e840ac" + integrity sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ== + dependencies: + queue "6.0.2" import-fresh@^2.0.0: version "2.0.0" @@ -2748,7 +4181,7 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.2.1: +import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -2774,23 +4207,27 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -invariant@*, invariant@^2.2.4: +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + +invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" -ip@^1.1.5: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" - integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== - is-absolute@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" @@ -2799,29 +4236,59 @@ is-absolute@^1.0.0: is-relative "^1.0.0" is-windows "^1.0.1" -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== dependencies: - kind-of "^6.0.0" + call-bind "^1.0.2" + get-intrinsic "^1.2.1" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== + dependencies: + hasown "^2.0.2" is-core-module@^2.9.0: version "2.11.0" @@ -2830,60 +4297,42 @@ is-core-module@^2.9.0: dependencies: has "^1.0.3" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" + is-typed-array "^1.1.13" -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" + has-tostringtag "^1.0.0" is-directory@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -2894,6 +4343,13 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + is-git-dirty@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-git-dirty/-/is-git-dirty-2.0.1.tgz#29ca82fb0924ccbeaa0bae08de217546df593012" @@ -2910,7 +4366,7 @@ is-git-repository@^2.0.0: execa "^4.0.3" is-absolute "^1.0.0" -is-glob@^4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -2922,12 +4378,22 @@ is-interactive@^1.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: - kind-of "^3.0.2" + has-tostringtag "^1.0.0" is-number@^7.0.0: version "7.0.0" @@ -2939,18 +4405,31 @@ is-path-cwd@^2.2.0: resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== -is-path-inside@^3.0.2: +is-path-inside@^3.0.2, is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-relative@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" @@ -2958,16 +4437,44 @@ is-relative@^1.0.0: dependencies: is-unc-path "^1.0.0" -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + is-unc-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" @@ -2980,7 +4487,27 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-windows@^1.0.1, is-windows@^1.0.2: +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + +is-windows@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -2990,7 +4517,19 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== -isarray@1.0.0, isarray@~1.0.0: +is-wsl@^2.1.1, is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== @@ -3000,114 +4539,103 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: +isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -jest-environment-node@^29.2.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.3.1.tgz#5023b32472b3fba91db5c799a0d5624ad4803e74" - integrity sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag== +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== dependencies: - "@jest/environment" "^29.3.1" - "@jest/fake-timers" "^29.3.1" - "@jest/types" "^29.3.1" + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jest-environment-node@^29.6.3: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^29.3.1" - jest-util "^29.3.1" + jest-mock "^29.7.0" + jest-util "^29.7.0" -jest-get-type@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" - integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== -jest-message-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.3.1.tgz#37bc5c468dfe5120712053dd03faf0f053bd6adb" - integrity sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA== +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.3.1" + "@jest/types" "^29.6.3" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.3.1" + pretty-format "^29.7.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.3.1.tgz#60287d92e5010979d01f218c6b215b688e0f313e" - integrity sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA== - dependencies: - "@jest/types" "^29.3.1" - "@types/node" "*" - jest-util "^29.3.1" - -jest-regex-util@^27.0.6: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" - integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== - -jest-serializer@^27.0.6: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" - integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.9" - -jest-util@^27.2.0: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" - integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== dependencies: - "@jest/types" "^27.5.1" + "@jest/types" "^29.6.3" "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" + jest-util "^29.7.0" -jest-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.3.1.tgz#1dda51e378bbcb7e3bc9d8ab651445591ed373e1" - integrity sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ== +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^26.5.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" - integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== +jest-validate@^29.6.3: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== dependencies: - "@jest/types" "^26.6.2" - camelcase "^6.0.0" + "@jest/types" "^29.6.3" + camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^26.3.0" + jest-get-type "^29.6.3" leven "^3.1.0" - pretty-format "^26.6.2" + pretty-format "^29.7.0" -jest-worker@^27.2.0: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== +jest-worker@^29.6.3: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" + jest-util "^29.7.0" merge-stream "^2.0.0" supports-color "^8.0.0" @@ -3140,15 +4668,27 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -jsc-android@^250230.2.1: - version "250230.2.1" - resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-250230.2.1.tgz#3790313a970586a03ab0ad47defbc84df54f1b83" - integrity sha512-KmxeBlRjwoqCnBBKGsihFtvsBHyUFlBxJPK4FzeYcIuBfdjv6jFys44JITAgSTbQD+vIdwMEfyZklsuQX0yI1Q== +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" -jscodeshift@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.13.1.tgz#69bfe51e54c831296380585c6d9e733512aecdef" - integrity sha512-lGyiEbGOvmMRKgWk4vf+lUrCWO/8YR8sUR3FKF1Cq5fovjZDlIcw3Hu5ppLHAnEXshVffvaM0eyuY/AbOeYpnQ== +jsc-android@^250231.0.0: + version "250231.0.0" + resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-250231.0.0.tgz#91720f8df382a108872fa4b3f558f33ba5e95262" + integrity sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw== + +jsc-safe-url@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz#141c14fbb43791e88d5dc64e85a374575a83477a" + integrity sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q== + +jscodeshift@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.14.0.tgz#7542e6715d6d2e8bde0b4e883f0ccea358b46881" + integrity sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA== dependencies: "@babel/core" "^7.13.16" "@babel/parser" "^7.13.16" @@ -3163,10 +4703,10 @@ jscodeshift@^0.13.1: chalk "^4.1.2" flow-parser "0.*" graceful-fs "^4.2.4" - micromatch "^3.1.10" + micromatch "^4.0.4" neo-async "^2.5.0" node-dir "^0.1.17" - recast "^0.20.4" + recast "^0.21.0" temp "^0.8.4" write-file-atomic "^2.3.0" @@ -3180,6 +4720,11 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -3190,6 +4735,16 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + json5@^2.2.1, json5@^2.2.2: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" @@ -3211,26 +4766,24 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: - is-buffer "^1.1.5" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + json-buffer "3.0.1" -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -3250,6 +4803,22 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lighthouse-logger@^1.0.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz#aef90f9e97cd81db367c7634292ee22079280aaa" + integrity sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g== + dependencies: + debug "^2.6.9" + marky "^1.2.2" + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -3282,11 +4851,21 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash.throttle@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" @@ -3311,6 +4890,18 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +loupe@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.1.tgz#71d038d59007d890e3247c5db97c1ec5a92edc54" + integrity sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw== + dependencies: + get-func-name "^2.0.1" + +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -3333,17 +4924,10 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" +marky@^1.2.2: + version "1.2.5" + resolved "https://registry.yarnpkg.com/marky/-/marky-1.2.5.tgz#55796b688cbd72390d2d399eaaf1832c9413e3c0" + integrity sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q== memoize-one@^5.0.0: version "5.2.1" @@ -3360,332 +4944,160 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -metro-babel-transformer@0.73.5: - version "0.73.5" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.73.5.tgz#e7ebe371cd8bf5df90b0e9153587b4d5089d2ce7" - integrity sha512-G3awAJ9of/R2jEg+MRokYcq/TNvMSxJipwybQ2NfwwSj5iLEmRH2YbwTx5w8f5qKgs2K4SS2pmBIs8qjdV6p3Q== - dependencies: - "@babel/core" "^7.14.0" - hermes-parser "0.8.0" - metro-source-map "0.73.5" - nullthrows "^1.1.1" - -metro-babel-transformer@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.73.7.tgz#561ffa0336eb6d7d112e7128e957114c729fdb71" - integrity sha512-s7UVkwovGTEXYEQrv5hcmSBbFJ9s9lhCRNMScn4Itgj3UMdqRr9lU8DXKEFlJ7osgRxN6n5+eXqcvhE4B1H1VQ== +metro-babel-transformer@0.80.12: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.80.12.tgz#ad02ade921dd4ced27b26b18ff31eb60608e3f56" + integrity sha512-YZziRs0MgA3pzCkkvOoQRXjIoVjvrpi/yRlJnObyIvMP6lFdtyG4nUGIwGY9VXnBvxmXD6mPY2e+NSw6JAyiRg== dependencies: "@babel/core" "^7.20.0" - hermes-parser "0.8.0" - metro-source-map "0.73.7" + flow-enums-runtime "^0.0.6" + hermes-parser "0.23.1" nullthrows "^1.1.1" -metro-cache-key@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.73.7.tgz#fa3b4ece5f3191ce238a623051a0d03bada2a153" - integrity sha512-GngYzrHwZU9U0Xl81H4aq9Tn5cjQyU12v9/flB0hzpeiYO5A89TIeilb4Kg8jtfC6JcmmsdK9nxYIGEq7odHhQ== - -metro-cache@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.73.7.tgz#dd2b6a791b2754eae9c0a86dcf714b98e025fd95" - integrity sha512-CPPgI+i9yVzOEDCdmEEZ67JgOvZyNDs8kStmGUFgDuLSjj3//HhkqT5XyfWjGeH6KmyGiS8ip3cgLOVn3IsOSA== +metro-cache-key@0.80.12: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.80.12.tgz#52f5de698b85866503ace45d0ad76f75aaec92a4" + integrity sha512-o4BspKnugg/pE45ei0LGHVuBJXwRgruW7oSFAeSZvBKA/sGr0UhOGY3uycOgWInnS3v5yTTfiBA9lHlNRhsvGA== dependencies: - metro-core "0.73.7" - rimraf "^3.0.2" + flow-enums-runtime "^0.0.6" -metro-config@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.73.7.tgz#8935054ece6155d214420c263272cd3a690a82e2" - integrity sha512-pD/F+vK3u37cbj1skYmI6cUsEEscqNRtW2KlDKu1m+n8nooDB2oGTOZatlS5WQa7Ga6jYQRydftlq4CLDexAfA== +metro-cache@0.80.12: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.80.12.tgz#bd81af02c4f17b5aeab19bb030566b14147cee8b" + integrity sha512-p5kNHh2KJ0pbQI/H7ZBPCEwkyNcSz7OUkslzsiIWBMPQGFJ/xArMwkV7I+GJcWh+b4m6zbLxE5fk6fqbVK1xGA== dependencies: - cosmiconfig "^5.0.5" - jest-validate "^26.5.2" - metro "0.73.7" - metro-cache "0.73.7" - metro-core "0.73.7" - metro-runtime "0.73.7" + exponential-backoff "^3.1.1" + flow-enums-runtime "^0.0.6" + metro-core "0.80.12" -metro-core@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.73.7.tgz#f5abe2448ea72a65f54db9bc90068f3308de1df2" - integrity sha512-H7j1Egj1VnNnsSYf9ZKv0SRwijgtRKIcaGNQq/T+er73vqqb4kR9H+2VIJYPXi6R8lT+QLIMfs6CWSUHAJUgtg== +metro-config@0.80.12, metro-config@^0.80.3: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.80.12.tgz#1543009f37f7ad26352ffc493fc6305d38bdf1c0" + integrity sha512-4rwOWwrhm62LjB12ytiuR5NgK1ZBNr24/He8mqCsC+HXZ+ATbrewLNztzbAZHtFsrxP4D4GLTGgh96pCpYLSAQ== dependencies: + connect "^3.6.5" + cosmiconfig "^5.0.5" + flow-enums-runtime "^0.0.6" + jest-validate "^29.6.3" + metro "0.80.12" + metro-cache "0.80.12" + metro-core "0.80.12" + metro-runtime "0.80.12" + +metro-core@0.80.12, metro-core@^0.80.3: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.80.12.tgz#5ae337923ab19ff524077efa1aeacdf4480cfa28" + integrity sha512-QqdJ/yAK+IpPs2HU/h5v2pKEdANBagSsc6DRSjnwSyJsCoHlmyJKCaCJ7KhWGx+N4OHxh37hoA8fc2CuZbx0Fw== + dependencies: + flow-enums-runtime "^0.0.6" lodash.throttle "^4.1.1" - metro-resolver "0.73.7" + metro-resolver "0.80.12" -metro-file-map@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.73.7.tgz#709f33ac5ea6f87668d454c77973ab296b7a064b" - integrity sha512-BYaCo2e/4FMN4nOajeN+Za5cPfecfikzUYuFWWMyLAmHU6dj7B+PFkaJ4OEJO3vmRoeq5vMOmhpKXgysYbNXJg== +metro-file-map@0.80.12: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.80.12.tgz#b03240166a68aa16c5a168c26e190d9da547eefb" + integrity sha512-sYdemWSlk66bWzW2wp79kcPMzwuG32x1ZF3otI0QZTmrnTaaTiGyhE66P1z6KR4n2Eu5QXiABa6EWbAQv0r8bw== dependencies: - abort-controller "^3.0.0" anymatch "^3.0.3" debug "^2.2.0" fb-watchman "^2.0.0" + flow-enums-runtime "^0.0.6" graceful-fs "^4.2.4" invariant "^2.2.4" - jest-regex-util "^27.0.6" - jest-serializer "^27.0.6" - jest-util "^27.2.0" - jest-worker "^27.2.0" + jest-worker "^29.6.3" micromatch "^4.0.4" + node-abort-controller "^3.1.1" nullthrows "^1.1.1" walker "^1.0.7" optionalDependencies: fsevents "^2.3.2" -metro-hermes-compiler@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-hermes-compiler/-/metro-hermes-compiler-0.73.7.tgz#d1b519c4040423240d89e7816340ca9635deeae8" - integrity sha512-F8PlJ8mWEEumGNH3eMRA3gjgP70ZvH4Ex5F1KY6ofD/gpn7w5HJHSPTeVw8gtUb1pYLN4nevptpyXGg04Jfcog== - -metro-inspector-proxy@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.73.7.tgz#edb966c1581a41a3302860d264f3228e1f57a220" - integrity sha512-TsAtQeKr9X7NaQHlpshu+ZkGWlPi5fFKNqieLkfqvT1oXN4PQF/4q38INyiZtWLPvoUzTR6PRnm4pcUbJ7+Nzg== - dependencies: - connect "^3.6.5" - debug "^2.2.0" - ws "^7.5.1" - yargs "^17.5.1" - -metro-minify-terser@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.73.7.tgz#e45fc05eb2e3bc76c9b4fe4abccee0fffeedcf75" - integrity sha512-gbv1fmMOZm6gJ6dQoD+QktlCi2wk6nlTR8j8lQCjeeXGbs6O9e5XLWNPOexHqo7S69bdbohEnfZnLJFcxgHeNw== +metro-minify-terser@0.80.12: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.80.12.tgz#9951030e3bc52d7f3ac8664ce5862401c673e3c6" + integrity sha512-muWzUw3y5k+9083ZoX9VaJLWEV2Jcgi+Oan0Mmb/fBNMPqP9xVDuy4pOMn/HOiGndgfh/MK7s4bsjkyLJKMnXQ== dependencies: + flow-enums-runtime "^0.0.6" terser "^5.15.0" -metro-minify-uglify@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.73.7.tgz#3dfd397e8202905731e4a519a58fc334d9232a15" - integrity sha512-DmDCzfdbaPExQuQ7NQozCNOSOAgp5Ux9kWzmKAT8seQ38/3NtUepW+PTgxXIHmwNjJV4oHsHwlBlTwJmYihKXg== - dependencies: - uglify-es "^3.1.9" - -metro-react-native-babel-preset@0.73.5: - version "0.73.5" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.73.5.tgz#9b92f1ebc2b3d96f511c45a03f8e35e0fc46cc19" - integrity sha512-Ej6J8ozWSs6nrh0nwX7hgX4oPXUai40ckah37cSLu8qeED2XiEtfLV1YksTLafFE8fX0EieiP97U97dkOGHP4w== - dependencies: - "@babel/core" "^7.14.0" - "@babel/plugin-proposal-async-generator-functions" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-export-default-from" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.0.0" - "@babel/plugin-syntax-export-default-from" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.2.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-syntax-optional-chaining" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-async-to-generator" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-self" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-sticky-regex" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.5.0" - "@babel/plugin-transform-unicode-regex" "^7.0.0" - "@babel/template" "^7.0.0" - react-refresh "^0.4.0" - -metro-react-native-babel-preset@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.73.7.tgz#78e1ce448aa9a5cf3651c0ebe73cb225465211b4" - integrity sha512-RKcmRZREjJCzHKP+JhC9QTCohkeb3xa/DtqHU14U5KWzJHdC0mMrkTZYNXhV0cryxsaVKVEw5873KhbZyZHMVw== - dependencies: - "@babel/core" "^7.20.0" - "@babel/plugin-proposal-async-generator-functions" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-export-default-from" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.0.0" - "@babel/plugin-syntax-export-default-from" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.18.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-syntax-optional-chaining" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-async-to-generator" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-self" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-sticky-regex" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.5.0" - "@babel/plugin-transform-unicode-regex" "^7.0.0" - "@babel/template" "^7.0.0" - react-refresh "^0.4.0" - -metro-react-native-babel-transformer@0.73.5: - version "0.73.5" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.73.5.tgz#fb1d48cc73ce26371cf2a115f702b7bf3bb5516b" - integrity sha512-CZYgUguqFTzV9vSOZb60p8qlp31aWz8aBB6OqoZ2gJday+n/1k+Y0yy6VPr/tfXJheuQYVIXKvG1gMmUDyxt+Q== - dependencies: - "@babel/core" "^7.14.0" - babel-preset-fbjs "^3.4.0" - hermes-parser "0.8.0" - metro-babel-transformer "0.73.5" - metro-react-native-babel-preset "0.73.5" - metro-source-map "0.73.5" - nullthrows "^1.1.1" - -metro-react-native-babel-transformer@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.73.7.tgz#a92055fd564cd403255cc34f925c5e99ce457565" - integrity sha512-73HW8betjX+VPm3iqsMBe8F/F2Tt+hONO6YJwcF7FonTqQYW1oTz0dOp0dClZGfHUXxpJBz6Vuo7J6TpdzDD+w== - dependencies: - "@babel/core" "^7.20.0" - babel-preset-fbjs "^3.4.0" - hermes-parser "0.8.0" - metro-babel-transformer "0.73.7" - metro-react-native-babel-preset "0.73.7" - metro-source-map "0.73.7" - nullthrows "^1.1.1" - -metro-resolver@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.73.7.tgz#1e174cf59eac84c0869172764316042b466daaa5" - integrity sha512-mGW3XPeKBCwZnkHcKo1dhFa9olcx7SyNzG1vb5kjzJYe4Qs3yx04r/qFXIJLcIgLItB69TIGvosznUhpeOOXzg== - dependencies: - absolute-path "^0.0.0" - -metro-runtime@0.73.5: - version "0.73.5" - resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.73.5.tgz#8c92c3947e97a8dede6347ba6a9844bfb8be8258" - integrity sha512-8QJOS7bhJmR6r/Gkki/qY9oX/DdxnLhS8FpdG1Xmm2hDeUVAug12ekWTiCRMu7d1CDVv1F8WvUz09QckZ0dO0g== +metro-resolver@0.80.12: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.80.12.tgz#e3815914c21315b04db200032c3243a4cc22dfb6" + integrity sha512-PR24gYRZnYHM3xT9pg6BdbrGbM/Cu1TcyIFBVlAk7qDAuHkUNQ1nMzWumWs+kwSvtd9eZGzHoucGJpTUEeLZAw== dependencies: - "@babel/runtime" "^7.0.0" - react-refresh "^0.4.0" + flow-enums-runtime "^0.0.6" -metro-runtime@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.73.7.tgz#9f3a7f3ff668c1a87370650e32b47d8f6329fd1e" - integrity sha512-2fxRGrF8FyrwwHY0TCitdUljzutfW6CWEpdvPilfrs8p0PI5X8xOWg8ficeYtw+DldHtHIAL2phT59PqzHTyVA== +metro-runtime@0.80.12, metro-runtime@^0.80.3: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.80.12.tgz#a68af3a2a013f5372d3b8cee234fdd467455550b" + integrity sha512-LIx7+92p5rpI0i6iB4S4GBvvLxStNt6fF0oPMaUd1Weku7jZdfkCZzmrtDD9CSQ6EPb0T9NUZoyXIxlBa3wOCw== dependencies: - "@babel/runtime" "^7.0.0" - react-refresh "^0.4.0" - -metro-source-map@0.73.5: - version "0.73.5" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.73.5.tgz#67e14bd1fcc1074b9623640ca311cd99d07426fa" - integrity sha512-58p3zNWgUrqYYjFJb0KkZ+uJurTL4oz7i5T7577b3kvTYuJ0eK4y7rtYf8EwOfMYxRAn/m20aH1Y1fHTsLUwjQ== - dependencies: - "@babel/traverse" "^7.14.0" - "@babel/types" "^7.20.0" - invariant "^2.2.4" - metro-symbolicate "0.73.5" - nullthrows "^1.1.1" - ob1 "0.73.5" - source-map "^0.5.6" - vlq "^1.0.0" + "@babel/runtime" "^7.25.0" + flow-enums-runtime "^0.0.6" -metro-source-map@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.73.7.tgz#8e9f850a72d60ea7ace05b984f981c8ec843e7a0" - integrity sha512-gbC/lfUN52TtQhEsTTA+987MaFUpQlufuCI05blLGLosDcFCsARikHsxa65Gtslm/rG2MqvFLiPA5hviONNv9g== +metro-source-map@0.80.12, metro-source-map@^0.80.3: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.80.12.tgz#36a2768c880f8c459d6d758e2d0975e36479f49c" + integrity sha512-o+AXmE7hpvM8r8MKsx7TI21/eerYYy2DCDkWfoBkv+jNkl61khvDHlQn0cXZa6lrcNZiZkl9oHSMcwLLIrFmpw== dependencies: "@babel/traverse" "^7.20.0" "@babel/types" "^7.20.0" + flow-enums-runtime "^0.0.6" invariant "^2.2.4" - metro-symbolicate "0.73.7" + metro-symbolicate "0.80.12" nullthrows "^1.1.1" - ob1 "0.73.7" + ob1 "0.80.12" source-map "^0.5.6" vlq "^1.0.0" -metro-symbolicate@0.73.5: - version "0.73.5" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.73.5.tgz#8de118be231decd55c8c70ed54deb308fdffceda" - integrity sha512-aIC8sDlaEdtn0dTt+64IFZFEATatFx3GtzRbJi0+jJx47RjDRiuCt9fzmTMLuadWwnbFK9ZfVMuWEXM9sdtQ7w== +metro-symbolicate@0.80.12: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.80.12.tgz#3a6aa783c6e494e2879342d88d5379fab69d1ed2" + integrity sha512-/dIpNdHksXkGHZXARZpL7doUzHqSNxgQ8+kQGxwpJuHnDhGkENxB5PS2QBaTDdEcmyTMjS53CN1rl9n1gR6fmw== dependencies: + flow-enums-runtime "^0.0.6" invariant "^2.2.4" - metro-source-map "0.73.5" + metro-source-map "0.80.12" nullthrows "^1.1.1" source-map "^0.5.6" through2 "^2.0.1" vlq "^1.0.0" -metro-symbolicate@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.73.7.tgz#40e4cda81f8030b86afe391b5e686a0b06822b0a" - integrity sha512-571ThWmX5o8yGNzoXjlcdhmXqpByHU/bSZtWKhtgV2TyIAzYCYt4hawJAS5+/qDazUvjHdm8BbdqFUheM0EKNQ== - dependencies: - invariant "^2.2.4" - metro-source-map "0.73.7" - nullthrows "^1.1.1" - source-map "^0.5.6" - through2 "^2.0.1" - vlq "^1.0.0" - -metro-transform-plugins@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.73.7.tgz#49ff2571742d557f20301880f55b00054e468e52" - integrity sha512-M5isiWEau0jMudb5ezaNBZnYqXxcATMqnAYc+Cu25IahT1NHi5aWwLok9EBmBpN5641IZUZXScf+KnS7fPxPCQ== +metro-transform-plugins@0.80.12: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.80.12.tgz#4a3853630ad0f36cc2bffd53bae659ee171a389c" + integrity sha512-WQWp00AcZvXuQdbjQbx1LzFR31IInlkCDYJNRs6gtEtAyhwpMMlL2KcHmdY+wjDO9RPcliZ+Xl1riOuBecVlPA== dependencies: "@babel/core" "^7.20.0" "@babel/generator" "^7.20.0" "@babel/template" "^7.0.0" "@babel/traverse" "^7.20.0" + flow-enums-runtime "^0.0.6" nullthrows "^1.1.1" -metro-transform-worker@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.73.7.tgz#be111805e92ea48b7c76dd75830798f318e252e0" - integrity sha512-gZYIu9JAqEI9Rxi0xGMuMW6QsHGbMSptozlTOwOd7T7yXX3WwYS/I3yLPbLhbZTjOhwMHkTt8Nhm2qBo8nh14g== +metro-transform-worker@0.80.12: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.80.12.tgz#80be8a185b7deb93402b682f58a1dd6724317ad1" + integrity sha512-KAPFN1y3eVqEbKLx1I8WOarHPqDMUa8WelWxaJCNKO/yHCP26zELeqTJvhsQup+8uwB6EYi/sp0b6TGoh6lOEA== dependencies: "@babel/core" "^7.20.0" "@babel/generator" "^7.20.0" "@babel/parser" "^7.20.0" "@babel/types" "^7.20.0" - babel-preset-fbjs "^3.4.0" - metro "0.73.7" - metro-babel-transformer "0.73.7" - metro-cache "0.73.7" - metro-cache-key "0.73.7" - metro-hermes-compiler "0.73.7" - metro-source-map "0.73.7" - metro-transform-plugins "0.73.7" + flow-enums-runtime "^0.0.6" + metro "0.80.12" + metro-babel-transformer "0.80.12" + metro-cache "0.80.12" + metro-cache-key "0.80.12" + metro-minify-terser "0.80.12" + metro-source-map "0.80.12" + metro-transform-plugins "0.80.12" nullthrows "^1.1.1" -metro@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.73.7.tgz#435081339ac209e4d8802c57ac522638140c802b" - integrity sha512-pkRqFhuGUvkiu8HxKPUQelbCuyy6te6okMssTyLzQwsKilNLK4YMI2uD6PHnypg5SiMJ58lwfqkp/t5w72jEvw== +metro@0.80.12, metro@^0.80.3: + version "0.80.12" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.80.12.tgz#29a61fb83581a71e50c4d8d5d8458270edfe34cc" + integrity sha512-1UsH5FzJd9quUsD1qY+zUG4JY3jo3YEMxbMYH9jT6NK3j4iORhlwTK8fYTfAUBhDKjgLfKjAh7aoazNE23oIRA== dependencies: "@babel/code-frame" "^7.0.0" "@babel/core" "^7.20.0" @@ -3694,68 +5106,41 @@ metro@0.73.7: "@babel/template" "^7.0.0" "@babel/traverse" "^7.20.0" "@babel/types" "^7.20.0" - absolute-path "^0.0.0" accepts "^1.3.7" - async "^3.2.2" chalk "^4.0.0" ci-info "^2.0.0" connect "^3.6.5" debug "^2.2.0" denodeify "^1.2.1" error-stack-parser "^2.0.6" + flow-enums-runtime "^0.0.6" graceful-fs "^4.2.4" - hermes-parser "0.8.0" - image-size "^0.6.0" + hermes-parser "0.23.1" + image-size "^1.0.2" invariant "^2.2.4" - jest-worker "^27.2.0" + jest-worker "^29.6.3" + jsc-safe-url "^0.2.2" lodash.throttle "^4.1.1" - metro-babel-transformer "0.73.7" - metro-cache "0.73.7" - metro-cache-key "0.73.7" - metro-config "0.73.7" - metro-core "0.73.7" - metro-file-map "0.73.7" - metro-hermes-compiler "0.73.7" - metro-inspector-proxy "0.73.7" - metro-minify-terser "0.73.7" - metro-minify-uglify "0.73.7" - metro-react-native-babel-preset "0.73.7" - metro-resolver "0.73.7" - metro-runtime "0.73.7" - metro-source-map "0.73.7" - metro-symbolicate "0.73.7" - metro-transform-plugins "0.73.7" - metro-transform-worker "0.73.7" + metro-babel-transformer "0.80.12" + metro-cache "0.80.12" + metro-cache-key "0.80.12" + metro-config "0.80.12" + metro-core "0.80.12" + metro-file-map "0.80.12" + metro-resolver "0.80.12" + metro-runtime "0.80.12" + metro-source-map "0.80.12" + metro-symbolicate "0.80.12" + metro-transform-plugins "0.80.12" + metro-transform-worker "0.80.12" mime-types "^2.1.27" - node-fetch "^2.2.0" nullthrows "^1.1.1" - rimraf "^3.0.2" serialize-error "^2.1.0" source-map "^0.5.6" strip-ansi "^6.0.0" - temp "0.8.3" throat "^5.0.0" - ws "^7.5.1" - yargs "^17.5.1" - -micromatch@^3.1.10: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" + ws "^7.5.10" + yargs "^17.6.2" micromatch@^4.0.4: version "4.0.5" @@ -3792,7 +5177,7 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@^3.0.2, minimatch@^3.1.1: +minimatch@^3.0.2, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -3806,18 +5191,29 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" +minimatch@^5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.6: version "1.2.7" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== mkdirp@^0.5.1: version "0.5.6" @@ -3826,6 +5222,47 @@ mkdirp@^0.5.1: dependencies: minimist "^1.2.6" +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@^2.1.3: + version "2.1.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-2.1.6.tgz#964fbcb12b2d8c5d6fbc62a963ac95a273e2cc19" + integrity sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A== + +mkdirp@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" + integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== + +mocha@^10.7.3: + version "10.7.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.7.3.tgz#ae32003cabbd52b59aece17846056a68eb4b0752" + integrity sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A== + dependencies: + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^8.1.0" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -3836,27 +5273,24 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3: +ms@2.1.3, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" +mz@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== negotiator@0.6.3: version "0.6.3" @@ -3868,16 +5302,27 @@ neo-async@^2.5.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +nitro-codegen@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/nitro-codegen/-/nitro-codegen-0.7.0.tgz#b8a7e1d9c235778a0fac28c5a1fe5c4ebc3b00ba" + integrity sha512-Urz9nYiSOzcRHalkFcS5lFkqjlQyyqAdrll5yogbf5Jg3gSerh3I8py3gQ+3ndm/agsr5fw+LE1MwldEeS6HHA== + dependencies: + chalk "^5.3.0" + react-native-nitro-modules "^0.6.0" + ts-morph "^23.0.0" + yargs "^17.7.2" + zod "^3.23.8" nocache@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/nocache/-/nocache-3.0.4.tgz#5b37a56ec6e09fc7d401dceaed2eab40c8bfdf79" integrity sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw== +node-abort-controller@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" + integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== + node-dir@^0.1.17: version "0.1.17" resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" @@ -3885,18 +5330,28 @@ node-dir@^0.1.17: dependencies: minimatch "^3.0.2" -node-fetch@^2.2.0, node-fetch@^2.6.0: +node-fetch@^2.2.0: version "2.6.8" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.8.tgz#a68d30b162bc1d8fd71a367e81b997e1f4d4937e" integrity sha512-RZ6dBYuj8dRSfxpUSu+NsdF1dpPpluJxwOp+6IoDp/sH2QNDSvurYsAa+F1WxY2RjA1iP93xhcsUoYbF2XBqVg== dependencies: whatwg-url "^5.0.0" +node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + node-releases@^2.0.6: version "2.0.8" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" @@ -3907,19 +5362,12 @@ node-stream-zip@^1.9.1: resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.15.0.tgz#158adb88ed8004c6c49a396b50a6a5de3bca33ea" integrity sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw== -normalize-path@^3.0.0: +normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - -npm-run-path@^4.0.0: +npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== @@ -3931,43 +5379,65 @@ nullthrows@^1.1.1: resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== -ob1@0.73.5: - version "0.73.5" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.73.5.tgz#b80dc4a6f787044e3d8afde3c2d034ae23d05a86" - integrity sha512-MxQH/rCq9/COvgTQbjCldArmesGEidZVVQIn4vDUJvJJ8uMphXOTCBsgWTief2ugvb0WUimIaslKSA+qryFjjQ== - -ob1@0.73.7: - version "0.73.7" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.73.7.tgz#14c9b6ddc26cf99144f59eb542d7ae956e6b3192" - integrity sha512-DfelfvR843KADhSUATGGhuepVMRcf5VQX+6MQLy5AW0BKDLlO7Usj6YZeAAZP7P86QwsoTxB0RXCFiA7t6S1IQ== +ob1@0.80.12: + version "0.80.12" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.80.12.tgz#0451944ba6e5be225cc9751d8cd0d7309d2d1537" + integrity sha512-VMArClVT6LkhUGpnuEoBuyjG9rzUyEzg4PDkav6wK1cLhOK02gPCYFxoiB4mqVnrMhDpIzJcrGNAMVi9P+hXrw== + dependencies: + flow-enums-runtime "^0.0.6" -object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== +object.entries@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== dependencies: - isobject "^3.0.0" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: - isobject "^3.0.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.values@^1.1.6, object.values@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" on-finished@2.4.1: version "2.4.1" @@ -3995,7 +5465,7 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -4009,6 +5479,26 @@ open@^6.2.0: dependencies: is-wsl "^1.1.0" +open@^7.0.3: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + ora@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" @@ -4024,16 +5514,6 @@ ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" -os-tmpdir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -4081,6 +5561,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -4096,7 +5581,7 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -4106,15 +5591,32 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse5-htmlparser2-tree-adapter@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== + dependencies: + parse5 "^6.0.1" + +parse5@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== path-exists@^3.0.0: version "3.0.0" @@ -4131,11 +5633,6 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -4146,17 +5643,35 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pathval@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" + integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: +picocolors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -4178,10 +5693,27 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" + integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== pretty-format@^26.5.2, pretty-format@^26.6.2: version "26.6.2" @@ -4193,12 +5725,12 @@ pretty-format@^26.5.2, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" -pretty-format@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.3.1.tgz#1841cac822b02b4da8971dacb03e8a871b4722da" - integrity sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg== +pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: - "@jest/schemas" "^29.0.0" + "@jest/schemas" "^29.6.3" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -4214,7 +5746,7 @@ promise@^8.3.0: dependencies: asap "~2.0.6" -prompts@^2.4.0, prompts@^2.4.2: +prompts@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -4222,7 +5754,7 @@ prompts@^2.4.0, prompts@^2.4.2: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@*: +prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -4239,29 +5771,48 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +querystring@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" + integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +queue@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" + integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== + dependencies: + inherits "~2.0.3" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -react-devtools-core@^4.26.1: - version "4.27.1" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.27.1.tgz#167aa174383c65786cbb7e965a5b39c702f0a2d3" - integrity sha512-qXhcxxDWiFmFAOq48jts9YQYe1+wVoUXzJTlY4jbaATzyio6dd6CUGu3dXBhREeVgpZ+y4kg6vFJzIOZh6vY2w== +react-devtools-core@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-5.3.1.tgz#d57f5b8f74f16e622bd6a7bc270161e4ba162666" + integrity sha512-7FSb9meX0btdBQLwdFOwt6bGqvRPabmVMMslv8fgoSPqXyuGpgQe36kx8gR86XPw7aV1yVouTp6fyZ0EH+NfUw== dependencies: shell-quote "^1.6.1" ws "^7" -"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - react-is@^16.13.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" @@ -4272,6 +5823,11 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + react-native-builder-bob@^0.18.2: version "0.18.3" resolved "https://registry.yarnpkg.com/react-native-builder-bob/-/react-native-builder-bob-0.18.3.tgz#fb4d3e50a3b2290db3c88de6d40403ac7eb9f85f" @@ -4299,78 +5855,64 @@ react-native-builder-bob@^0.18.2: optionalDependencies: jetifier "^2.0.0" -react-native-codegen@^0.71.3: - version "0.71.3" - resolved "https://registry.yarnpkg.com/react-native-codegen/-/react-native-codegen-0.71.3.tgz#75fbc591819050791319ebdb9fe341ee4df5c288" - integrity sha512-5AvdHVU1sAaXg05i0dG664ZTaCaIFaY1znV5vNsj+wUu6MGxNEUNbDKk9dxKUkkxOyk2KZOK5uhzWL0p5H5yZQ== - dependencies: - "@babel/parser" "^7.14.0" - flow-parser "^0.185.0" - jscodeshift "^0.13.1" - nullthrows "^1.1.1" - -react-native-gradle-plugin@^0.71.12: - version "0.71.12" - resolved "https://registry.yarnpkg.com/react-native-gradle-plugin/-/react-native-gradle-plugin-0.71.12.tgz#7f0000b3d9593288183a13889fd6225d0ab506b8" - integrity sha512-ILujN0C+cX5QHmm22MXbHqZR619OzV/VThLHFhe7qnzZWpPh8O4KSvbtezoYMiBbmowAfy8SQpohwlN3nv6wZQ== - -react-native@0.71.0: - version "0.71.0" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.71.0.tgz#ce47c3cb6239484fcd686d1f45b363b7014b6c62" - integrity sha512-b5oCS/cPVqXT5E2K+0CfQMERAoRu6/6g1no9XRAcjQ4b5JG608WgDh5QgXPHaMSVhAvsJ1DuRoU8C/xqTjQITA== - dependencies: - "@jest/create-cache-key-function" "^29.2.1" - "@react-native-community/cli" "10.0.0" - "@react-native-community/cli-platform-android" "10.0.0" - "@react-native-community/cli-platform-ios" "10.0.0" - "@react-native/assets" "1.0.0" - "@react-native/normalize-color" "2.1.0" - "@react-native/polyfills" "2.0.0" +react-native-nitro-modules@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/react-native-nitro-modules/-/react-native-nitro-modules-0.6.0.tgz#3a7bdbbf015dbdb50e3ad28b390fa0c1318ee646" + integrity sha512-TxX13LxPhWw2m0L5RHx9bYfn945jFppXm+rxBacujCbZlV4urMQ3U1PRRTLmY1yaC23B5Bq27JFbJxJsgy4WlA== + +react-native@0.75.2: + version "0.75.2" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.75.2.tgz#12d7e3e63c8ab93dcab7a6d4c4c9f4ad199141d4" + integrity sha512-pP+Yswd/EurzAlKizytRrid9LJaPJzuNldc+o5t01md2VLHym8V7FWH2z9omFKtFTer8ERg0fAhG1fpd0Qq6bQ== + dependencies: + "@jest/create-cache-key-function" "^29.6.3" + "@react-native-community/cli" "14.0.0" + "@react-native-community/cli-platform-android" "14.0.0" + "@react-native-community/cli-platform-ios" "14.0.0" + "@react-native/assets-registry" "0.75.2" + "@react-native/codegen" "0.75.2" + "@react-native/community-cli-plugin" "0.75.2" + "@react-native/gradle-plugin" "0.75.2" + "@react-native/js-polyfills" "0.75.2" + "@react-native/normalize-colors" "0.75.2" + "@react-native/virtualized-lists" "0.75.2" abort-controller "^3.0.0" anser "^1.4.9" - base64-js "^1.1.2" - deprecated-react-native-prop-types "^3.0.1" + ansi-regex "^5.0.0" + base64-js "^1.5.1" + chalk "^4.0.0" event-target-shim "^5.0.1" + flow-enums-runtime "^0.0.6" + glob "^7.1.1" invariant "^2.2.4" - jest-environment-node "^29.2.1" - jsc-android "^250230.2.1" + jest-environment-node "^29.6.3" + jsc-android "^250231.0.0" memoize-one "^5.0.0" - metro-react-native-babel-transformer "0.73.5" - metro-runtime "0.73.5" - metro-source-map "0.73.5" + metro-runtime "^0.80.3" + metro-source-map "^0.80.3" mkdirp "^0.5.1" nullthrows "^1.1.1" pretty-format "^26.5.2" promise "^8.3.0" - react-devtools-core "^4.26.1" - react-native-codegen "^0.71.3" - react-native-gradle-plugin "^0.71.12" - react-refresh "^0.4.0" - react-shallow-renderer "^16.15.0" + react-devtools-core "^5.3.1" + react-refresh "^0.14.0" regenerator-runtime "^0.13.2" - scheduler "^0.23.0" - stacktrace-parser "^0.1.3" - use-sync-external-store "^1.0.0" + scheduler "0.24.0-canary-efb381bbf-20230505" + semver "^7.1.3" + stacktrace-parser "^0.1.10" whatwg-fetch "^3.0.0" ws "^6.2.2" + yargs "^17.6.2" -react-refresh@^0.4.0: - version "0.4.3" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.3.tgz#966f1750c191672e76e16c2efa569150cc73ab53" - integrity sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA== - -react-shallow-renderer@^16.15.0: - version "16.15.0" - resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz#48fb2cf9b23d23cde96708fe5273a7d3446f4457" - integrity sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA== - dependencies: - object-assign "^4.1.1" - react-is "^16.12.0 || ^17.0.0 || ^18.0.0" +react-refresh@^0.14.0: + version "0.14.2" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" + integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== -react@18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== +react@18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" @@ -4396,21 +5938,46 @@ readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + readline@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" integrity sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg== -recast@^0.20.4: - version "0.20.5" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.20.5.tgz#8e2c6c96827a1b339c634dd232957d230553ceae" - integrity sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ== +recast@^0.21.0: + version "0.21.5" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.21.5.tgz#e8cd22bb51bcd6130e54f87955d33a2b2e57b495" + integrity sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg== dependencies: - ast-types "0.14.2" + ast-types "0.15.2" esprima "~4.0.0" source-map "~0.6.1" tslib "^2.0.1" +reflect-metadata@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" + integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== + +reflect.getprototypeof@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + regenerate-unicode-properties@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" @@ -4428,6 +5995,11 @@ regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.2: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + regenerator-transform@^0.15.1: version "0.15.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" @@ -4435,13 +6007,22 @@ regenerator-transform@^0.15.1: dependencies: "@babel/runtime" "^7.8.4" -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" + "@babel/runtime" "^7.8.4" + +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" regexpu-core@^5.2.1: version "5.2.2" @@ -4467,16 +6048,6 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -4497,11 +6068,6 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== - resolve@^1.14.2: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" @@ -4511,6 +6077,15 @@ resolve@^1.14.2: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -4519,11 +6094,6 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -4536,11 +6106,6 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -rimraf@~2.2.6: - version "2.2.8" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" - integrity sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg== - rimraf@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -4555,31 +6120,51 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== dependencies: - ret "~0.1.10" + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== +scheduler@0.24.0-canary-efb381bbf-20230505: + version "0.24.0-canary-efb381bbf-20230505" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz#5dddc60e29f91cd7f8b983d7ce4a99c2202d178f" + integrity sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA== dependencies: loose-envify "^1.1.0" -semver@^5.5.0, semver@^5.6.0: +selfsigned@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== + dependencies: + "@types/node-forge" "^1.3.0" + node-forge "^1" + +semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -4589,6 +6174,16 @@ semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.1.3, semver@^7.3.7, semver@^7.5.2, semver@^7.6.0: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -4613,6 +6208,13 @@ serialize-error@^2.1.0: resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" integrity sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw== +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + serve-static@^1.13.1: version "1.15.0" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" @@ -4628,21 +6230,41 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1, set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== +sha.js@^2.4.11: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + shallow-clone@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" @@ -4650,13 +6272,6 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -4664,11 +6279,6 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" @@ -4679,11 +6289,26 @@ shell-quote@^1.6.1, shell-quote@^1.7.3: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== -signal-exit@^3.0.0, signal-exit@^3.0.2: +side-channel@^1.0.4, side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -4703,47 +6328,6 @@ slice-ansi@^2.0.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - source-map-support@^0.5.16, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -4752,11 +6336,6 @@ source-map-support@^0.5.16, source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -4767,18 +6346,6 @@ source-map@^0.6.0, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.7.3: - version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -4796,21 +6363,13 @@ stackframe@^1.3.4: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== -stacktrace-parser@^0.1.3: +stacktrace-parser@^0.1.10: version "0.1.10" resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== dependencies: type-fest "^0.7.1" -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -4821,6 +6380,20 @@ statuses@~1.5.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +string-natural-compare@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" + integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== + +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -4830,6 +6403,69 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.matchall@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + regexp.prototype.flags "^1.5.2" + set-function-name "^2.0.2" + side-channel "^1.0.6" + +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -4844,6 +6480,13 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^5.0.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" @@ -4858,16 +6501,28 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + sudo-prompt@^9.0.0: version "9.2.1" resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd" @@ -4887,7 +6542,7 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: +supports-color@^8.0.0, supports-color@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -4899,13 +6554,13 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -temp@0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" - integrity sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw== +synckit@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.1.tgz#febbfbb6649979450131f64735aa3f6c14575c88" + integrity sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A== dependencies: - os-tmpdir "^1.0.0" - rimraf "~2.2.6" + "@pkgr/core" "^0.1.0" + tslib "^2.6.2" temp@^0.8.4: version "0.8.4" @@ -4924,6 +6579,25 @@ terser@^5.15.0: commander "^2.20.0" source-map-support "~0.5.20" +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + throat@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" @@ -4947,21 +6621,6 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -4969,16 +6628,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" @@ -4989,33 +6638,142 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +ts-api-utils@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +ts-morph@^23.0.0: + version "23.0.0" + resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-23.0.0.tgz#601d74edd1d24247e312b9fa5d147bdc659bff15" + integrity sha512-FcvFx7a9E8TUe6T3ShihXJLiJOiqyafzFKUO4aqIHDUCIvADdGNShcbc2W5PMr3LerXRv7mafvFZ9lRENxJmug== + dependencies: + "@ts-morph/common" "~0.24.0" + code-block-writer "^13.0.1" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + tslib@^2.0.1: version "2.4.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== +tslib@^2.5.0, tslib@^2.6.2: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + +typeorm@^0.3.20: + version "0.3.20" + resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.20.tgz#4b61d737c6fed4e9f63006f88d58a5e54816b7ab" + integrity sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q== + dependencies: + "@sqltools/formatter" "^1.2.5" + app-root-path "^3.1.0" + buffer "^6.0.3" + chalk "^4.1.2" + cli-highlight "^2.1.11" + dayjs "^1.11.9" + debug "^4.3.4" + dotenv "^16.0.3" + glob "^10.3.10" + mkdirp "^2.1.3" + reflect-metadata "^0.2.1" + sha.js "^2.4.11" + tslib "^2.5.0" + uuid "^9.0.0" + yargs "^17.6.2" + typescript@^4.8.4: version "4.9.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== -uglify-es@^3.1.9: - version "3.3.9" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: - commander "~2.13.0" - source-map "~0.6.1" + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" unc-path-regex@^0.1.2: version "0.1.2" @@ -5045,16 +6803,6 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -5070,14 +6818,6 @@ unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - update-browserslist-db@^1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" @@ -5086,20 +6826,20 @@ update-browserslist-db@^1.0.9: escalade "^3.1.1" picocolors "^1.0.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== - -use-sync-external-store@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" - integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.1" -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" @@ -5111,6 +6851,11 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +uuid@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -5153,17 +6898,60 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-builtin-type@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.4.tgz#592796260602fc3514a1b5ee7fa29319b72380c3" + integrity sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w== + dependencies: + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.2" + which-typed-array "^1.1.15" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== +which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== dependencies: - isexe "^2.0.0" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" which@^2.0.1, which@^2.0.2: version "2.0.2" @@ -5172,6 +6960,25 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -5190,6 +6997,15 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -5211,11 +7027,23 @@ ws@^6.2.2: dependencies: async-limiter "~1.0.0" -ws@^7, ws@^7.5.1: +ws@^6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.3.tgz#ccc96e4add5fd6fedbc491903075c85c5a11d9ee" + integrity sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA== + dependencies: + async-limiter "~1.0.0" + +ws@^7: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +ws@^7.5.10: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -5241,6 +7069,11 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yaml@^2.2.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130" + integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q== + yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" @@ -5249,11 +7082,26 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^20.2.2, yargs-parser@^20.2.9: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== +yargs-unparser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + yargs@^15.1.0: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" @@ -5271,6 +7119,19 @@ yargs@^15.1.0: y18n "^4.0.0" yargs-parser "^18.1.2" +yargs@^16.0.0, yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@^17.5.1: version "17.6.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" @@ -5284,7 +7145,25 @@ yargs@^17.5.1: y18n "^5.0.5" yargs-parser "^21.1.1" +yargs@^17.6.2, yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod@^3.23.8: + version "3.23.8" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" + integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== From 8ed77872a2254f55f12816aedd669b8646ca4274 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 11 Sep 2024 16:58:50 +0200 Subject: [PATCH 085/156] add comment on how to get startup function in cpp --- cpp/OnLoad.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cpp/OnLoad.hpp b/cpp/OnLoad.hpp index f5280cab..1b3ab2a6 100644 --- a/cpp/OnLoad.hpp +++ b/cpp/OnLoad.hpp @@ -18,4 +18,5 @@ void registerHybridObjectConstructors(); // OnLoad() // }; -// static OnLoad onLoad; +// #pragma optimize("", off) +// static volatile OnLoad onLoad; From 5ccd99fbc5fd2ebc713620f12bb95184a926796b Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 11 Sep 2024 17:22:53 +0200 Subject: [PATCH 086/156] add default hybrid object constructors --- cpp/specs/HybridQuickSQLite.cpp | 2 ++ cpp/specs/HybridSelectQueryResult.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/cpp/specs/HybridQuickSQLite.cpp b/cpp/specs/HybridQuickSQLite.cpp index d7f2b8b4..b54415f6 100644 --- a/cpp/specs/HybridQuickSQLite.cpp +++ b/cpp/specs/HybridQuickSQLite.cpp @@ -16,6 +16,8 @@ namespace margelo::rnquicksqlite { +void HybridQuickSQLite::HybridQuickSQLite() : HybridQuickSQLiteSpec() {} + void HybridQuickSQLite::open(const std::string& dbName, const std::optional& location) { std::string tempDocPath = std::string(docPathStr); if (location) { diff --git a/cpp/specs/HybridSelectQueryResult.cpp b/cpp/specs/HybridSelectQueryResult.cpp index 633046d7..5b54dc47 100644 --- a/cpp/specs/HybridSelectQueryResult.cpp +++ b/cpp/specs/HybridSelectQueryResult.cpp @@ -2,6 +2,8 @@ namespace margelo::rnquicksqlite { +HybridSelectQueryResult::HybridSelectQueryResult() : HybridSelectQueryResultSpec() {} + HybridSelectQueryResult::HybridSelectQueryResult(TableResults&& results, TableMetadata&& metadata) : HybridSelectQueryResultSpec(), _results(std::move(results)), _metadata(std::move(metadata)) {} From b83e43cd57ad8eb705e05920912d3c49fb1a7b85 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 11 Sep 2024 18:01:55 +0200 Subject: [PATCH 087/156] fix: HybridObject default constructor --- cpp/specs/HybridQuickSQLite.cpp | 2 -- cpp/specs/HybridQuickSQLite.hpp | 3 +++ cpp/specs/HybridSelectQueryResult.cpp | 5 ----- cpp/specs/HybridSelectQueryResult.hpp | 4 +++- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/cpp/specs/HybridQuickSQLite.cpp b/cpp/specs/HybridQuickSQLite.cpp index b54415f6..d7f2b8b4 100644 --- a/cpp/specs/HybridQuickSQLite.cpp +++ b/cpp/specs/HybridQuickSQLite.cpp @@ -16,8 +16,6 @@ namespace margelo::rnquicksqlite { -void HybridQuickSQLite::HybridQuickSQLite() : HybridQuickSQLiteSpec() {} - void HybridQuickSQLite::open(const std::string& dbName, const std::optional& location) { std::string tempDocPath = std::string(docPathStr); if (location) { diff --git a/cpp/specs/HybridQuickSQLite.hpp b/cpp/specs/HybridQuickSQLite.hpp index 06a67b1c..55d093e6 100644 --- a/cpp/specs/HybridQuickSQLite.hpp +++ b/cpp/specs/HybridQuickSQLite.hpp @@ -7,6 +7,9 @@ using namespace margelo::nitro::rnquicksqlite; namespace margelo::rnquicksqlite { class HybridQuickSQLite: public HybridQuickSQLiteSpec { +public: + HybridQuickSQLite() : HybridObject(TAG) {} + public: // Methods void open(const std::string& dbName, const std::optional& location) override; diff --git a/cpp/specs/HybridSelectQueryResult.cpp b/cpp/specs/HybridSelectQueryResult.cpp index 5b54dc47..9a9dd5f1 100644 --- a/cpp/specs/HybridSelectQueryResult.cpp +++ b/cpp/specs/HybridSelectQueryResult.cpp @@ -2,11 +2,6 @@ namespace margelo::rnquicksqlite { -HybridSelectQueryResult::HybridSelectQueryResult() : HybridSelectQueryResultSpec() {} - -HybridSelectQueryResult::HybridSelectQueryResult(TableResults&& results, TableMetadata&& metadata) - : HybridSelectQueryResultSpec(), _results(std::move(results)), _metadata(std::move(metadata)) {} - TableResults HybridSelectQueryResult::getResults() { return this->_results; }; diff --git a/cpp/specs/HybridSelectQueryResult.hpp b/cpp/specs/HybridSelectQueryResult.hpp index 513811db..61f497b1 100644 --- a/cpp/specs/HybridSelectQueryResult.hpp +++ b/cpp/specs/HybridSelectQueryResult.hpp @@ -10,7 +10,9 @@ namespace margelo::rnquicksqlite { class HybridSelectQueryResult: public HybridSelectQueryResultSpec { public: - HybridSelectQueryResult(TableResults&& results, TableMetadata&& metadata); + HybridSelectQueryResult() : HybridObject(TAG) {} + HybridSelectQueryResult(TableResults&& results, TableMetadata&& metadata) + : HybridObject(TAG), _results(std::move(results)), _metadata(std::move(metadata)) {} public: // Properties From 14dc2d825dbe72ddd3cfe8e3f40db8c53378737b Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 11 Sep 2024 18:02:04 +0200 Subject: [PATCH 088/156] fix: import --- example/src/App.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/src/App.tsx b/example/src/App.tsx index c4ef2746..8ef0f37d 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from 'react' import { SafeAreaView, ScrollView, Text } from 'react-native' import 'reflect-metadata' -import { registerBaseTests, runTests } from './tests/index' +import { registerBaseTests, runTests } from './tests' // import {registerTypeORMTests} from './tests/typeorm.spec'; export default function App() { From b84413d90b49eb8406c09efcd476de9fd60fe491 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 13 Sep 2024 13:06:42 +0200 Subject: [PATCH 089/156] update nitro --- example/package.json | 2 +- example/yarn.lock | 8 ++++---- package.json | 2 +- yarn.lock | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/example/package.json b/example/package.json index c2d9b39f..3a224755 100644 --- a/example/package.json +++ b/example/package.json @@ -17,7 +17,7 @@ "nativewind": "^2.0.11", "react": "18.2.0", "react-native": "0.75.2", - "react-native-nitro-modules": "^0.7.0", + "react-native-nitro-modules": "^0.8.0", "react-native-quick-sqlite": "./..", "react-native-safe-area-context": "^4.11.0", "reflect-metadata": "^0.1.13", diff --git a/example/yarn.lock b/example/yarn.lock index 876a483c..2dca09da 100644 --- a/example/yarn.lock +++ b/example/yarn.lock @@ -6006,10 +6006,10 @@ react-is@^18.3.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== -react-native-nitro-modules@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/react-native-nitro-modules/-/react-native-nitro-modules-0.7.0.tgz#cbc1a4262f8e1abd6803b6bf0e8fadcae7f601ab" - integrity sha512-bzNIlEuRE5t+c5pxVXUy7JCA5Mtl3MCb5IK3/yJHn+SNJLFdbgdcKqiAQ3OTs/Je6ZpYI69frEl9RcXTKirmPA== +react-native-nitro-modules@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/react-native-nitro-modules/-/react-native-nitro-modules-0.8.0.tgz#8bfa945d034fcf93493aa42ec987839c6b786830" + integrity sha512-q9CA/E3iFcOo3tl1OYeOMTaiAwAizENDG4aB5CPooA7hoBQFGdjl5DVs9wDTXMfwv7vPgHBHvsfYIC9f/05A5w== react-native-quick-base64@^2.0.5: version "2.0.5" diff --git a/package.json b/package.json index 8477c2e7..d949fa59 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "eslint": "8.57.0", "eslint-plugin-prettier": "^5.2.1", "mocha": "^10.7.3", - "nitro-codegen": "^0.7.0", + "nitro-codegen": "^0.8.0", "prettier": "^3.3.3", "react": "18.3.1", "react-native": "0.75.2", diff --git a/yarn.lock b/yarn.lock index a6846857..7f14458c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5302,10 +5302,10 @@ neo-async@^2.5.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -nitro-codegen@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/nitro-codegen/-/nitro-codegen-0.7.0.tgz#b8a7e1d9c235778a0fac28c5a1fe5c4ebc3b00ba" - integrity sha512-Urz9nYiSOzcRHalkFcS5lFkqjlQyyqAdrll5yogbf5Jg3gSerh3I8py3gQ+3ndm/agsr5fw+LE1MwldEeS6HHA== +nitro-codegen@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/nitro-codegen/-/nitro-codegen-0.8.0.tgz#d9a4b21c4d9210498992c05fac759545479076ae" + integrity sha512-yNYM3fHH9MjzaEEtTieOOHLAWdOBT0uRky2AWfgPlsG4rN+x/3067mH4vbao6JDR1zIP6hlEjQ1zmRG04ltGhw== dependencies: chalk "^5.3.0" react-native-nitro-modules "^0.6.0" From 307bb7ccc0b4c43f72d1001cbf50dc68a97c174b Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 13 Sep 2024 13:19:00 +0200 Subject: [PATCH 090/156] add nitro autolinking --- cpp/OnLoad.cpp | 24 ++++++----- cpp/OnLoad.hpp | 17 ++++---- cpp/specs/HybridQuickSQLite.cpp | 2 + example/ios/Podfile.lock | 6 +-- ios/OnLoad.mm | 4 +- nitro.json | 5 +++ .../android/RNQuickSQLite+autolinking.cmake | 5 ++- .../android/RNQuickSQLite+autolinking.gradle | 2 +- .../generated/android/RNQuickSQLiteOnLoad.cpp | 41 +++++++++++++++++++ .../generated/android/RNQuickSQLiteOnLoad.hpp | 25 +++++++++++ .../generated/android/RNQuickSQLiteOnLoad.kt | 1 + .../ios/RNQuickSQLite+autolinking.rb | 4 +- .../ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp | 2 +- .../ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp | 2 +- .../ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp | 2 +- .../generated/ios/RNQuickSQLiteAutolinking.mm | 36 ++++++++++++++++ .../ios/RNQuickSQLiteAutolinking.swift | 11 +++++ .../shared/c++/BatchQueryCommand.hpp | 2 +- .../generated/shared/c++/BatchQueryResult.hpp | 2 +- .../generated/shared/c++/ColumnMetadata.hpp | 2 +- nitrogen/generated/shared/c++/ColumnType.hpp | 2 +- .../generated/shared/c++/FileLoadResult.hpp | 2 +- .../shared/c++/HybridQuickSQLiteSpec.cpp | 2 +- .../shared/c++/HybridQuickSQLiteSpec.hpp | 2 +- .../c++/HybridSelectQueryResultSpec.cpp | 2 +- .../c++/HybridSelectQueryResultSpec.hpp | 2 +- .../shared/c++/NativeQueryResult.hpp | 2 +- nitrogen/generated/shared/c++/QueryType.hpp | 2 +- 28 files changed, 169 insertions(+), 42 deletions(-) create mode 100644 nitrogen/generated/android/RNQuickSQLiteOnLoad.cpp create mode 100644 nitrogen/generated/android/RNQuickSQLiteOnLoad.hpp create mode 100644 nitrogen/generated/android/RNQuickSQLiteOnLoad.kt create mode 100644 nitrogen/generated/ios/RNQuickSQLiteAutolinking.mm create mode 100644 nitrogen/generated/ios/RNQuickSQLiteAutolinking.swift diff --git a/cpp/OnLoad.cpp b/cpp/OnLoad.cpp index 4b0b5824..491dd12b 100644 --- a/cpp/OnLoad.cpp +++ b/cpp/OnLoad.cpp @@ -5,17 +5,21 @@ using namespace margelo::nitro; using namespace margelo::rnquicksqlite; -void clearState() { - sqliteCloseAll(); -} +// void clearState() { +// sqliteCloseAll(); +// } + +// auto wasRegistered = false; +// // Call this at app startup to register the HybridObjects +// void registerHybridObjectConstructors() { +// // if (wasRegistered) return; +// wasRegistered = true; -// Call this at app startup to register the HybridObjects -void registerHybridObjectConstructors() { - HybridObjectRegistry::registerHybridObjectConstructor("QuickSQLite", []() -> std::shared_ptr { - return std::make_shared(); - }); -} +// HybridObjectRegistry::registerHybridObjectConstructor("QuickSQLite", []() -> std::shared_ptr { +// return std::make_shared(); +// }); +// } -// OnLoad::OnLoad() { +// OnLoadCpp::OnLoadCpp() { // registerHybridObjectConstructors(); // } diff --git a/cpp/OnLoad.hpp b/cpp/OnLoad.hpp index 1b3ab2a6..ed21e121 100644 --- a/cpp/OnLoad.hpp +++ b/cpp/OnLoad.hpp @@ -7,16 +7,15 @@ #include "ThreadPool.h" std::string docPathStr; -auto pool = std::make_shared(); -void clearState(); +// void clearState(); -void registerHybridObjectConstructors(); +// void registerHybridObjectConstructors(); -// class OnLoad { -// public: -// OnLoad() -// }; +//class OnLoadCpp { +//public: +// OnLoadCpp(); +//}; -// #pragma optimize("", off) -// static volatile OnLoad onLoad; +//#pragma optimize("", off) +//static volatile OnLoadCpp onLoad; diff --git a/cpp/specs/HybridQuickSQLite.cpp b/cpp/specs/HybridQuickSQLite.cpp index d7f2b8b4..d6f5c8f5 100644 --- a/cpp/specs/HybridQuickSQLite.cpp +++ b/cpp/specs/HybridQuickSQLite.cpp @@ -16,6 +16,8 @@ namespace margelo::rnquicksqlite { +auto pool = std::make_shared(); + void HybridQuickSQLite::open(const std::string& dbName, const std::optional& location) { std::string tempDocPath = std::string(docPathStr); if (location) { diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 45de4e4b..807077e9 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -7,7 +7,7 @@ PODS: - hermes-engine (0.75.2): - hermes-engine/Pre-built (= 0.75.2) - hermes-engine/Pre-built (0.75.2) - - NitroModules (0.7.0): + - NitroModules (0.8.0): - DoubleConversion - glog - hermes-engine @@ -1822,7 +1822,7 @@ SPEC CHECKSUMS: fmt: 4c2741a687cc09f0634a2e2c72a838b99f1ff120 glog: 69ef571f3de08433d766d614c73a9838a06bf7eb hermes-engine: 3b6e0717ca847e2fc90a201e59db36caf04dee88 - NitroModules: 47b80650d063f9b8ae7a3e02564cd282ad3d2ac9 + NitroModules: 7184d6a9527f2d015c7e4865ee6615b3e26d9cfb RCT-Folly: 4464f4d875961fce86008d45f4ecf6cef6de0740 RCTDeprecation: 34cbf122b623037ea9facad2e92e53434c5c7422 RCTRequired: 24c446d7bcd0f517d516b6265d8df04dc3eb1219 @@ -1879,7 +1879,7 @@ SPEC CHECKSUMS: React-utils: 81a715d9c0a2a49047e77a86f3a2247408540deb ReactCodegen: 60973d382704c793c605b9be0fc7f31cb279442f ReactCommon: 6ef348087d250257c44c0204461c03f036650e9b - RNQuickSQLite: 1a029062c82cd4016f933e5f2b7d4da78733c0dd + RNQuickSQLite: 3adb5ab0242ba4392ffc53d49a8fc6fb3df3f907 SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d Yoga: a1d7895431387402a674fd0d1c04ec85e87909b8 diff --git a/ios/OnLoad.mm b/ios/OnLoad.mm index 7da36b81..eb1d3dc0 100644 --- a/ios/OnLoad.mm +++ b/ios/OnLoad.mm @@ -1,6 +1,6 @@ #import #import "RNQuickSQLite-Swift-Cxx-Umbrella.hpp" -#import "OnLoad.hpp" +// #import "OnLoad.hpp" @interface OnLoad : NSObject @end @@ -11,7 +11,7 @@ @implementation OnLoad using namespace margelo::nitro::rnquicksqlite; + (void)load { - registerHybridObjectConstructors(); + // registerHybridObjectConstructors(); // Get appGroupID value from Info.plist using key "AppGroup" NSString *appGroupID = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"ReactNativeQuickSQLite_AppGroup"]; diff --git a/nitro.json b/nitro.json index be1b402a..44553556 100644 --- a/nitro.json +++ b/nitro.json @@ -11,6 +11,11 @@ ], "androidCxxLibName": "RNQuickSQLite" }, + "autolinking": { + "QuickSQLite": { + "cpp": "HybridQuickSQLite" + } + }, "ignorePaths": [ "example", "lib" diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake index 2d4708e7..99da2fc9 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.cmake @@ -1,6 +1,6 @@ # # RNQuickSQLite+autolinking.cmake -# Wed Sep 11 2024 +# Fri Sep 13 2024 # This file was generated by nitrogen. DO NOT MODIFY THIS FILE. # https://github.com/mrousavy/nitro # Copyright © 2024 Marc Rousavy @ Margelo @@ -18,12 +18,15 @@ include_directories( "../nitrogen/generated/shared/c++" "../nitrogen/generated/android/c++" + "../nitrogen/generated/android/" ) # Add all .cpp sources that were generated by Nitrogen target_sources( # CMake project name (Android C++ library name) RNQuickSQLite PRIVATE + # Autolinking Setup + ../nitrogen/generated/android/RNQuickSQLiteOnLoad.cpp # Shared Nitrogen C++ sources ../nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp ../nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp diff --git a/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle b/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle index cd85e560..fee0afea 100644 --- a/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle +++ b/nitrogen/generated/android/RNQuickSQLite+autolinking.gradle @@ -1,6 +1,6 @@ /// /// RNQuickSQLite+autolinking.gradle -/// Wed Sep 11 2024 +/// Fri Sep 13 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/android/RNQuickSQLiteOnLoad.cpp b/nitrogen/generated/android/RNQuickSQLiteOnLoad.cpp new file mode 100644 index 00000000..65756094 --- /dev/null +++ b/nitrogen/generated/android/RNQuickSQLiteOnLoad.cpp @@ -0,0 +1,41 @@ +/// +/// RNQuickSQLiteOnLoad.cpp +/// Fri Sep 13 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#include "RNQuickSQLiteOnLoad.hpp" + +#include +#include +#include + +#include "HybridQuickSQLite.hpp" + +namespace margelo::nitro::rnquicksqlite { + +int initialize(JavaVM* vm) { + using namespace margelo::nitro; + using namespace margelo::nitro::rnquicksqlite; + using namespace facebook; + + return facebook::jni::initialize(vm, [] { + // Register native JNI methods + + + // Register Nitro Hybrid Objects + HybridObjectRegistry::registerHybridObjectConstructor( + "QuickSQLite", + []() -> std::shared_ptr { + static_assert(std::is_default_constructible_v, + "The HybridObject \"HybridQuickSQLite\" is not default-constructible! " + "Create a public constructor that takes zero arguments to be able to autolink this HybridObject."); + return std::make_shared(); + } + ); + }); +} + +} // namespace margelo::nitro::rnquicksqlite diff --git a/nitrogen/generated/android/RNQuickSQLiteOnLoad.hpp b/nitrogen/generated/android/RNQuickSQLiteOnLoad.hpp new file mode 100644 index 00000000..150dffe6 --- /dev/null +++ b/nitrogen/generated/android/RNQuickSQLiteOnLoad.hpp @@ -0,0 +1,25 @@ +/// +/// RNQuickSQLiteOnLoad.hpp +/// Fri Sep 13 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#include + +namespace margelo::nitro::rnquicksqlite { + + /** + * Initializes the native (C++) part of RNQuickSQLite, and autolinks all Hybrid Objects. + * Call this in your `JNI_OnLoad` function (probably inside `cpp-adapter.cpp`). + * Example: + * ```cpp (cpp-adapter.cpp) + * JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) { + * return margelo::nitro::rnquicksqlite::initialize(vm); + * } + * ``` + */ + int initialize(JavaVM* vm); + +} // namespace margelo::nitro::rnquicksqlite diff --git a/nitrogen/generated/android/RNQuickSQLiteOnLoad.kt b/nitrogen/generated/android/RNQuickSQLiteOnLoad.kt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/nitrogen/generated/android/RNQuickSQLiteOnLoad.kt @@ -0,0 +1 @@ + diff --git a/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb b/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb index c58f4758..4da47483 100644 --- a/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb +++ b/nitrogen/generated/ios/RNQuickSQLite+autolinking.rb @@ -1,6 +1,6 @@ # # RNQuickSQLite+autolinking.rb -# Wed Sep 11 2024 +# Fri Sep 13 2024 # This file was generated by nitrogen. DO NOT MODIFY THIS FILE. # https://github.com/mrousavy/nitro # Copyright © 2024 Marc Rousavy @ Margelo @@ -30,7 +30,7 @@ def add_nitrogen_files(spec) # Generated cross-platform specs "nitrogen/generated/shared/**/*.{h,hpp,c,cpp,swift}", # Generated bridges for the cross-platform specs - "nitrogen/generated/ios/**/*.{h,hpp,c,cpp,swift}", + "nitrogen/generated/ios/**/*.{h,hpp,c,cpp,mm,swift}", ] current_public_header_files = spec.attributes_hash['public_header_files'] || [] diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp index a1d5641c..a7e67499 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.cpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Bridge.cpp -/// Wed Sep 11 2024 +/// Fri Sep 13 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp index fb7cd734..0845f64f 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Bridge.hpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Bridge.hpp -/// Wed Sep 11 2024 +/// Fri Sep 13 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp index 2d526cc6..cbc87554 100644 --- a/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp +++ b/nitrogen/generated/ios/RNQuickSQLite-Swift-Cxx-Umbrella.hpp @@ -1,6 +1,6 @@ /// /// RNQuickSQLite-Swift-Cxx-Umbrella.hpp -/// Wed Sep 11 2024 +/// Fri Sep 13 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/ios/RNQuickSQLiteAutolinking.mm b/nitrogen/generated/ios/RNQuickSQLiteAutolinking.mm new file mode 100644 index 00000000..2fd76616 --- /dev/null +++ b/nitrogen/generated/ios/RNQuickSQLiteAutolinking.mm @@ -0,0 +1,36 @@ +/// +/// RNQuickSQLiteAutolinking.mm +/// Fri Sep 13 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +#import +#import + +#import + +#include "HybridQuickSQLite.hpp" + +@interface RNQuickSQLiteAutolinking : NSObject +@end + +@implementation RNQuickSQLiteAutolinking + ++ (void) load { + using namespace margelo::nitro; + using namespace margelo::nitro::rnquicksqlite; + + HybridObjectRegistry::registerHybridObjectConstructor( + "QuickSQLite", + []() -> std::shared_ptr { + static_assert(std::is_default_constructible_v, + "The HybridObject \"HybridQuickSQLite\" is not default-constructible! " + "Create a public constructor that takes zero arguments to be able to autolink this HybridObject."); + return std::make_shared(); + } + ); +} + +@end diff --git a/nitrogen/generated/ios/RNQuickSQLiteAutolinking.swift b/nitrogen/generated/ios/RNQuickSQLiteAutolinking.swift new file mode 100644 index 00000000..9883a6cd --- /dev/null +++ b/nitrogen/generated/ios/RNQuickSQLiteAutolinking.swift @@ -0,0 +1,11 @@ +/// +/// RNQuickSQLiteAutolinking.swift +/// Fri Sep 13 2024 +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2024 Marc Rousavy @ Margelo +/// + +public final class RNQuickSQLiteAutolinking { + +} diff --git a/nitrogen/generated/shared/c++/BatchQueryCommand.hpp b/nitrogen/generated/shared/c++/BatchQueryCommand.hpp index 5db8ce5c..219f00b7 100644 --- a/nitrogen/generated/shared/c++/BatchQueryCommand.hpp +++ b/nitrogen/generated/shared/c++/BatchQueryCommand.hpp @@ -1,6 +1,6 @@ /// /// BatchQueryCommand.hpp -/// Wed Sep 11 2024 +/// Fri Sep 13 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/BatchQueryResult.hpp b/nitrogen/generated/shared/c++/BatchQueryResult.hpp index bc2df573..95ad795b 100644 --- a/nitrogen/generated/shared/c++/BatchQueryResult.hpp +++ b/nitrogen/generated/shared/c++/BatchQueryResult.hpp @@ -1,6 +1,6 @@ /// /// BatchQueryResult.hpp -/// Wed Sep 11 2024 +/// Fri Sep 13 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/ColumnMetadata.hpp b/nitrogen/generated/shared/c++/ColumnMetadata.hpp index 792a6f53..cda1f423 100644 --- a/nitrogen/generated/shared/c++/ColumnMetadata.hpp +++ b/nitrogen/generated/shared/c++/ColumnMetadata.hpp @@ -1,6 +1,6 @@ /// /// ColumnMetadata.hpp -/// Wed Sep 11 2024 +/// Fri Sep 13 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/ColumnType.hpp b/nitrogen/generated/shared/c++/ColumnType.hpp index a48ae0cb..80e9a240 100644 --- a/nitrogen/generated/shared/c++/ColumnType.hpp +++ b/nitrogen/generated/shared/c++/ColumnType.hpp @@ -1,6 +1,6 @@ /// /// ColumnType.hpp -/// Wed Sep 11 2024 +/// Fri Sep 13 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/FileLoadResult.hpp b/nitrogen/generated/shared/c++/FileLoadResult.hpp index c548f481..57148291 100644 --- a/nitrogen/generated/shared/c++/FileLoadResult.hpp +++ b/nitrogen/generated/shared/c++/FileLoadResult.hpp @@ -1,6 +1,6 @@ /// /// FileLoadResult.hpp -/// Wed Sep 11 2024 +/// Fri Sep 13 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp index da64e169..ae910ca2 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.cpp @@ -1,6 +1,6 @@ /// /// HybridQuickSQLiteSpec.cpp -/// Wed Sep 11 2024 +/// Fri Sep 13 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp index 7231b301..2eeef83f 100644 --- a/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridQuickSQLiteSpec.hpp @@ -1,6 +1,6 @@ /// /// HybridQuickSQLiteSpec.hpp -/// Wed Sep 11 2024 +/// Fri Sep 13 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp index 757ec633..953df7ac 100644 --- a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.cpp @@ -1,6 +1,6 @@ /// /// HybridSelectQueryResultSpec.cpp -/// Wed Sep 11 2024 +/// Fri Sep 13 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp index beb2ccac..291678a2 100644 --- a/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridSelectQueryResultSpec.hpp @@ -1,6 +1,6 @@ /// /// HybridSelectQueryResultSpec.hpp -/// Wed Sep 11 2024 +/// Fri Sep 13 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/NativeQueryResult.hpp b/nitrogen/generated/shared/c++/NativeQueryResult.hpp index 3edf26c7..81355109 100644 --- a/nitrogen/generated/shared/c++/NativeQueryResult.hpp +++ b/nitrogen/generated/shared/c++/NativeQueryResult.hpp @@ -1,6 +1,6 @@ /// /// NativeQueryResult.hpp -/// Wed Sep 11 2024 +/// Fri Sep 13 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo diff --git a/nitrogen/generated/shared/c++/QueryType.hpp b/nitrogen/generated/shared/c++/QueryType.hpp index b82f9fce..3fd63332 100644 --- a/nitrogen/generated/shared/c++/QueryType.hpp +++ b/nitrogen/generated/shared/c++/QueryType.hpp @@ -1,6 +1,6 @@ /// /// QueryType.hpp -/// Wed Sep 11 2024 +/// Fri Sep 13 2024 /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. /// https://github.com/mrousavy/nitro /// Copyright © 2024 Marc Rousavy @ Margelo From f05ed1fe2e25114ad322ee68d50c540d10a1982e Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 13 Sep 2024 14:09:10 +0200 Subject: [PATCH 091/156] re-structure javascript files --- src/index.ts | 130 +++++++++++++++++++++++-------------------------- src/typeORM.ts | 34 ++++++------- 2 files changed, 79 insertions(+), 85 deletions(-) diff --git a/src/index.ts b/src/index.ts index d61b4ea1..3d3583a3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,13 +10,46 @@ import { NativeQueryResult, ColumnType, } from './types' +import { enhanceQueryResult } from './typeORM' export * from './types' export { typeORMDriver } from './typeORM' -const _open = QuickSQLite.open -QuickSQLite.open = (dbName: string, location?: string) => { - _open(dbName, location) +export function open(options: { + name: string + location?: string +}): QuickSQLiteConnection { + openDb(options.name, options.location) + + return { + close: () => close(options.name), + delete: () => QuickSQLite.drop(options.name, options.location), + attach: (dbNameToAttach: string, alias: string, location?: string) => + QuickSQLite.attach(options.name, dbNameToAttach, alias, location), + detach: (alias: string) => QuickSQLite.detach(options.name, alias), + transaction: (fn: (tx: Transaction) => Promise | void) => + transaction(options.name, fn), + execute: ( + query: string, + params?: SQLiteValue[] + ): QueryResult => execute(options.name, query, params), + executeAsync: ( + query: string, + params?: SQLiteValue[] + ): Promise> => executeAsync(options.name, query, params), + executeBatch: (commands: BatchQueryCommand[]) => + QuickSQLite.executeBatch(options.name, commands), + executeBatchAsync: (commands: BatchQueryCommand[]) => + QuickSQLite.executeBatchAsync(options.name, commands), + loadFile: (location: string) => + QuickSQLite.loadFile(options.name, location), + loadFileAsync: (location: string) => + QuickSQLite.loadFileAsync(options.name, location), + } +} + +function openDb(dbName: string, location?: string) { + QuickSQLite.open(dbName, location) locks[dbName] = { queue: [], @@ -24,15 +57,36 @@ QuickSQLite.open = (dbName: string, location?: string) => { } } -const _close = QuickSQLite.close -QuickSQLite.close = (dbName: string) => { - _close(dbName) +function close(dbName: string) { + QuickSQLite.close(dbName) delete locks[dbName] } -const buildJsQueryResult = ( +function execute( + dbName: string, + query: string, + params?: SQLiteValue[] +): QueryResult { + const nativeResult = QuickSQLite.execute(dbName, query, params) + const result = buildJsQueryResult(nativeResult) + enhanceQueryResult(result) + return result +} + +async function executeAsync( + dbName: string, + query: string, + params?: SQLiteValue[] +): Promise> { + const nativeResult = await QuickSQLite.executeAsync(dbName, query, params) + const result = buildJsQueryResult(nativeResult) + enhanceQueryResult(result) + return result +} + +function buildJsQueryResult( nativeResult: NativeQueryResult -): QueryResult => { +): QueryResult { let result: QueryResult = { queryType: nativeResult.queryType, insertId: nativeResult.insertId, @@ -83,63 +137,3 @@ const buildJsQueryResult = ( return result } - -const _execute = QuickSQLite.execute -export const execute = ( - dbName: string, - query: string, - params?: SQLiteValue[] -): QueryResult => { - const nativeResult = _execute(dbName, query, params) - const result = buildJsQueryResult(nativeResult) - // enhanceQueryResult(result); - return result -} -QuickSQLite.execute = execute - -const _executeAsync = QuickSQLite.executeAsync -export const executeAsync = async ( - dbName: string, - query: string, - params?: SQLiteValue[] -): Promise> => { - const nativeResult = await _executeAsync(dbName, query, params) - const result = buildJsQueryResult(nativeResult) - // enhanceQueryResult(res); - return result -} -QuickSQLite.executeAsync = executeAsync - -export const open = (options: { - name: string - location?: string -}): QuickSQLiteConnection => { - QuickSQLite.open(options.name, options.location) - - return { - close: () => QuickSQLite.close(options.name), - delete: () => QuickSQLite.drop(options.name, options.location), - attach: (dbNameToAttach: string, alias: string, location?: string) => - QuickSQLite.attach(options.name, dbNameToAttach, alias, location), - detach: (alias: string) => QuickSQLite.detach(options.name, alias), - transaction: (fn: (tx: Transaction) => Promise | void) => - transaction(options.name, fn), - execute: ( - query: string, - params?: SQLiteValue[] - ): QueryResult => QuickSQLite.execute(options.name, query, params), - executeAsync: ( - query: string, - params?: SQLiteValue[] - ): Promise> => - QuickSQLite.executeAsync(options.name, query, params), - executeBatch: (commands: BatchQueryCommand[]) => - QuickSQLite.executeBatch(options.name, commands), - executeBatchAsync: (commands: BatchQueryCommand[]) => - QuickSQLite.executeBatchAsync(options.name, commands), - loadFile: (location: string) => - QuickSQLite.loadFile(options.name, location), - loadFileAsync: (location: string) => - QuickSQLite.loadFileAsync(options.name, location), - } -} diff --git a/src/typeORM.ts b/src/typeORM.ts index 4264698c..3074342c 100644 --- a/src/typeORM.ts +++ b/src/typeORM.ts @@ -12,19 +12,19 @@ import { QueryResult, SQLiteItem, SQLiteValue, Transaction } from './types' // Enhance some host functions // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work -const enhanceQueryResult = ( +export const enhanceQueryResult = ( result: QueryResult ): void => { // Add 'item' function to result object to allow the sqlite-storage typeorm driver to work - // if (result.rows == null) { - // result.rows = { - // _array: [], - // length: 0, - // item: (idx: number) => result.rows._array[idx], - // }; - // } else { - // result.rows.item = (idx: number) => result.rows._array[idx]; - // } + if (result.rows == null) { + result.rows = { + data: [], + length: 0, + item: (idx: number) => result.rows.data[idx], + } + } else { + result.rows.item = (idx: number) => result.rows.data[idx] + } } /** @@ -47,8 +47,8 @@ export const typeORMDriver = { executeSql: async ( sql: string, params: SQLiteValue[] | undefined, - ok: (res: QueryResult) => void, - fail: (msg: string) => void + okExecute: (res: QueryResult) => void, + failExecute: (msg: string) => void ) => { try { let response = await QuickSQLite.executeAsync( @@ -57,9 +57,9 @@ export const typeORMDriver = { params ) enhanceQueryResult(response) - ok(response) + okExecute(response) } catch (e) { - fail(e) + failExecute(e) } }, transaction: ( @@ -67,12 +67,12 @@ export const typeORMDriver = { ): Promise => { return transaction(options.name, fn) }, - close: (ok: any, fail: any) => { + close: (okClose: any, failClose: any) => { try { QuickSQLite.close(options.name) - ok() + okClose() } catch (e) { - fail(e) + failClose(e) } }, attach: ( From b51d7c266ddb9267d333b5b01d4c3c8366118107 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 13 Sep 2024 14:09:20 +0200 Subject: [PATCH 092/156] fix: cpp --- cpp/Globals.hpp | 5 +++++ cpp/OnLoad.cpp | 25 ------------------------- cpp/OnLoad.hpp | 21 --------------------- cpp/Types.hpp | 2 +- cpp/specs/HybridQuickSQLite.cpp | 6 +++--- cpp/specs/HybridQuickSQLite.hpp | 4 +--- cpp/specs/HybridSelectQueryResult.cpp | 2 +- cpp/specs/HybridSelectQueryResult.hpp | 14 +++++++------- cpp/sqliteBridge.cpp | 2 +- 9 files changed, 19 insertions(+), 62 deletions(-) create mode 100644 cpp/Globals.hpp delete mode 100644 cpp/OnLoad.cpp delete mode 100644 cpp/OnLoad.hpp diff --git a/cpp/Globals.hpp b/cpp/Globals.hpp new file mode 100644 index 00000000..194dfbc5 --- /dev/null +++ b/cpp/Globals.hpp @@ -0,0 +1,5 @@ +#pragma once + +#include + +std::string docPathStr; diff --git a/cpp/OnLoad.cpp b/cpp/OnLoad.cpp deleted file mode 100644 index 491dd12b..00000000 --- a/cpp/OnLoad.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "OnLoad.hpp" -#include "HybridQuickSQLite.hpp" -#include "HybridSelectQueryResult.hpp" - -using namespace margelo::nitro; -using namespace margelo::rnquicksqlite; - -// void clearState() { -// sqliteCloseAll(); -// } - -// auto wasRegistered = false; -// // Call this at app startup to register the HybridObjects -// void registerHybridObjectConstructors() { -// // if (wasRegistered) return; -// wasRegistered = true; - -// HybridObjectRegistry::registerHybridObjectConstructor("QuickSQLite", []() -> std::shared_ptr { -// return std::make_shared(); -// }); -// } - -// OnLoadCpp::OnLoadCpp() { -// registerHybridObjectConstructors(); -// } diff --git a/cpp/OnLoad.hpp b/cpp/OnLoad.hpp deleted file mode 100644 index ed21e121..00000000 --- a/cpp/OnLoad.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include -#include "HybridQuickSQLiteSpec.hpp" -#include "HybridSelectQueryResultSpec.hpp" -#include "sqliteBridge.h" -#include "ThreadPool.h" - -std::string docPathStr; - -// void clearState(); - -// void registerHybridObjectConstructors(); - -//class OnLoadCpp { -//public: -// OnLoadCpp(); -//}; - -//#pragma optimize("", off) -//static volatile OnLoadCpp onLoad; diff --git a/cpp/Types.hpp b/cpp/Types.hpp index 1d2fa426..be724ec4 100644 --- a/cpp/Types.hpp +++ b/cpp/Types.hpp @@ -1,7 +1,7 @@ #pragma once #include -#include "ArrayBuffer.hpp" +#include #include "ColumnType.hpp" #include "ColumnMetadata.hpp" diff --git a/cpp/specs/HybridQuickSQLite.cpp b/cpp/specs/HybridQuickSQLite.cpp index d6f5c8f5..af2c8ef1 100644 --- a/cpp/specs/HybridQuickSQLite.cpp +++ b/cpp/specs/HybridQuickSQLite.cpp @@ -10,16 +10,16 @@ #include "sqlfileloader.h" #include "sqlbatchexecutor.h" #include "macros.h" -#include "OnLoad.hpp" +#include "Globals.hpp" #include "QueryType.hpp" #include "Types.hpp" -namespace margelo::rnquicksqlite { +namespace margelo::nitro::rnquicksqlite { auto pool = std::make_shared(); void HybridQuickSQLite::open(const std::string& dbName, const std::optional& location) { - std::string tempDocPath = std::string(docPathStr); + std::string tempDocPath = std::string(nullptr); if (location) { tempDocPath = tempDocPath + "/" + *location; } diff --git a/cpp/specs/HybridQuickSQLite.hpp b/cpp/specs/HybridQuickSQLite.hpp index 55d093e6..a272743d 100644 --- a/cpp/specs/HybridQuickSQLite.hpp +++ b/cpp/specs/HybridQuickSQLite.hpp @@ -2,9 +2,7 @@ #include "HybridQuickSQLiteSpec.hpp" -using namespace margelo::nitro::rnquicksqlite; - -namespace margelo::rnquicksqlite { +namespace margelo::nitro::rnquicksqlite { class HybridQuickSQLite: public HybridQuickSQLiteSpec { public: diff --git a/cpp/specs/HybridSelectQueryResult.cpp b/cpp/specs/HybridSelectQueryResult.cpp index 9a9dd5f1..b23df31a 100644 --- a/cpp/specs/HybridSelectQueryResult.cpp +++ b/cpp/specs/HybridSelectQueryResult.cpp @@ -1,6 +1,6 @@ #include "HybridSelectQueryResult.hpp" -namespace margelo::rnquicksqlite { +namespace margelo::nitro::rnquicksqlite { TableResults HybridSelectQueryResult::getResults() { return this->_results; diff --git a/cpp/specs/HybridSelectQueryResult.hpp b/cpp/specs/HybridSelectQueryResult.hpp index 61f497b1..ec72c3f8 100644 --- a/cpp/specs/HybridSelectQueryResult.hpp +++ b/cpp/specs/HybridSelectQueryResult.hpp @@ -4,15 +4,19 @@ #include "HybridSelectQueryResultSpec.hpp" #include "Types.hpp" -using namespace margelo::nitro::rnquicksqlite; +using namespace margelo::rnquicksqlite; -namespace margelo::rnquicksqlite { +namespace margelo::nitro::rnquicksqlite { class HybridSelectQueryResult: public HybridSelectQueryResultSpec { public: HybridSelectQueryResult() : HybridObject(TAG) {} HybridSelectQueryResult(TableResults&& results, TableMetadata&& metadata) : HybridObject(TAG), _results(std::move(results)), _metadata(std::move(metadata)) {} + +private: + TableResults _results; + TableMetadata _metadata; public: // Properties @@ -20,10 +24,6 @@ class HybridSelectQueryResult: public HybridSelectQueryResultSpec { void setResults(const TableResults& results) override; TableMetadata getMetadata() override; void setMetadata(const TableMetadata& metadata) override; - -private: - TableResults _results; - TableMetadata _metadata; }; - + } diff --git a/cpp/sqliteBridge.cpp b/cpp/sqliteBridge.cpp index bea43f1b..5f8ad4ba 100644 --- a/cpp/sqliteBridge.cpp +++ b/cpp/sqliteBridge.cpp @@ -8,7 +8,7 @@ #include #include "sqliteBridge.h" #include "logs.h" -#include "ArrayBuffer.hpp" +#include using namespace facebook; using namespace margelo::nitro; From da62169a491c2aa889e019c22d0fa865780cf298 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 13 Sep 2024 14:09:29 +0200 Subject: [PATCH 093/156] fix: ios --- ios/Empty.swift | 3 --- ios/OnLoad.mm | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 ios/Empty.swift diff --git a/ios/Empty.swift b/ios/Empty.swift deleted file mode 100644 index ae72263c..00000000 --- a/ios/Empty.swift +++ /dev/null @@ -1,3 +0,0 @@ -// We just need this (empty) file in order for Xcode/Swift to generate a "RNQuickSQLite-Swift.h" header - -import Foundation diff --git a/ios/OnLoad.mm b/ios/OnLoad.mm index eb1d3dc0..1740691f 100644 --- a/ios/OnLoad.mm +++ b/ios/OnLoad.mm @@ -1,6 +1,6 @@ #import #import "RNQuickSQLite-Swift-Cxx-Umbrella.hpp" -// #import "OnLoad.hpp" +#import "Globals.hpp" @interface OnLoad : NSObject @end From c94bae3868b79c75bad5e9e2eda3f6c374dc86a9 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 13 Sep 2024 14:24:40 +0200 Subject: [PATCH 094/156] fix: bootup --- cpp/specs/HybridQuickSQLite.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/specs/HybridQuickSQLite.cpp b/cpp/specs/HybridQuickSQLite.cpp index af2c8ef1..601bbb31 100644 --- a/cpp/specs/HybridQuickSQLite.cpp +++ b/cpp/specs/HybridQuickSQLite.cpp @@ -19,7 +19,7 @@ namespace margelo::nitro::rnquicksqlite { auto pool = std::make_shared(); void HybridQuickSQLite::open(const std::string& dbName, const std::optional& location) { - std::string tempDocPath = std::string(nullptr); + std::string tempDocPath = std::string(docPathStr); if (location) { tempDocPath = tempDocPath + "/" + *location; } From 76a92539935a5fa44fbcff5222a831dc1921d1ca Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 13 Sep 2024 14:29:55 +0200 Subject: [PATCH 095/156] add clang-format config --- .clang-format | 26 ++++++++++++++++++++++++++ scripts/clang-format.sh | 0 2 files changed, 26 insertions(+) create mode 100644 .clang-format mode change 100644 => 100755 scripts/clang-format.sh diff --git a/.clang-format b/.clang-format new file mode 100644 index 00000000..e701e3b6 --- /dev/null +++ b/.clang-format @@ -0,0 +1,26 @@ +# Config for clang-format version 16 + +# Standard +BasedOnStyle: llvm +Standard: c++20 + +# Indentation +IndentWidth: 2 +ColumnLimit: 140 + +# Includes +SortIncludes: CaseSensitive +SortUsingDeclarations: true + +# Pointer and reference alignment +PointerAlignment: Left +ReferenceAlignment: Left +ReflowComments: true + +# Line breaking options +BreakBeforeBraces: Attach +BreakConstructorInitializers: BeforeColon +AlwaysBreakTemplateDeclarations: true +AllowShortFunctionsOnASingleLine: Empty +IndentCaseLabels: true +NamespaceIndentation: Inner diff --git a/scripts/clang-format.sh b/scripts/clang-format.sh old mode 100644 new mode 100755 From c02e7d9f815a99808df1c3f9a38e78288ac0086b Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 13 Sep 2024 15:26:29 +0200 Subject: [PATCH 096/156] cpp format --- cpp/ThreadPool.cpp | 132 +- cpp/ThreadPool.h | 52 +- cpp/Types.hpp | 57 +- cpp/logs.h | 34 +- cpp/macros.h | 7 +- cpp/specs/HybridQuickSQLite.cpp | 248 +- cpp/specs/HybridQuickSQLite.hpp | 35 +- cpp/specs/HybridSelectQueryResult.cpp | 10 +- cpp/specs/HybridSelectQueryResult.hpp | 30 +- cpp/sqlbatchexecutor.cpp | 133 +- cpp/sqlbatchexecutor.h | 10 +- cpp/sqlfileloader.cpp | 76 +- cpp/sqlfileloader.h | 2 +- cpp/sqlite3.c | 171858 +++++++++++------------ cpp/sqlite3.h | 2426 +- cpp/sqliteBridge.cpp | 665 +- cpp/sqliteBridge.h | 8 +- 17 files changed, 85621 insertions(+), 90162 deletions(-) diff --git a/cpp/ThreadPool.cpp b/cpp/ThreadPool.cpp index 9328682a..4b6f5c8b 100644 --- a/cpp/ThreadPool.cpp +++ b/cpp/ThreadPool.cpp @@ -9,93 +9,83 @@ 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) - { - numberOfThreads = 1; - } - - 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 - threads.push_back(std::thread(&ThreadPool::doWork, this)); - } +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) { + numberOfThreads = 1; + } + + 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 + threads.push_back(std::thread(&ThreadPool::doWork, this)); + } } // 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() -{ - // 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()) - { - thread.join(); - } +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()) { + thread.join(); } + } } // 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) -{ - // Grab the mutex - std::lock_guard g(workQueueMutex); - - // Push the request to the queue - workQueue.push(task); - - // Notify one thread that there are requests to process - workQueueConditionVariable.notify_one(); +void ThreadPool::queueWork(std::function task) { + // Grab the mutex + std::lock_guard g(workQueueMutex); + + // Push the request to the queue + workQueue.push(task); + + // Notify one thread that there are requests to process + workQueueConditionVariable.notify_one(); } // Function used by the threads to grab work from the queue -void ThreadPool::doWork() -{ - // Loop while the queue is not destructing - while (!done) +void ThreadPool::doWork() { + // Loop while the queue is not destructing + while (!done) { + std::function task; + + // Create a scope, so we don't lock the queue for longer than necessary { - 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, [&] - { - // Only wake up if there are elements in the queue or the program is - // shutting down - return !workQueue.empty() || done; }); - - // If we are shutting down exit witout trying to process more work - if (done) - { - break; - } - - task = workQueue.front(); - workQueue.pop(); - } - ++busy; - task(); - --busy; + std::unique_lock g(workQueueMutex); + workQueueConditionVariable.wait(g, [&] { + // Only wake up if there are elements in the queue or the program is + // shutting down + return !workQueue.empty() || done; + }); + + // If we are shutting down exit witout trying to process more work + if (done) { + break; + } + + task = workQueue.front(); + workQueue.pop(); } + ++busy; + task(); + --busy; + } } void ThreadPool::waitFinished() { - std::unique_lock g(workQueueMutex); - workQueueConditionVariable.wait(g, [&]{ return workQueue.empty() && (busy == 0); }); + std::unique_lock g(workQueueMutex); + workQueueConditionVariable.wait(g, [&] { return workQueue.empty() && (busy == 0); }); } -} +} // namespace margelo::rnquicksqlite diff --git a/cpp/ThreadPool.h b/cpp/ThreadPool.h index b66c29d7..45c19707 100644 --- a/cpp/ThreadPool.h +++ b/cpp/ThreadPool.h @@ -12,32 +12,32 @@ namespace margelo::rnquicksqlite { class ThreadPool { public: - ThreadPool(); - ~ThreadPool(); - void queueWork(std::function task); - void waitFinished(); - + ThreadPool(); + ~ThreadPool(); + void queueWork(std::function task); + void waitFinished(); + private: - unsigned int busy; - // This condition variable is used for the threads to wait until there is work - // to do - std::condition_variable_any workQueueConditionVariable; - - // We store the threads in a vector, so we can later stop them gracefully - std::vector threads; - - // Mutex to protect workQueue - std::mutex workQueueMutex; - - // Queue of requests waiting to be processed - std::queue> workQueue; - - // This will be set to true when the thread pool is shutting down. This tells - // the threads to stop looping and finish - bool done; - - // Function used by the threads to grab work from the queue - void doWork(); + unsigned int busy; + // This condition variable is used for the threads to wait until there is work + // to do + std::condition_variable_any workQueueConditionVariable; + + // We store the threads in a vector, so we can later stop them gracefully + std::vector threads; + + // Mutex to protect workQueue + std::mutex workQueueMutex; + + // Queue of requests waiting to be processed + std::queue> workQueue; + + // This will be set to true when the thread pool is shutting down. This tells + // the threads to stop looping and finish + bool done; + + // Function used by the threads to grab work from the queue + void doWork(); }; -} +} // namespace margelo::rnquicksqlite diff --git a/cpp/Types.hpp b/cpp/Types.hpp index be724ec4..547f8091 100644 --- a/cpp/Types.hpp +++ b/cpp/Types.hpp @@ -1,9 +1,9 @@ #pragma once -#include -#include -#include "ColumnType.hpp" #include "ColumnMetadata.hpp" +#include "ColumnType.hpp" +#include +#include using namespace margelo::nitro; using namespace margelo::nitro::rnquicksqlite; @@ -13,31 +13,24 @@ namespace margelo::rnquicksqlite { /** * Various structs to help with the results of the SQLite operations */ -enum ResultType -{ - SQLiteOk, - SQLiteError -}; +enum ResultType { SQLiteOk, SQLiteError }; -struct SQLiteOPResult -{ +struct SQLiteOPResult { ResultType type; std::string errorMessage; int rowsAffected; double insertId; }; -struct SequelLiteralUpdateResult -{ +struct SequelLiteralUpdateResult { ResultType type; - std::string message; + std::string message; int affectedRows; }; -struct SequelBatchOperationResult -{ +struct SequelBatchOperationResult { ResultType type; - std::string message; + std::string message; int affectedRows; int commands; }; @@ -50,21 +43,21 @@ using TableMetadata = std::unordered_map; // constexpr function that maps SQLiteColumnType to string literals constexpr ColumnType mapSQLiteTypeToColumnType(std::string type) { - if (type == "BOOLEAN") { - return ColumnType::BOOLEAN; - } else if (type == "REAL" || type == "NUMERIC") { - return ColumnType::NUMBER; - } else if (type == "INTEGER") { - return ColumnType::INT64; - } else if (type == "TEXT" || type == "VARCHAR(N)" || type == "CHAR(N)") { - return ColumnType::TEXT; - } else if (type == "BLOB") { - return ColumnType::ARRAY_BUFFER; - } else if (type == "NULL") { - return ColumnType::NULL_VALUE; - } else { - return ColumnType::UNKNOWN; - } + if (type == "BOOLEAN") { + return ColumnType::BOOLEAN; + } else if (type == "REAL" || type == "NUMERIC") { + return ColumnType::NUMBER; + } else if (type == "INTEGER") { + return ColumnType::INT64; + } else if (type == "TEXT" || type == "VARCHAR(N)" || type == "CHAR(N)") { + return ColumnType::TEXT; + } else if (type == "BLOB") { + return ColumnType::ARRAY_BUFFER; + } else if (type == "NULL") { + return ColumnType::NULL_VALUE; + } else { + return ColumnType::UNKNOWN; + } } -} +} // namespace margelo::rnquicksqlite diff --git a/cpp/logs.h b/cpp/logs.h index 0b8df568..aaa5d6d4 100644 --- a/cpp/logs.h +++ b/cpp/logs.h @@ -12,27 +12,27 @@ // LOGS NO ANDROID #include #define LOG_TAG "react-native-quick-sqlite" -#define LOGV(...) \ - printf(" "); \ - printf(__VA_ARGS__); \ +#define LOGV(...) \ + printf(" "); \ + printf(__VA_ARGS__); \ printf("\t - <%s> \n", LOG_TAG); -#define LOGD(...) \ - printf(" "); \ - printf(__VA_ARGS__); \ +#define LOGD(...) \ + printf(" "); \ + printf(__VA_ARGS__); \ printf("\t - <%s> \n", LOG_TAG); -#define LOGI(...) \ - printf(" "); \ - printf(__VA_ARGS__); \ +#define LOGI(...) \ + printf(" "); \ + printf(__VA_ARGS__); \ printf("\t - <%s> \n", LOG_TAG); -#define LOGW(...) \ - printf(" * Warning: "); \ - printf(__VA_ARGS__); \ +#define LOGW(...) \ + printf(" * Warning: "); \ + printf(__VA_ARGS__); \ printf("\t - <%s> \n", LOG_TAG); -#define LOGE(...) \ - printf(" *** Error: "); \ - printf(__VA_ARGS__); \ +#define LOGE(...) \ + printf(" *** Error: "); \ + printf(__VA_ARGS__); \ printf("\t - <%s> \n", LOG_TAG); -#define LOGSIMPLE(...) \ - printf(" "); \ +#define LOGSIMPLE(...) \ + printf(" "); \ printf(__VA_ARGS__); #endif // ANDROID diff --git a/cpp/macros.h b/cpp/macros.h index c1457078..8005554f 100644 --- a/cpp/macros.h +++ b/cpp/macros.h @@ -1,16 +1,13 @@ #ifndef macros_h #define macros_h -#define HOSTFN(name, basecount) \ +#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 +#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/cpp/specs/HybridQuickSQLite.cpp b/cpp/specs/HybridQuickSQLite.cpp index 601bbb31..adf559b5 100644 --- a/cpp/specs/HybridQuickSQLite.cpp +++ b/cpp/specs/HybridQuickSQLite.cpp @@ -1,188 +1,178 @@ -#include -#include -#include -#include #include "HybridQuickSQLite.hpp" -#include "HybridSelectQueryResult.hpp" -#include "sqliteBridge.h" -#include "logs.h" -#include "ThreadPool.h" -#include "sqlfileloader.h" -#include "sqlbatchexecutor.h" -#include "macros.h" #include "Globals.hpp" +#include "HybridSelectQueryResult.hpp" #include "QueryType.hpp" +#include "ThreadPool.h" #include "Types.hpp" +#include "logs.h" +#include "macros.h" +#include "sqlbatchexecutor.h" +#include "sqlfileloader.h" +#include "sqliteBridge.h" +#include +#include +#include +#include namespace margelo::nitro::rnquicksqlite { auto pool = std::make_shared(); void HybridQuickSQLite::open(const std::string& dbName, const std::optional& location) { - std::string tempDocPath = std::string(docPathStr); - if (location) { - tempDocPath = tempDocPath + "/" + *location; - } + std::string tempDocPath = std::string(docPathStr); + if (location) { + tempDocPath = tempDocPath + "/" + *location; + } - SQLiteOPResult result = sqliteOpenDb(dbName, tempDocPath); + SQLiteOPResult result = sqliteOpenDb(dbName, tempDocPath); - if (result.type == SQLiteError) - { - throw std::runtime_error(result.errorMessage.c_str()); - } + if (result.type == SQLiteError) { + throw std::runtime_error(result.errorMessage.c_str()); + } } void HybridQuickSQLite::close(const std::string& dbName) { - SQLiteOPResult result = sqliteCloseDb(dbName); + SQLiteOPResult result = sqliteCloseDb(dbName); - if (result.type == SQLiteError) - { - throw std::runtime_error(result.errorMessage.c_str()); - } + if (result.type == SQLiteError) { + throw std::runtime_error(result.errorMessage.c_str()); + } }; void HybridQuickSQLite::drop(const std::string& dbName, const std::optional& location) { - std::string tempDocPath = std::string(docPathStr); - if (location) - { - tempDocPath = tempDocPath + "/" + *location; - } - + std::string tempDocPath = std::string(docPathStr); + if (location) { + tempDocPath = tempDocPath + "/" + *location; + } - SQLiteOPResult result = sqliteRemoveDb(dbName, tempDocPath); + SQLiteOPResult result = sqliteRemoveDb(dbName, tempDocPath); - if (result.type == SQLiteError) - { - throw std::runtime_error(result.errorMessage.c_str()); - } + if (result.type == SQLiteError) { + throw std::runtime_error(result.errorMessage.c_str()); + } }; -void HybridQuickSQLite::attach(const std::string& mainDbName, const std::string& dbNameToAttach, const std::string& alias, const std::optional& location) { - std::string tempDocPath = std::string(docPathStr); - if (location) - { - tempDocPath = tempDocPath + "/" + *location; - } +void HybridQuickSQLite::attach(const std::string& mainDbName, const std::string& dbNameToAttach, const std::string& alias, + const std::optional& location) { + std::string tempDocPath = std::string(docPathStr); + if (location) { + tempDocPath = tempDocPath + "/" + *location; + } - SQLiteOPResult result = sqliteAttachDb(mainDbName, tempDocPath, dbNameToAttach, alias); + SQLiteOPResult result = sqliteAttachDb(mainDbName, tempDocPath, dbNameToAttach, alias); - if (result.type == SQLiteError) - { - throw std::runtime_error(result.errorMessage.c_str()); - } + if (result.type == SQLiteError) { + throw std::runtime_error(result.errorMessage.c_str()); + } }; void HybridQuickSQLite::detach(const std::string& mainDbName, const std::string& alias) { - SQLiteOPResult result = sqliteDetachDb(mainDbName, alias); + SQLiteOPResult result = sqliteDetachDb(mainDbName, alias); - if (result.type == SQLiteError) - { - throw std::runtime_error(result.errorMessage.c_str()); - } + if (result.type == SQLiteError) { + throw std::runtime_error(result.errorMessage.c_str()); + } }; -NativeQueryResult HybridQuickSQLite::execute(const std::string& dbName, const std::string& query, const std::optional& params) { - auto results = TableResults(); - auto metadata = std::optional(std::nullopt); - - // Converting results into a JSI Response - try { - auto status = sqliteExecute(dbName, query, params, results, metadata); +NativeQueryResult HybridQuickSQLite::execute(const std::string& dbName, const std::string& query, + const std::optional& params) { + auto results = TableResults(); + auto metadata = std::optional(std::nullopt); - if(status.type == SQLiteError) { - throw std::runtime_error(status.errorMessage); - } + // Converting results into a JSI Response + try { + auto status = sqliteExecute(dbName, query, params, results, metadata); - if (metadata) { - const auto selectQueryResult = std::make_shared(std::move(results), std::move(*metadata)); - return NativeQueryResult(QueryType::SELECT, status.insertId, status.rowsAffected, selectQueryResult); - } + if (status.type == SQLiteError) { + throw std::runtime_error(status.errorMessage); + } - return NativeQueryResult(QueryType::SELECT, status.insertId, status.rowsAffected, std::nullopt); - } catch(std::exception &e) { - throw std::runtime_error(e.what()); + if (metadata) { + const auto selectQueryResult = std::make_shared(std::move(results), std::move(*metadata)); + return NativeQueryResult(QueryType::SELECT, status.insertId, status.rowsAffected, selectQueryResult); } + + return NativeQueryResult(QueryType::SELECT, status.insertId, status.rowsAffected, std::nullopt); + } catch (std::exception& e) { + throw std::runtime_error(e.what()); + } }; -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(); +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()); - } - }; + 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)); + pool->queueWork(std::move(task)); - return future; + return future; }; BatchQueryResult HybridQuickSQLite::executeBatch(const std::string& dbName, const std::vector& batchParams) { - const auto commands = batchParamsToCommands(batchParams); - - auto batchResult = sqliteExecuteBatch(dbName, commands); - if (batchResult.type == SQLiteOk) - { - return BatchQueryResult(batchResult.affectedRows); - } - else - { - throw std::runtime_error(batchResult.message); - } + const auto commands = batchParamsToCommands(batchParams); + + auto batchResult = sqliteExecuteBatch(dbName, commands); + if (batchResult.type == SQLiteOk) { + return BatchQueryResult(batchResult.affectedRows); + } else { + throw std::runtime_error(batchResult.message); + } }; -std::future HybridQuickSQLite::executeBatchAsync(const std::string& dbName, const std::vector& batchParams) { - auto promise = std::make_shared>(); - auto future = promise->get_future(); +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()); - } - }; + 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)); + pool->queueWork(std::move(task)); - return future; + return future; }; FileLoadResult HybridQuickSQLite::loadFile(const std::string& dbName, const std::string& location) { - const auto importResult = importSQLFile(dbName, location); - if (importResult.type == SQLiteOk) - { - auto result = new FileLoadResult(importResult.commands, importResult.affectedRows); - return *result; - } - else - { - throw std::runtime_error("[react-native-quick-sqlite][loadFile] Could not open file"); - } + const auto importResult = importSQLFile(dbName, location); + if (importResult.type == SQLiteOk) { + auto result = new FileLoadResult(importResult.commands, importResult.affectedRows); + return *result; + } else { + throw std::runtime_error("[react-native-quick-sqlite][loadFile] Could not open file"); + } }; std::future HybridQuickSQLite::loadFileAsync(const std::string& dbName, const std::string& location) { - auto promise = std::make_shared>(); - auto future = promise->get_future(); + 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()); - } - }; + 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)); + pool->queueWork(std::move(task)); - return future; + return future; }; -} +} // namespace margelo::nitro::rnquicksqlite diff --git a/cpp/specs/HybridQuickSQLite.hpp b/cpp/specs/HybridQuickSQLite.hpp index a272743d..02061e31 100644 --- a/cpp/specs/HybridQuickSQLite.hpp +++ b/cpp/specs/HybridQuickSQLite.hpp @@ -4,23 +4,28 @@ namespace margelo::nitro::rnquicksqlite { -class HybridQuickSQLite: public HybridQuickSQLiteSpec { +class HybridQuickSQLite : public HybridQuickSQLiteSpec { public: - HybridQuickSQLite() : HybridObject(TAG) {} + HybridQuickSQLite() : HybridObject(TAG) {} 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; - NativeQueryResult 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; + // 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; + NativeQueryResult 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; }; -} +} // namespace margelo::nitro::rnquicksqlite diff --git a/cpp/specs/HybridSelectQueryResult.cpp b/cpp/specs/HybridSelectQueryResult.cpp index b23df31a..96535303 100644 --- a/cpp/specs/HybridSelectQueryResult.cpp +++ b/cpp/specs/HybridSelectQueryResult.cpp @@ -3,19 +3,19 @@ namespace margelo::nitro::rnquicksqlite { TableResults HybridSelectQueryResult::getResults() { - return this->_results; + return this->_results; }; void HybridSelectQueryResult::setResults(const TableResults& results) { - this->_results = results; + this->_results = results; }; TableMetadata HybridSelectQueryResult::getMetadata() { - return this->_metadata; + return this->_metadata; } void HybridSelectQueryResult::setMetadata(const TableMetadata& metadata) { - this->_metadata = metadata; + this->_metadata = metadata; } -} +} // namespace margelo::nitro::rnquicksqlite diff --git a/cpp/specs/HybridSelectQueryResult.hpp b/cpp/specs/HybridSelectQueryResult.hpp index ec72c3f8..56779dca 100644 --- a/cpp/specs/HybridSelectQueryResult.hpp +++ b/cpp/specs/HybridSelectQueryResult.hpp @@ -1,29 +1,29 @@ #pragma once -#include #include "HybridSelectQueryResultSpec.hpp" #include "Types.hpp" +#include using namespace margelo::rnquicksqlite; namespace margelo::nitro::rnquicksqlite { -class HybridSelectQueryResult: public HybridSelectQueryResultSpec { +class HybridSelectQueryResult : public HybridSelectQueryResultSpec { public: - HybridSelectQueryResult() : HybridObject(TAG) {} - HybridSelectQueryResult(TableResults&& results, TableMetadata&& metadata) - : HybridObject(TAG), _results(std::move(results)), _metadata(std::move(metadata)) {} - + HybridSelectQueryResult() : HybridObject(TAG) {} + HybridSelectQueryResult(TableResults&& results, TableMetadata&& metadata) + : HybridObject(TAG), _results(std::move(results)), _metadata(std::move(metadata)) {} + private: - TableResults _results; - TableMetadata _metadata; + TableResults _results; + TableMetadata _metadata; public: - // Properties - TableResults getResults() override; - void setResults(const TableResults& results) override; - TableMetadata getMetadata() override; - void setMetadata(const TableMetadata& metadata) override; + // Properties + TableResults getResults() override; + void setResults(const TableResults& results) override; + TableMetadata getMetadata() override; + void setMetadata(const TableMetadata& metadata) override; }; - -} + +} // namespace margelo::nitro::rnquicksqlite diff --git a/cpp/sqlbatchexecutor.cpp b/cpp/sqlbatchexecutor.cpp index c14415bf..6d4a1ecd 100644 --- a/cpp/sqlbatchexecutor.cpp +++ b/cpp/sqlbatchexecutor.cpp @@ -1,101 +1,78 @@ /** * SQL Batch execution implementation using default sqliteBridge implementation -*/ + */ #include "sqlbatchexecutor.h" #include "sqliteBridge.h" #include namespace margelo::rnquicksqlite { -std::vector batchParamsToCommands(const std::vector& batchParams) -{ - auto commands = std::vector(); +std::vector batchParamsToCommands(const std::vector& batchParams) { + auto commands = std::vector(); - for (auto& command : batchParams) - { - if (command.params) - { - using ParamsVec = SQLiteParams; - using NestedParamsVec = std::vector; + for (auto& command : batchParams) { + if (command.params) { + using ParamsVec = SQLiteParams; + using NestedParamsVec = std::vector; - if (std::holds_alternative(*command.params)) { - // This arguments is an array of arrays, like a batch update of a single sql command. - for (const auto& params : std::get(*command.params)) - { - commands.push_back(BatchQuery{ - command.query, - std::make_shared(params) - }); - } - } - else - { - commands.push_back(BatchQuery{ - command.query, - std::make_shared(std::move(std::get(*command.params))) - }); - } - } - else - { - commands.push_back(BatchQuery{ - command.query, - NULL - }); + if (std::holds_alternative(*command.params)) { + // This arguments is an array of arrays, like a batch update of a single sql command. + for (const auto& params : std::get(*command.params)) { + commands.push_back(BatchQuery{command.query, std::make_shared(params)}); } + } else { + commands.push_back(BatchQuery{command.query, std::make_shared(std::move(std::get(*command.params)))}); + } + } else { + commands.push_back(BatchQuery{command.query, NULL}); } + } - return commands; + return commands; } -SequelBatchOperationResult sqliteExecuteBatch(const std::string& dbName, const std::vector& commands) -{ - size_t commandCount = commands.size(); - if(commandCount <= 0) - { - return SequelBatchOperationResult { - .type = SQLiteError, - .message = "No SQL commands provided", - }; - } +SequelBatchOperationResult sqliteExecuteBatch(const std::string& dbName, const std::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; i(std::nullopt); - auto result = sqliteExecute(dbName, command.sql, *command.params.get(), results, metadata); - 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) - { + // 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 results = TableResults(); + auto metadata = std::optional(std::nullopt); + auto result = sqliteExecute(dbName, command.sql, *command.params.get(), results, metadata); + if (result.type == SQLiteError) { sqliteExecuteLiteral(dbName, "ROLLBACK"); - return SequelBatchOperationResult { + return SequelBatchOperationResult{ .type = SQLiteError, - .message = exc.what(), + .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(), + }; + } } -} +} // namespace margelo::rnquicksqlite diff --git a/cpp/sqlbatchexecutor.h b/cpp/sqlbatchexecutor.h index 225c8d11..9f635898 100644 --- a/cpp/sqlbatchexecutor.h +++ b/cpp/sqlbatchexecutor.h @@ -1,10 +1,10 @@ /** * SQL Batch execution implementation using default sqliteBridge implementation -*/ + */ #pragma once -#include "Types.hpp" #include "BatchQueryCommand.hpp" +#include "Types.hpp" using namespace facebook; using namespace margelo::nitro; @@ -12,8 +12,8 @@ using namespace margelo::nitro; namespace margelo::rnquicksqlite { struct BatchQuery { - std::string sql; - std::shared_ptr params; + std::string sql; + std::shared_ptr params; }; /** @@ -27,4 +27,4 @@ std::vector batchParamsToCommands(const std::vector& commands); -} +} // namespace margelo::rnquicksqlite diff --git a/cpp/sqlfileloader.cpp b/cpp/sqlfileloader.cpp index 9778c025..321af6a2 100644 --- a/cpp/sqlfileloader.cpp +++ b/cpp/sqlfileloader.cpp @@ -1,56 +1,44 @@ /** * SQL File Loader implementation -*/ + */ #include "sqlfileloader.h" -#include #include +#include namespace margelo::rnquicksqlite { -SequelBatchOperationResult importSQLFile(const std::string& dbName, const std::string& fileLocation) -{ - std::string line; - std::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(); +SequelBatchOperationResult importSQLFile(const std::string& dbName, const std::string& fileLocation) { + std::string line; + std::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"); - return {SQLiteError, "[react-native-quick-sqlite][loadSQLFile] Unexpected error, transaction was rolledback", 0, 0}; + 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}; - } + } else { + return {SQLiteError, "[react-native-quick-sqlite][loadSQLFile] Could not open file", 0, 0}; + } } -} +} // namespace margelo::rnquicksqlite diff --git a/cpp/sqlfileloader.h b/cpp/sqlfileloader.h index 9a2c15f9..44cacaa2 100644 --- a/cpp/sqlfileloader.h +++ b/cpp/sqlfileloader.h @@ -3,7 +3,7 @@ * SQL File Loader * Utilizes the regular sqlite bridge to load an SQLFile inside a transaction * -*/ + */ #include "sqliteBridge.h" diff --git a/cpp/sqlite3.c b/cpp/sqlite3.c index 51d5dbd0..12a21f34 100644 --- a/cpp/sqlite3.c +++ b/cpp/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