Change EXPLAIN QUERY PLAN output to say "USE TEMP B-TREE FOR LAST TERM OF ORDER BY...
[sqlite.git] / tool / mkpragmatab.tcl
blob2b5b6fdcdba75aaca9e5d5a78dcfc7e3ef0dcac4
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.
12 # The results are normally written into the ../src/pragma.h file. However,
13 # if an alternative output file name is provided as an argument, then
14 # results are written into the alternative. For example:
16 # tclsh tool/mkpragmatab.tcl ;# <--- Results to src/pragma.h
18 # tclsh tool/mkpragmatab.tcl /dev/tty ;# <-- results to terminal
21 # Flag meanings:
22 set flagMeaning(NeedSchema) {Force schema load before running}
23 set flagMeaning(ReadOnly) {Read-only HEADER_VALUE}
24 set flagMeaning(Result0) {Acts as query when no argument}
25 set flagMeaning(Result1) {Acts as query when has one argument}
26 set flagMeaning(SchemaReq) {Schema required - "main" is default}
27 set flagMeaning(SchemaOpt) {Schema restricts name search if present}
28 set flagMeaning(NoColumns) {OP_ResultRow called with zero columns}
29 set flagMeaning(NoColumns1) {zero columns if RHS argument is present}
31 set pragma_def {
32 NAME: full_column_names
33 TYPE: FLAG
34 ARG: SQLITE_FullColNames
35 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
37 NAME: short_column_names
38 TYPE: FLAG
39 ARG: SQLITE_ShortColNames
40 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
42 NAME: count_changes
43 TYPE: FLAG
44 ARG: SQLITE_CountRows
45 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
47 NAME: empty_result_callbacks
48 TYPE: FLAG
49 ARG: SQLITE_NullCallback
50 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
52 NAME: fullfsync
53 TYPE: FLAG
54 ARG: SQLITE_FullFSync
55 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
57 NAME: checkpoint_fullfsync
58 TYPE: FLAG
59 ARG: SQLITE_CkptFullFSync
60 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
62 NAME: cache_spill
63 FLAG: Result0 SchemaReq NoColumns1
64 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
66 NAME: reverse_unordered_selects
67 TYPE: FLAG
68 ARG: SQLITE_ReverseOrder
69 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
71 NAME: query_only
72 TYPE: FLAG
73 ARG: SQLITE_QueryOnly
74 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
76 NAME: automatic_index
77 TYPE: FLAG
78 ARG: SQLITE_AutoIndex
79 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
80 IF: !defined(SQLITE_OMIT_AUTOMATIC_INDEX)
82 NAME: sql_trace
83 TYPE: FLAG
84 ARG: SQLITE_SqlTrace
85 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
86 IF: defined(SQLITE_DEBUG)
88 NAME: vdbe_listing
89 TYPE: FLAG
90 ARG: SQLITE_VdbeListing
91 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
92 IF: defined(SQLITE_DEBUG)
94 NAME: vdbe_trace
95 TYPE: FLAG
96 ARG: SQLITE_VdbeTrace
97 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
98 IF: defined(SQLITE_DEBUG)
100 NAME: vdbe_addoptrace
101 TYPE: FLAG
102 ARG: SQLITE_VdbeAddopTrace
103 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
104 IF: defined(SQLITE_DEBUG)
106 NAME: vdbe_debug
107 TYPE: FLAG
108 ARG: SQLITE_SqlTrace|SQLITE_VdbeListing|SQLITE_VdbeTrace
109 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
110 IF: defined(SQLITE_DEBUG)
112 NAME: vdbe_eqp
113 TYPE: FLAG
114 ARG: SQLITE_VdbeEQP
115 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
116 IF: defined(SQLITE_DEBUG)
118 NAME: ignore_check_constraints
119 TYPE: FLAG
120 ARG: SQLITE_IgnoreChecks
121 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
122 IF: !defined(SQLITE_OMIT_CHECK)
124 NAME: writable_schema
125 TYPE: FLAG
126 ARG: SQLITE_WriteSchema|SQLITE_NoSchemaError
127 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
129 NAME: read_uncommitted
130 TYPE: FLAG
131 ARG: SQLITE_ReadUncommit
132 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
134 NAME: recursive_triggers
135 TYPE: FLAG
136 ARG: SQLITE_RecTriggers
137 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
139 NAME: trusted_schema
140 TYPE: FLAG
141 ARG: SQLITE_TrustedSchema
142 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
144 NAME: foreign_keys
145 TYPE: FLAG
146 ARG: SQLITE_ForeignKeys
147 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
148 IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
150 NAME: defer_foreign_keys
151 TYPE: FLAG
152 ARG: SQLITE_DeferFKs
153 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
154 IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
156 NAME: cell_size_check
157 TYPE: FLAG
158 ARG: SQLITE_CellSizeCk
160 NAME: default_cache_size
161 FLAG: NeedSchema Result0 SchemaReq NoColumns1
162 COLS: cache_size
163 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED)
165 NAME: page_size
166 FLAG: Result0 SchemaReq NoColumns1
167 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
169 NAME: secure_delete
170 FLAG: Result0
171 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
173 NAME: page_count
174 FLAG: NeedSchema Result0 SchemaReq
175 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
177 NAME: max_page_count
178 TYPE: PAGE_COUNT
179 FLAG: NeedSchema Result0 SchemaReq
180 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
182 NAME: locking_mode
183 FLAG: Result0 SchemaReq
184 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
186 NAME: journal_mode
187 FLAG: NeedSchema Result0 SchemaReq
188 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
190 NAME: journal_size_limit
191 FLAG: Result0 SchemaReq
192 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
194 NAME: cache_size
195 FLAG: NeedSchema Result0 SchemaReq NoColumns1
196 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
198 NAME: mmap_size
199 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
201 NAME: auto_vacuum
202 FLAG: NeedSchema Result0 SchemaReq NoColumns1
203 IF: !defined(SQLITE_OMIT_AUTOVACUUM)
205 NAME: incremental_vacuum
206 FLAG: NeedSchema NoColumns
207 IF: !defined(SQLITE_OMIT_AUTOVACUUM)
209 NAME: temp_store
210 FLAG: Result0 NoColumns1
211 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
213 NAME: temp_store_directory
214 FLAG: NoColumns1
215 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
217 NAME: data_store_directory
218 FLAG: NoColumns1
219 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN
221 NAME: lock_proxy_file
222 FLAG: NoColumns1
223 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_ENABLE_LOCKING_STYLE
225 NAME: synchronous
226 FLAG: NeedSchema Result0 SchemaReq NoColumns1
227 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS)
229 NAME: table_info
230 FLAG: NeedSchema Result1 SchemaOpt
231 ARG: 0
232 COLS: cid name type notnull dflt_value pk
233 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
235 NAME: table_xinfo
236 TYPE: TABLE_INFO
237 FLAG: NeedSchema Result1 SchemaOpt
238 ARG: 1
239 COLS: cid name type notnull dflt_value pk hidden
240 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
242 NAME: table_list
243 TYPE: TABLE_LIST
244 FLAG: NeedSchema Result1
245 COLS: schema name type ncol wr strict
246 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
248 NAME: stats
249 FLAG: NeedSchema Result0 SchemaReq
250 COLS: tbl idx wdth hght flgs
251 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) && defined(SQLITE_DEBUG)
253 NAME: index_info
254 TYPE: INDEX_INFO
255 ARG: 0
256 FLAG: NeedSchema Result1 SchemaOpt
257 COLS: seqno cid name
258 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
260 NAME: index_xinfo
261 TYPE: INDEX_INFO
262 ARG: 1
263 FLAG: NeedSchema Result1 SchemaOpt
264 COLS: seqno cid name desc coll key
265 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
267 NAME: index_list
268 FLAG: NeedSchema Result1 SchemaOpt
269 COLS: seq name unique origin partial
270 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
272 NAME: database_list
273 FLAG: Result0
274 COLS: seq name file
275 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
277 NAME: function_list
278 FLAG: Result0
279 COLS: name builtin type enc narg flags
280 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
281 IF: !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
283 NAME: module_list
284 FLAG: Result0
285 COLS: name
286 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
287 IF: !defined(SQLITE_OMIT_VIRTUALTABLE)
288 IF: !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
290 NAME: pragma_list
291 FLAG: Result0
292 COLS: name
293 IF: !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
295 NAME: collation_list
296 FLAG: Result0
297 COLS: seq name
298 IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
300 NAME: foreign_key_list
301 FLAG: NeedSchema Result1 SchemaOpt
302 COLS: id seq table from to on_update on_delete match
303 IF: !defined(SQLITE_OMIT_FOREIGN_KEY)
305 NAME: foreign_key_check
306 FLAG: NeedSchema Result0 Result1 SchemaOpt
307 COLS: table rowid parent fkid
308 IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
310 NAME: parser_trace
311 TYPE: FLAG
312 ARG: SQLITE_ParserTrace
313 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
314 IF: defined(SQLITE_DEBUG)
316 NAME: case_sensitive_like
317 FLAG: NoColumns
318 IF: !defined(SQLITE_OMIT_CASE_SENSITIVE_LIKE_PRAGMA)
320 NAME: integrity_check
321 FLAG: NeedSchema Result0 Result1 SchemaOpt
322 IF: !defined(SQLITE_OMIT_INTEGRITY_CHECK)
324 NAME: quick_check
325 TYPE: INTEGRITY_CHECK
326 FLAG: NeedSchema Result0 Result1 SchemaOpt
327 IF: !defined(SQLITE_OMIT_INTEGRITY_CHECK)
329 NAME: encoding
330 FLAG: Result0 NoColumns1
331 IF: !defined(SQLITE_OMIT_UTF16)
333 NAME: schema_version
334 TYPE: HEADER_VALUE
335 ARG: BTREE_SCHEMA_VERSION
336 FLAG: NoColumns1 Result0
337 IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
339 NAME: user_version
340 TYPE: HEADER_VALUE
341 ARG: BTREE_USER_VERSION
342 FLAG: NoColumns1 Result0
343 IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
345 NAME: data_version
346 TYPE: HEADER_VALUE
347 ARG: BTREE_DATA_VERSION
348 FLAG: ReadOnly Result0
349 IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
351 NAME: freelist_count
352 TYPE: HEADER_VALUE
353 ARG: BTREE_FREE_PAGE_COUNT
354 FLAG: ReadOnly Result0
355 IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
357 NAME: application_id
358 TYPE: HEADER_VALUE
359 ARG: BTREE_APPLICATION_ID
360 FLAG: NoColumns1 Result0
361 IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
363 NAME: compile_options
364 FLAG: Result0
365 IF: !defined(SQLITE_OMIT_COMPILEOPTION_DIAGS)
367 NAME: wal_checkpoint
368 FLAG: NeedSchema
369 COLS: busy log checkpointed
370 IF: !defined(SQLITE_OMIT_WAL)
372 NAME: wal_autocheckpoint
373 IF: !defined(SQLITE_OMIT_WAL)
375 NAME: shrink_memory
376 FLAG: NoColumns
378 NAME: busy_timeout
379 FLAG: Result0
380 COLS: timeout
382 NAME: lock_status
383 FLAG: Result0
384 COLS: database status
385 IF: defined(SQLITE_DEBUG) || defined(SQLITE_TEST)
387 NAME: activate_extensions
388 IF: defined(SQLITE_ENABLE_CEROD)
390 NAME: soft_heap_limit
391 FLAG: Result0
393 NAME: hard_heap_limit
394 FLAG: Result0
396 NAME: threads
397 FLAG: Result0
399 NAME: analysis_limit
400 FLAG: Result0
402 NAME: optimize
403 FLAG: Result1 NeedSchema
405 NAME: legacy_alter_table
406 TYPE: FLAG
407 ARG: SQLITE_LegacyAlter
408 IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
411 # Open the output file
413 if {$argc>0} {
414 set destfile [lindex $argv 0]
415 } else {
416 set destfile "[file dir [file dir [file normal $argv0]]]/src/pragma.h"
417 puts "Overwriting $destfile with new pragma table..."
419 set fd [open $destfile wb]
420 puts $fd {/* DO NOT EDIT!
421 ** This file is automatically generated by the script at
422 ** ../tool/mkpragmatab.tcl. To update the set of pragmas, edit
423 ** that script and rerun it.
426 # Parse the PRAGMA table above.
428 set name {}
429 set type {}
430 set if {}
431 set flags {}
432 set cols {}
433 set cols_list {}
434 set arg 0
435 proc record_one {} {
436 global name type if arg allbyname typebyif flags cols all_cols
437 global cols_list colUsedBy
438 if {$name==""} return
439 if {$cols!=""} {
440 if {![info exists all_cols($cols)]} {
441 set all_cols($cols) 1
442 lappend cols_list $cols
444 set cx $cols
445 lappend colUsedBy($cols) $name
446 } else {
447 set cx 0
449 set allbyname($name) [list $type $arg $if $flags $cols]
450 set name {}
451 set type {}
452 set if {}
453 set flags {}
454 set cols {}
455 set arg 0
457 foreach line [split $pragma_def \n] {
458 set line [string trim $line]
459 if {$line==""} continue
460 foreach {id val} [split $line :] break
461 set val [string trim $val]
462 if {$id=="NAME"} {
463 record_one
464 set name $val
465 set type [string toupper $val]
466 } elseif {$id=="TYPE"} {
467 set type $val
468 if {$type=="FLAG"} {
469 lappend flags Result0 NoColumns1
471 } elseif {$id=="ARG"} {
472 set arg $val
473 } elseif {$id=="COLS"} {
474 set cols $val
475 } elseif {$id=="IF"} {
476 lappend if $val
477 } elseif {$id=="FLAG"} {
478 foreach term [split $val] {
479 lappend flags $term
480 set allflags($term) 1
482 } else {
483 error "bad pragma_def line: $line"
486 record_one
487 set allnames [lsort [array names allbyname]]
489 # Generate #defines for all pragma type names. Group the pragmas that are
490 # omit in default builds (ex: defined(SQLITE_DEBUG))
491 # at the end.
493 puts $fd "\n/* The various pragma types */"
494 set pnum 0
495 foreach name $allnames {
496 set type [lindex $allbyname($name) 0]
497 if {[info exists seentype($type)]} continue
498 set if [lindex $allbyname($name) 2]
499 if {[regexp SQLITE_DEBUG $if] || [regexp SQLITE_HAS_CODEC $if]} continue
500 set seentype($type) 1
501 puts $fd [format {#define %-35s %4d} PragTyp_$type $pnum]
502 incr pnum
504 foreach name $allnames {
505 set type [lindex $allbyname($name) 0]
506 if {[info exists seentype($type)]} continue
507 set if [lindex $allbyname($name) 2]
508 if {[regexp SQLITE_DEBUG $if]} continue
509 set seentype($type) 1
510 puts $fd [format {#define %-35s %4d} PragTyp_$type $pnum]
511 incr pnum
513 foreach name $allnames {
514 set type [lindex $allbyname($name) 0]
515 if {[info exists seentype($type)]} continue
516 set seentype($type) 1
517 puts $fd [format {#define %-35s %4d} PragTyp_$type $pnum]
518 incr pnum
521 # Generate #defines for flags
523 puts $fd "\n/* Property flags associated with various pragma. */"
524 set fv 1
525 foreach f [lsort [array names allflags]] {
526 puts $fd [format {#define PragFlg_%-10s 0x%02x /* %s */} \
527 $f $fv $flagMeaning($f)]
528 set fv [expr {$fv*2}]
531 # Sort the column lists so that longer column lists occur first
533 proc colscmp {a b} {
534 return [expr {[llength $b] - [llength $a]}]
536 set cols_list [lsort -command colscmp $cols_list]
538 # Generate the array of column names used by pragmas that act like
539 # queries.
541 puts $fd "\n/* Names of columns for pragmas that return multi-column result"
542 puts $fd "** or that return single-column results where the name of the"
543 puts $fd "** result column is different from the name of the pragma\n*/"
544 puts $fd "static const char *const pragCName\[\] = {"
545 set offset 0
546 set allcollist {}
547 foreach cols $cols_list {
548 set n [llength $cols]
549 set limit [expr {[llength $allcollist] - $n}]
550 for {set i 0} {$i<$limit} {incr i} {
551 set sublist [lrange $allcollist $i [expr {$i+$n-1}]]
552 if {$sublist==$cols} {
553 puts $fd [format "%27s/* $colUsedBy($cols) reuses $i */" ""]
554 set cols_offset($cols) $i
555 break
558 if {$i<$limit} continue
559 set cols_offset($cols) $offset
560 set ub " /* Used by: $colUsedBy($cols) */"
561 foreach c $cols {
562 lappend allcollist $c
563 puts $fd [format " /* %3d */ %-14s%s" $offset \"$c\", $ub]
564 set ub ""
565 incr offset
568 puts $fd "\175;"
570 # Generate the lookup table
572 puts $fd "\n/* Definitions of all built-in pragmas */"
573 puts $fd "typedef struct PragmaName \173"
574 puts $fd " const char *const zName; /* Name of pragma */"
575 puts $fd " u8 ePragTyp; /* PragTyp_XXX value */"
576 puts $fd " u8 mPragFlg; /* Zero or more PragFlg_XXX values */"
577 puts $fd { u8 iPragCName; /* Start of column names in pragCName[] */}
578 puts $fd " u8 nPragCName; \
579 /* Num of col names. 0 means use pragma name */"
580 puts $fd " u64 iArg; /* Extra argument */"
581 puts $fd "\175 PragmaName;"
582 puts $fd "static const PragmaName aPragmaName\[\] = \173"
584 set current_if {}
585 set spacer [format { %26s } {}]
586 foreach name $allnames {
587 foreach {type arg if flag cx} $allbyname($name) break
588 if {$cx==0 || $cx==""} {
589 set cy 0
590 set nx 0
591 } else {
592 set cy $cols_offset($cx)
593 set nx [llength $cx]
595 if {$if!=$current_if} {
596 if {$current_if!=""} {
597 foreach this_if $current_if {
598 puts $fd "#endif"
601 set current_if $if
602 if {$current_if!=""} {
603 foreach this_if $current_if {
604 puts $fd "#if $this_if"
608 set typex [format PragTyp_%-23s $type,]
609 if {$flag==""} {
610 set flagx "0"
611 } else {
612 set flagx PragFlg_[join $flag {|PragFlg_}]
614 puts $fd " \173/* zName: */ \"$name\","
615 puts $fd " /* ePragTyp: */ PragTyp_$type,"
616 puts $fd " /* ePragFlg: */ $flagx,"
617 puts $fd " /* ColNames: */ $cy, $nx,"
618 puts $fd " /* iArg: */ $arg \175,"
620 if {$current_if!=""} {
621 foreach this_if $current_if {
622 puts $fd "#endif"
625 puts $fd "\175;"
627 # count the number of pragmas, for information purposes
629 set allcnt 0
630 set dfltcnt 0
631 foreach name $allnames {
632 incr allcnt
633 set if [lindex $allbyname($name) 2]
634 if {[regexp {^defined} $if] || [regexp {[^!]defined} $if]} continue
635 incr dfltcnt
637 puts $fd "/* Number of pragmas: $dfltcnt on by default, $allcnt total. */"