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.
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
}
24 NAME
: full_column_names
26 ARG
: SQLITE_FullColNames
27 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
29 NAME
: short_column_names
31 ARG
: SQLITE_ShortColNames
32 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
37 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
39 NAME
: empty_result_callbacks
41 ARG
: SQLITE_NullCallback
42 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
47 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
49 NAME
: checkpoint_fullfsync
51 ARG
: SQLITE_CkptFullFSync
52 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
55 FLAG
: Result0 SchemaReq NoColumns1
56 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
58 NAME
: reverse_unordered_selects
60 ARG
: SQLITE_ReverseOrder
61 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
66 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
71 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
72 IF
: !defined
(SQLITE_OMIT_AUTOMATIC_INDEX
)
77 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
78 IF
: defined
(SQLITE_DEBUG
)
82 ARG
: SQLITE_VdbeListing
83 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
84 IF
: defined
(SQLITE_DEBUG
)
89 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
90 IF
: defined
(SQLITE_DEBUG
)
94 ARG
: SQLITE_VdbeAddopTrace
95 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
96 IF
: defined
(SQLITE_DEBUG
)
100 ARG
: SQLITE_SqlTrace|SQLITE_VdbeListing|SQLITE_VdbeTrace
101 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
102 IF
: defined
(SQLITE_DEBUG
)
107 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
108 IF
: defined
(SQLITE_DEBUG
)
110 NAME
: ignore_check_constraints
112 ARG
: SQLITE_IgnoreChecks
113 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
114 IF
: !defined
(SQLITE_OMIT_CHECK
)
116 NAME
: writable_schema
118 ARG
: SQLITE_WriteSchema|SQLITE_NoSchemaError
119 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
121 NAME
: read_uncommitted
123 ARG
: SQLITE_ReadUncommit
124 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
126 NAME
: recursive_triggers
128 ARG
: SQLITE_RecTriggers
129 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
133 ARG
: SQLITE_TrustedSchema
134 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
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
145 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
146 IF
: !defined
(SQLITE_OMIT_FOREIGN_KEY
) && !defined
(SQLITE_OMIT_TRIGGER
)
148 NAME
: cell_size_check
150 ARG
: SQLITE_CellSizeCk
152 NAME
: default_cache_size
153 FLAG
: NeedSchema Result0 SchemaReq NoColumns1
155 IF
: !defined
(SQLITE_OMIT_PAGER_PRAGMAS
) && !defined
(SQLITE_OMIT_DEPRECATED
)
158 FLAG
: Result0 SchemaReq NoColumns1
159 IF
: !defined
(SQLITE_OMIT_PAGER_PRAGMAS
)
163 IF
: !defined
(SQLITE_OMIT_PAGER_PRAGMAS
)
166 FLAG
: NeedSchema Result0 SchemaReq
167 IF
: !defined
(SQLITE_OMIT_PAGER_PRAGMAS
)
171 FLAG
: NeedSchema Result0 SchemaReq
172 IF
: !defined
(SQLITE_OMIT_PAGER_PRAGMAS
)
175 FLAG
: Result0 SchemaReq
176 IF
: !defined
(SQLITE_OMIT_PAGER_PRAGMAS
)
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
)
187 FLAG
: NeedSchema Result0 SchemaReq NoColumns1
188 IF
: !defined
(SQLITE_OMIT_PAGER_PRAGMAS
)
191 IF
: !defined
(SQLITE_OMIT_PAGER_PRAGMAS
)
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
)
202 FLAG
: Result0 NoColumns1
203 IF
: !defined
(SQLITE_OMIT_PAGER_PRAGMAS
)
205 NAME
: temp_store_directory
207 IF
: !defined
(SQLITE_OMIT_PAGER_PRAGMAS
)
209 NAME
: data_store_directory
211 IF
: !defined
(SQLITE_OMIT_PAGER_PRAGMAS
) && SQLITE_OS_WIN
213 NAME
: lock_proxy_file
215 IF
: !defined
(SQLITE_OMIT_PAGER_PRAGMAS
) && SQLITE_ENABLE_LOCKING_STYLE
218 FLAG
: NeedSchema Result0 SchemaReq NoColumns1
219 IF
: !defined
(SQLITE_OMIT_PAGER_PRAGMAS
)
222 FLAG
: NeedSchema Result1 SchemaOpt
224 COLS
: cid name type notnull dflt_value pk
225 IF
: !defined
(SQLITE_OMIT_SCHEMA_PRAGMAS
)
229 FLAG
: NeedSchema Result1 SchemaOpt
231 COLS
: cid name type notnull dflt_value pk hidden
232 IF
: !defined
(SQLITE_OMIT_SCHEMA_PRAGMAS
)
236 FLAG
: NeedSchema Result1
237 COLS
: schema name type ncol wr strict
238 IF
: !defined
(SQLITE_OMIT_SCHEMA_PRAGMAS
)
241 FLAG
: NeedSchema Result0 SchemaReq
242 COLS
: tbl idx wdth hght flgs
243 IF
: !defined
(SQLITE_OMIT_SCHEMA_PRAGMAS
) && defined
(SQLITE_DEBUG
)
248 FLAG
: NeedSchema Result1 SchemaOpt
250 IF
: !defined
(SQLITE_OMIT_SCHEMA_PRAGMAS
)
255 FLAG
: NeedSchema Result1 SchemaOpt
256 COLS
: seqno cid name desc coll key
257 IF
: !defined
(SQLITE_OMIT_SCHEMA_PRAGMAS
)
260 FLAG
: NeedSchema Result1 SchemaOpt
261 COLS
: seq name unique origin partial
262 IF
: !defined
(SQLITE_OMIT_SCHEMA_PRAGMAS
)
267 IF
: !defined
(SQLITE_OMIT_SCHEMA_PRAGMAS
)
271 COLS
: name builtin type enc narg flags
272 IF
: !defined
(SQLITE_OMIT_SCHEMA_PRAGMAS
)
273 IF
: !defined
(SQLITE_OMIT_INTROSPECTION_PRAGMAS
)
278 IF
: !defined
(SQLITE_OMIT_SCHEMA_PRAGMAS
)
279 IF
: !defined
(SQLITE_OMIT_VIRTUALTABLE
)
280 IF
: !defined
(SQLITE_OMIT_INTROSPECTION_PRAGMAS
)
285 IF
: !defined
(SQLITE_OMIT_INTROSPECTION_PRAGMAS
)
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
)
304 ARG
: SQLITE_ParserTrace
305 IF
: !defined
(SQLITE_OMIT_FLAG_PRAGMAS
)
306 IF
: defined
(SQLITE_DEBUG
)
308 NAME
: case_sensitive_like
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
)
317 TYPE
: INTEGRITY_CHECK
318 FLAG
: NeedSchema Result0 Result1 SchemaOpt
319 IF
: !defined
(SQLITE_OMIT_INTEGRITY_CHECK
)
322 FLAG
: Result0 NoColumns1
323 IF
: !defined
(SQLITE_OMIT_UTF16
)
327 ARG
: BTREE_SCHEMA_VERSION
328 FLAG
: NoColumns1 Result0
329 IF
: !defined
(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS
)
333 ARG
: BTREE_USER_VERSION
334 FLAG
: NoColumns1 Result0
335 IF
: !defined
(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS
)
339 ARG
: BTREE_DATA_VERSION
340 FLAG
: ReadOnly Result0
341 IF
: !defined
(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS
)
345 ARG
: BTREE_FREE_PAGE_COUNT
346 FLAG
: ReadOnly Result0
347 IF
: !defined
(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS
)
351 ARG
: BTREE_APPLICATION_ID
352 FLAG
: NoColumns1 Result0
353 IF
: !defined
(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS
)
355 NAME
: compile_options
357 IF
: !defined
(SQLITE_OMIT_COMPILEOPTION_DIAGS
)
361 COLS
: busy log checkpointed
362 IF
: !defined
(SQLITE_OMIT_WAL
)
364 NAME
: wal_autocheckpoint
365 IF
: !defined
(SQLITE_OMIT_WAL
)
376 COLS
: database status
377 IF
: defined
(SQLITE_DEBUG
) || defined
(SQLITE_TEST
)
382 IF
: defined
(SQLITE_HAS_CODEC
)
387 IF
: defined
(SQLITE_HAS_CODEC
)
392 IF
: defined
(SQLITE_HAS_CODEC
)
397 IF
: defined
(SQLITE_HAS_CODEC
)
402 IF
: defined
(SQLITE_HAS_CODEC
)
407 IF
: defined
(SQLITE_HAS_CODEC
)
409 NAME
: activate_extensions
410 IF
: defined
(SQLITE_ENABLE_CEROD
)
412 NAME
: soft_heap_limit
415 NAME
: hard_heap_limit
425 FLAG
: Result1 NeedSchema
427 NAME
: legacy_alter_table
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.
454 global name type
if arg allbyname typebyif flags cols all_cols
455 global cols_list colUsedBy
456 if {$name==""} return
458 if {![info exists all_cols
($cols)]} {
459 set all_cols
($cols) 1
460 lappend cols_list
$cols
463 lappend colUsedBy
($cols) $name
467 set allbyname
($name) [list $type $arg $if $flags $cols]
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]
483 set type
[string toupper
$val]
484 } elseif
{$id=="TYPE"} {
487 lappend flags Result0 NoColumns1
489 } elseif
{$id=="ARG"} {
491 } elseif
{$id=="COLS"} {
493 } elseif
{$id=="IF"} {
495 } elseif
{$id=="FLAG"} {
496 foreach term
[split $val] {
498 set allflags
($term) 1
501 error "bad pragma_def line: $line"
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))
511 puts $fd "\n/* The various pragma types */"
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]
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]
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]
539 # Generate #defines for flags
541 puts $fd "\n/* Property flags associated with various pragma. */"
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
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
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\[\] = {"
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
576 if {$i<$limit} continue
577 set cols_offset
($cols) $offset
578 set ub
" /* Used by: $colUsedBy($cols) */"
580 lappend allcollist
$c
581 puts $fd [format " /* %3d */ %-14s%s" $offset \"$c\", $ub]
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"
603 set spacer
[format { %26s
} {}]
604 foreach name
$allnames {
605 foreach {type arg
if flag cx
} $allbyname($name) break
606 if {$cx==0 ||
$cx==""} {
610 set cy
$cols_offset($cx)
613 if {$if!=$current_if} {
614 if {$current_if!=""} {
615 foreach this_if
$current_if {
620 if {$current_if!=""} {
621 foreach this_if
$current_if {
622 puts $fd "#if $this_if"
626 set typex
[format PragTyp_
%-23s $type,]
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 {
645 # count the number of pragmas, for information purposes
649 foreach name
$allnames {
651 set if [lindex $allbyname($name) 2]
652 if {[regexp {^defined
} $if] ||
[regexp {[^
!]defined
} $if]} continue
655 puts $fd "/* Number of pragmas: $dfltcnt on by default, $allcnt total. */"