diff options
| author | 2021-12-26 16:30:39 +0100 | |
|---|---|---|
| committer | 2021-12-26 18:12:55 +0100 | |
| commit | 3cd587ea0edb03122bdac298eea97ac9f79afd07 (patch) | |
| tree | d77600b33b28cf333b925d5579433c382c57c15d | |
| parent | gitignore: ignore coredumps (diff) | |
| download | zig-sqlite-3cd587ea0edb03122bdac298eea97ac9f79afd07.tar.gz zig-sqlite-3cd587ea0edb03122bdac298eea97ac9f79afd07.tar.xz zig-sqlite-3cd587ea0edb03122bdac298eea97ac9f79afd07.zip | |
add some fuzzing capability
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | build.zig | 50 | ||||
| -rw-r--r-- | fuzz/inputs/schema.sql | 1 | ||||
| -rw-r--r-- | fuzz/main.zig | 45 | ||||
| -rw-r--r-- | fuzz/sql.dict | 283 |
5 files changed, 379 insertions, 1 deletions
| @@ -3,3 +3,4 @@ zig-* | |||
| 3 | .zigmod | 3 | .zigmod |
| 4 | deps.zig | 4 | deps.zig |
| 5 | core.* | 5 | core.* |
| 6 | /fuzz/outputs | ||
| @@ -146,7 +146,7 @@ const all_test_targets = switch (builtin.target.cpu.arch) { | |||
| 146 | }, | 146 | }, |
| 147 | }; | 147 | }; |
| 148 | 148 | ||
| 149 | pub fn build(b: *std.build.Builder) void { | 149 | pub fn build(b: *std.build.Builder) !void { |
| 150 | const in_memory = b.option(bool, "in_memory", "Should the tests run with sqlite in memory (default true)") orelse true; | 150 | const in_memory = b.option(bool, "in_memory", "Should the tests run with sqlite in memory (default true)") orelse true; |
| 151 | const dbfile = b.option([]const u8, "dbfile", "Always use this database file instead of a temporary one"); | 151 | const dbfile = b.option([]const u8, "dbfile", "Always use this database file instead of a temporary one"); |
| 152 | const use_bundled = b.option(bool, "use_bundled", "Use the bundled sqlite3 source instead of linking the system library (default false)"); | 152 | const use_bundled = b.option(bool, "use_bundled", "Use the bundled sqlite3 source instead of linking the system library (default false)"); |
| @@ -203,4 +203,52 @@ pub fn build(b: *std.build.Builder) void { | |||
| 203 | 203 | ||
| 204 | test_step.dependOn(&tests.step); | 204 | test_step.dependOn(&tests.step); |
| 205 | } | 205 | } |
| 206 | |||
| 207 | // Fuzzing | ||
| 208 | |||
| 209 | const lib = b.addStaticLibrary("sqlite", null); | ||
| 210 | lib.addCSourceFile("c/sqlite3.c", &[_][]const u8{"-std=c99"}); | ||
| 211 | lib.linkLibC(); | ||
| 212 | lib.setBuildMode(.Debug); | ||
| 213 | lib.setTarget(getTarget(target, true)); | ||
| 214 | |||
| 215 | // The library | ||
| 216 | const fuzz_lib = b.addStaticLibrary("fuzz-lib", "fuzz/main.zig"); | ||
| 217 | fuzz_lib.addIncludeDir("c"); | ||
| 218 | fuzz_lib.setBuildMode(.Debug); | ||
| 219 | fuzz_lib.setTarget(getTarget(target, true)); | ||
| 220 | fuzz_lib.linkLibrary(lib); | ||
| 221 | fuzz_lib.want_lto = true; | ||
| 222 | fuzz_lib.bundle_compiler_rt = true; | ||
| 223 | fuzz_lib.addPackagePath("sqlite", "sqlite.zig"); | ||
| 224 | |||
| 225 | // Setup the output name | ||
| 226 | const fuzz_executable_name = "fuzz"; | ||
| 227 | const fuzz_exe_path = try std.fs.path.join(b.allocator, &.{ b.cache_root, fuzz_executable_name }); | ||
| 228 | |||
| 229 | // We want `afl-clang-lto -o path/to/output path/to/library` | ||
| 230 | const fuzz_compile = b.addSystemCommand(&.{ "afl-clang-lto", "-o", fuzz_exe_path }); | ||
| 231 | fuzz_compile.addArtifactArg(lib); | ||
| 232 | fuzz_compile.addArtifactArg(fuzz_lib); | ||
| 233 | |||
| 234 | // Install the cached output to the install 'bin' path | ||
| 235 | const fuzz_install = b.addInstallBinFile(.{ .path = fuzz_exe_path }, fuzz_executable_name); | ||
| 236 | |||
| 237 | // Add a top-level step that compiles and installs the fuzz executable | ||
| 238 | const fuzz_compile_run = b.step("fuzz", "Build executable for fuzz testing using afl-clang-lto"); | ||
| 239 | // fuzz_compile_run.dependOn(&fuzz_lib.step); | ||
| 240 | fuzz_compile_run.dependOn(&fuzz_compile.step); | ||
| 241 | fuzz_compile_run.dependOn(&fuzz_install.step); | ||
| 242 | |||
| 243 | // Compile a companion exe for debugging crashes | ||
| 244 | const fuzz_debug_exe = b.addExecutable("fuzz-debug", "fuzz/main.zig"); | ||
| 245 | fuzz_debug_exe.addIncludeDir("c"); | ||
| 246 | fuzz_debug_exe.setBuildMode(.Debug); | ||
| 247 | fuzz_debug_exe.setTarget(getTarget(target, true)); | ||
| 248 | fuzz_debug_exe.linkLibrary(lib); | ||
| 249 | fuzz_debug_exe.addPackagePath("sqlite", "sqlite.zig"); | ||
| 250 | |||
| 251 | // Only install fuzz-debug when the fuzz step is run | ||
| 252 | const install_fuzz_debug_exe = b.addInstallArtifact(fuzz_debug_exe); | ||
| 253 | fuzz_compile_run.dependOn(&install_fuzz_debug_exe.step); | ||
| 206 | } | 254 | } |
diff --git a/fuzz/inputs/schema.sql b/fuzz/inputs/schema.sql new file mode 100644 index 0000000..85a5643 --- /dev/null +++ b/fuzz/inputs/schema.sql | |||
| @@ -0,0 +1 @@ | |||
| CREATE TABLE foobar(user integer primary key, name text, data blob); | |||
diff --git a/fuzz/main.zig b/fuzz/main.zig new file mode 100644 index 0000000..482cbe0 --- /dev/null +++ b/fuzz/main.zig | |||
| @@ -0,0 +1,45 @@ | |||
| 1 | const std = @import("std"); | ||
| 2 | const sqlite = @import("sqlite"); | ||
| 3 | |||
| 4 | pub export fn main() callconv(.C) void { | ||
| 5 | zigMain() catch unreachable; | ||
| 6 | } | ||
| 7 | |||
| 8 | pub fn zigMain() !void { | ||
| 9 | var gpa = std.heap.GeneralPurposeAllocator(.{}){}; | ||
| 10 | defer std.debug.assert(gpa.deinit() == false); | ||
| 11 | const allocator = gpa.allocator(); | ||
| 12 | |||
| 13 | // Read the data from stdin | ||
| 14 | const stdin = std.io.getStdIn(); | ||
| 15 | const data = try stdin.readToEndAlloc(allocator, std.math.maxInt(usize)); | ||
| 16 | defer allocator.free(data); | ||
| 17 | |||
| 18 | var db = try sqlite.Db.init(.{ | ||
| 19 | .mode = .Memory, | ||
| 20 | .open_flags = .{ | ||
| 21 | .write = true, | ||
| 22 | .create = true, | ||
| 23 | }, | ||
| 24 | }); | ||
| 25 | defer db.deinit(); | ||
| 26 | |||
| 27 | try db.exec("CREATE TABLE test(id integer primary key, name text, data blob)", .{}, .{}); | ||
| 28 | |||
| 29 | db.execDynamic(data, .{}, .{}) catch |err| switch (err) { | ||
| 30 | error.SQLiteError => return, | ||
| 31 | else => return err, | ||
| 32 | }; | ||
| 33 | |||
| 34 | db.execDynamic( | ||
| 35 | "INSERT INTO test(name, data) VALUES($name, $data)", | ||
| 36 | .{}, | ||
| 37 | .{ | ||
| 38 | .name = data, | ||
| 39 | .data = data, | ||
| 40 | }, | ||
| 41 | ) catch |err| switch (err) { | ||
| 42 | error.SQLiteError => return, | ||
| 43 | else => return err, | ||
| 44 | }; | ||
| 45 | } | ||
diff --git a/fuzz/sql.dict b/fuzz/sql.dict new file mode 100644 index 0000000..92ec3ca --- /dev/null +++ b/fuzz/sql.dict | |||
| @@ -0,0 +1,283 @@ | |||
| 1 | # Taken from https://github.com/google/oss-fuzz/blob/f64134b0b3c2b27a4283e55581d41d83d3c3a64f/projects/sqlite3/sql.dict | ||
| 2 | # | ||
| 3 | # AFL dictionary for SQL | ||
| 4 | # ---------------------- | ||
| 5 | # | ||
| 6 | # Modeled based on SQLite documentation, contains some number of SQLite | ||
| 7 | # extensions. Other dialects of SQL may benefit from customized dictionaries. | ||
| 8 | # | ||
| 9 | # If you append @1 to the file name when loading this dictionary, afl-fuzz | ||
| 10 | # will also additionally load a selection of pragma keywords that are very | ||
| 11 | # specific to SQLite (and are probably less interesting from the security | ||
| 12 | # standpoint, because they are usually not allowed in non-privileged | ||
| 13 | # contexts). | ||
| 14 | # | ||
| 15 | # Created by Michal Zalewski <lcamtuf@google.com> | ||
| 16 | # | ||
| 17 | |||
| 18 | function_abs=" abs(1)" | ||
| 19 | function_avg=" avg(1)" | ||
| 20 | function_changes=" changes()" | ||
| 21 | function_char=" char(1)" | ||
| 22 | function_coalesce=" coalesce(1,1)" | ||
| 23 | function_count=" count(1)" | ||
| 24 | function_date=" date(1,1,1)" | ||
| 25 | function_datetime=" datetime(1,1,1)" | ||
| 26 | function_decimal=" decimal(1,1)" | ||
| 27 | function_glob=" glob(1,1)" | ||
| 28 | function_group_concat=" group_concat(1,1)" | ||
| 29 | function_hex=" hex(1)" | ||
| 30 | function_ifnull=" ifnull(1,1)" | ||
| 31 | function_instr=" instr(1,1)" | ||
| 32 | function_julianday=" julianday(1,1,1)" | ||
| 33 | function_last_insert_rowid=" last_insert_rowid()" | ||
| 34 | function_length=" length(1)" | ||
| 35 | function_like=" like(1,1)" | ||
| 36 | function_likelihood=" likelihood(1,1)" | ||
| 37 | function_likely=" likely(1)" | ||
| 38 | function_load_extension=" load_extension(1,1)" | ||
| 39 | function_lower=" lower(1)" | ||
| 40 | function_ltrim=" ltrim(1,1)" | ||
| 41 | function_max=" max(1,1)" | ||
| 42 | function_min=" min(1,1)" | ||
| 43 | function_nullif=" nullif(1,1)" | ||
| 44 | function_printf=" printf(1,1)" | ||
| 45 | function_quote=" quote(1)" | ||
| 46 | function_random=" random()" | ||
| 47 | function_randomblob=" randomblob(1)" | ||
| 48 | function_replace=" replace(1,1,1)" | ||
| 49 | function_round=" round(1,1)" | ||
| 50 | function_rtrim=" rtrim(1,1)" | ||
| 51 | function_soundex=" soundex(1)" | ||
| 52 | function_sqlite_compileoption_get=" sqlite_compileoption_get(1)" | ||
| 53 | function_sqlite_compileoption_used=" sqlite_compileoption_used(1)" | ||
| 54 | function_sqlite_source_id=" sqlite_source_id()" | ||
| 55 | function_sqlite_version=" sqlite_version()" | ||
| 56 | function_strftime=" strftime(1,1,1,1)" | ||
| 57 | function_substr=" substr(1,1,1)" | ||
| 58 | function_sum=" sum(1)" | ||
| 59 | function_time=" time(1,1,1)" | ||
| 60 | function_total=" total(1)" | ||
| 61 | function_total_changes=" total_changes()" | ||
| 62 | function_trim=" trim(1,1)" | ||
| 63 | function_typeof=" typeof(1)" | ||
| 64 | function_unicode=" unicode(1)" | ||
| 65 | function_unlikely=" unlikely(1)" | ||
| 66 | function_upper=" upper(1)" | ||
| 67 | function_varchar=" varchar(1)" | ||
| 68 | function_zeroblob=" zeroblob(1)" | ||
| 69 | |||
| 70 | keyword_ABORT="ABORT" | ||
| 71 | keyword_ACTION="ACTION" | ||
| 72 | keyword_ADD="ADD" | ||
| 73 | keyword_AFTER="AFTER" | ||
| 74 | keyword_ALL="ALL" | ||
| 75 | keyword_ALTER="ALTER" | ||
| 76 | keyword_ANALYZE="ANALYZE" | ||
| 77 | keyword_AND="AND" | ||
| 78 | keyword_AS="AS" | ||
| 79 | keyword_ASC="ASC" | ||
| 80 | keyword_ATTACH="ATTACH" | ||
| 81 | keyword_AUTOINCREMENT="AUTOINCREMENT" | ||
| 82 | keyword_BEFORE="BEFORE" | ||
| 83 | keyword_BEGIN="BEGIN" | ||
| 84 | keyword_BETWEEN="BETWEEN" | ||
| 85 | keyword_BY="BY" | ||
| 86 | keyword_CASCADE="CASCADE" | ||
| 87 | keyword_CASE="CASE" | ||
| 88 | keyword_CAST="CAST" | ||
| 89 | keyword_CHECK="CHECK" | ||
| 90 | keyword_COLLATE="COLLATE" | ||
| 91 | keyword_COLUMN="COLUMN" | ||
| 92 | keyword_COMMIT="COMMIT" | ||
| 93 | keyword_CONFLICT="CONFLICT" | ||
| 94 | keyword_CONSTRAINT="CONSTRAINT" | ||
| 95 | keyword_CREATE="CREATE" | ||
| 96 | keyword_CROSS="CROSS" | ||
| 97 | keyword_CURRENT_DATE="CURRENT_DATE" | ||
| 98 | keyword_CURRENT_TIME="CURRENT_TIME" | ||
| 99 | keyword_CURRENT_TIMESTAMP="CURRENT_TIMESTAMP" | ||
| 100 | keyword_DATABASE="DATABASE" | ||
| 101 | keyword_DEFAULT="DEFAULT" | ||
| 102 | keyword_DEFERRABLE="DEFERRABLE" | ||
| 103 | keyword_DEFERRED="DEFERRED" | ||
| 104 | keyword_DELETE="DELETE" | ||
| 105 | keyword_DESC="DESC" | ||
| 106 | keyword_DETACH="DETACH" | ||
| 107 | keyword_DISTINCT="DISTINCT" | ||
| 108 | keyword_DROP="DROP" | ||
| 109 | keyword_EACH="EACH" | ||
| 110 | keyword_ELSE="ELSE" | ||
| 111 | keyword_END="END" | ||
| 112 | keyword_ESCAPE="ESCAPE" | ||
| 113 | keyword_EXCEPT="EXCEPT" | ||
| 114 | keyword_EXCLUSIVE="EXCLUSIVE" | ||
| 115 | keyword_EXISTS="EXISTS" | ||
| 116 | keyword_EXPLAIN="EXPLAIN" | ||
| 117 | keyword_FAIL="FAIL" | ||
| 118 | keyword_FOR="FOR" | ||
| 119 | keyword_FOREIGN="FOREIGN" | ||
| 120 | keyword_FROM="FROM" | ||
| 121 | keyword_FULL="FULL" | ||
| 122 | keyword_GLOB="GLOB" | ||
| 123 | keyword_GROUP="GROUP" | ||
| 124 | keyword_HAVING="HAVING" | ||
| 125 | keyword_IF="IF" | ||
| 126 | keyword_IGNORE="IGNORE" | ||
| 127 | keyword_IMMEDIATE="IMMEDIATE" | ||
| 128 | keyword_IN="IN" | ||
| 129 | keyword_INDEX="INDEX" | ||
| 130 | keyword_INDEXED="INDEXED" | ||
| 131 | keyword_INITIALLY="INITIALLY" | ||
| 132 | keyword_INNER="INNER" | ||
| 133 | keyword_INSERT="INSERT" | ||
| 134 | keyword_INSTEAD="INSTEAD" | ||
| 135 | keyword_INTERSECT="INTERSECT" | ||
| 136 | keyword_INTO="INTO" | ||
| 137 | keyword_IS="IS" | ||
| 138 | keyword_ISNULL="ISNULL" | ||
| 139 | keyword_JOIN="JOIN" | ||
| 140 | keyword_KEY="KEY" | ||
| 141 | keyword_LEFT="LEFT" | ||
| 142 | keyword_LIKE="LIKE" | ||
| 143 | keyword_LIMIT="LIMIT" | ||
| 144 | keyword_MATCH="MATCH" | ||
| 145 | keyword_NATURAL="NATURAL" | ||
| 146 | keyword_NO="NO" | ||
| 147 | keyword_NOT="NOT" | ||
| 148 | keyword_NOTNULL="NOTNULL" | ||
| 149 | keyword_NULL="NULL" | ||
| 150 | keyword_OF="OF" | ||
| 151 | keyword_OFFSET="OFFSET" | ||
| 152 | keyword_ON="ON" | ||
| 153 | keyword_OR="OR" | ||
| 154 | keyword_ORDER="ORDER" | ||
| 155 | keyword_OUTER="OUTER" | ||
| 156 | keyword_PLAN="PLAN" | ||
| 157 | keyword_PRAGMA="PRAGMA" | ||
| 158 | keyword_PRIMARY="PRIMARY" | ||
| 159 | keyword_QUERY="QUERY" | ||
| 160 | keyword_RAISE="RAISE" | ||
| 161 | keyword_RECURSIVE="RECURSIVE" | ||
| 162 | keyword_REFERENCES="REFERENCES" | ||
| 163 | #keyword_REGEXP="REGEXP" | ||
| 164 | keyword_REINDEX="REINDEX" | ||
| 165 | keyword_RELEASE="RELEASE" | ||
| 166 | keyword_RENAME="RENAME" | ||
| 167 | keyword_REPLACE="REPLACE" | ||
| 168 | keyword_RESTRICT="RESTRICT" | ||
| 169 | keyword_RIGHT="RIGHT" | ||
| 170 | keyword_ROLLBACK="ROLLBACK" | ||
| 171 | keyword_ROW="ROW" | ||
| 172 | keyword_SAVEPOINT="SAVEPOINT" | ||
| 173 | keyword_SELECT="SELECT" | ||
| 174 | keyword_SET="SET" | ||
| 175 | keyword_TABLE="TABLE" | ||
| 176 | keyword_TEMP="TEMP" | ||
| 177 | keyword_TEMPORARY="TEMPORARY" | ||
| 178 | keyword_THEN="THEN" | ||
| 179 | keyword_TO="TO" | ||
| 180 | keyword_TRANSACTION="TRANSACTION" | ||
| 181 | keyword_TRIGGER="TRIGGER" | ||
| 182 | keyword_UNION="UNION" | ||
| 183 | keyword_UNIQUE="UNIQUE" | ||
| 184 | keyword_UPDATE="UPDATE" | ||
| 185 | keyword_USING="USING" | ||
| 186 | keyword_VACUUM="VACUUM" | ||
| 187 | keyword_VALUES="VALUES" | ||
| 188 | keyword_VIEW="VIEW" | ||
| 189 | keyword_VIRTUAL="VIRTUAL" | ||
| 190 | keyword_WHEN="WHEN" | ||
| 191 | keyword_WHERE="WHERE" | ||
| 192 | keyword_WITH="WITH" | ||
| 193 | keyword_WITHOUT="WITHOUT" | ||
| 194 | |||
| 195 | operator_concat=" || " | ||
| 196 | operator_ebove_eq=" >=" | ||
| 197 | |||
| 198 | snippet_1eq1=" 1=1" | ||
| 199 | snippet_at=" @1" | ||
| 200 | snippet_backticks=" `a`" | ||
| 201 | snippet_blob=" blob" | ||
| 202 | snippet_brackets=" [a]" | ||
| 203 | snippet_colon=" :1" | ||
| 204 | snippet_comment=" /* */" | ||
| 205 | snippet_date="2001-01-01" | ||
| 206 | snippet_dollar=" $1" | ||
| 207 | snippet_dotref=" a.b" | ||
| 208 | snippet_fmtY="%Y" | ||
| 209 | snippet_int=" int" | ||
| 210 | snippet_neg1=" -1" | ||
| 211 | snippet_pair=" a,b" | ||
| 212 | snippet_parentheses=" (1)" | ||
| 213 | snippet_plus2days="+2 days" | ||
| 214 | snippet_qmark=" ?1" | ||
| 215 | snippet_semicolon=" ;" | ||
| 216 | snippet_star=" *" | ||
| 217 | snippet_string_pair=" \"a\",\"b\"" | ||
| 218 | |||
| 219 | string_dbl_q=" \"a\"" | ||
| 220 | string_escaped_q=" 'a''b'" | ||
| 221 | string_single_q=" 'a'" | ||
| 222 | |||
| 223 | pragma_application_id@1=" application_id" | ||
| 224 | pragma_auto_vacuum@1=" auto_vacuum" | ||
| 225 | pragma_automatic_index@1=" automatic_index" | ||
| 226 | pragma_busy_timeout@1=" busy_timeout" | ||
| 227 | pragma_cache_size@1=" cache_size" | ||
| 228 | pragma_cache_spill@1=" cache_spill" | ||
| 229 | pragma_case_sensitive_like@1=" case_sensitive_like" | ||
| 230 | pragma_checkpoint_fullfsync@1=" checkpoint_fullfsync" | ||
| 231 | pragma_collation_list@1=" collation_list" | ||
| 232 | pragma_compile_options@1=" compile_options" | ||
| 233 | pragma_count_changes@1=" count_changes" | ||
| 234 | pragma_data_store_directory@1=" data_store_directory" | ||
| 235 | pragma_database_list@1=" database_list" | ||
| 236 | pragma_default_cache_size@1=" default_cache_size" | ||
| 237 | pragma_defer_foreign_keys@1=" defer_foreign_keys" | ||
| 238 | pragma_empty_result_callbacks@1=" empty_result_callbacks" | ||
| 239 | pragma_encoding@1=" encoding" | ||
| 240 | pragma_foreign_key_check@1=" foreign_key_check" | ||
| 241 | pragma_foreign_key_list@1=" foreign_key_list" | ||
| 242 | pragma_foreign_keys@1=" foreign_keys" | ||
| 243 | pragma_freelist_count@1=" freelist_count" | ||
| 244 | pragma_full_column_names@1=" full_column_names" | ||
| 245 | pragma_fullfsync@1=" fullfsync" | ||
| 246 | pragma_ignore_check_constraints@1=" ignore_check_constraints" | ||
| 247 | pragma_incremental_vacuum@1=" incremental_vacuum" | ||
| 248 | pragma_index_info@1=" index_info" | ||
| 249 | pragma_index_list@1=" index_list" | ||
| 250 | pragma_integrity_check@1=" integrity_check" | ||
| 251 | pragma_journal_mode@1=" journal_mode" | ||
| 252 | pragma_journal_size_limit@1=" journal_size_limit" | ||
| 253 | pragma_legacy_file_format@1=" legacy_file_format" | ||
| 254 | pragma_locking_mode@1=" locking_mode" | ||
| 255 | pragma_max_page_count@1=" max_page_count" | ||
| 256 | pragma_mmap_size@1=" mmap_size" | ||
| 257 | pragma_page_count@1=" page_count" | ||
| 258 | pragma_page_size@1=" page_size" | ||
| 259 | pragma_parser_trace@1=" parser_trace" | ||
| 260 | pragma_query_only@1=" query_only" | ||
| 261 | pragma_quick_check@1=" quick_check" | ||
| 262 | pragma_read_uncommitted@1=" read_uncommitted" | ||
| 263 | pragma_recursive_triggers@1=" recursive_triggers" | ||
| 264 | pragma_reverse_unordered_selects@1=" reverse_unordered_selects" | ||
| 265 | pragma_schema_version@1=" schema_version" | ||
| 266 | pragma_secure_delete@1=" secure_delete" | ||
| 267 | pragma_short_column_names@1=" short_column_names" | ||
| 268 | pragma_shrink_memory@1=" shrink_memory" | ||
| 269 | pragma_soft_heap_limit@1=" soft_heap_limit" | ||
| 270 | pragma_stats@1=" stats" | ||
| 271 | pragma_synchronous@1=" synchronous" | ||
| 272 | pragma_table_info@1=" table_info" | ||
| 273 | pragma_temp_store@1=" temp_store" | ||
| 274 | pragma_temp_store_directory@1=" temp_store_directory" | ||
| 275 | pragma_threads@1=" threads" | ||
| 276 | pragma_user_version@1=" user_version" | ||
| 277 | pragma_vdbe_addoptrace@1=" vdbe_addoptrace" | ||
| 278 | pragma_vdbe_debug@1=" vdbe_debug" | ||
| 279 | pragma_vdbe_listing@1=" vdbe_listing" | ||
| 280 | pragma_vdbe_trace@1=" vdbe_trace" | ||
| 281 | pragma_wal_autocheckpoint@1=" wal_autocheckpoint" | ||
| 282 | pragma_wal_checkpoint@1=" wal_checkpoint" | ||
| 283 | pragma_writable_schema@1=" writable_schema" | ||