bump version number and changelog
[sqlcipher.git] / tool / mkpragmatab.tcl
blobb6b042a5ef5bbda7b477ea5994e427d1b4137a12
1 #!/usr/bin/tclsh
3 # Run this script to generate the pragma name lookup table C code.
5 # To add new pragmas, first add the name and other relevant attributes
6 # of the pragma to the "pragma_def" object below. Then run this script
7 # to generate the ../src/pragma.h header file that contains macros and
8 # the lookup table needed for pragma name lookup in the pragma.c module.
9 # Then add the extra "case PragTyp_XXXXX:" and subsequent code for the
10 # new pragma in ../src/pragma.c.
13 # Flag meanings:
14 set flagMeaning(NeedSchema) {Force schema load before running}
15 set flagMeaning(ReadOnly) {Read-only HEADER_VALUE}
16 set flagMeaning(Result0) {Acts as query when no argument}
17 set flagMeaning(Result1) {Acts as query when has one argument}
18 set flagMeaning(SchemaReq) {Schema required - "main" is default}
19 set flagMeaning(SchemaOpt) {Schema restricts name search if present}
20 set flagMeaning(NoColumns) {OP_ResultRow called with zero columns}
21 set flagMeaning(NoColumns1) {zero columns if RHS argument is present}
23 set pragma_def {
24 NAME: full_column_names
25 TYPE: FLAG
26 ARG: SQLITE_FullColNames
27 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
29 NAME: short_column_names
30 TYPE: FLAG
31 ARG: SQLITE_ShortColNames
32 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
34 NAME: count_changes
35 TYPE: FLAG
36 ARG: SQLITE_CountRows
37 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
39 NAME: empty_result_callbacks
40 TYPE: FLAG
41 ARG: SQLITE_NullCallback
42 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
44 NAME: fullfsync
45 TYPE: FLAG
46 ARG: SQLITE_FullFSync
47 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
49 NAME: checkpoint_fullfsync
50 TYPE: FLAG
51 ARG: SQLITE_CkptFullFSync
52 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
54 NAME: cache_spill
55 FLAG: Result0 SchemaReq NoColumns1
56 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
58 NAME: reverse_unordered_selects
59 TYPE: FLAG
60 ARG: SQLITE_ReverseOrder
61 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
63 NAME: query_only
64 TYPE: FLAG
65 ARG: SQLITE_QueryOnly
66 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
68 NAME: automatic_index
69 TYPE: FLAG
70 ARG: SQLITE_AutoIndex
71 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
72 IF: !defined(SQLITE_OMIT_AUTOMATIC_INDEX)
74 NAME: sql_trace
75 TYPE: FLAG
76 ARG: SQLITE_SqlTrace
77 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
78 IF: defined(SQLITE_DEBUG)
80 NAME: vdbe_listing
81 TYPE: FLAG
82 ARG: SQLITE_VdbeListing
83 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
84 IF: defined(SQLITE_DEBUG)
86 NAME: vdbe_trace
87 TYPE: FLAG
88 ARG: SQLITE_VdbeTrace
89 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
90 IF: defined(SQLITE_DEBUG)
92 NAME: vdbe_addoptrace
93 TYPE: FLAG
94 ARG: SQLITE_VdbeAddopTrace
95 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
96 IF: defined(SQLITE_DEBUG)
98 NAME: vdbe_debug
99 TYPE: FLAG
100 ARG: SQLITE_SqlTrace|SQLITE_VdbeListing|SQLITE_VdbeTrace
101 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
102 IF: defined(SQLITE_DEBUG)
104 NAME: vdbe_eqp
105 TYPE: FLAG
106 ARG: SQLITE_VdbeEQP
107 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
108 IF: defined(SQLITE_DEBUG)
110 NAME: ignore_check_constraints
111 TYPE: FLAG
112 ARG: SQLITE_IgnoreChecks
113 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
114 IF: !defined(SQLITE_OMIT_CHECK)
116 NAME: writable_schema
117 TYPE: FLAG
118 ARG: SQLITE_WriteSchema|SQLITE_NoSchemaError
119 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
121 NAME: read_uncommitted
122 TYPE: FLAG
123 ARG: SQLITE_ReadUncommit
124 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
126 NAME: recursive_triggers
127 TYPE: FLAG
128 ARG: SQLITE_RecTriggers
129 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
131 NAME: trusted_schema
132 TYPE: FLAG
133 ARG: SQLITE_TrustedSchema
134 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
136 NAME: foreign_keys
137 TYPE: FLAG
138 ARG: SQLITE_ForeignKeys
139 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
140 IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
142 NAME: defer_foreign_keys
143 TYPE: FLAG
144 ARG: SQLITE_DeferFKs
145 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
146 IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
148 NAME: cell_size_check
149 TYPE: FLAG
150 ARG: SQLITE_CellSizeCk
152 NAME: default_cache_size
153 FLAG: NeedSchema Result0 SchemaReq NoColumns1
154 COLS: cache_size
155 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED)
157 NAME: page_size
158 FLAG: Result0 SchemaReq NoColumns1
159 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
161 NAME: secure_delete
162 FLAG: Result0
163 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
165 NAME: page_count
166 FLAG: NeedSchema Result0 SchemaReq
167 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
169 NAME: max_page_count
170 TYPE: PAGE_COUNT
171 FLAG: NeedSchema Result0 SchemaReq
172 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
174 NAME: locking_mode
175 FLAG: Result0 SchemaReq
176 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
178 NAME: journal_mode
179 FLAG: NeedSchema Result0 SchemaReq
180 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
182 NAME: journal_size_limit
183 FLAG: Result0 SchemaReq
184 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
186 NAME: cache_size
187 FLAG: NeedSchema Result0 SchemaReq NoColumns1
188 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
190 NAME: mmap_size
191 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
193 NAME: auto_vacuum
194 FLAG: NeedSchema Result0 SchemaReq NoColumns1
195 IF: !defined(SQLITE_OMIT_AUTOVACUUM)
197 NAME: incremental_vacuum
198 FLAG: NeedSchema NoColumns
199 IF: !defined(SQLITE_OMIT_AUTOVACUUM)
201 NAME: temp_store
202 FLAG: Result0 NoColumns1
203 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
205 NAME: temp_store_directory
206 FLAG: NoColumns1
207 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
209 NAME: data_store_directory
210 FLAG: NoColumns1
211 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN
213 NAME: lock_proxy_file
214 FLAG: NoColumns1
215 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_ENABLE_LOCKING_STYLE
217 NAME: synchronous
218 FLAG: NeedSchema Result0 SchemaReq NoColumns1
219 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
221 NAME: table_info
222 FLAG: NeedSchema Result1 SchemaOpt
223 ARG: 0
224 COLS: cid name type notnull dflt_value pk
225 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
227 NAME: table_xinfo
228 TYPE: TABLE_INFO
229 FLAG: NeedSchema Result1 SchemaOpt
230 ARG: 1
231 COLS: cid name type notnull dflt_value pk hidden
232 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
234 NAME: table_list
235 TYPE: TABLE_LIST
236 FLAG: NeedSchema Result1
237 COLS: schema name type ncol wr strict
238 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
240 NAME: stats
241 FLAG: NeedSchema Result0 SchemaReq
242 COLS: tbl idx wdth hght flgs
243 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) && defined(SQLITE_DEBUG)
245 NAME: index_info
246 TYPE: INDEX_INFO
247 ARG: 0
248 FLAG: NeedSchema Result1 SchemaOpt
249 COLS: seqno cid name
250 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
252 NAME: index_xinfo
253 TYPE: INDEX_INFO
254 ARG: 1
255 FLAG: NeedSchema Result1 SchemaOpt
256 COLS: seqno cid name desc coll key
257 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
259 NAME: index_list
260 FLAG: NeedSchema Result1 SchemaOpt
261 COLS: seq name unique origin partial
262 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
264 NAME: database_list
265 FLAG: NeedSchema Result0
266 COLS: seq name file
267 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
269 NAME: function_list
270 FLAG: Result0
271 COLS: name builtin type enc narg flags
272 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
273 IF: !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
275 NAME: module_list
276 FLAG: Result0
277 COLS: name
278 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
279 IF: !defined(SQLITE_OMIT_VIRTUALTABLE)
280 IF: !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
282 NAME: pragma_list
283 FLAG: Result0
284 COLS: name
285 IF: !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
287 NAME: collation_list
288 FLAG: Result0
289 COLS: seq name
290 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
292 NAME: foreign_key_list
293 FLAG: NeedSchema Result1 SchemaOpt
294 COLS: id seq table from to on_update on_delete match
295 IF: !defined(SQLITE_OMIT_FOREIGN_KEY)
297 NAME: foreign_key_check
298 FLAG: NeedSchema Result0 Result1 SchemaOpt
299 COLS: table rowid parent fkid
300 IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
302 NAME: parser_trace
303 TYPE: FLAG
304 ARG: SQLITE_ParserTrace
305 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
306 IF: defined(SQLITE_DEBUG)
308 NAME: case_sensitive_like
309 FLAG: NoColumns
310 IF: !defined(SQLITE_OMIT_CASE_SENSITIVE_LIKE_PRAGMA)
312 NAME: integrity_check
313 FLAG: NeedSchema Result0 Result1 SchemaOpt
314 IF: !defined(SQLITE_OMIT_INTEGRITY_CHECK)
316 NAME: quick_check
317 TYPE: INTEGRITY_CHECK
318 FLAG: NeedSchema Result0 Result1 SchemaOpt
319 IF: !defined(SQLITE_OMIT_INTEGRITY_CHECK)
321 NAME: encoding
322 FLAG: Result0 NoColumns1
323 IF: !defined(SQLITE_OMIT_UTF16)
325 NAME: schema_version
326 TYPE: HEADER_VALUE
327 ARG: BTREE_SCHEMA_VERSION
328 FLAG: NoColumns1 Result0
329 IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
331 NAME: user_version
332 TYPE: HEADER_VALUE
333 ARG: BTREE_USER_VERSION
334 FLAG: NoColumns1 Result0
335 IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
337 NAME: data_version
338 TYPE: HEADER_VALUE
339 ARG: BTREE_DATA_VERSION
340 FLAG: ReadOnly Result0
341 IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
343 NAME: freelist_count
344 TYPE: HEADER_VALUE
345 ARG: BTREE_FREE_PAGE_COUNT
346 FLAG: ReadOnly Result0
347 IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
349 NAME: application_id
350 TYPE: HEADER_VALUE
351 ARG: BTREE_APPLICATION_ID
352 FLAG: NoColumns1 Result0
353 IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
355 NAME: compile_options
356 FLAG: Result0
357 IF: !defined(SQLITE_OMIT_COMPILEOPTION_DIAGS)
359 NAME: wal_checkpoint
360 FLAG: NeedSchema
361 COLS: busy log checkpointed
362 IF: !defined(SQLITE_OMIT_WAL)
364 NAME: wal_autocheckpoint
365 IF: !defined(SQLITE_OMIT_WAL)
367 NAME: shrink_memory
368 FLAG: NoColumns
370 NAME: busy_timeout
371 FLAG: Result0
372 COLS: timeout
374 NAME: lock_status
375 FLAG: Result0
376 COLS: database status
377 IF: defined(SQLITE_DEBUG) || defined(SQLITE_TEST)
379 NAME: key
380 TYPE: KEY
381 ARG: 0
382 IF: defined(SQLITE_HAS_CODEC)
384 NAME: rekey
385 TYPE: KEY
386 ARG: 1
387 IF: defined(SQLITE_HAS_CODEC)
389 NAME: hexkey
390 TYPE: KEY
391 ARG: 2
392 IF: defined(SQLITE_HAS_CODEC)
394 NAME: hexrekey
395 TYPE: KEY
396 ARG: 3
397 IF: defined(SQLITE_HAS_CODEC)
399 NAME: textkey
400 TYPE: KEY
401 ARG: 4
402 IF: defined(SQLITE_HAS_CODEC)
404 NAME: textrekey
405 TYPE: KEY
406 ARG: 5
407 IF: defined(SQLITE_HAS_CODEC)
409 NAME: activate_extensions
410 IF: defined(SQLITE_ENABLE_CEROD)
412 NAME: soft_heap_limit
413 FLAG: Result0
415 NAME: hard_heap_limit
416 FLAG: Result0
418 NAME: threads
419 FLAG: Result0
421 NAME: analysis_limit
422 FLAG: Result0
424 NAME: optimize
425 FLAG: Result1 NeedSchema
427 NAME: legacy_alter_table
428 TYPE: FLAG
429 ARG: SQLITE_LegacyAlter
430 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
433 # Open the output file
435 set destfile "[file dir [file dir [file normal $argv0]]]/src/pragma.h"
436 puts "Overwriting $destfile with new pragma table..."
437 set fd [open $destfile wb]
438 puts $fd {/* DO NOT EDIT!
439 ** This file is automatically generated by the script at
440 ** ../tool/mkpragmatab.tcl. To update the set of pragmas, edit
441 ** that script and rerun it.
444 # Parse the PRAGMA table above.
446 set name {}
447 set type {}
448 set if {}
449 set flags {}
450 set cols {}
451 set cols_list {}
452 set arg 0
453 proc record_one {} {
454 global name type if arg allbyname typebyif flags cols all_cols
455 global cols_list colUsedBy
456 if {$name==""} return
457 if {$cols!=""} {
458 if {![info exists all_cols($cols)]} {
459 set all_cols($cols) 1
460 lappend cols_list $cols
462 set cx $cols
463 lappend colUsedBy($cols) $name
464 } else {
465 set cx 0
467 set allbyname($name) [list $type $arg $if $flags $cols]
468 set name {}
469 set type {}
470 set if {}
471 set flags {}
472 set cols {}
473 set arg 0
475 foreach line [split $pragma_def \n] {
476 set line [string trim $line]
477 if {$line==""} continue
478 foreach {id val} [split $line :] break
479 set val [string trim $val]
480 if {$id=="NAME"} {
481 record_one
482 set name $val
483 set type [string toupper $val]
484 } elseif {$id=="TYPE"} {
485 set type $val
486 if {$type=="FLAG"} {
487 lappend flags Result0 NoColumns1
489 } elseif {$id=="ARG"} {
490 set arg $val
491 } elseif {$id=="COLS"} {
492 set cols $val
493 } elseif {$id=="IF"} {
494 lappend if $val
495 } elseif {$id=="FLAG"} {
496 foreach term [split $val] {
497 lappend flags $term
498 set allflags($term) 1
500 } else {
501 error "bad pragma_def line: $line"
504 record_one
505 set allnames [lsort [array names allbyname]]
507 # Generate #defines for all pragma type names. Group the pragmas that are
508 # omit in default builds (ex: defined(SQLITE_DEBUG))
509 # at the end.
511 puts $fd "\n/* The various pragma types */"
512 set pnum 0
513 foreach name $allnames {
514 set type [lindex $allbyname($name) 0]
515 if {[info exists seentype($type)]} continue
516 set if [lindex $allbyname($name) 2]
517 if {[regexp SQLITE_DEBUG $if] || [regexp SQLITE_HAS_CODEC $if]} continue
518 set seentype($type) 1
519 puts $fd [format {#define %-35s %4d} PragTyp_$type $pnum]
520 incr pnum
522 foreach name $allnames {
523 set type [lindex $allbyname($name) 0]
524 if {[info exists seentype($type)]} continue
525 set if [lindex $allbyname($name) 2]
526 if {[regexp SQLITE_DEBUG $if]} continue
527 set seentype($type) 1
528 puts $fd [format {#define %-35s %4d} PragTyp_$type $pnum]
529 incr pnum
531 foreach name $allnames {
532 set type [lindex $allbyname($name) 0]
533 if {[info exists seentype($type)]} continue
534 set seentype($type) 1
535 puts $fd [format {#define %-35s %4d} PragTyp_$type $pnum]
536 incr pnum
539 # Generate #defines for flags
541 puts $fd "\n/* Property flags associated with various pragma. */"
542 set fv 1
543 foreach f [lsort [array names allflags]] {
544 puts $fd [format {#define PragFlg_%-10s 0x%02x /* %s */} \
545 $f $fv $flagMeaning($f)]
546 set fv [expr {$fv*2}]
549 # Sort the column lists so that longer column lists occur first
551 proc colscmp {a b} {
552 return [expr {[llength $b] - [llength $a]}]
554 set cols_list [lsort -command colscmp $cols_list]
556 # Generate the array of column names used by pragmas that act like
557 # queries.
559 puts $fd "\n/* Names of columns for pragmas that return multi-column result"
560 puts $fd "** or that return single-column results where the name of the"
561 puts $fd "** result column is different from the name of the pragma\n*/"
562 puts $fd "static const char *const pragCName\[\] = {"
563 set offset 0
564 set allcollist {}
565 foreach cols $cols_list {
566 set n [llength $cols]
567 set limit [expr {[llength $allcollist] - $n}]
568 for {set i 0} {$i<$limit} {incr i} {
569 set sublist [lrange $allcollist $i [expr {$i+$n-1}]]
570 if {$sublist==$cols} {
571 puts $fd [format "%27s/* $colUsedBy($cols) reuses $i */" ""]
572 set cols_offset($cols) $i
573 break
576 if {$i<$limit} continue
577 set cols_offset($cols) $offset
578 set ub " /* Used by: $colUsedBy($cols) */"
579 foreach c $cols {
580 lappend allcollist $c
581 puts $fd [format " /* %3d */ %-14s%s" $offset \"$c\", $ub]
582 set ub ""
583 incr offset
586 puts $fd "\175;"
588 # Generate the lookup table
590 puts $fd "\n/* Definitions of all built-in pragmas */"
591 puts $fd "typedef struct PragmaName \173"
592 puts $fd " const char *const zName; /* Name of pragma */"
593 puts $fd " u8 ePragTyp; /* PragTyp_XXX value */"
594 puts $fd " u8 mPragFlg; /* Zero or more PragFlg_XXX values */"
595 puts $fd { u8 iPragCName; /* Start of column names in pragCName[] */}
596 puts $fd " u8 nPragCName; \
597 /* Num of col names. 0 means use pragma name */"
598 puts $fd " u64 iArg; /* Extra argument */"
599 puts $fd "\175 PragmaName;"
600 puts $fd "static const PragmaName aPragmaName\[\] = \173"
602 set current_if {}
603 set spacer [format { %26s } {}]
604 foreach name $allnames {
605 foreach {type arg if flag cx} $allbyname($name) break
606 if {$cx==0 || $cx==""} {
607 set cy 0
608 set nx 0
609 } else {
610 set cy $cols_offset($cx)
611 set nx [llength $cx]
613 if {$if!=$current_if} {
614 if {$current_if!=""} {
615 foreach this_if $current_if {
616 puts $fd "#endif"
619 set current_if $if
620 if {$current_if!=""} {
621 foreach this_if $current_if {
622 puts $fd "#if $this_if"
626 set typex [format PragTyp_%-23s $type,]
627 if {$flag==""} {
628 set flagx "0"
629 } else {
630 set flagx PragFlg_[join $flag {|PragFlg_}]
632 puts $fd " \173/* zName: */ \"$name\","
633 puts $fd " /* ePragTyp: */ PragTyp_$type,"
634 puts $fd " /* ePragFlg: */ $flagx,"
635 puts $fd " /* ColNames: */ $cy, $nx,"
636 puts $fd " /* iArg: */ $arg \175,"
638 if {$current_if!=""} {
639 foreach this_if $current_if {
640 puts $fd "#endif"
643 puts $fd "\175;"
645 # count the number of pragmas, for information purposes
647 set allcnt 0
648 set dfltcnt 0
649 foreach name $allnames {
650 incr allcnt
651 set if [lindex $allbyname($name) 2]
652 if {[regexp {^defined} $if] || [regexp {[^!]defined} $if]} continue
653 incr dfltcnt
655 puts $fd "/* Number of pragmas: $dfltcnt on by default, $allcnt total. */"