# Compile-time options passed to SQLite when compiling and building
# the Chromium amalgamation.
#
# The vast majority of the macros here are documented at
# https://www.sqlite.org/compile.html
#
# This file is read by a GN build script as well as generate_amalgamation.py
#
# By default, we disable all SQLite features that can be disabled by adding a
# SQLITE_OMIT_ define, or by leaving out a SQLITE_ENABLE_ define. We only enable
# features that have compelling use cases in the codebase.
#
# Each SQLite feature carries a cost to our users (binary size, pressure on
# caches and branch predictors, extra surface area for security
# vulnerabilities), as well as a maintenance cost (more surface area to be
# covered by our fuzzers, more logic to reason through when debugging a crash
# or a security vulnerability report). Enabled features must provide benefits
# that outweigh these costs.
sqlite_chromium_configuration_flags = [
# Chrome doesn't use the ANALYZE SQLite extension.
#
# ANALYZE [1] is non-standard, and currently performs a table scan to
# update statistics used by the query planner. Chrome uses straightforward
# database schemas which do not require the level of fine tuning provided
# by ANALYZE, and we generally cannot afford the I/O cost of the required
# table scans.
#
# [1] https://www.sqlite.org/lang_analyze.html
"SQLITE_OMIT_ANALYZE",
# Chrome initializes SQLite manually in //sql/connection.cc.
"SQLITE_OMIT_AUTOINIT",
# Chrome should not use queries with the pathologic performance cases
# mitigated by automatic indexes.
#
# Disabling automatic indexing exposes the pathological performance problems,
# instead of having SQLite paper over them. This helps us catch the prbolems
# in early testing, such as pinpoint and Finch.
#
# As a bonus, disabling automatic indexing simplifies the mental model for
# SQLite's optimizer, which makes a bit it easier to reason about SQL
# statement performance.
#
# See https://www.sqlite.org/optoverview.html#autoindex
"SQLITE_OMIT_AUTOMATIC_INDEX",
# Chrome calls sqlite3_reset() correctly to reset prepared statements.
"SQLITE_OMIT_AUTORESET",
# Chromium does not use sqlite3_{get,free}_table().
# Chrome doesn't use sqlite3_compileoption_{used,get}().
"SQLITE_OMIT_COMPILEOPTION_DIAGS",
# EXPLAIN's output is not stable across releases [1], so it should not be
# used in Chrome. Skipping the EXPLAIN machinery also results in
# non-trivial binary savings.
#
# [1] https://www.sqlite.org/lang_explain.html
"SQLITE_OMIT_EXPLAIN",
# Chrome does not use sqlite3_{get,free}_table().
"SQLITE_OMIT_GET_TABLE",
# Chrome does not use PRAGMA {function,module,pragma}_list.
"SQLITE_OMIT_INTROSPECTION_PRAGMAS",
# Chrome already depends on malloc being very efficient, so we disable
# SQLite's arena allocator.
"SQLITE_DEFAULT_LOOKASIDE=0,0",
"SQLITE_OMIT_LOOKASIDE",
# Chrome doesn't use TCL variables.
"SQLITE_OMIT_TCL_VARIABLE",
# The REINDEX statemnt is only useful if a collation sequence's definition
# changes [1]. Chrome never defines its own collation sequences [2, 3], so
# it never needs to call REINDEX.
#
# [1] https://www.sqlite.org/lang_reindex.html
# [2] https://www.sqlite.org/datatype3.html#collating_sequences
# [3] https://www.sqlite.org/c3ref/create_collation.html
"SQLITE_OMIT_REINDEX",
# Chrome doesn't use sqlite3_{profile,trace}().
"SQLITE_OMIT_TRACE",
# Chrome doesn't use UPSERT.
"SQLITE_OMIT_UPSERT",
# Chrome doesn't use window functions in SQL.
"SQLITE_OMIT_WINDOWFUNC",
]